<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[New Level]]></title><description><![CDATA[New Level]]></description><link>https://newlevel.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 17:04:23 GMT</lastBuildDate><atom:link href="https://newlevel.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[A Simple, Blazing-Fast Searchable Selector Using Laravel & Alpine.js]]></title><description><![CDATA[Overview
Learn how to build a fast, searchable selection modal using Laravel and Alpine.js. This tutorial shows the simple approach that performs well for small to medium datasets.
Tech Stack

Laravel - Backend framework

Alpine.js - Lightweight Java...]]></description><link>https://newlevel.hashnode.dev/real-time-search-with-laravel-and-alpinejs-the-simple-approach</link><guid isPermaLink="true">https://newlevel.hashnode.dev/real-time-search-with-laravel-and-alpinejs-the-simple-approach</guid><category><![CDATA[Laravel]]></category><category><![CDATA[alpinejs]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[PHP]]></category><category><![CDATA[frontend]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[performance]]></category><category><![CDATA[search]]></category><dc:creator><![CDATA[Manuk Minasyan]]></dc:creator><pubDate>Fri, 19 Sep 2025 20:19:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1758313274354/6639b4e8-094e-4739-89c4-294865b728e6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-overview">Overview</h2>
<p>Learn how to build a fast, searchable selection modal using Laravel and Alpine.js. This tutorial shows the simple approach that performs well for small to medium datasets.</p>
<h2 id="heading-tech-stack">Tech Stack</h2>
<ul>
<li><p><strong>Laravel</strong> - Backend framework</p>
</li>
<li><p><strong>Alpine.js</strong> - Lightweight JavaScript reactivity</p>
</li>
<li><p><strong>Tailwind CSS</strong> - Utility-first styling</p>
</li>
</ul>
<h2 id="heading-the-approach">The Approach</h2>
<h3 id="heading-1-pre-compute-search-data">1. Pre-compute Search Data</h3>
<p>Do the heavy work once during render:</p>
<pre><code class="lang-php"><span class="hljs-comment">// Pre-compute search text for each item</span>
$searchText = strtolower($item[<span class="hljs-string">'name'</span>] . <span class="hljs-string">' '</span> . $item[<span class="hljs-string">'description'</span>]);
</code></pre>
<h3 id="heading-2-alpinejs-for-search-and-selection">2. Alpine.js for Search and Selection</h3>
<p>Simple Alpine.js component:</p>
<pre><code class="lang-javascript">{
    <span class="hljs-attr">search</span>: <span class="hljs-string">''</span>,
    <span class="hljs-attr">hasResults</span>: <span class="hljs-literal">true</span>,
    <span class="hljs-attr">selectedValue</span>: <span class="hljs-string">''</span>,

    init() {
        <span class="hljs-built_in">this</span>.$watch(<span class="hljs-string">'search'</span>, <span class="hljs-function">() =&gt;</span> <span class="hljs-built_in">this</span>.filterItems());
    },

    filterItems() {
        <span class="hljs-keyword">const</span> searchLower = <span class="hljs-built_in">this</span>.search.toLowerCase().trim();
        <span class="hljs-keyword">const</span> cards = <span class="hljs-built_in">this</span>.$el.querySelectorAll(<span class="hljs-string">'.item-card'</span>);
        <span class="hljs-keyword">let</span> visibleCount = <span class="hljs-number">0</span>;

        cards.forEach(<span class="hljs-function"><span class="hljs-params">card</span> =&gt;</span> {
            <span class="hljs-keyword">const</span> text = card.dataset.searchText || <span class="hljs-string">''</span>;
            <span class="hljs-keyword">const</span> isVisible = searchLower === <span class="hljs-string">''</span> || text.includes(searchLower);
            card.style.display = isVisible ? <span class="hljs-string">''</span> : <span class="hljs-string">'none'</span>;
            <span class="hljs-keyword">if</span> (isVisible) visibleCount++;
        });

        <span class="hljs-built_in">this</span>.hasResults = visibleCount &gt; <span class="hljs-number">0</span>;
    }
}
</code></pre>
<h3 id="heading-3-basic-html-structure">3. Basic HTML Structure</h3>
<pre><code class="lang-html"><span class="hljs-comment">&lt;!-- Search input --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"search"</span> <span class="hljs-attr">x-model</span>=<span class="hljs-string">"search"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Search..."</span> /&gt;</span>

