/* Tailwind CSS v4 — disable auto-detection, scan only what matters */ @import "tailwindcss" source(none); @source "../views"; @source "../js"; /* Tailwind v4 plugins */ @plugin "@tailwindcss/forms"; /* Dark mode: class-based strategy (replaces darkMode: 'class' in tailwind.config.js) */ @custom-variant dark (&:where(.dark, .dark *)); /* Theme customization (replaces theme.extend in tailwind.config.js) */ @theme { --font-sans: "Figtree", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; --radius-card: 0.75rem; } /* Import FontAwesome — only the weights we use (skips v4-compat font + shims) */ @import '@fortawesome/fontawesome-free/css/fontawesome.min.css'; @import '@fortawesome/fontawesome-free/css/solid.min.css'; @import '@fortawesome/fontawesome-free/css/regular.min.css'; @import '@fortawesome/fontawesome-free/css/brands.min.css'; /* Import custom CSP-safe styles */ @import './csp-safe.css'; /* Alpine.js x-cloak - hide elements until Alpine initializes */ [x-cloak] { display: none !important; } /* Fixed layout - ensure html and body have proper height constraints */ html, body { height: 100%; overflow: hidden; } /* Dark Mode Text Readability Fixes */ @layer base { /* Ensure dark backgrounds have light text */ .dark { color-scheme: dark; } /* Fix text-gray-700, text-gray-800, text-gray-900 in dark mode */ .dark .text-gray-700:not([class*="dark:text-"]) { color: rgb(209 213 219) !important; /* gray-300 */ } .dark .text-gray-800:not([class*="dark:text-"]) { color: rgb(229 231 235) !important; /* gray-200 */ } .dark .text-gray-900:not([class*="dark:text-"]) { color: rgb(243 244 246) !important; /* gray-100 */ } /* Ensure labels are readable in dark mode */ .dark label:not([class*="dark:text-"]) { color: rgb(209 213 219) !important; /* gray-300 */ } /* Fix table headers in dark mode */ .dark th:not([class*="dark:text-"]) { color: rgb(209 213 219) !important; /* gray-300 */ } /* Fix table cells in dark mode */ .dark td:not([class*="dark:text-"]) { color: rgb(229 231 235) !important; /* gray-200 */ } /* Ensure headings are visible in dark mode */ .dark h1:not([class*="dark:text-"]), .dark h2:not([class*="dark:text-"]), .dark h3:not([class*="dark:text-"]), .dark h4:not([class*="dark:text-"]), .dark h5:not([class*="dark:text-"]), .dark h6:not([class*="dark:text-"]) { color: rgb(243 244 246) !important; /* gray-100 */ } /* Fix select elements in dark mode */ .dark select:not([class*="dark:text-"]), .dark input:not([class*="dark:text-"]), .dark textarea:not([class*="dark:text-"]) { color: rgb(243 244 246) !important; /* gray-100 */ } } /* Page-level card container (rounded-xl, shadow) */ .card { @apply bg-white dark:bg-gray-800 rounded-xl shadow-md border border-gray-200 dark:border-gray-700 transition-colors duration-200; } /* Custom styles for proper spacing and button alignment */ .btn { @apply inline-flex items-center justify-center px-4 py-2 border rounded-lg font-semibold text-sm transition-colors duration-150; } .btn i { @apply mr-2; } .btn-primary { @apply bg-blue-600 dark:bg-blue-700 text-white border-blue-600 dark:border-blue-700 hover:bg-blue-700 dark:hover:bg-blue-800; } .btn-secondary { @apply bg-gray-600 dark:bg-gray-700 text-white border-gray-600 dark:border-gray-700 hover:bg-gray-700 dark:hover:bg-gray-800; } .btn-success { @apply bg-green-600 dark:bg-green-700 text-white border-green-600 dark:border-green-700 hover:bg-green-700 dark:hover:bg-green-800; } .btn-danger { @apply bg-red-600 dark:bg-red-700 text-white border-red-600 dark:border-red-700 hover:bg-red-700 dark:hover:bg-red-800; } .btn-warning { @apply bg-yellow-500 dark:bg-yellow-600 text-white border-yellow-500 dark:border-yellow-600 hover:bg-yellow-600 dark:hover:bg-yellow-700; } .btn-info { @apply bg-cyan-600 dark:bg-cyan-700 text-white border-cyan-600 dark:border-cyan-700 hover:bg-cyan-700 dark:hover:bg-cyan-800; } .btn-sm { @apply px-3 py-1 text-xs; } .btn-lg { @apply px-6 py-3 text-base; } /* Button group spacing */ .btn-group { @apply inline-flex space-x-2; } /* Icon spacing */ .fas, .far, .fab, .fa { @apply inline-block; min-width: 1em; text-align: center; } /* Table action buttons */ .table-actions { @apply flex items-center gap-2; } .table-actions .btn { @apply shrink-0; } /* Mobile Responsive Improvements */ /* Mobile-friendly tables */ @media (max-width: 768px) { .table-responsive { overflow-x: auto; margin-left: -1rem; margin-right: -1rem; padding-left: 1rem; padding-right: 1rem; } .table-responsive table { min-width: max-content; } /* Card-style table rows for mobile */ .table-mobile-cards tbody tr { display: block; border: 1px solid rgb(229 231 235); border-radius: 0.5rem; margin-bottom: 1rem; padding: 1rem; } .dark .table-mobile-cards tbody tr { border-color: rgb(55 65 81); } .table-mobile-cards tbody td { display: block; text-align: left; padding-left: 50% !important; position: relative; } .table-mobile-cards tbody td::before { content: attr(data-label); position: absolute; left: 1rem; font-weight: 600; color: rgb(55 65 81); } .dark .table-mobile-cards tbody td::before { color: rgb(209 213 219); } .table-mobile-cards thead { display: none; } /* Stack buttons vertically on mobile */ .btn-group { display: flex; flex-direction: column; row-gap: 0.5rem; column-gap: 0; } /* Full width buttons on mobile */ .btn-mobile-full { width: 100%; justify-content: center; } /* Mobile search forms */ .search-form-mobile { flex-direction: column; row-gap: 0.5rem; } .search-form-mobile select, .search-form-mobile input { width: 100%; border-radius: 0.25rem; } /* Reduce padding on small screens */ .container { padding-left: 0.5rem; padding-right: 0.5rem; } /* Stack navigation items */ .nav-mobile-stack { flex-direction: column; row-gap: 0.5rem; column-gap: 0; } /* Hide non-essential columns on mobile */ .hide-mobile { display: none; } /* Smaller text on mobile */ .text-mobile-sm { font-size: 0.75rem; line-height: 1rem; } /* Mobile dropdown menus should be full width */ .dropdown-menu { left: 0; right: 0; width: auto; margin-left: 0.5rem; margin-right: 0.5rem; } /* Mobile modal adjustments */ .modal-content { margin-left: 0.5rem; margin-right: 0.5rem; max-height: 90vh; overflow-y: auto; } /* Smaller font sizes for headings on mobile */ h1 { font-size: 1.5rem; line-height: 2rem; } h2 { font-size: 1.25rem; line-height: 1.75rem; } h3 { font-size: 1.125rem; line-height: 1.75rem; } /* Mobile grid adjustments */ .grid-mobile-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } /* Touch-friendly sizing */ .touch-target { min-height: 44px; min-width: 44px; } /* Mobile-optimized badges and labels */ .badge { font-size: 0.75rem; line-height: 1rem; padding: 0.25rem 0.5rem; } /* Improve readability of release titles */ .release-title { font-size: 0.875rem; line-height: 1.25rem; } /* Stack action buttons in cards */ .card-actions { flex-direction: column; row-gap: 0.5rem; column-gap: 0; } /* Make pagination more compact */ .pagination { font-size: 0.875rem; line-height: 1.25rem; } .pagination .page-link { padding: 0.25rem 0.5rem; min-width: 2rem; } /* Optimize data tables for mobile */ table.dataTable { font-size: 0.875rem; } table.dataTable td, table.dataTable th { padding: 0.5rem 0.25rem; } /* Improve form labels */ label { font-size: 0.875rem; line-height: 1.25rem; font-weight: 500; } /* Better spacing for form groups */ .form-group { margin-bottom: 0.75rem; } /* Mobile-friendly alerts */ .alert { font-size: 0.875rem; line-height: 1.25rem; padding: 0.5rem 0.75rem; } /* Compact breadcrumbs */ .breadcrumb { font-size: 0.75rem; line-height: 1rem; } /* Stack filter options vertically */ .filter-options { flex-direction: column; row-gap: 0.5rem; } } /* Small mobile devices */ @media (max-width: 480px) { /* Even smaller text on very small screens */ body { font-size: 0.875rem; line-height: 1.25rem; } .btn { font-size: 0.75rem; line-height: 1rem; padding: 0.5rem 0.75rem; } /* Stack form fields */ .form-grid { grid-template-columns: repeat(1, minmax(0, 1fr)); gap: 0.5rem; } /* Compact headers */ .page-header { font-size: 1.25rem; line-height: 1.75rem; padding-top: 0.5rem; padding-bottom: 0.5rem; } /* Reduce card padding */ .card-mobile-compact { padding: 0.75rem; } } /* Tablet improvements */ @media (min-width: 768px) and (max-width: 1024px) { /* 2-column layout on tablets where appropriate */ .tablet-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } /* Tablet-optimized navigation */ .nav-tablet { column-gap: 0.5rem; } } /* Landscape mobile optimization */ @media (max-height: 600px) and (orientation: landscape) { /* Reduce vertical padding in landscape */ .py-6 { padding-top: 0.5rem; padding-bottom: 0.5rem; } /* Compact modals in landscape */ .modal-content { max-height: 85vh; } /* Smaller fixed buttons */ #mobile-sidebar-toggle, #theme-toggle { padding: 0.5rem; font-size: 0.875rem; line-height: 1.25rem; } } /* Preview Modal CSP-Safe Styles */ .preview-modal-hidden, .modal-hidden { display: none; } #previewModal, .modal-z-index { z-index: 9999; } #previewModal.flex { display: flex; } /* Modal content scroll area */ .modal-content-scroll { max-height: calc(90vh - 80px); } /* Search highlight styling */ .search-highlight, mark { @apply bg-yellow-200 px-0.5 rounded; } .dark .search-highlight, .dark mark { @apply bg-yellow-700; }