@extends('layouts.app') @section('title', 'UI Kit') @section('nav_uikit', 'bg-teal-50 text-teal-700 font-semibold') @section('page_title', 'UI Kit') @section('page_subtitle', 'Living style guide — the components and class recipes this project actually uses') @section('content') @php $reservationBadges = [ 'Pending' => 'bg-amber-50 text-amber-700 border-[0.5px] border-amber-200', 'Confirmed' => 'bg-teal-50 text-teal-700 border-[0.5px] border-teal-200', 'Checked In' => 'bg-green-50 text-green-700 border-[0.5px] border-green-200', 'Checked Out' => 'bg-gray-50 text-gray-500 border-[0.5px] border-gray-200', 'Cancelled' => 'bg-red-50 text-red-600 border-[0.5px] border-red-200', 'No Show' => 'bg-orange-50 text-orange-600 border-[0.5px] border-orange-200', ]; $roomBadges = [ 'Available' => 'bg-teal-50 text-teal-700 border-[0.5px] border-teal-200', 'Clean' => 'bg-green-100 text-green-700 border-[0.5px] border-green-300', 'Occupied' => 'bg-teal-700 text-white border-[0.5px] border-teal-700', 'Dirty' => 'bg-amber-100 text-amber-700 border-[0.5px] border-amber-300', 'Maintenance' => 'bg-orange-100 text-orange-700 border-[0.5px] border-orange-300', 'Out of Order' => 'bg-red-100 text-red-700 border-[0.5px] border-red-300', ]; $palette = [ 'teal-600 · primary' => 'bg-teal-600', 'teal-700 · primary hover' => 'bg-teal-700', 'teal-50 · active/soft' => 'bg-teal-50', 'amber-500 · pending/dirty' => 'bg-amber-500', 'green-500 · positive' => 'bg-green-500', 'blue-500 · undo/info' => 'bg-blue-500', 'orange-500 · warning' => 'bg-orange-500', 'red-500 · destructive' => 'bg-red-500', 'purple-500 · group' => 'bg-purple-500', 'gray-200 · borders' => 'bg-gray-200', ]; @endphp
{{-- ===== INTRO ===== --}}

Every sample below is rendered with the exact classes used across NXT-ePMS, with the class recipe underneath for copy-paste. Ground rules: Tailwind v4 (no config file — scanning via @source in app.css), hairline borders (border-[0.5px]), teal as the only accent, no gradients or heavy shadows, Alpine.js from CDN.

{{-- ===== COLORS ===== --}}

Color Palette

@foreach($palette as $label => $class)

{{ $label }}

@endforeach
{{-- ===== TYPOGRAPHY ===== --}}

Typography

Page Title

text-2xl font-bold text-gray-900

Section / Card Label

text-gray-400 text-xs font-semibold uppercase tracking-wider

Tiny Field Label

text-gray-400 text-[10px] uppercase tracking-wider

Body text — the default for table cells and paragraphs.

text-sm text-gray-700

Muted helper / meta text.

text-xs text-gray-400

₱12,345

text-2xl font-black text-teal-700 — stat numbers; currency via number_format($v, 0)
{{-- ===== BUTTONS ===== --}}

Buttons

Primary   bg-teal-600 hover:bg-teal-700 text-white text-sm font-semibold px-4 py-2.5 rounded-lg transition-colors
Secondary text-gray-600 border-[0.5px] border-gray-200 hover:bg-gray-50 (same sizing)
Danger    text-red-600 bg-red-50 border-[0.5px] border-red-200 hover:bg-red-100
Undo      text-blue-700 bg-blue-50 border-[0.5px] border-blue-200 hover:bg-blue-100 — distinct from primary & destructive on purpose
{{-- ===== BADGES ===== --}}

Status Badges

Reservation statuses

@foreach($reservationBadges as $label => $class) @if($label === 'Checked In')@endif {{ $label }} @endforeach

Room statuses

@foreach($roomBadges as $label => $class) {{ $label }} @endforeach

Special

Group Booking Charged to Room GCash
inline-flex items-center px-2 py-0.5 rounded-full text-[11px] font-semibold bg-{color}-50 text-{color}-700 border-[0.5px] border-{color}-200
Rule: badges use border-[0.5px], never ring-1. Live states get the pulsing dot.
{{-- ===== CARDS ===== --}}

Cards

Stat Tile

42

of 63 total

Card with Header Band

Body content. Caution: a card with overflow-hidden must never contain an Alpine dropdown (it clips) or hold a wide table (wrap the table in overflow-x-auto instead).
Card  bg-white border-[0.5px] border-gray-200 rounded-xl p-5
Band  px-5 py-3 border-b border-gray-100 bg-gray-50/50 (apply rounded-t-xl on the band itself if the card can't be overflow-hidden)
{{-- ===== FORMS ===== --}}

Form Controls

Input  w-full border-[0.5px] border-gray-200 rounded-lg px-3 py-2.5 text-sm text-gray-700 focus:outline-none focus:ring-2 focus:ring-teal-500/20 focus:border-teal-400
Rules: CMS checkboxes need a hidden value=0 field before them; field pairs sit in grid grid-cols-1 sm:grid-cols-2 gap-4 (full-width rows get sm:col-span-2)
{{-- ===== ALERTS ===== --}}

Flash Alerts

Success — rendered from session('success').

Error — rendered from session('error'). Views must render both.

{{-- ===== TABLE ===== --}}

Data Table

Guest Room Status Amount

Maria Santos

2026-07-000123

204 · Deluxe Twin Checked In ₱1,798

Jose Reyes

2026-07-000124

301 · Family Room Pending ₱3,298
Always: <div class="overflow-x-auto"> wrapper + min-w-[…] on the table. Sort links: request()->fullUrlWithQuery(['sort' => …, 'dir' => …])
{{-- ===== DROPDOWN + CONFIRM DIALOG ===== --}}

Alpine Dropdown

x-data + x-show + x-cloak + @click.outside. Never place inside an overflow-hidden card.

Global Confirm Dialog

Add data-confirm="…" (+ data-danger="true") to the form, never the button. These demo buttons just reload this page.

{{-- ===== EMPTY STATE ===== --}}

Empty State

Nothing here yet. Add the first one above.

Icon: w-10 h-10 text-gray-100 · Text: text-gray-300 text-sm · centered, py-10+
{{-- ===== MOBILE RECIPES ===== --}}

Mobile-Responsive Recipes

Page header      flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between
Button/filter row  add flex-wrap; date inputs get flex-1 min-w-0
Stat grid        grid grid-cols-1 sm:grid-cols-4 (or grid-cols-2 sm:… for tiny tiles)
Field pairs      grid grid-cols-1 sm:grid-cols-2 gap-4 · full-width rows: sm:col-span-2 (never unprefixed!)
Wide table       <div class="overflow-x-auto"><table class="w-full min-w-[640px]">
Tab strips       add overflow-x-auto so tabs scroll instead of clipping
Pasted iframes   wrapper gets [&>iframe]:w-full [&>iframe]:h-full
@endsection