<span class="hljs-comment">&lt;!-- Items grid --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"grid gap-4"</span>&gt;</span>
    <span class="hljs-comment">&lt;!-- Each item has data-search-text attribute --&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item-card"</span> <span class="hljs-attr">data-search-text</span>=<span class="hljs-string">"contact form simple"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">h3</span>&gt;</span>Contact Form<span class="hljs-tag">&lt;/<span class="hljs-name">h3</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Simple contact form<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

<span class="hljs-comment">&lt;!-- Empty state --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">x-show</span>=<span class="hljs-string">"search !== '' &amp;&amp; !hasResults"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>No items found<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">x-on:click</span>=<span class="hljs-string">"search = ''"</span>&gt;</span>Clear search<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<h2 id="heading-key-benefits">Key Benefits</h2>
<h3 id="heading-instant-search-response">Instant Search Response</h3>
<ul>
<li><p>No server requests during search</p>
</li>
<li><p>Direct DOM manipulation for speed</p>
</li>
<li><p>Works well for up to 50 items</p>
</li>
</ul>
<h3 id="heading-progressive-enhancement">Progressive Enhancement</h3>
<ul>
<li><p>Works without JavaScript (graceful degradation)</p>
</li>
<li><p>Accessible by default</p>
</li>
<li><p>Mobile-friendly</p>
</li>
</ul>
<h3 id="heading-simple-maintenance">Simple Maintenance</h3>
<ul>
<li><p>No complex state management</p>
</li>
<li><p>Easy to debug and extend</p>
</li>
<li><p>Standard Laravel patterns</p>
</li>
</ul>
<h2 id="heading-performance-tips">Performance Tips</h2>
<p><strong>Pre-compute when possible:</strong></p>
<pre><code class="lang-php"><span class="hljs-comment">// Do this once during render, not during search</span>
$searchText = strtolower($title . <span class="hljs-string">' '</span> . $description);
</code></pre>
<p><strong>Use direct DOM manipulation:</strong></p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Faster than virtual DOM for small datasets</span>
card.style.display = isVisible ? <span class="hljs-string">''</span> : <span class="hljs-string">'none'</span>;
</code></pre>
<p><strong>Auto-focus for better UX:</strong></p>
<pre><code class="lang-javascript"><span class="hljs-built_in">this</span>.$nextTick(<span class="hljs-function">() =&gt;</span> <span class="hljs-built_in">this</span>.$refs.searchInput?.focus());
</code></pre>
<h2 id="heading-when-to-use-this-approach">When to Use This Approach</h2>
<p><strong>Perfect for:</strong></p>
<ul>
<li><p>Small to medium datasets (&lt; 50 items)</p>
</li>
<li><p>Live search requirements</p>
</li>
<li><p>Simple filtering logic</p>
</li>
<li><p>Laravel applications</p>
</li>
</ul>
<p><strong>Consider alternatives for:</strong></p>
<ul>
<li><p>Large datasets (&gt; 100 items)</p>
</li>
<li><p>Complex search algorithms</p>
</li>
<li><p>Heavy data processing</p>
</li>
</ul>
<h2 id="heading-key-lessons">Key Lessons</h2>
<ol>
<li><p><strong>Start Simple</strong> - Basic DOM manipulation often outperforms complex solutions</p>
</li>
<li><p><strong>Pre-compute When Possible</strong> - Do heavy work once, not repeatedly</p>
</li>
<li><p><strong>Progressive Enhancement</strong> - Build a working baseline first</p>
</li>
<li><p><strong>Alpine.js Shines</strong> - Perfect for form interactions and simple reactivity</p>
</li>
</ol>
<h2 id="heading-complete-working-example">Complete Working Example</h2>
<p>Here's a full implementation you can copy and adapt:</p>
<pre><code class="lang-html">{{-- Quick test component --}}
@php
    $items = [
        'contact' =&gt; ['name' =&gt; 'Contact Form', 'description' =&gt; 'Simple contact form', 'category' =&gt; 'Business'],
        'survey' =&gt; ['name' =&gt; 'Survey Form', 'description' =&gt; 'Multi-question survey', 'category' =&gt; 'Research'],
        'registration' =&gt; ['name' =&gt; 'Event Registration', 'description' =&gt; 'Event signup form', 'category' =&gt; 'Events'],
        'newsletter' =&gt; ['name' =&gt; 'Newsletter Signup', 'description' =&gt; 'Email subscription form', 'category' =&gt; 'Marketing'],
        'feedback' =&gt; ['name' =&gt; 'Feedback Form', 'description' =&gt; 'Customer feedback collection', 'category' =&gt; 'Support'],
    ];
@endphp

