BlatUI
Blocks

Calendar 20

<x-layouts.app title="Calendar 20">
    @php
        $timeSlots = [];
        for ($i = 0; $i < 37; $i++) {
            $totalMinutes = $i * 15;
            $hour = intdiv($totalMinutes, 60) + 9;
            $minute = $totalMinutes % 60;
            $timeSlots[] = sprintf('%02d:%02d', $hour, $minute);
        }
        $bookedDates = ['2025-06-17', '2025-06-18', '2025-06-19'];
    @endphp
    <div class="flex min-h-svh items-center justify-center p-6">
        <div x-data="{ date: '2025-06-12', selectedTime: '10:00' }"
            @calendar-change.window="date = $event.detail"
            x-init="
                $watch('date', () => {});
                window.calendar20Label = (d) => {
                    if (!d) return '';
                    const p = String(d).split('-').map(Number);
                    return new Date(p[0], p[1] - 1, p[2]).toLocaleDateString('en-US', { weekday: 'long', day: 'numeric', month: 'long' });
                };
            ">
            <x-ui.card class="gap-0 p-0">
                <x-ui.card-content class="relative p-0 md:pr-48">
                    <div class="p-6">
                        <x-ui.calendar mode="single" value="2025-06-12" default-month="2025-06-12"
                            :disabled="$bookedDates"
                            :modifiers="['booked' => $bookedDates]"
                            :modifiers-class="['booked' => '[&>button]:line-through opacity-100']"
                            class="bg-transparent p-0 [--cell-size:2.5rem] md:[--cell-size:3rem]" />
                    </div>
                    <div class="no-scrollbar inset-y-0 right-0 flex max-h-72 w-full scroll-pb-6 flex-col gap-4 overflow-y-auto border-t p-6 md:absolute md:max-h-none md:w-48 md:border-l md:border-t-0">
                        <div class="grid gap-2">
                            @foreach ($timeSlots as $time)
                                <x-ui.button variant="outline"
                                    x-on:click="selectedTime = '{{ $time }}'"
                                    x-bind:class="selectedTime === '{{ $time }}'
                                        ? 'bg-primary text-primary-foreground hover:bg-primary/90 border-transparent'
                                        : ''"
                                    class="w-full shadow-none">
                                    {{ $time }}
                                </x-ui.button>
                            @endforeach
                        </div>
                    </div>
                </x-ui.card-content>
                <x-ui.card-footer class="flex flex-col gap-4 border-t !py-5 px-6 md:flex-row">
                    <div class="text-sm">
                        <template x-if="date && selectedTime">
                            <span>
                                Your meeting is booked for
                                <span class="font-medium" x-text="' ' + window.calendar20Label(date) + ' '"></span>
                                at <span class="font-medium" x-text="selectedTime"></span>.
                            </span>
                        </template>
                        <template x-if="!(date && selectedTime)">
                            <span>Select a date and time for your meeting.</span>
                        </template>
                    </div>
                    <x-ui.button variant="outline" class="w-full md:ml-auto md:w-auto"
                        x-bind:disabled="!(date && selectedTime)">
                        Continue
                    </x-ui.button>
                </x-ui.card-footer>
            </x-ui.card>
        </div>
    </div>
</x-layouts.app>