@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
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.
Color Palette
{{ $label }}
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
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
Status Badges
Reservation statuses
Room statuses
Special
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
Stat Tile
42
of 63 total
Card with Header Band
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)
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)
Flash Alerts
Success — rendered from session('success').
Error — rendered from session('error'). Views must render both.
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' => …])
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
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-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