<span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Test Searchable Component<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://cdn.tailwindcss.com"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">defer</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">body</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"bg-gray-50 min-h-screen"</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">div</span>
    <span class="hljs-attr">x-data</span>=<span class="hljs-string">"{
        search: '',
        hasResults: true,
        selectedValue: '',

        init() {
            this.$watch('search', () =&gt; this.filterItems());
            this.$nextTick(() =&gt; this.$refs.searchInput?.focus());
        },

        filterItems() {
            const searchLower = this.search.toLowerCase().trim();
            const cards = this.$el.querySelectorAll('.item-card');
            let visibleCount = 0;

            cards.forEach(card =&gt; {
                const text = card.dataset.searchText || '';
                const isVisible = searchLower === '' || text.includes(searchLower);
                card.style.display = isVisible ? '' : 'none';
                if (isVisible) visibleCount++;
            });

            this.hasResults = visibleCount &gt; 0;
        }
    }"</span>
    <span class="hljs-attr">class</span>=<span class="hljs-string">"p-6 max-w-4xl mx-auto"</span>
&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-3xl font-bold mb-8 text-gray-800"</span>&gt;</span>Test: Live Search Component<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>

    {{-- Search Input --}}
    <span class="hljs-tag">&lt;<span class="hljs-name">input</span>
        <span class="hljs-attr">type</span>=<span class="hljs-string">"search"</span>
        <span class="hljs-attr">x-model</span>=<span class="hljs-string">"search"</span>
        <span class="hljs-attr">x-ref</span>=<span class="hljs-string">"searchInput"</span>
        <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Search items..."</span>
        <span class="hljs-attr">class</span>=<span class="hljs-string">"w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent outline-none text-lg"</span>
    /&gt;</span>

    {{-- Items Grid --}}
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"grid gap-4 grid-cols-1 md:grid-cols-2 lg:grid-cols-3 mt-8"</span>&gt;</span>
        @foreach ($items as $value =&gt; $item)
            @php
                $searchText = strtolower($item['name'] . ' ' . $item['description'] . ' ' . $item['category']);
            @endphp

            <span class="hljs-tag">&lt;<span class="hljs-name">label</span>
                <span class="hljs-attr">class</span>=<span class="hljs-string">"item-card cursor-pointer block"</span>
                <span class="hljs-attr">data-search-text</span>=<span class="hljs-string">"{{ $searchText }}"</span>
            &gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">input</span>
                    <span class="hljs-attr">type</span>=<span class="hljs-string">"radio"</span>
                    <span class="hljs-attr">name</span>=<span class="hljs-string">"selected_item"</span>
                    <span class="hljs-attr">value</span>=<span class="hljs-string">"{{ $value }}"</span>
                    <span class="hljs-attr">x-model</span>=<span class="hljs-string">"selectedValue"</span>
                    <span class="hljs-attr">class</span>=<span class="hljs-string">"sr-only"</span>
                /&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">div</span>
                    <span class="hljs-attr">class</span>=<span class="hljs-string">"border rounded-xl p-6 transition-all duration-200 hover:shadow-lg"</span>
                    <span class="hljs-attr">:class</span>=<span class="hljs-string">"selectedValue === '{{ $value }}' ? 'border-blue-600 bg-blue-50 shadow-lg ring-2 ring-blue-100' : 'border-gray-200 bg-white hover:border-gray-300'"</span>
                &gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">h3</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"font-bold text-xl mb-3"</span> <span class="hljs-attr">:class</span>=<span class="hljs-string">"selectedValue === '{{ $value }}' ? 'text-blue-900' : 'text-gray-900'"</span>&gt;</span>{{ $item['name'] }}<span class="hljs-tag">&lt;/<span class="hljs-name">h3</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-gray-600 mb-3 leading-relaxed"</span>&gt;</span>{{ $item['description'] }}<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">span</span>
                        <span class="hljs-attr">class</span>=<span class="hljs-string">"inline-block px-3 py-1 text-sm rounded-full font-medium"</span>
                        <span class="hljs-attr">:class</span>=<span class="hljs-string">"selectedValue === '{{ $value }}' ? 'bg-blue-100 text-blue-800' : 'bg-gray-100 text-gray-700'"</span>
                    &gt;</span>{{ $item['category'] }}<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
        @endforeach
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

    {{-- Empty State --}}
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">x-show</span>=<span class="hljs-string">"search !== '' &amp;&amp; !hasResults"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-center py-16"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-gray-400 mb-6"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">svg</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"w-16 h-16 mx-auto mb-4"</span> <span class="hljs-attr">fill</span>=<span class="hljs-string">"none"</span> <span class="hljs-attr">stroke</span>=<span class="hljs-string">"currentColor"</span> <span class="hljs-attr">viewBox</span>=<span class="hljs-string">"0 0 24 24"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">path</span> <span class="hljs-attr">stroke-linecap</span>=<span class="hljs-string">"round"</span> <span class="hljs-attr">stroke-linejoin</span>=<span class="hljs-string">"round"</span> <span class="hljs-attr">stroke-width</span>=<span class="hljs-string">"1.5"</span> <span class="hljs-attr">d</span>=<span class="hljs-string">"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">path</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">svg</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-xl font-semibold text-gray-600 mb-2"</span>&gt;</span>No items found<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-gray-500"</span>&gt;</span>Try adjusting your search terms<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">button</span>
            <span class="hljs-attr">type</span>=<span class="hljs-string">"button"</span>
            <span class="hljs-attr">x-on:click</span>=<span class="hljs-string">"search = ''"</span>
            <span class="hljs-attr">class</span>=<span class="hljs-string">"px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors font-medium"</span>
        &gt;</span>
            Clear search
        <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

    {{-- Results Info --}}
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"mt-8 p-4 bg-white border border-gray-200 rounded-lg"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"grid grid-cols-1 md:grid-cols-3 gap-4 text-sm"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">strong</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-gray-700"</span>&gt;</span>Current search:<span class="hljs-tag">&lt;/<span class="hljs-name">strong</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-blue-600 font-mono"</span> <span class="hljs-attr">x-text</span>=<span class="hljs-string">"search || '(none)'"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">strong</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-gray-700"</span>&gt;</span>Has results:<span class="hljs-tag">&lt;/<span class="hljs-name">strong</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">:class</span>=<span class="hljs-string">"hasResults ? 'text-green-600' : 'text-red-600'"</span> <span class="hljs-attr">x-text</span>=<span class="hljs-string">"hasResults ? 'Yes' : 'No'"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">strong</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-gray-700"</span>&gt;</span>Selected:<span class="hljs-tag">&lt;/<span class="hljs-name">strong</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-blue-600 font-mono"</span> <span class="hljs-attr">x-text</span>=<span class="hljs-string">"selectedValue || '(none)'"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<h2 id="heading-how-to-use">How to Use</h2>
<ol>
<li><p><strong>Create the component</strong> - Save the above code as a Blade component</p>
</li>
<li><p><strong>Include it</strong> - Use <code>&lt;x-searchable-selector /&gt;</code> in your views</p>
</li>
<li><p><strong>Customize data</strong> - Replace the <code>$items</code> array with your data</p>
</li>
<li><p><strong>Style it</strong> - Adjust Tailwind classes to match your design</p>
</li>
</ol>
<h2 id="heading-key-implementation-details">Key Implementation Details</h2>
<p><strong>Pre-computed search text:</strong></p>
<pre><code class="lang-php">$searchText = strtolower($item[<span class="hljs-string">'name'</span>] . <span class="hljs-string">' '</span> . $item[<span class="hljs-string">'description'</span>] . <span class="hljs-string">' '</span> . $item[<span class="hljs-string">'category'</span>]);
</code></pre>
<p><strong>Alpine.js filtering:</strong></p>
<pre><code class="lang-javascript">cards.forEach(<span class="hljs-function"><span class="hljs-params">card</span> =&gt;</span> {
    <span class="hljs-keyword">const</span> text = card.dataset.searchText || <span class="hljs-string">''</span>;
    <span class="hljs-keyword">const</span> isVisible = searchLower === <span class="hljs-string">''</span> || text.includes(searchLower);
    card.style.display = isVisible ? <span class="hljs-string">''</span> : <span class="hljs-string">'none'</span>;
    <span class="hljs-keyword">if</span> (isVisible) visibleCount++;
});
</code></pre>
<p><strong>Visual selection feedback:</strong></p>
<pre><code class="lang-html">:class="selectedValue === '{{ $value }}' ? 'border-blue-600 bg-blue-50' : 'border-gray-300'"
</code></pre>
<p>This approach scales well for typical use cases and can be enhanced later if requirements grow.</p>
<hr />
<p><em>This tutorial shows the approach used in</em> <a target="_blank" href="https://filaforms.app/"><em>FilaForms</em></a> <em>- Laravel form infrastructure for rapid development.</em></p>
]]></content:encoded></item></channel></rss>