Skip to main content

AI & workflows

Ai Context Bar code

Copy the implementation or inspect every file that belongs to this component unit.

resources/views/components/ui/ai-context-bar.blade.php

@props([
    'projects' => [
        'dzc' => 'dzc',
        'components' => 'components',
    ],
    'selectedProject' => 'dzc',
    'projectName' => 'project',
    'workModes' => [
        'local' => 'Work locally',
        'cloud' => 'Cloud task',
        'review' => 'Review only',
    ],
    'selectedWorkMode' => 'local',
    'workModeName' => 'work_mode',
    'branches' => [
        'main' => 'main',
        'develop' => 'develop',
    ],
    'selectedBranch' => 'main',
    'branchName' => 'branch',
    'disabled' => false,
    'layout' => 'inline',
    'title' => 'Workspace',
    'embedded' => false,
])

@php
    /*
    | Shared project, work mode and branch selectors for AI workflows.
    |
    | layout:
    |   inline  — compact ghost selects for toolbars and footers
    |   stacked — labeled fields for narrow sidebars
    |
    | Usage:
    |   <x-ui.ai-context-bar
    |       :projects="['dzc' => 'dzc']"
    |       :branches="['main' => 'main', 'feature/agents' => 'feature/agents']"
    |   />
    */
    $isStacked = $layout === 'stacked';

    $containerClass = match (true) {
        $isStacked && $embedded => 'min-w-0',
        $isStacked => 'min-w-0 overflow-hidden rounded-2xl border border-gray-200 bg-white shadow-sm dark:border-gray-800 dark:bg-gray-900',
        default => 'flex min-w-0 flex-col gap-2 rounded-2xl border border-gray-200 bg-gray-50 px-4 py-3 dark:border-gray-800 dark:bg-gray-950 sm:flex-row sm:flex-wrap sm:items-center sm:gap-3',
    };

    $inlineSelectClass = 'h-9 w-full appearance-none rounded-lg border border-gray-200 bg-white pe-8 ps-3 text-sm font-medium text-gray-700 shadow-sm transition hover:border-gray-300 hover:bg-gray-50 focus:border-brand-500 focus:ring-1 focus:ring-brand-500 disabled:cursor-default disabled:opacity-50 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200 dark:hover:border-gray-600 dark:hover:bg-gray-800';

    $stackedSelectClass = 'h-10 w-full appearance-none rounded-lg border border-gray-300 bg-white pe-8 ps-9 text-sm font-medium text-gray-700 shadow-sm transition focus:border-brand-500 focus:ring-1 focus:ring-brand-500 disabled:cursor-default disabled:opacity-50 dark:border-gray-700 dark:bg-gray-950 dark:text-gray-200';
@endphp

<div {{ $attributes->merge(['class' => $containerClass]) }}>
    @if ($isStacked)
        @unless ($embedded)
            <div class="border-b border-gray-200 px-4 py-4 dark:border-gray-800 sm:px-5">
                <p class="text-sm font-semibold text-gray-900 dark:text-white">{{ $title }}</p>
                <p class="text-xs text-gray-500 dark:text-gray-400">Project, mode and branch</p>
            </div>
        @endunless

        <div @class(['space-y-4 p-4 sm:p-5', 'border-t border-gray-200 pt-4 dark:border-gray-800' => $embedded])>
            <label class="block">
                <span class="mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300">Project</span>
                <span class="relative block">
                    <x-ui.icon name="folder" size="base" class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" />
                    <select name="{{ $projectName }}" @disabled($disabled) class="{{ $stackedSelectClass }}">
                        @foreach ($projects as $value => $label)
                            <option value="{{ $value }}" @selected($selectedProject === $value)>{{ $label }}</option>
                        @endforeach
                    </select>
                    <x-ui.icon name="caret-down" weight="bold" size="sm" class="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-gray-400" />
                </span>
            </label>

            <label class="block">
                <span class="mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300">Work mode</span>
                <span class="relative block">
                    <x-ui.icon name="laptop" size="base" class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" />
                    <select name="{{ $workModeName }}" @disabled($disabled) class="{{ $stackedSelectClass }}">
                        @foreach ($workModes as $value => $label)
                            <option value="{{ $value }}" @selected($selectedWorkMode === $value)>{{ $label }}</option>
                        @endforeach
                    </select>
                    <x-ui.icon name="caret-down" weight="bold" size="sm" class="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-gray-400" />
                </span>
            </label>

            <label class="block">
                <span class="mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300">Branch</span>
                <span class="relative block">
                    <x-ui.icon name="git-branch" size="base" class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" />
                    <select name="{{ $branchName }}" @disabled($disabled) class="{{ $stackedSelectClass }}">
                        @foreach ($branches as $value => $label)
                            <option value="{{ $value }}" @selected($selectedBranch === $value)>{{ $label }}</option>
                        @endforeach
                    </select>
                    <x-ui.icon name="caret-down" weight="bold" size="sm" class="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-gray-400" />
                </span>
            </label>
        </div>
    @else
        <label class="relative w-full min-w-0 sm:w-44">
            <span class="sr-only">Project</span>
            <x-ui.icon name="folder" size="base" class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" />
            <select name="{{ $projectName }}" @disabled($disabled) class="{{ $inlineSelectClass }} ps-9">
                @foreach ($projects as $value => $label)
                    <option value="{{ $value }}" @selected($selectedProject === $value)>{{ $label }}</option>
                @endforeach
            </select>
            <x-ui.icon name="caret-down" weight="bold" size="sm" class="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-gray-400" />
        </label>

        <label class="relative w-full min-w-0 sm:w-48">
            <span class="sr-only">Work mode</span>
            <x-ui.icon name="laptop" size="base" class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" />
            <select name="{{ $workModeName }}" @disabled($disabled) class="{{ $inlineSelectClass }} ps-9">
                @foreach ($workModes as $value => $label)
                    <option value="{{ $value }}" @selected($selectedWorkMode === $value)>{{ $label }}</option>
                @endforeach
            </select>
            <x-ui.icon name="caret-down" weight="bold" size="sm" class="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-gray-400" />
        </label>

        <label class="relative w-full min-w-0 sm:w-56">
            <span class="sr-only">Branch</span>
            <x-ui.icon name="git-branch" size="base" class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" />
            <select name="{{ $branchName }}" @disabled($disabled) class="{{ $inlineSelectClass }} ps-9">
                @foreach ($branches as $value => $label)
                    <option value="{{ $value }}" @selected($selectedBranch === $value)>{{ $label }}</option>
                @endforeach
            </select>
            <x-ui.icon name="caret-down" weight="bold" size="sm" class="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 text-gray-400" />
        </label>
    @endif
</div>