sed -n '1,180p' resources/views/layouts/app/sidebar.blade.php && sed -n '1,100p' tests/Browser/Admin/AuthenticationTest.php

AuthenticationTest.php

<!DOCTYPE html>
getLocale()) }}" class="dark">

        @include('partials.head')

        <flux:sidebar sticky collapsible="mobile" class="border-e border-zinc-200 bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-900">
            <flux:sidebar.header>
                <x-app-logo :sidebar="true" href="{{ route('admin.dashboard') }}" wire:navigate />
                <flux:sidebar.collapse class="lg:hidden" />
            </flux:sidebar.header>

            <flux:sidebar.nav>
                <flux:sidebar.group :heading="__('Platform')" class="grid">
                    <flux:sidebar.item icon="home" :href="route('admin.dashboard')" :current="request()->routeIs('admin.dashboard')" wire:navigate>
                        {{ __('Dashboard') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="chart-bar" :href="route('admin.analytics.index')" :current="request()->routeIs('admin.analytics.*')" wire:navigate>
                        {{ __('Analytics') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="squares-2x2" :href="route('admin.apps.index')" :current="request()->routeIs('admin.apps.*')" wire:navigate>
                        {{ __('Apps') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="code-bracket" :href="route('admin.developers.index')" :current="request()->routeIs('admin.developers.*')" wire:navigate>
                        {{ __('Developers') }}
                    </flux:sidebar.item>
                </flux:sidebar.group>

                <flux:sidebar.group :heading="__('Products')" class="grid">
                    <flux:sidebar.item icon="cube" :href="route('admin.products.index')" :current="request()->routeIs('admin.products.*')" wire:navigate>
                        {{ __('Products') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="rectangle-stack" :href="route('admin.collections.index')" :current="request()->routeIs('admin.collections.*')" wire:navigate>
                        {{ __('Collections') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="archive-box" :href="route('admin.inventory.index')" :current="request()->routeIs('admin.inventory.*')" wire:navigate>
                        {{ __('Inventory') }}
                    </flux:sidebar.item>
                </flux:sidebar.group>

                <flux:sidebar.group :heading="__('Operations')" class="grid">
                    <flux:sidebar.item icon="shopping-bag" :href="route('admin.orders.index')" :current="request()->routeIs('admin.orders.*')" wire:navigate>
                        {{ __('Orders') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="users" :href="route('admin.customers.index')" :current="request()->routeIs('admin.customers.*')" wire:navigate>
                        {{ __('Customers') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="tag" :href="route('admin.discounts.index')" :current="request()->routeIs('admin.discounts.*')" wire:navigate>
                        {{ __('Discounts') }}
                    </flux:sidebar.item>
                </flux:sidebar.group>

                <flux:sidebar.group :heading="__('Storefront')" class="grid">
                    <flux:sidebar.item icon="document-text" :href="route('admin.pages.index')" :current="request()->routeIs('admin.pages.*')" wire:navigate>
                        {{ __('Pages') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="bars-3" :href="route('admin.navigation.index')" :current="request()->routeIs('admin.navigation.*')" wire:navigate>
                        {{ __('Navigation') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="paint-brush" :href="route('admin.themes.index')" :current="request()->routeIs('admin.themes.*')" wire:navigate>
                        {{ __('Themes') }}
                    </flux:sidebar.item>
                </flux:sidebar.group>

                <flux:sidebar.group :heading="__('Configuration')" class="grid">
                    <flux:sidebar.item icon="cog-6-tooth" :href="route('admin.settings.index')" :current="request()->routeIs('admin.settings.*')" wire:navigate>
                        {{ __('Settings') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="magnifying-glass" :href="route('admin.search.settings')" :current="request()->routeIs('admin.search.*')" wire:navigate>
                        {{ __('Search') }}
                    </flux:sidebar.item>
                </flux:sidebar.group>
            </flux:sidebar.nav>

            <flux:spacer />

            <flux:sidebar.nav>
                <flux:sidebar.item icon="folder-git-2" href="https://github.com/laravel/livewire-starter-kit" target="_blank">
                    {{ __('Repository') }}
                </flux:sidebar.item>

                <flux:sidebar.item icon="book-open-text" href="https://laravel.com/docs/starter-kits#livewire" target="_blank">
                    {{ __('Documentation') }}
                </flux:sidebar.item>
            </flux:sidebar.nav>

            <x-desktop-user-menu class="hidden lg:block" :name="auth()->user()->name" />
        </flux:sidebar>

        <flux:header class="lg:hidden">
            <flux:sidebar.toggle class="lg:hidden" icon="bars-2" inset="left" />

            <flux:spacer />

            <flux:dropdown position="top" align="end">
                <flux:profile
                    :initials="auth()->user()->initials()"
                    icon-trailing="chevron-down"
                />

                <flux:menu>
                    <flux:menu.radio.group>

                                <flux:avatar
                                    :name="auth()->user()->name"
                                    :initials="auth()->user()->initials()"
                                />

                                    <flux:heading class="truncate">{{ auth()->user()->name }}</flux:heading>
                                    <flux:text class="truncate">{{ auth()->user()->email }}</flux:text>

                    </flux:menu.radio.group>

                    <flux:menu.separator />

                    <flux:menu.radio.group>
                        <flux:menu.item :href="route('profile.edit')" icon="cog" wire:navigate>
                            {{ __('Settings') }}
                        </flux:menu.item>
                    </flux:menu.radio.group>

                    <flux:menu.separator />

                    <form method="POST" action="{{ route('logout') }}" class="w-full">
                        @csrf
                        <flux:menu.item
                            as="button"
                            type="submit"
                            icon="arrow-right-start-on-rectangle"
                            class="w-full cursor-pointer"
                            data-test="logout-button"
                        >
                            {{ __('Log Out') }}
                        </flux:menu.item>
                    </form>
                </flux:menu>
            </flux:dropdown>
        </flux:header>

        {{ $slot }}

        @fluxScripts

<?php

test('example', function () {
    $response = $this->get('/');

    $response->assertStatus(200);
});


Output:
Chunk ID: cb4bae
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 2003
Output:
<!DOCTYPE html>
getLocale()) }}" class="dark">

        @include('partials.head')

        <flux:sidebar sticky collapsible="mobile" class="border-e border-zinc-200 bg-zinc-50 dark:border-zinc-700 dark:bg-zinc-900">
            <flux:sidebar.header>
                <x-app-logo :sidebar="true" href="{{ route('admin.dashboard') }}" wire:navigate />
                <flux:sidebar.collapse class="lg:hidden" />
            </flux:sidebar.header>

            <flux:sidebar.nav>
                <flux:sidebar.group :heading="__('Platform')" class="grid">
                    <flux:sidebar.item icon="home" :href="route('admin.dashboard')" :current="request()->routeIs('admin.dashboard')" wire:navigate>
                        {{ __('Dashboard') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="chart-bar" :href="route('admin.analytics.index')" :current="request()->routeIs('admin.analytics.*')" wire:navigate>
                        {{ __('Analytics') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="squares-2x2" :href="route('admin.apps.index')" :current="request()->routeIs('admin.apps.*')" wire:navigate>
                        {{ __('Apps') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="code-bracket" :href="route('admin.developers.index')" :current="request()->routeIs('admin.developers.*')" wire:navigate>
                        {{ __('Developers') }}
                    </flux:sidebar.item>
                </flux:sidebar.group>

                <flux:sidebar.group :heading="__('Products')" class="grid">
                    <flux:sidebar.item icon="cube" :href="route('admin.products.index')" :current="request()->routeIs('admin.products.*')" wire:navigate>
                        {{ __('Products') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="rectangle-stack" :href="route('admin.collections.index')" :current="request()->routeIs('admin.collections.*')" wire:navigate>
                        {{ __('Collections') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="archive-box" :href="route('admin.inventory.index')" :current="request()->routeIs('admin.inventory.*')" wire:navigate>
                        {{ __('Inventory') }}
                    </flux:sidebar.item>
                </flux:sidebar.group>

                <flux:sidebar.group :heading="__('Operations')" class="grid">
                    <flux:sidebar.item icon="shopping-bag" :href="route('admin.orders.index')" :current="request()->routeIs('admin.orders.*')" wire:navigate>
                        {{ __('Orders') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="users" :href="route('admin.customers.index')" :current="request()->routeIs('admin.customers.*')" wire:navigate>
                        {{ __('Customers') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="tag" :href="route('admin.discounts.index')" :current="request()->routeIs('admin.discounts.*')" wire:navigate>
                        {{ __('Discounts') }}
                    </flux:sidebar.item>
                </flux:sidebar.group>

                <flux:sidebar.group :heading="__('Storefront')" class="grid">
                    <flux:sidebar.item icon="document-text" :href="route('admin.pages.index')" :current="request()->routeIs('admin.pages.*')" wire:navigate>
                        {{ __('Pages') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="bars-3" :href="route('admin.navigation.index')" :current="request()->routeIs('admin.navigation.*')" wire:navigate>
                        {{ __('Navigation') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="paint-brush" :href="route('admin.themes.index')" :current="request()->routeIs('admin.themes.*')" wire:navigate>
                        {{ __('Themes') }}
                    </flux:sidebar.item>
                </flux:sidebar.group>

                <flux:sidebar.group :heading="__('Configuration')" class="grid">
                    <flux:sidebar.item icon="cog-6-tooth" :href="route('admin.settings.index')" :current="request()->routeIs('admin.settings.*')" wire:navigate>
                        {{ __('Settings') }}
                    </flux:sidebar.item>

                    <flux:sidebar.item icon="magnifying-glass" :href="route('admin.search.settings')" :current="request()->routeIs('admin.search.*')" wire:navigate>
                        {{ __('Search') }}
                    </flux:sidebar.item>
                </flux:sidebar.group>
            </flux:sidebar.nav>

            <flux:spacer />

            <flux:sidebar.nav>
                <flux:sidebar.item icon="folder-git-2" href="https://github.com/laravel/livewire-starter-kit" target="_blank">
                    {{ __('Repository') }}
                </flux:sidebar.item>

                <flux:sidebar.item icon="book-open-text" href="https://laravel.com/docs/starter-kits#livewire" target="_blank">
                    {{ __('Documentation') }}
                </flux:sidebar.item>
            </flux:sidebar.nav>

            <x-desktop-user-menu class="hidden lg:block" :name="auth()->user()->name" />
        </flux:sidebar>

        <flux:header class="lg:hidden">
            <flux:sidebar.toggle class="lg:hidden" icon="bars-2" inset="left" />

            <flux:spacer />

            <flux:dropdown position="top" align="end">
                <flux:profile
                    :initials="auth()->user()->initials()"
                    icon-trailing="chevron-down"
                />

                <flux:menu>
                    <flux:menu.radio.group>

                                <flux:avatar
                                    :name="auth()->user()->name"
                                    :initials="auth()->user()->initials()"
                                />

                                    <flux:heading class="truncate">{{ auth()->user()->name }}</flux:heading>
                                    <flux:text class="truncate">{{ auth()->user()->email }}</flux:text>

                    </flux:menu.radio.group>

                    <flux:menu.separator />

                    <flux:menu.radio.group>
                        <flux:menu.item :href="route('profile.edit')" icon="cog" wire:navigate>
                            {{ __('Settings') }}
                        </flux:menu.item>
                    </flux:menu.radio.group>

                    <flux:menu.separator />

                    <form method="POST" action="{{ route('logout') }}" class="w-full">
                        @csrf
                        <flux:menu.item
                            as="button"
                            type="submit"
                            icon="arrow-right-start-on-rectangle"
                            class="w-full cursor-pointer"
                            data-test="logout-button"
                        >
                            {{ __('Log Out') }}
                        </flux:menu.item>
                    </form>
                </flux:menu>
            </flux:dropdown>
        </flux:header>

        {{ $slot }}

        @fluxScripts

<?php

test('example', function () {
    $response = $this->get('/');

    $response->assertStatus(200);
});


Output:
Chunk ID: 1b9cd4
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1182
Output:
## Suite 2: Admin Authentication

**File:** `tests/Browser/Admin/AuthenticationTest.php`

**Purpose:** Verify the admin login flow, credential validation, session management, logout, and sidebar navigation after successful login.

### Authentication Flow

```mermaid
stateDiagram-v2
    [*] --> LoginPage: visit /admin/login
    LoginPage --> Dashboard: valid credentials + click "Sign in"
    LoginPage --> LoginPage: invalid credentials (show error)
    LoginPage --> LoginPage: empty fields (show validation)
    Dashboard --> Products: click "Products"
    Dashboard --> Orders: click "Orders"
    Dashboard --> Customers: click "Customers"
    Dashboard --> Discounts: click "Discounts"
    Dashboard --> Settings: click "Settings"
    Dashboard --> Analytics: click "Analytics"
    Dashboard --> Themes: click "Themes"
    Dashboard --> LoginPage: click profile dropdown then "Logout"
```

---

### Test 2.1: Can log in as admin

**Preconditions:** Seeded admin user

**Steps:**
1. Navigate to `/admin/login`
2. Enter email: `admin@acme.test`
3. Enter password: `password`
4. Click the "Sign in" button

**Expected Results:**
- Page displays "Dashboard"
- No JavaScript errors

---

### Test 2.2: Shows error for invalid credentials

**Preconditions:** Seeded admin user

**Steps:**
1. Navigate to `/admin/login`
2. Enter email: `admin@acme.test`
3. Enter password: `wrongpassword`
4. Click the "Sign in" button

**Expected Results:**
- Page displays "Invalid credentials"
- No JavaScript errors

---

### Test 2.3: Shows error for empty email

**Preconditions:** None

**Steps:**
1. Navigate to `/admin/login`
2. Enter password: `password` (leave email empty)
3. Click the "Sign in" button

**Expected Results:**
- Validation error referencing "email" is visible
- No JavaScript errors

---

### Test 2.4: Shows error for empty password

**Preconditions:** None

**Steps:**
1. Navigate to `/admin/login`
2. Enter email: `admin@acme.test` (leave password empty)
3. Click the "Sign in" button

**Expected Results:**
- Validation error referencing "password" is visible
- No JavaScript errors

---

### Test 2.5: Redirects unauthenticated users to login from dashboard

**Preconditions:** Not logged in

**Steps:**
1. Navigate to `/admin` (without logging in)

**Expected Results:**
- Page displays "Sign in" (redirected to login form)
- No JavaScript errors

---

### Test 2.6: Redirects unauthenticated users to login from products

**Preconditions:** Not logged in

**Steps:**
1. Navigate to `/admin/products` (without logging in)

**Expected Results:**
- Page displays "Sign in" (redirected to login form)
- No JavaScript errors

---

### Test 2.7: Can log out

**Preconditions:** Seeded admin user

**Steps:**
1. Navigate to `/admin/login`
2. Enter email: `admin@acme.test`
3. Enter password: `password`
4. Click the "Sign in" button
5. Verify "Dashboard" is visible
6. Click on "Admin User" (profile/user menu)
7. Click "Logout"

**Expected Results:**
- Page displays "Sign in" (returned to login form)

---

### Test 2.8: Can navigate through admin sidebar sections

**Preconditions:** Seeded admin user

**Steps:**
1. Navigate to `/admin/login`
2. Enter email: `admin@acme.test`
3. Enter password: `password`
4. Click the "Sign in" button
5. Click "Products" in the sidebar
6. Verify "Products" heading is visible
7. Click "Orders" in the sidebar
8. Verify "Orders" heading is visible
9. Click "Customers" in the sidebar
10. Verify "Customers" heading is visible
11. Click "Discounts" in the sidebar
12. Verify "Discounts" heading is visible
13. Click "Settings" in the sidebar
14. Verify "Store Settings" heading is visible

**Expected Results:**
- Each section loads without JavaScript errors
- Each section heading is visible after clicking its sidebar link

---

### Test 2.9: Can navigate to analytics from sidebar

**Preconditions:** Seeded admin user

**Steps:**
1. Navigate to `/admin/login`
2. Enter email: `admin@acme.test`
3. Enter password: `password`
4. Click the "Sign in" button
5. Click "Analytics" in the sidebar

**Expected Results:**
- Page displays "Analytics"
- No JavaScript errors

---

### Test 2.10: Can navigate to themes from sidebar

**Preconditions:** Seeded admin user

**Steps:**
1. Navigate to `/admin/login`
2. Enter email: `admin@acme.test`
3. Enter password: `password`
4. Click the "Sign in" button
5. Click "Themes" in the sidebar

**Expected Results:**
- Page displays "Themes"
- No JavaScript errors

**Login Helper Pattern:** Tests 2.7-2.10 require the admin to be logged in first. Each test should perform the full login sequence (visit login page, fill credentials, click sign in, assert dashboard) before proceeding. This ensures test independence.

**Total: 10 tests**


/bin/zsh
-lc
sed -n '1,120p' tests/Pest.php

<?php

/*
|--------------------------------------------------------------------------
| Test Case
|--------------------------------------------------------------------------
|
| The closure you provide to your test functions is always bound to a specific PHPUnit test
| case class. By default, that class is "PHPUnit\Framework\TestCase". Of course, you may
| need to change it using the "pest()" function to bind a different classes or traits.
|
*/

pest()->extend(Tests\TestCase::class)
    ->in('Feature', 'Browser');

/*
|--------------------------------------------------------------------------
| Expectations
|--------------------------------------------------------------------------
|
| When you're writing tests, you often need to check that values meet certain conditions. The
| "expect()" function gives you access to a set of "expectations" methods that you can use
| to assert different things. Of course, you may extend the Expectation API at any time.
|
*/

expect()->extend('toBeOne', function () {
    return $this->toBe(1);
});

/*
|--------------------------------------------------------------------------
| Functions
|--------------------------------------------------------------------------
|
| While Pest is very powerful out-of-the-box, you may have some testing code specific to your
| project that you don't want to repeat in every file. Here you can also expose helpers as
| global functions to help you to reduce the number of lines of code in your test files.
|
*/

function something()
{
    // ..
}


Output:
Chunk ID: 9aa925
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 383
Output:
<?php

/*
|--------------------------------------------------------------------------
| Test Case
|--------------------------------------------------------------------------
|
| The closure you provide to your test functions is always bound to a specific PHPUnit test
| case class. By default, that class is "PHPUnit\Framework\TestCase". Of course, you may
| need to change it using the "pest()" function to bind a different classes or traits.
|
*/

pest()->extend(Tests\TestCase::class)
    ->in('Feature', 'Browser');

/*
|--------------------------------------------------------------------------
| Expectations
|--------------------------------------------------------------------------
|
| When you're writing tests, you often need to check that values meet certain conditions. The
| "expect()" function gives you access to a set of "expectations" methods that you can use
| to assert different things. Of course, you may extend the Expectation API at any time.
|
*/

expect()->extend('toBeOne', function () {
    return $this->toBe(1);
});

/*
|--------------------------------------------------------------------------
| Functions
|--------------------------------------------------------------------------
|
| While Pest is very powerful out-of-the-box, you may have some testing code specific to your
| project that you don't want to repeat in every file. Here you can also expose helpers as
| global functions to help you to reduce the number of lines of code in your test files.
|
*/

function something()
{
    // ..
}


rg -n "function fill|function type|function click|function press|assertPathIs|assertUrlIs|assertNoJavaScriptErrors|assertNoConsole" vendor/pestphp -g '*.php'


rg -n "function fill|function type|function click|function press|assertPathIs|assertUrlIs|assertNoJavaScriptErrors|assertNoConsole" vendor/pestphp -g '*.php'

rg -n 'function fill|function type|function click|function press|assertPathIs|assertUrlIs|assertNoJavaScriptErrors|assertNoConsole' vendor/pestphp -g '*.php'

Question: function fill|function type|function click|function press|assertPathIs|assertUrlIs|assertNoJavaScriptErrors|assertNoConsole

vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:17:    public function click(string $text): self
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:63:    public function type(string $field, string $value): self
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:73:    public function typeSlowly(string $field, string $value, int $delay = 100): self
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:85:    public function fill(string $field, string $value): self
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:191:    public function press(string $button): self
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:199:    public function pressAndWaitFor(string $button, int|float $seconds = 1): self
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:18:    public function assertUrlIs(string $url): Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:161:        return $this->assertPathIs(route($route, $parameters, false));
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:198:    public function assertPathIs(string $path): Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:213:    public function assertPathIsNot(string $path): Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesConsoleAssertions.php:25:        $this->assertNoConsoleLogs();
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesConsoleAssertions.php:26:        $this->assertNoJavaScriptErrors();
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesConsoleAssertions.php:61:    public function assertNoConsoleLogs(): Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesConsoleAssertions.php:78:    public function assertNoJavaScriptErrors(): Webpage
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:133:    public function click(?array $options = null): void
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:157:    public function fill(string $value, ?array $options = null): void
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:170:    public function type(string $text, ?array $options = null): void
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:215:    public function press(string $key, ?array $options = null): void


Output:
Chunk ID: 43e56d
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 618
Output:
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:17:    public function click(string $text): self
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:63:    public function type(string $field, string $value): self
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:73:    public function typeSlowly(string $field, string $value, int $delay = 100): self
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:85:    public function fill(string $field, string $value): self
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:191:    public function press(string $button): self
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:199:    public function pressAndWaitFor(string $button, int|float $seconds = 1): self
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:18:    public function assertUrlIs(string $url): Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:161:        return $this->assertPathIs(route($route, $parameters, false));
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:198:    public function assertPathIs(string $path): Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:213:    public function assertPathIsNot(string $path): Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesConsoleAssertions.php:25:        $this->assertNoConsoleLogs();
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesConsoleAssertions.php:26:        $this->assertNoJavaScriptErrors();
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesConsoleAssertions.php:61:    public function assertNoConsoleLogs(): Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesConsoleAssertions.php:78:    public function assertNoJavaScriptErrors(): Webpage
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:133:    public function click(?array $options = null): void
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:157:    public function fill(string $value, ?array $options = null): void
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:170:    public function type(string $text, ?array $options = null): void
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:215:    public function press(string $key, ?array $options = null): void


sed -n '1,130p' vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php && sed -n '1,120p' vendor/pestphp/pest-plugin-browser/src/Support/Locator.php


sed -n '1,130p' vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php && sed -n '1,120p' vendor/pestphp/pest-plugin-browser/src/Support/Locator.php

Locator.php

<?php

declare(strict_types=1);

namespace Pest\Browser\Api\Concerns;

use Pest\Browser\Api\Webpage;

/**
 * @mixin Webpage
 */
trait InteractsWithElements
{
    /**
     * Click the link with the given text.
     */
    public function click(string $text): self
    {
        $this->guessLocator($text)->click();

        return $this;
    }

    /**
     * Get the text of the element matching the given selector.
     */
    public function text(string $selector): ?string
    {
        return $this->guessLocator($selector)->textContent();
    }

    /**
     * Get the given attribute from the element matching the given selector.
     */
    public function attribute(string $selector, string $attribute): ?string
    {
        $locator = $this->guessLocator($selector);

        return $locator->getAttribute($attribute) ?? null;
    }

    /**
     * Send the given keys to the element matching the given selector.
     *
     * @param  array<int, string>  $keys
     */
    public function keys(string $selector, array|string $keys): self
    {
        $keys = is_array($keys) ? $keys : [$keys];

        $locator = $this->guessLocator($selector);

        foreach ($keys as $key) {
            $locator->press($key);
        }

        return $this;
    }

    /**
     * Type the given value in the given field.
     */
    public function type(string $field, string $value): self
    {
        $this->guessLocator($field)->fill($value);

        return $this;
    }

    /**
     * Type the given value slowly in the given field.
     */
    public function typeSlowly(string $field, string $value, int $delay = 100): self
    {
        $options = ['delay' => $delay];

        $this->guessLocator($field)->type($value, $options);

        return $this;
    }

    /**
     * Fills the given value in the given field.
     */
    public function fill(string $field, string $value): self
    {
        return $this->type($field, $value);
    }

    /**
     * Hovers over the element matching the given selector.
     */
    public function hover(string $selector): self
    {
        $this->guessLocator($selector)->hover();

        return $this;
    }

    /**
     * Right-click the element matching the given selector.
     */
    public function rightClick(string $text): Webpage
    {
        $this->guessLocator($text)->click([
            'button' => 'right',
        ]);

        return $this;
    }

    /**
     * Select the given value in the given field.
     *
     * @param  array<int, string|int>|string|int  $option
     */
    public function select(string $field, array|string|int $option): self
    {
        $this->guessLocator($field)->selectOption($option);

        return $this;
    }

    /**
     * Type the given value in the given field without clearing it.
     */
    public function append(string $field, string $value): self
    {
        $locator = $this->guessLocator($field);

sed: vendor/pestphp/pest-plugin-browser/src/Support/Locator.php: No such file or directory


Output:
Chunk ID: 53dd69
Wall time: 0.0000 seconds
Process exited with code 1
Original token count: 754
Output:
<?php

declare(strict_types=1);

namespace Pest\Browser\Api\Concerns;

use Pest\Browser\Api\Webpage;

/**
 * @mixin Webpage
 */
trait InteractsWithElements
{
    /**
     * Click the link with the given text.
     */
    public function click(string $text): self
    {
        $this->guessLocator($text)->click();

        return $this;
    }

    /**
     * Get the text of the element matching the given selector.
     */
    public function text(string $selector): ?string
    {
        return $this->guessLocator($selector)->textContent();
    }

    /**
     * Get the given attribute from the element matching the given selector.
     */
    public function attribute(string $selector, string $attribute): ?string
    {
        $locator = $this->guessLocator($selector);

        return $locator->getAttribute($attribute) ?? null;
    }

    /**
     * Send the given keys to the element matching the given selector.
     *
     * @param  array<int, string>  $keys
     */
    public function keys(string $selector, array|string $keys): self
    {
        $keys = is_array($keys) ? $keys : [$keys];

        $locator = $this->guessLocator($selector);

        foreach ($keys as $key) {
            $locator->press($key);
        }

        return $this;
    }

    /**
     * Type the given value in the given field.
     */
    public function type(string $field, string $value): self
    {
        $this->guessLocator($field)->fill($value);

        return $this;
    }

    /**
     * Type the given value slowly in the given field.
     */
    public function typeSlowly(string $field, string $value, int $delay = 100): self
    {
        $options = ['delay' => $delay];

        $this->guessLocator($field)->type($value, $options);

        return $this;
    }

    /**
     * Fills the given value in the given field.
     */
    public function fill(string $field, string $value): self
    {
        return $this->type($field, $value);
    }

    /**
     * Hovers over the element matching the given selector.
     */
    public function hover(string $selector): self
    {
        $this->guessLocator($selector)->hover();

        return $this;
    }

    /**
     * Right-click the element matching the given selector.
     */
    public function rightClick(string $text): Webpage
    {
        $this->guessLocator($text)->click([
            'button' => 'right',
        ]);

        return $this;
    }

    /**
     * Select the given value in the given field.
     *
     * @param  array<int, string|int>|string|int  $option
     */
    public function select(string $field, array|string|int $option): self
    {
        $this->guessLocator($field)->selectOption($option);

        return $this;
    }

    /**
     * Type the given value in the given field without clearing it.
     */
    public function append(string $field, string $value): self
    {
        $locator = $this->guessLocator($field);

sed: vendor/pestphp/pest-plugin-browser/src/Support/Locator.php: No such file or directory


rg -n "function guessLocator|data-test|@" vendor/pestphp/pest-plugin-browser/src -g '*.php'


rg -n "function guessLocator|data-test|@" vendor/pestphp/pest-plugin-browser/src -g '*.php'

rg -n 'function guessLocator|data-test|@' vendor/pestphp/pest-plugin-browser/src -g '*.php'

Question: function guessLocator|data-test|@

vendor/pestphp/pest-plugin-browser/src/Browsable.php:14: * @internal
vendor/pestphp/pest-plugin-browser/src/Browsable.php:21:     * @internal
vendor/pestphp/pest-plugin-browser/src/Browsable.php:37:     * @template TUrl of array<int, string>|string
vendor/pestphp/pest-plugin-browser/src/Browsable.php:39:     * @param  TUrl  $url
vendor/pestphp/pest-plugin-browser/src/Browsable.php:40:     * @param  array<string, mixed>  $options
vendor/pestphp/pest-plugin-browser/src/Browsable.php:41:     * @return (TUrl is array<int, string> ? ArrayablePendingAwaitablePage : PendingAwaitablePage)
vendor/pestphp/pest-plugin-browser/src/Browsable.php:65:     * @return array <string, string>
vendor/pestphp/pest-plugin-browser/src/Cleanables/Livewire.php:11: * @internal
vendor/pestphp/pest-plugin-browser/src/Cleanables/Livewire.php:22:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/HasWaitCapabilities.php:10: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Cleanables/Ziggy.php:11: * @internal
vendor/pestphp/pest-plugin-browser/src/Cleanables/Ziggy.php:20:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Execution.php:20: * @internal
vendor/pestphp/pest-plugin-browser/src/Execution.php:53:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Execution.php:57:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Execution.php:62:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Execution.php:117:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Execution.php:174:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:13: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:38:     * @param  array<string, mixed>  $params
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:50:        /** @var array{result?: array{value: mixed}} $message */
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:109:     * @return array<mixed>
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:131:        /** @var array{method: string|null, params: array{type: string|null, guid: string}} $message */
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:134:                // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:165:     * @return array<Element>
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:171:        /** @var array{method?: string|null, params: array{type?: string|null, guid?: string}} $message */
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:190:        /** @var array{result: array{binary: string|null}} $message */
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:206:        /** @var array{result?: array{frame?: array{guid?: string}}} $message */
vendor/pestphp/pest-plugin-browser/src/Cleanables/Inertia.php:11: * @internal
vendor/pestphp/pest-plugin-browser/src/Cleanables/Inertia.php:20:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Cleanables/Inertia.php:24:            // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Configuration.php:12: * @internal
vendor/pestphp/pest-plugin-browser/src/Configuration.php:14: * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/Plugin.php:23: * @internal
vendor/pestphp/pest-plugin-browser/src/Plugin.php:25:final class Plugin implements Bootable, HandlesArguments, Terminable // @pest-arch-ignore-line
vendor/pestphp/pest-plugin-browser/src/Plugin.php:45:                /** @var TestStatus $status */
vendor/pestphp/pest-plugin-browser/src/Plugin.php:46:                $status = $this->status(); // @phpstan-ignore-line
vendor/pestphp/pest-plugin-browser/src/Plugin.php:62:     * @param  array<int, string>  $arguments}
vendor/pestphp/pest-plugin-browser/src/Plugin.php:161:     * @throws OptionNotSupportedInParallelException
vendor/pestphp/pest-plugin-browser/src/Playwright/JSHandle.php:14: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/JSHandle.php:82:        return (string) $value; // @phpstan-ignore-line // temporary
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithFrames.php:12: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Drivers/NullableHttpServer.php:11: * @internal
vendor/pestphp/pest-plugin-browser/src/Drivers/NullableHttpServer.php:13: * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/ServerManager.php:19: * @internal
vendor/pestphp/pest-plugin-browser/src/ServerManager.php:21: * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/GlobalState.php:12: * @internal
vendor/pestphp/pest-plugin-b…21414 chars truncated…sertions.php:22:        /** @var array{ scheme: string, host: string, port?: int, path?: string} $segments */
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:138:        /** @var non-empty-string $actualPath */
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:153:     * @param  array<string, mixed>  $parameters
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:326:     * @return array<int|string, array<array-key, mixed>|string>
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:330:        /** @var array{ scheme: string, host: string, port?: int, path?: string, query?: string} */
vendor/pestphp/pest-plugin-browser/src/Support/JavaScriptSerializer.php:12: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/JavaScriptSerializer.php:19:     * @return array<string, mixed>
vendor/pestphp/pest-plugin-browser/src/Support/JavaScriptSerializer.php:32:     * @return array<string, mixed>
vendor/pestphp/pest-plugin-browser/src/Support/JavaScriptSerializer.php:93:        return ['s' => (string) $value]; // @phpstan-ignore-line
vendor/pestphp/pest-plugin-browser/src/Support/JavaScriptSerializer.php:106:         * @var array{
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesConsoleAssertions.php:14: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesConsoleAssertions.php:16: * @phpstan-import-type Violations from AccessibilityFormatter
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesConsoleAssertions.php:108:        /** @var Violations|null $violations */
vendor/pestphp/pest-plugin-browser/src/Support/Selector.php:41:        return str_starts_with($selector, '@');
vendor/pestphp/pest-plugin-browser/src/Support/Selector.php:147:     * @param  array<string, string|bool>  $options
vendor/pestphp/pest-plugin-browser/src/Support/BrowserTestIdentifier.php:14: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/BrowserTestIdentifier.php:16: * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/Support/BrowserTestIdentifier.php:76:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Support/ImageDiffView.php:25:                    <button @click="activeTab = 'diff'" :class="{ 'active': activeTab === 'diff' }">Diff</button>
vendor/pestphp/pest-plugin-browser/src/Support/ImageDiffView.php:26:                    <button @click="activeTab = 'silder'" :class="{ 'active': activeTab === 'silder' }">Slider</button>
vendor/pestphp/pest-plugin-browser/src/Support/ImageDiffView.php:48:        /** @phpstan-ignore-next-line */
vendor/pestphp/pest-plugin-browser/src/Support/Shell.php:8: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/Shell.php:10: * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/Support/Str.php:8: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/PackageJsonDirectory.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/Port.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/Port.php:30:            // @codeCoverageIgnoreStart
vendor/pestphp/pest-plugin-browser/src/Support/Port.php:32:            // @codeCoverageIgnoreEnd
vendor/pestphp/pest-plugin-browser/src/Support/ComputeUrl.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/Screenshot.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/Screenshot.php:46:            // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Support/Screenshot.php:51:            @mkdir(self::dir(), 0755, true);
vendor/pestphp/pest-plugin-browser/src/Support/Screenshot.php:62:     * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/Support/Screenshot.php:79:                    @unlink($file);
vendor/pestphp/pest-plugin-browser/src/Support/Screenshot.php:83:            @rmdir($dir);
vendor/pestphp/pest-plugin-browser/src/Support/AccessibilityFormatter.php:8: * @phpstan-type Violations array<int, array{
vendor/pestphp/pest-plugin-browser/src/Support/AccessibilityFormatter.php:35:     * @param  Violations  $violations
vendor/pestphp/pest-plugin-browser/src/Support/GuessLocator.php:12: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/GuessLocator.php:39:            $id = Selector::escapeForAttributeSelectorOrRegex(str_replace('@', '', $selector), true);
vendor/pestphp/pest-plugin-browser/src/Support/GuessLocator.php:43:                    "[data-testid=$id], [data-test=$id]",
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesElementAssertions.php:11: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesElementAssertions.php:587:     * @deprecated Use `assertSee` instead.
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesElementAssertions.php:599:     * @param  string  $haystack  String to look in
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesElementAssertions.php:600:     * @param  array<int, string>  $needles  List of needles to look for in haystack


Output:
Chunk ID: b1341a
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 7854
Output:
vendor/pestphp/pest-plugin-browser/src/Browsable.php:14: * @internal
vendor/pestphp/pest-plugin-browser/src/Browsable.php:21:     * @internal
vendor/pestphp/pest-plugin-browser/src/Browsable.php:37:     * @template TUrl of array<int, string>|string
vendor/pestphp/pest-plugin-browser/src/Browsable.php:39:     * @param  TUrl  $url
vendor/pestphp/pest-plugin-browser/src/Browsable.php:40:     * @param  array<string, mixed>  $options
vendor/pestphp/pest-plugin-browser/src/Browsable.php:41:     * @return (TUrl is array<int, string> ? ArrayablePendingAwaitablePage : PendingAwaitablePage)
vendor/pestphp/pest-plugin-browser/src/Browsable.php:65:     * @return array <string, string>
vendor/pestphp/pest-plugin-browser/src/Cleanables/Livewire.php:11: * @internal
vendor/pestphp/pest-plugin-browser/src/Cleanables/Livewire.php:22:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/HasWaitCapabilities.php:10: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Cleanables/Ziggy.php:11: * @internal
vendor/pestphp/pest-plugin-browser/src/Cleanables/Ziggy.php:20:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Execution.php:20: * @internal
vendor/pestphp/pest-plugin-browser/src/Execution.php:53:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Execution.php:57:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Execution.php:62:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Execution.php:117:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Execution.php:174:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:13: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:38:     * @param  array<string, mixed>  $params
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:50:        /** @var array{result?: array{value: mixed}} $message */
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:109:     * @return array<mixed>
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:131:        /** @var array{method: string|null, params: array{type: string|null, guid: string}} $message */
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:134:                // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:165:     * @return array<Element>
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:171:        /** @var array{method?: string|null, params: array{type?: string|null, guid?: string}} $message */
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:190:        /** @var array{result: array{binary: string|null}} $message */
vendor/pestphp/pest-plugin-browser/src/Playwright/Concerns/InteractsWithPlaywright.php:206:        /** @var array{result?: array{frame?: array{guid?: string}}} $message */
vendor/pestphp/pest-plugin-browser/src/Cleanables/Inertia.php:11: * @internal
vendor/pestphp/pest-plugin-browser/src/Cleanables/Inertia.php:20:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Cleanables/Inertia.php:24:            // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Configuration.php:12: * @internal
vendor/pestphp/pest-plugin-browser/src/Configuration.php:14: * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/Plugin.php:23: * @internal
vendor/pestphp/pest-plugin-browser/src/Plugin.php:25:final class Plugin implements Bootable, HandlesArguments, Terminable // @pest-arch-ignore-line
vendor/pestphp/pest-plugin-browser/src/Plugin.php:45:                /** @var TestStatus $status */
vendor/pestphp/pest-plugin-browser/src/Plugin.php:46:                $status = $this->status(); // @phpstan-ignore-line
vendor/pestphp/pest-plugin-browser/src/Plugin.php:62:     * @param  array<int, string>  $arguments}
vendor/pestphp/pest-plugin-browser/src/Plugin.php:161:     * @throws OptionNotSupportedInParallelException
vendor/pestphp/pest-plugin-browser/src/Playwright/JSHandle.php:14: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/JSHandle.php:82:        return (string) $value; // @phpstan-ignore-line // temporary
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithFrames.php:12: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Drivers/NullableHttpServer.php:11: * @internal
vendor/pestphp/pest-plugin-browser/src/Drivers/NullableHttpServer.php:13: * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/ServerManager.php:19: * @internal
vendor/pestphp/pest-plugin-browser/src/ServerManager.php:21: * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/GlobalState.php:12: * @internal
vendor/pestphp/pest-plugin-browser/src/GlobalState.php:14: * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/GlobalState.php:21:     * @var array<int, class-string<Contracts\Cleanable>>
vendor/pestphp/pest-plugin-browser/src/GlobalState.php:35:            /** @var Contracts\Cleanable $instance */
vendor/pestphp/pest-plugin-browser/src/Playwright/Client.php:15: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/Client.php:69:     * @param  array<string, mixed>  $params
vendor/pestphp/pest-plugin-browser/src/Playwright/Client.php:70:     * @param  array<string, mixed>  $meta
vendor/pestphp/pest-plugin-browser/src/Playwright/Client.php:71:     * @return Generator<array<string, mixed>>
vendor/pestphp/pest-plugin-browser/src/Playwright/Client.php:91:            /** @var array{id: string|null, params: array{add: string|null}, error: array{error: array{message: string|null}}} $response */
vendor/pestphp/pest-plugin-browser/src/Enums/AccessibilityIssueLevel.php:8: * @internal
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesScreenshotAssertions.php:11: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Contracts/HttpServer.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Contracts/HttpServer.php:47:     * @throws Throwable
vendor/pestphp/pest-plugin-browser/src/Playwright/InitScript.php:8: * @internal
vendor/pestphp/pest-plugin-browser/src/Filters/UsesBrowserTestCaseMethodFilter.php:19: * @internal
vendor/pestphp/pest-plugin-browser/src/Filters/UsesBrowserTestCaseMethodFilter.php:21: * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/Playwright/Element.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/Element.php:28:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Element.php:54:     * @return array{x: float, y: float, width: float, height: float}|null
vendor/pestphp/pest-plugin-browser/src/Playwright/Element.php:79:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Element.php:89:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Element.php:99:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Element.php:110:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Playwright.php:11: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/Playwright.php:18:     * @var array<string, BrowserFactory>
vendor/pestphp/pest-plugin-browser/src/Playwright/Playwright.php:219:     * @template TReturnType
vendor/pestphp/pest-plugin-browser/src/Playwright/Playwright.php:221:     * @param  callable(): TReturnType  $callback
vendor/pestphp/pest-plugin-browser/src/Playwright/Playwright.php:222:     * @return TReturnType
vendor/pestphp/pest-plugin-browser/src/Playwright/Playwright.php:249:        /** @var array{method: string|null, params: array{type: string|null, guid: string, initializer: array{name: string|null, preLaunchedBrowser?: array{guid: string}}}} $message */
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:17: * @mixin PendingAwaitablePage
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:19: * @implements ArrayAccess<int, PendingAwaitablePage|On>
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:20: * @implements IteratorAggregate<int, PendingAwaitablePage|On>
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:27:     * @param  array<int, PendingAwaitablePage|On>  $pendingAwaitablePages
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:38:     * @param  array<int, mixed>  $arguments
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:43:            // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:61:     * @return Traversable<int, PendingAwaitablePage|On>
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:63:     * @internal
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:73:     * @internal
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:83:     * @throws OutOfBoundsException
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:85:     * @internal
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:99:     * @internal
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:113:     * @internal
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:123:     * @internal
vendor/pestphp/pest-plugin-browser/src/Api/ArrayablePendingAwaitablePage.php:133:     * @throws ExpectationFailedException
vendor/pestphp/pest-plugin-browser/src/Drivers/LaravelHttpServer.php:32: * @internal
vendor/pestphp/pest-plugin-browser/src/Drivers/LaravelHttpServer.php:34: * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/Drivers/LaravelHttpServer.php:68:        // @codeCoverageIgnoreStart
vendor/pestphp/pest-plugin-browser/src/Drivers/LaravelHttpServer.php:116:        // @codeCoverageIgnoreStart
vendor/pestphp/pest-plugin-browser/src/Drivers/LaravelHttpServer.php:181:     * @throws Throwable
vendor/pestphp/pest-plugin-browser/src/Drivers/LaravelHttpServer.php:229:        $query = $uri->getQuery() ?? ''; // @phpstan-ignore-line
vendor/pestphp/pest-plugin-browser/src/Drivers/LaravelHttpServer.php:248:        $cookies = array_merge($cookies, test()->prepareCookiesForRequest()); // @phpstan-ignore-line
vendor/pestphp/pest-plugin-browser/src/Drivers/LaravelHttpServer.php:249:        /** @var array<string, string> $serverVariables */
vendor/pestphp/pest-plugin-browser/src/Drivers/LaravelHttpServer.php:250:        $serverVariables = test()->serverVariables(); // @phpstan-ignore-line
vendor/pestphp/pest-plugin-browser/src/Drivers/LaravelHttpServer.php:257:            [], // @TODO files...
vendor/pestphp/pest-plugin-browser/src/Drivers/LaravelHttpServer.php:303:                // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Drivers/LaravelHttpServer.php:310:            $response->headers->all(), // @phpstan-ignore-line
vendor/pestphp/pest-plugin-browser/src/Drivers/LaravelHttpServer.php:335:            // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Enums/Device.php:8: * @internal
vendor/pestphp/pest-plugin-browser/src/Enums/Device.php:51:     * @return array{
vendor/pestphp/pest-plugin-browser/src/Exceptions/PlaywrightNotInstalledException.php:12: * @internal
vendor/pestphp/pest-plugin-browser/src/Contracts/Cleanable.php:8: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/Browser.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/Browser.php:24:     * @var array<int, Context>
vendor/pestphp/pest-plugin-browser/src/Playwright/Browser.php:40:     * @param  array<string, mixed>  $options  Options for the context, e.g. ['hasTouch' => true]
vendor/pestphp/pest-plugin-browser/src/Playwright/Browser.php:50:        /** @var array{result: array{context: array{guid: string|null}}} $message */
vendor/pestphp/pest-plugin-browser/src/Contracts/PlaywrightServer.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Contracts/PlaywrightServer.php:27:     * @throws ServerNotFoundException
vendor/pestphp/pest-plugin-browser/src/Playwright/Servers/AlreadyStartedPlaywrightServer.php:12: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/Servers/AlreadyStartedPlaywrightServer.php:29:     * @throws JsonException
vendor/pestphp/pest-plugin-browser/src/Playwright/Servers/AlreadyStartedPlaywrightServer.php:41:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Playwright/Servers/AlreadyStartedPlaywrightServer.php:54:     * @throws JsonException
vendor/pestphp/pest-plugin-browser/src/Playwright/Servers/AlreadyStartedPlaywrightServer.php:79:        @unlink($path);
vendor/pestphp/pest-plugin-browser/src/Playwright/Servers/AlreadyStartedPlaywrightServer.php:109:     * @throws RuntimeException If the process has not been started yet or has stopped unexpectedly.
vendor/pestphp/pest-plugin-browser/src/Enums/BrowserType.php:8: * @internal
vendor/pestphp/pest-plugin-browser/src/Api/PendingAwaitablePage.php:15: * @mixin Webpage|AwaitableWebpage
vendor/pestphp/pest-plugin-browser/src/Api/PendingAwaitablePage.php:27:     * @param  array<string, mixed>  $options
vendor/pestphp/pest-plugin-browser/src/Api/PendingAwaitablePage.php:41:     * @param  array<int, mixed>  $arguments
vendor/pestphp/pest-plugin-browser/src/Api/PendingAwaitablePage.php:47:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Api/PendingAwaitablePage.php:169:     * @param  array<string, mixed>  $options
vendor/pestphp/pest-plugin-browser/src/Api/PendingAwaitablePage.php:194:     * @param  array<string, mixed>  &$options
vendor/pestphp/pest-plugin-browser/src/Api/PendingAwaitablePage.php:210:     * @param  callable(): AwaitableWebpage  $callback
vendor/pestphp/pest-plugin-browser/src/Enums/ColorScheme.php:8: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/BrowserFactory.php:8: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/BrowserFactory.php:63:        /** @var array{result: array{browser: array{guid: string|null}}} $message */
vendor/pestphp/pest-plugin-browser/src/Exceptions/BrowserExpectationFailedException.php:14: * @internal
vendor/pestphp/pest-plugin-browser/src/Exceptions/BrowserExpectationFailedException.php:63:            $e->getPrevious(), // @phpstan-ignore-line
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:10: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:45:     * @param  array<int, string>  $keys
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithElements.php:115:     * @param  array<int, string|int>|string|int  $option
vendor/pestphp/pest-plugin-browser/src/Enums/City.php:70:     * @return array{latitude: float, longitude: float}
vendor/pestphp/pest-plugin-browser/src/Playwright/Context.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/Context.php:49:        /** @var array{method: string|null, params: array{type: string|null, guid: string, initializer: array{url: string}}, result: array{page: array{guid: string|null}}} $message */
vendor/pestphp/pest-plugin-browser/src/Api/TestableLivewire.php:12: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Api/TestableLivewire.php:29:     * @param  array<string, mixed>  $arguments
vendor/pestphp/pest-plugin-browser/src/Api/TestableLivewire.php:33:        /** @phpstan-ignore-next-line */
vendor/pestphp/pest-plugin-browser/src/Playwright/Servers/PlaywrightNpmServer.php:15: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/Servers/PlaywrightNpmServer.php:17: * @codeCoverageIgnore This class is used at plugin level to manage processes.
vendor/pestphp/pest-plugin-browser/src/Playwright/Servers/PlaywrightNpmServer.php:119:     * @throws RuntimeException If the process has not been started yet or has stopped unexpectedly.
vendor/pestphp/pest-plugin-browser/src/Playwright/Servers/PlaywrightNpmServer.php:141:     * @throws PlaywrightNotInstalledException
vendor/pestphp/pest-plugin-browser/src/Exceptions/BrowserAlreadyClosedException.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Exceptions/PlaywrightOutdatedException.php:12: * @internal
vendor/pestphp/pest-plugin-browser/src/Exceptions/PlaywrightOutdatedException.php:22:            'Playwright is outdated. Please run [npm install playwright@latest && npx playwright install] in the root directory of your project.',
vendor/pestphp/pest-plugin-browser/src/Exceptions/ServerNotFoundException.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithTab.php:12: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithTab.php:49:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithTab.php:60:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Api/Webpage.php:101:    private function guessLocator(string $selector, ?string $value = null): Locator
vendor/pestphp/pest-plugin-browser/src/Api/Livewire.php:17:     * @param  array<string, mixed>  $parameters
vendor/pestphp/pest-plugin-browser/src/Api/Livewire.php:30:        /** @var Component $component */
vendor/pestphp/pest-plugin-browser/src/Api/Livewire.php:44:                        @livewireStyles
vendor/pestphp/pest-plugin-browser/src/Api/Livewire.php:47:                        @livewireScripts
vendor/pestphp/pest-plugin-browser/src/Exceptions/PortNotFoundException.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:19: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:71:     * @template TReturn
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:73:     * @param  callable(Page): TReturn  $callback
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:74:     * @return TReturn
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:90:     * @param  array<string, mixed>  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:117:     * @deprecated Use locator($selector)->elementHandle() instead for Element compatibility, or use locator($selector) for Locator-first approach
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:127:     * @return Element[]
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:134:        /** @var array{method?: string|null, params: array{type?: string|null, guid?: string}} $message */
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:159:     * @param  array<string, string|bool>  $params
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:171:        $testIdAttributeName = 'data-testid';
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:251:     * @param  mixed  $arg  Optional argument to pass to the function
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:297:     * @param  array<string, mixed>|null  $options  Additional options like state, strict, timeout
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:324:     * @return array{width: int, height: int}
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:328:        /** @var array{width: int, height: int} $result */
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:379:                return new JSHandle((string) $message['params']['guid']); // @phpstan-ignore-line
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:387:                return new JSHandle($message['result']['handle']['guid']); // @phpstan-ignore-line
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:455:     * @return array<int, array{message: string}>
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:461:        /** @var array<int, array{message: string}> $consoleLogs */
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:469:     * @return array<int, string>
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:481:        /** @var array<int, string> $brokenImages */
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:489:     * @return array<int, array{message: string}>
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:495:        /** @var array<int, array{message: string}> $jsErrors */
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:503:     * @throws ExpectationFailedException
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:533:            /** @var array{result: array{diff: string|null}} $message */
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:605:        /** @var array{result: array{binary: string|null}} $message */
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:618:     * @param  array<string, mixed>  $params
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:652:     * @return array<string, mixed>
vendor/pestphp/pest-plugin-browser/src/Playwright/Page.php:687:            test()->name() // @phpstan-ignore-line
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:13: * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:131:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:143:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:155:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:168:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:201:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:213:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:226:     * @param  array<int, string|int>|string|int  $value
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:272:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:294:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:340:     * @param  array<string, string|bool>  $params
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:354:        $testIdSelector = Selector::getByTestIdSelector('data-testid', $testId);
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:410:     * @param  string|array<string, mixed>  $options  Selector string or filter options array
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:489:     * @internal
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:501:     * @return array<int, self>
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:518:     * @return array<int, string>
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:538:     * @return array<int, string>
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:576:     * @return array{x: float, y: float, width: float, height: float}|null
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:603:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:618:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:641:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:666:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:680:     * @return object|null Frame object with guid property, or null if not an iframe
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:695:     * @return object|null Frame object with guid property, or null if no owner frame
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:745:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:761:     * @param  array<string, mixed>|null  $options
vendor/pestphp/pest-plugin-browser/src/Playwright/Locator.php:775:     * @param  array<string, mixed>  $params
vendor/pestphp/pest-plugin-browser/src/Exceptions/BrowserNotSupportedException.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Exceptions/OptionNotSupportedInParallelException.php:12: * @internal
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithScreen.php:39:            // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Api/AwaitableWebpage.php:16: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Api/AwaitableWebpage.php:23:     * @param  array<int, string>  $nonAwaitableMethods
vendor/pestphp/pest-plugin-browser/src/Api/AwaitableWebpage.php:39:     * @param  array<int, mixed>  $arguments
vendor/pestphp/pest-plugin-browser/src/Api/AwaitableWebpage.php:50:                // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Api/AwaitableWebpage.php:54:                    // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Api/AwaitableWebpage.php:63:            } catch (Throwable) { // @phpstan-ignore-line
vendor/pestphp/pest-plugin-browser/src/Api/From.php:12: * @mixin PendingAwaitablePage
vendor/pestphp/pest-plugin-browser/src/Api/From.php:19:     * @param  array<string, mixed>  $options
vendor/pestphp/pest-plugin-browser/src/Api/On.php:11: * @mixin PendingAwaitablePage
vendor/pestphp/pest-plugin-browser/src/Api/On.php:18:     * @param  array<string, mixed>  $options
vendor/pestphp/pest-plugin-browser/src/Api/On.php:32:     * @param  array<int, mixed>  $arguments
vendor/pestphp/pest-plugin-browser/src/Api/On.php:36:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithToolbar.php:11: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/InteractsWithToolbar.php:28:     * @param  array<string, mixed>  $options
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:11: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:22:        /** @var array{ scheme: string, host: string, port?: int, path?: string} $segments */
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:138:        /** @var non-empty-string $actualPath */
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:153:     * @param  array<string, mixed>  $parameters
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:326:     * @return array<int|string, array<array-key, mixed>|string>
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesUrlAssertions.php:330:        /** @var array{ scheme: string, host: string, port?: int, path?: string, query?: string} */
vendor/pestphp/pest-plugin-browser/src/Support/JavaScriptSerializer.php:12: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/JavaScriptSerializer.php:19:     * @return array<string, mixed>
vendor/pestphp/pest-plugin-browser/src/Support/JavaScriptSerializer.php:32:     * @return array<string, mixed>
vendor/pestphp/pest-plugin-browser/src/Support/JavaScriptSerializer.php:93:        return ['s' => (string) $value]; // @phpstan-ignore-line
vendor/pestphp/pest-plugin-browser/src/Support/JavaScriptSerializer.php:106:         * @var array{
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesConsoleAssertions.php:14: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesConsoleAssertions.php:16: * @phpstan-import-type Violations from AccessibilityFormatter
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesConsoleAssertions.php:108:        /** @var Violations|null $violations */
vendor/pestphp/pest-plugin-browser/src/Support/Selector.php:41:        return str_starts_with($selector, '@');
vendor/pestphp/pest-plugin-browser/src/Support/Selector.php:147:     * @param  array<string, string|bool>  $options
vendor/pestphp/pest-plugin-browser/src/Support/BrowserTestIdentifier.php:14: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/BrowserTestIdentifier.php:16: * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/Support/BrowserTestIdentifier.php:76:        // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Support/ImageDiffView.php:25:                    <button @click="activeTab = 'diff'" :class="{ 'active': activeTab === 'diff' }">Diff</button>
vendor/pestphp/pest-plugin-browser/src/Support/ImageDiffView.php:26:                    <button @click="activeTab = 'silder'" :class="{ 'active': activeTab === 'silder' }">Slider</button>
vendor/pestphp/pest-plugin-browser/src/Support/ImageDiffView.php:48:        /** @phpstan-ignore-next-line */
vendor/pestphp/pest-plugin-browser/src/Support/Shell.php:8: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/Shell.php:10: * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/Support/Str.php:8: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/PackageJsonDirectory.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/Port.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/Port.php:30:            // @codeCoverageIgnoreStart
vendor/pestphp/pest-plugin-browser/src/Support/Port.php:32:            // @codeCoverageIgnoreEnd
vendor/pestphp/pest-plugin-browser/src/Support/ComputeUrl.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/Screenshot.php:10: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/Screenshot.php:46:            // @phpstan-ignore-next-line
vendor/pestphp/pest-plugin-browser/src/Support/Screenshot.php:51:            @mkdir(self::dir(), 0755, true);
vendor/pestphp/pest-plugin-browser/src/Support/Screenshot.php:62:     * @codeCoverageIgnore
vendor/pestphp/pest-plugin-browser/src/Support/Screenshot.php:79:                    @unlink($file);
vendor/pestphp/pest-plugin-browser/src/Support/Screenshot.php:83:            @rmdir($dir);
vendor/pestphp/pest-plugin-browser/src/Support/AccessibilityFormatter.php:8: * @phpstan-type Violations array<int, array{
vendor/pestphp/pest-plugin-browser/src/Support/AccessibilityFormatter.php:35:     * @param  Violations  $violations
vendor/pestphp/pest-plugin-browser/src/Support/GuessLocator.php:12: * @internal
vendor/pestphp/pest-plugin-browser/src/Support/GuessLocator.php:39:            $id = Selector::escapeForAttributeSelectorOrRegex(str_replace('@', '', $selector), true);
vendor/pestphp/pest-plugin-browser/src/Support/GuessLocator.php:43:                    "[data-testid=$id], [data-test=$id]",
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesElementAssertions.php:11: * @mixin Webpage
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesElementAssertions.php:587:     * @deprecated Use `assertSee` instead.
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesElementAssertions.php:599:     * @param  string  $haystack  String to look in
vendor/pestphp/pest-plugin-browser/src/Api/Concerns/MakesElementAssertions.php:600:     * @param  array<int, string>  $needles  List of needles to look for in haystack


sed -n '90,140p' vendor/pestphp/pest-plugin-browser/src/Api/Webpage.php && sed -n '1,110p' vendor/pestphp/pest-plugin-browser/src/Support/GuessLocator.php && sed -n '130,220p' vendor/pestphp/pest-plugin-browser/src/Support/Selector.php


sed -n '90,140p' vendor/pestphp/pest-plugin-browser/src/Api/Webpage.php && sed -n '1,110p' vendor/pestphp/pest-plugin-browser/src/Support/GuessLocator.php && sed -n '130,220p' vendor/pestphp/pest-plugin-browser/src/Support/Selector.php

Selector.php

    /**
     * Gets the page instance.
     */
    public function value(string $selector): string
    {
        return $this->guessLocator($selector)->inputValue();
    }

    /**
     * Gets the locator for the given selector.
     */
    private function guessLocator(string $selector, ?string $value = null): Locator
    {
        return (new GuessLocator($this->page))->for($selector, $value);
    }
}
<?php

declare(strict_types=1);

namespace Pest\Browser\Support;

use Pest\Browser\Playwright\Locator;
use Pest\Browser\Playwright\Page;
use PHPUnit\Framework\ExpectationFailedException;

/**
 * @internal
 */
final readonly class GuessLocator
{
    /**
     * Creates a new guess locator instance.
     */
    public function __construct(
        private Page $page,
    ) {
        //
    }

    /**
     * Guesses the locator for the given page and selector.
     */
    public function for(string $selector, ?string $value = null): Locator
    {
        if (Selector::isExplicit($selector)) {
            if ($value !== null) {
                $selector .= sprintf('[value=%s]', Selector::escapeForAttributeSelectorOrRegex($value, true));
            }

            return $this->page->locator($selector);
        }

        if (Selector::isDataTest($selector)) {
            $id = Selector::escapeForAttributeSelectorOrRegex(str_replace('@', '', $selector), true);

            return $this->page->unstrict(
                fn (): Locator => $this->page->locator(
                    "[data-testid=$id], [data-test=$id]",
                ),
            );
        }

        foreach (['[id="%s"]', '[name="%s"]'] as $format) {
            $formattedSelector = sprintf($format, $selector);

            if ($value !== null) {
                $formattedSelector .= sprintf('[value=%s]', Selector::escapeForAttributeSelectorOrRegex($value, true));
            }

            $locator = $this->page->unstrict(
                fn (): Locator => $this->page->locator($formattedSelector),
            );

            if ($locator->count() > 0) {
                return $locator;
            }
        }

        if ($value !== null) {
            return throw new ExpectationFailedException(
                sprintf('Selector [%s] does not match any element.', $selector)
            );
        }

        return $this->page->unstrict(
            fn (): Locator => $this->page->getByText($selector, true),
        );
    }
}
     */
    public static function escapeForAttributeSelector(string $text, bool $exact = false): string
    {
        $escapedText = str_replace('\\', '\\\\', $text);
        $escapedText = str_replace('"', '\\"', $escapedText);

        if ($exact) {
            return "\"{$escapedText}\"";
        }

        return "\"{$escapedText}\"i";

    }

    /**
     * Get selector by role.
     *
     * @param  array<string, string|bool>  $options
     */
    public static function getByRoleSelector(string $role, array $options = []): string
    {
        $props = [];

        if (isset($options['checked'])) {
            $props['checked'] = (bool) $options['checked'] ? 'true' : 'false';
        }
        if (isset($options['disabled'])) {
            $props['disabled'] = (bool) $options['disabled'] ? 'true' : 'false';
        }
        if (isset($options['selected'])) {
            $props['selected'] = (bool) $options['selected'] ? 'true' : 'false';
        }
        if (isset($options['expanded'])) {
            $props['expanded'] = (bool) $options['expanded'] ? 'true' : 'false';
        }
        if (isset($options['includeHidden'])) {
            $props['include-hidden'] = (bool) $options['includeHidden'] ? 'true' : 'false';
        }
        if (isset($options['level'])) {
            $props['level'] = (string) $options['level'];
        }
        if (isset($options['name'])) {
            $exact = $options['exact'] ?? false;
            $props['name'] = self::escapeForAttributeSelector((string) $options['name'], (bool) $exact);
        }
        if (isset($options['pressed'])) {
            $props['pressed'] = (bool) $options['pressed'] ? 'true' : 'false';
        }

        $propsStr = '';
        foreach ($props as $k => $v) {
            $propsStr .= '['.$k.'='.$v.']';
        }

        return 'internal:'."role={$role}{$propsStr}";
    }
}


Output:
Chunk ID: d00fc7
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1077
Output:
    /**
     * Gets the page instance.
     */
    public function value(string $selector): string
    {
        return $this->guessLocator($selector)->inputValue();
    }

    /**
     * Gets the locator for the given selector.
     */
    private function guessLocator(string $selector, ?string $value = null): Locator
    {
        return (new GuessLocator($this->page))->for($selector, $value);
    }
}
<?php

declare(strict_types=1);

namespace Pest\Browser\Support;

use Pest\Browser\Playwright\Locator;
use Pest\Browser\Playwright\Page;
use PHPUnit\Framework\ExpectationFailedException;

/**
 * @internal
 */
final readonly class GuessLocator
{
    /**
     * Creates a new guess locator instance.
     */
    public function __construct(
        private Page $page,
    ) {
        //
    }

    /**
     * Guesses the locator for the given page and selector.
     */
    public function for(string $selector, ?string $value = null): Locator
    {
        if (Selector::isExplicit($selector)) {
            if ($value !== null) {
                $selector .= sprintf('[value=%s]', Selector::escapeForAttributeSelectorOrRegex($value, true));
            }

            return $this->page->locator($selector);
        }

        if (Selector::isDataTest($selector)) {
            $id = Selector::escapeForAttributeSelectorOrRegex(str_replace('@', '', $selector), true);

            return $this->page->unstrict(
                fn (): Locator => $this->page->locator(
                    "[data-testid=$id], [data-test=$id]",
                ),
            );
        }

        foreach (['[id="%s"]', '[name="%s"]'] as $format) {
            $formattedSelector = sprintf($format, $selector);

            if ($value !== null) {
                $formattedSelector .= sprintf('[value=%s]', Selector::escapeForAttributeSelectorOrRegex($value, true));
            }

            $locator = $this->page->unstrict(
                fn (): Locator => $this->page->locator($formattedSelector),
            );

            if ($locator->count() > 0) {
                return $locator;
            }
        }

        if ($value !== null) {
            return throw new ExpectationFailedException(
                sprintf('Selector [%s] does not match any element.', $selector)
            );
        }

        return $this->page->unstrict(
            fn (): Locator => $this->page->getByText($selector, true),
        );
    }
}
     */
    public static function escapeForAttributeSelector(string $text, bool $exact = false): string
    {
        $escapedText = str_replace('\\', '\\\\', $text);
        $escapedText = str_replace('"', '\\"', $escapedText);

        if ($exact) {
            return "\"{$escapedText}\"";
        }

        return "\"{$escapedText}\"i";

    }

    /**
     * Get selector by role.
     *
     * @param  array<string, string|bool>  $options
     */
    public static function getByRoleSelector(string $role, array $options = []): string
    {
        $props = [];

        if (isset($options['checked'])) {
            $props['checked'] = (bool) $options['checked'] ? 'true' : 'false';
        }
        if (isset($options['disabled'])) {
            $props['disabled'] = (bool) $options['disabled'] ? 'true' : 'false';
        }
        if (isset($options['selected'])) {
            $props['selected'] = (bool) $options['selected'] ? 'true' : 'false';
        }
        if (isset($options['expanded'])) {
            $props['expanded'] = (bool) $options['expanded'] ? 'true' : 'false';
        }
        if (isset($options['includeHidden'])) {
            $props['include-hidden'] = (bool) $options['includeHidden'] ? 'true' : 'false';
        }
        if (isset($options['level'])) {
            $props['level'] = (string) $options['level'];
        }
        if (isset($options['name'])) {
            $exact = $options['exact'] ?? false;
            $props['name'] = self::escapeForAttributeSelector((string) $options['name'], (bool) $exact);
        }
        if (isset($options['pressed'])) {
            $props['pressed'] = (bool) $options['pressed'] ? 'true' : 'false';
        }

        $propsStr = '';
        foreach ($props as $k => $v) {
            $propsStr .= '['.$k.'='.$v.']';
        }

        return 'internal:'."role={$role}{$propsStr}";
    }
}


rg -n "desktop-user-menu|data-test|Log Out|auth\(\)->user" resources/views -g '*.blade.php' && sed -n '1,180p' resources/views/components/desktop-user-menu.blade.php


rg -n "desktop-user-menu|data-test|Log Out|auth\(\)->user" resources/views -g '*.blade.php' && sed -n '1,180p' resources/views/components/desktop-user-menu.blade.php

rg -n "desktop-user-menu|data-test|Log Out|auth\\(\\)->user" resources/views -g '*.blade.php'

Question: desktop-user-menu|data-test|Log Out|auth\(\)->user

desktop-user-menu.blade.php

resources/views/layouts/app/sidebar.blade.php:97:            <x-desktop-user-menu class="hidden lg:block" :name="auth()->user()->name" />
resources/views/layouts/app/sidebar.blade.php:108:                    :initials="auth()->user()->initials()"
resources/views/layouts/app/sidebar.blade.php:117:                                    :name="auth()->user()->name"
resources/views/layouts/app/sidebar.blade.php:118:                                    :initials="auth()->user()->initials()"
resources/views/layouts/app/sidebar.blade.php:122:                                    <flux:heading class="truncate">{{ auth()->user()->name }}</flux:heading>
resources/views/layouts/app/sidebar.blade.php:123:                                    <flux:text class="truncate">{{ auth()->user()->email }}</flux:text>
resources/views/layouts/app/sidebar.blade.php:146:                            data-test="logout-button"
resources/views/layouts/app/sidebar.blade.php:148:                            {{ __('Log Out') }}
resources/views/components/desktop-user-menu.blade.php:4:        :initials="auth()->user()->initials()"
resources/views/components/desktop-user-menu.blade.php:6:        data-test="sidebar-menu-button"
resources/views/components/desktop-user-menu.blade.php:12:                :name="auth()->user()->name"
resources/views/components/desktop-user-menu.blade.php:13:                :initials="auth()->user()->initials()"
resources/views/components/desktop-user-menu.blade.php:16:                <flux:heading class="truncate">{{ auth()->user()->name }}</flux:heading>
resources/views/components/desktop-user-menu.blade.php:17:                <flux:text class="truncate">{{ auth()->user()->email }}</flux:text>
resources/views/components/desktop-user-menu.blade.php:32:                    data-test="logout-button"
resources/views/components/desktop-user-menu.blade.php:34:                    {{ __('Log Out') }}
resources/views/layouts/app/header.blade.php:44:            <x-desktop-user-menu />
resources/views/livewire/admin/auth/login.blade.php:27:        <flux:button variant="primary" type="submit" class="w-full" data-test="admin-login-button">
resources/views/livewire/admin/products/form.blade.php:48:                            data-test="product-media-input"
resources/views/livewire/admin/products/form.blade.php:52:                            <flux:button type="button" wire:click="uploadMedia" variant="primary" icon="cloud-arrow-up" wire:loading.attr="disabled" wire:target="newMedia,uploadMedia" data-test="product-media-upload-button">
resources/views/livewire/auth/reset-password.blade.php:46:                <flux:button type="submit" variant="primary" class="w-full" data-test="reset-password-button">
resources/views/livewire/auth/login.blade.php:46:                <flux:button variant="primary" type="submit" class="w-full" data-test="login-button">
resources/views/livewire/auth/register.blade.php:56:                <flux:button type="submit" variant="primary" class="w-full" data-test="register-user-button">
resources/views/livewire/auth/forgot-password.blade.php:21:            <flux:button variant="primary" type="submit" class="w-full" data-test="email-password-reset-link-button">
resources/views/livewire/auth/confirm-password.blade.php:23:            <flux:button variant="primary" type="submit" class="w-full" data-test="confirm-password-button">
resources/views/livewire/auth/verify-email.blade.php:23:                <flux:button variant="ghost" type="submit" class="text-sm cursor-pointer" data-test="logout-button">
resources/views/livewire/storefront/account/auth/login.blade.php:31:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-login-button">
resources/views/livewire/storefront/account/auth/register.blade.php:43:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-register-button">
resources/views/livewire/storefront/account/auth/reset-password.blade.php:33:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-reset-password-button">
resources/views/livewire/storefront/account/auth/forgot-password.blade.php:21:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-forgot-password-button">
<flux:dropdown position="bottom" align="start">
    <flux:sidebar.profile
        {{ $attributes->only('name') }}
        :initials="auth()->user()->initials()"
        icon:trailing="chevrons-up-down"
        data-test="sidebar-menu-button"
    />

    <flux:menu>

            <flux:avatar
                :name="auth()->user()->name"
                :initials="auth()->user()->initials()"
            />

                <flux:heading class="truncate">{{ auth()->user()->name }}</flux:heading>
                <flux:text class="truncate">{{ auth()->user()->email }}</flux:text>

        <flux:menu.separator />
        <flux:menu.radio.group>
            <flux:menu.item :href="route('profile.edit')" icon="cog" wire:navigate>
                {{ __('Settings') }}
            </flux:menu.item>
            <form method="POST" action="{{ route('logout') }}" class="w-full">
                @csrf
                <flux:menu.item
                    as="button"
                    type="submit"
                    icon="arrow-right-start-on-rectangle"
                    class="w-full cursor-pointer"
                    data-test="logout-button"
                >
                    {{ __('Log Out') }}
                </flux:menu.item>
            </form>
        </flux:menu.radio.group>
    </flux:menu>
</flux:dropdown>


Output:
Chunk ID: 238972
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1447
Output:
resources/views/layouts/app/sidebar.blade.php:97:            <x-desktop-user-menu class="hidden lg:block" :name="auth()->user()->name" />
resources/views/layouts/app/sidebar.blade.php:108:                    :initials="auth()->user()->initials()"
resources/views/layouts/app/sidebar.blade.php:117:                                    :name="auth()->user()->name"
resources/views/layouts/app/sidebar.blade.php:118:                                    :initials="auth()->user()->initials()"
resources/views/layouts/app/sidebar.blade.php:122:                                    <flux:heading class="truncate">{{ auth()->user()->name }}</flux:heading>
resources/views/layouts/app/sidebar.blade.php:123:                                    <flux:text class="truncate">{{ auth()->user()->email }}</flux:text>
resources/views/layouts/app/sidebar.blade.php:146:                            data-test="logout-button"
resources/views/layouts/app/sidebar.blade.php:148:                            {{ __('Log Out') }}
resources/views/components/desktop-user-menu.blade.php:4:        :initials="auth()->user()->initials()"
resources/views/components/desktop-user-menu.blade.php:6:        data-test="sidebar-menu-button"
resources/views/components/desktop-user-menu.blade.php:12:                :name="auth()->user()->name"
resources/views/components/desktop-user-menu.blade.php:13:                :initials="auth()->user()->initials()"
resources/views/components/desktop-user-menu.blade.php:16:                <flux:heading class="truncate">{{ auth()->user()->name }}</flux:heading>
resources/views/components/desktop-user-menu.blade.php:17:                <flux:text class="truncate">{{ auth()->user()->email }}</flux:text>
resources/views/components/desktop-user-menu.blade.php:32:                    data-test="logout-button"
resources/views/components/desktop-user-menu.blade.php:34:                    {{ __('Log Out') }}
resources/views/layouts/app/header.blade.php:44:            <x-desktop-user-menu />
resources/views/livewire/admin/auth/login.blade.php:27:        <flux:button variant="primary" type="submit" class="w-full" data-test="admin-login-button">
resources/views/livewire/admin/products/form.blade.php:48:                            data-test="product-media-input"
resources/views/livewire/admin/products/form.blade.php:52:                            <flux:button type="button" wire:click="uploadMedia" variant="primary" icon="cloud-arrow-up" wire:loading.attr="disabled" wire:target="newMedia,uploadMedia" data-test="product-media-upload-button">
resources/views/livewire/auth/reset-password.blade.php:46:                <flux:button type="submit" variant="primary" class="w-full" data-test="reset-password-button">
resources/views/livewire/auth/login.blade.php:46:                <flux:button variant="primary" type="submit" class="w-full" data-test="login-button">
resources/views/livewire/auth/register.blade.php:56:                <flux:button type="submit" variant="primary" class="w-full" data-test="register-user-button">
resources/views/livewire/auth/forgot-password.blade.php:21:            <flux:button variant="primary" type="submit" class="w-full" data-test="email-password-reset-link-button">
resources/views/livewire/auth/confirm-password.blade.php:23:            <flux:button variant="primary" type="submit" class="w-full" data-test="confirm-password-button">
resources/views/livewire/auth/verify-email.blade.php:23:                <flux:button variant="ghost" type="submit" class="text-sm cursor-pointer" data-test="logout-button">
resources/views/livewire/storefront/account/auth/login.blade.php:31:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-login-button">
resources/views/livewire/storefront/account/auth/register.blade.php:43:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-register-button">
resources/views/livewire/storefront/account/auth/reset-password.blade.php:33:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-reset-password-button">
resources/views/livewire/storefront/account/auth/forgot-password.blade.php:21:        <flux:button variant="primary" type="submit" class="w-full" data-test="customer-forgot-password-button">
<flux:dropdown position="bottom" align="start">
    <flux:sidebar.profile
        {{ $attributes->only('name') }}
        :initials="auth()->user()->initials()"
        icon:trailing="chevrons-up-down"
        data-test="sidebar-menu-button"
    />

    <flux:menu>

            <flux:avatar
                :name="auth()->user()->name"
                :initials="auth()->user()->initials()"
            />

                <flux:heading class="truncate">{{ auth()->user()->name }}</flux:heading>
                <flux:text class="truncate">{{ auth()->user()->email }}</flux:text>

        <flux:menu.separator />
        <flux:menu.radio.group>
            <flux:menu.item :href="route('profile.edit')" icon="cog" wire:navigate>
                {{ __('Settings') }}
            </flux:menu.item>
            <form method="POST" action="{{ route('logout') }}" class="w-full">
                @csrf
                <flux:menu.item
                    as="button"
                    type="submit"
                    icon="arrow-right-start-on-rectangle"
                    class="w-full cursor-pointer"
                    data-test="logout-button"
                >
                    {{ __('Log Out') }}
                </flux:menu.item>
            </form>
        </flux:menu.radio.group>
    </flux:menu>
</flux:dropdown>


sed -n '1,110p' resources/views/layouts/app/header.blade.php && rg -n "layouts\.app|layouts.app|<x-layouts.app|component_layout|app\.sidebar|app\.header|desktop-user-menu" resources app config -g '*.php' -g '*.blade.php'


rg -n "function logout|route\('logout'|admin.logout|redirect\(\)->route\('admin.login'|LogoutResponse" app resources routes tests config vendor/laravel/fortify/src/Http/Responses -g '*.php' -g '*.blade.php'