@tailwind base; @tailwind components; @tailwind utilities; @layer base { :root { --background: #ffffff; --foreground: #000000; --accents-1: #fafafa; --accents-2: #eaeaea; --accents-3: #999999; --accents-4: #888888; --accents-5: #666666; --accents-6: #444444; --accents-7: #333333; --accents-8: #111111; } .dark { --background: #000000; --foreground: #ffffff; --accents-1: #111111; --accents-2: #333333; --accents-3: #444444; --accents-4: #666666; --accents-5: #888888; --accents-6: #999999; --accents-7: #eaeaea; --accents-8: #fafafa; } body { @apply bg-background text-foreground font-sans antialiased; } } @layer components { .custom-select-wrapper { @apply shrink-0; } .btn { @apply inline-flex items-center justify-center rounded-md text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-foreground disabled:pointer-events-none disabled:opacity-50 h-9 px-4 py-2 hover:shadow-md active:scale-95; } .btn-primary { @apply bg-foreground text-background hover:opacity-90 hover:-translate-y-0.5; } .btn-secondary { @apply bg-background text-foreground border border-accents-2 hover:bg-accents-1 hover:border-foreground hover:-translate-y-0.5; } .btn-danger { @apply bg-red-500 text-white hover:bg-red-600 border border-transparent hover:-translate-y-0.5 hover:shadow-red-500/20; } .btn-icon { @apply p-2 rounded-lg text-accents-5 transition-all duration-200 hover:text-foreground hover:bg-white/40 dark:hover:bg-white/10 active:scale-95; } .btn-icon-danger { @apply p-2 rounded-lg text-red-500 transition-all duration-200 hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-900/20 active:scale-95; } .form-label { @apply block text-xs font-bold text-accents-6 dark:text-accents-3 uppercase tracking-wider mb-1 transition-colors duration-200; } .form-label-card { @apply block text-sm font-medium text-accents-6 mb-1 transition-colors duration-200; } .glass-label, .modal-glass .form-label { @apply text-foreground opacity-80 dark:opacity-90 font-semibold shadow-black/10; } .form-control, .form-input, .form-input-search, .form-select { @apply flex items-center h-10 w-full rounded-xl border border-accents-2 dark:border-white/10 bg-white/40 dark:bg-white/5 backdrop-blur-xl px-3 py-1 text-sm text-foreground shadow-sm transition-all duration-300 file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-accents-5 focus-visible:outline-none focus-visible:border-foreground focus-visible:ring-2 focus-visible:ring-foreground disabled:cursor-not-allowed disabled:opacity-50 min-w-0 hover:border-accents-4 hover:bg-white/60 dark:hover:bg-white/10 hover:shadow-md; } .form-input-search { @apply rounded-full border-2 border-white/20 dark:border-white/10 bg-white/25 dark:bg-black/40 backdrop-blur-[40px] text-foreground shadow-sm transition-all duration-200 focus-visible:outline-none focus-visible:border-white/50 focus-visible:ring-0 min-w-0 hover:bg-white/40 dark:hover:bg-black/60 hover:border-white/40; } .form-filter { @apply flex items-center justify-between h-10 w-full rounded-xl border-2 border-white/20 dark:border-white/10 bg-white/25 dark:bg-black/40 backdrop-blur-[40px] px-3 py-1 text-sm text-foreground shadow-sm transition-all duration-200 focus-visible:outline-none focus-visible:border-white/50 focus-visible:ring-0 min-w-0 hover:bg-white/40 dark:hover:bg-black/60 hover:border-white/40 cursor-pointer; } /* Autofill Fix - Glass Compatible */ input:-webkit-autofill, input:-webkit-autofill:hover, input:-webkit-autofill:focus, input:-webkit-autofill:active { -webkit-box-shadow: 0 0 0 30px transparent inset !important; -webkit-text-fill-color: var(--foreground) !important; transition: background-color 5000s ease-in-out 0s; caret-color: var(--foreground); } /* Input with Icon Global Style */ .input-group { @apply relative w-full text-accents-6 transition-colors duration-200 focus-within:text-foreground; } .input-icon { @apply absolute inset-y-0 left-0 flex items-center justify-center w-10 pointer-events-none z-10; } .input-group .form-input, .input-group .form-input-search { @apply !pl-10; } .input-suffix { @apply absolute inset-y-0 right-0 flex items-center pr-3 text-accents-5 pointer-events-none z-10; } /* Merged Inputs (Side-by-side) */ .input-group-merged { @apply flex w-full relative; } .input-group-merged > .form-control:not(:first-child), .input-group-merged > .form-input:not(:first-child), .input-group-merged > select:not(:first-child) { @apply rounded-l-none -ml-px; } .input-group-merged > .form-control:not(:last-child), .input-group-merged > .form-input:not(:last-child), .input-group-merged > select:not(:last-child) { @apply rounded-r-none; } .input-group-merged > *:focus-within { @apply z-20; } /* File Input Specific Styling - Custom File Button */ .form-control-file { @apply block w-full text-sm text-accents-5 border-2 border-accents-2 rounded-md file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-xs file:font-semibold file:bg-accents-2 file:text-foreground hover:file:bg-accents-3 cursor-pointer transition-colors; } .checkbox { @apply appearance-none h-5 w-5 shrink-0 rounded border border-accents-5 dark:border-white/30 bg-white/50 dark:bg-white/10 backdrop-blur-sm shadow-sm transition-all duration-200 checked:bg-blue-600 checked:border-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-600/20 disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer hover:border-blue-500 dark:hover:border-blue-400 hover:shadow-md; background-position: center; background-size: 100%; background-repeat: no-repeat; } .checkbox:checked { background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='%23ffffff' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); } .dark .checkbox:checked { background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='%23ffffff' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); } .card, .glass-card { @apply rounded-2xl border-2 border-white/20 dark:border-white/10 bg-white/25 dark:bg-black/40 backdrop-blur-[40px] text-foreground shadow-2xl p-6 transition-all duration-500 hover:border-white/40 dark:hover:border-white/20 hover:bg-white/40 dark:hover:bg-black/60 hover:shadow-cyan-500/10 hover:-translate-y-1; } .status-dot { @apply flex h-2 w-2 rounded-full; } .sub-card, .card-nested { @apply bg-white/60 dark:bg-white/10 border-2 border-white/40 dark:border-white/10 rounded-xl p-4 shadow-md transition-all duration-300 hover:bg-white/80 dark:hover:bg-white/15 hover:border-white/60 hover:shadow-lg hover:scale-[1.01]; } /* Custom Select Dropdown Global Style */ .custom-select-dropdown { @apply absolute z-50 min-w-full top-full mt-1 bg-white/80 dark:bg-black/80 backdrop-blur-[40px] border border-white/20 dark:border-white/10 rounded-xl shadow-2xl transition-all duration-200 ease-out origin-top opacity-0 scale-95 -translate-y-2 invisible pointer-events-none flex flex-col max-h-60 overflow-hidden ring-1 ring-black/5; } .custom-select-dropdown.open { @apply opacity-100 scale-100 translate-y-0 visible pointer-events-auto; } .custom-select-dropdown.dropdown-up { @apply bottom-full top-auto mb-1 mt-0 origin-bottom translate-y-2; } .custom-select-dropdown.dropdown-up.open { @apply translate-y-0; } /* Premium Control Pill & Segmented Switch */ .control-pill { @apply flex items-center gap-1 px-1.5 h-10 rounded-full border-2 border-accents-2 bg-white/60 dark:bg-black/40 backdrop-blur-md shadow-sm transition-all duration-300 hover:shadow-md hover:border-accents-3 hover:bg-white/80 dark:hover:bg-black/60; } .pill-divider { @apply w-px h-4 bg-accents-3 mx-1 opacity-40; } .segmented-switch { @apply relative flex items-center p-0.5 bg-accents-2 dark:bg-black rounded-full overflow-hidden w-14 h-8 shadow-inner border border-accents-2 dark:border-white/10; } .segmented-switch-slider { @apply absolute left-0.5 top-0.5 h-7 w-7 rounded-full bg-foreground shadow-md transition-all duration-300 ease-in-out z-0; } .dark .segmented-switch-slider { --tw-translate-x: 24px; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .segmented-switch-btn { @apply relative z-10 flex h-7 w-7 items-center justify-center text-accents-5 transition-colors duration-300; } /* Active icon colors based on theme */ /* In Light Mode: Track is light, Slider is Black. We want Active icon to be WHITE on the Slider. */ .theme-toggle-light-icon { @apply text-white; } .dark .theme-toggle-light-icon { @apply text-accents-5 hover:text-white; } /* In Dark Mode: Track is dark, Slider is White. We want Active icon to be BLACK on the Slider. */ .theme-toggle-dark-icon { @apply text-accents-5 hover:text-black; } .dark .theme-toggle-dark-icon { @apply text-black; } .segmented-switch-btn.active { /* This is a fallback but the specific icons above are better */ @apply text-background; } /* Language Switcher Pill Button */ .pill-lang-btn { @apply flex items-center justify-center h-8 w-8 rounded-full text-foreground hover:bg-accents-2 transition-all duration-200 outline-none focus:ring-1 focus:ring-accents-3; } /* Dropdown Bridge to prevent accidental closure on margin gaps */ .dropdown-bridge::before { content: ""; position: absolute; top: -1.25rem; left: 0; right: 0; height: 1.25rem; background: transparent; z-index: -1; } /* Specific Bridge expansion for Notification to make it more "sticky" */ #notification-dropdown.dropdown-bridge::before { inset: -2rem -3rem; /* Expand 32px top/bottom, 48px left/right */ top: -2.5rem; /* Ensure it covers the gap to the button */ } /* Glassmorphism Table */ .table-container { @apply w-full overflow-x-auto rounded-xl border-2 border-black/5 dark:border-white/10 shadow-sm; } .table-glass { @apply w-full border-collapse text-left text-sm; } .table-glass thead { @apply bg-white/80 dark:bg-white/5 backdrop-blur-md border-b-2 border-black/5 dark:border-white/10; } .table-glass th { @apply px-6 py-4 font-semibold text-accents-5 uppercase tracking-wider text-xs; } .table-glass tbody { @apply bg-white/40 dark:bg-white/5 backdrop-blur-sm divide-y divide-black/5 dark:divide-white/10; } .table-glass tr { @apply transition-colors duration-200 hover:bg-white/60 dark:hover:bg-white/10; } .table-glass td { @apply px-6 py-4 text-foreground whitespace-nowrap; } /* Global Table Actions Reveal Trigger */ .table-actions-reveal { @apply opacity-0 transition-opacity duration-200; } .table-glass tr:hover .table-actions-reveal { @apply opacity-100; } /* Global Glassmorphism Modal */ .modal-backdrop { @apply fixed inset-0 z-50 bg-black/60 backdrop-blur-sm transition-opacity duration-300; } .modal-glass { @apply fixed top-1/2 left-1/2 z-50 w-full max-w-lg -translate-x-1/2 -translate-y-1/2 rounded-2xl border-2 border-white/20 dark:border-white/10 bg-white/25 dark:bg-black/60 backdrop-blur-[40px] shadow-2xl transition-all duration-300 scale-95 opacity-0 overflow-hidden flex flex-col max-h-[90vh]; } .modal-glass.open { @apply scale-100 opacity-100; } .modal-header { @apply flex items-center justify-between px-6 py-4 border-b-2 border-white/10 bg-white/10 dark:bg-white/5; } .modal-title { @apply text-lg font-bold text-foreground tracking-tight; } .modal-body { @apply p-6 overflow-y-auto custom-scrollbar; } .modal-footer { @apply flex justify-end gap-3 px-6 py-4 border-t-2 border-white/10 bg-white/10 dark:bg-white/5; } } @layer utilities { /* Custom Scrollbar - Vercel Style */ ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { @apply bg-accents-3 rounded-full transition-colors; } ::-webkit-scrollbar-thumb:hover { @apply bg-accents-4; } /* Ensure styles apply to specific containers if needed */ .scrollbar-hide::-webkit-scrollbar { display: none; } .scrollbar-hide { -ms-overflow-style: none; scrollbar-width: none; } /* Mobile only scrollbar hide */ @media (max-width: 768px) { .no-scrollbar-mobile::-webkit-scrollbar { display: none; } .no-scrollbar-mobile { -ms-overflow-style: none; scrollbar-width: none; } } } html { overflow-y: scroll; scrollbar-gutter: stable; } /* Premium SweetAlert2 Overrides - Glassmorphism Style */ div.swal2-popup { background-color: rgba(255, 255, 255, 0.5) !important; /* High transparency for Maximum Glossy Light Mode */ backdrop-filter: blur(16px) !important; -webkit-backdrop-filter: blur(16px) !important; color: var(--foreground) !important; border: 1px solid rgba(255, 255, 255, 0.4) !important; /* Subtle reflective border */ border-radius: 0.75rem !important; /* rounded-xl */ box-shadow: 0 10px 30px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.05) !important; /* Softer shadow */ padding: 1.5rem !important; } div:where(.swal2-container) { z-index: 9999 !important; } div:where(.swal2-popup).swal-wide { width: auto !important; max-width: 900px !important; } /* Dark mode background fix for glassmorphism */ .dark div.swal2-popup { background-color: rgba(0, 0, 0, 0.75) !important; border-color: rgba(255, 255, 255, 0.1) !important; } div.swal2-title { color: var(--foreground) !important; font-family: inherit !important; font-size: 1.25rem !important; font-weight: 600 !important; margin-top: 1rem !important; } div.swal2-html-container { color: var(--accents-5) !important; font-family: inherit !important; font-size: 0.875rem !important; margin-top: 0.5rem !important; } /* Hide default icon styling to make way for Lucide */ div.swal2-icon { border: none !important; background: transparent !important; margin: 0 auto !important; } /* Remove default animations/styles for icons */ .swal2-icon-content { display: flex !important; align-items: center; justify-content: center; } /* Target actions container for flex gap */ div.swal2-actions { gap: 1rem !important; } div.swal2-confirm, div.swal2-cancel { @apply !m-0; /* Reset margins to use flex gap */ } div.swal2-confirm { @apply btn btn-primary !important; border-radius: 0.5rem !important; } div.swal2-cancel { @apply btn btn-secondary !important; border-radius: 0.5rem !important; } /* Dark Mode Specific Adjustments */ .dark div.swal2-popup { border-color: #333 !important; } /* Custom Icon Colors (applied to Lucide wrapper) */ .text-success { color: #10b981; } .text-error { color: #ef4444; } .text-warning { color: #f59e0b; } .text-info { color: #3b82f6; } .text-question { color: #8b5cf6; } /* Custom Premium Stacking Toasts */ #mivo-toast-container { position: fixed; bottom: 1.5rem; right: 1.5rem; z-index: 9999; display: flex; flex-direction: column-reverse; gap: 0.75rem; pointer-events: none; max-width: 400px; width: calc(100% - 3rem); } .mivo-toast { pointer-events: auto; background-color: rgba(255, 255, 255, 0.6); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid rgba(255, 255, 255, 0.4); border-radius: 0.75rem; box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); padding: 1rem; display: flex; align-items: center; gap: 0.75rem; animation: toast-slide-in 0.3s cubic-bezier(0.16, 1, 0.3, 1); transition: all 0.3s ease; position: relative; overflow: hidden; } .dark .mivo-toast { background-color: rgba(0, 0, 0, 0.7); border-color: rgba(255, 255, 255, 0.1); } .mivo-toast-content { flex: 1; min-width: 0; } .mivo-toast-title { font-size: 0.875rem; font-weight: 600; color: var(--foreground); line-height: 1.25; } .mivo-toast-message { font-size: 0.75rem; color: var(--accents-5); margin-top: 0.125rem; } .mivo-toast-close { padding: 0.25rem; margin: -0.25rem; border-radius: 0.375rem; color: var(--accents-4); transition: all 0.2s; cursor: pointer; } .mivo-toast-close:hover { background-color: var(--accents-2); color: var(--foreground); } .mivo-toast-progress { position: absolute; bottom: 0; left: 0; height: 2px; background-color: currentColor; opacity: 0.2; width: 0%; } @keyframes toast-slide-in { from { transform: translateX(100%) scale(0.9); opacity: 0; } to { transform: translateX(0) scale(1); opacity: 1; } } .mivo-toast-fade-out { transform: translateX(100%); opacity: 0; } /* SweetAlert Premium Fixes */ div:where(.swal2-icon).swal2-success { border-color: #10B981 !important; color: #10B981 !important; } div:where(.swal2-icon).swal2-success .swal2-success-ring { border-color: rgba(16, 185, 129, 0.4) !important; /* Emphasize ring slightly */ } div:where(.swal2-icon).swal2-success .swal2-success-circular-line-left, div:where(.swal2-icon).swal2-success .swal2-success-circular-line-right, div:where(.swal2-icon).swal2-success .swal2-success-fix { background-color: transparent !important; } div:where(.swal2-icon).swal2-success .swal2-success-line-tip, div:where(.swal2-icon).swal2-success .swal2-success-line-long { background-color: #10B981 !important; } div:where(.swal2-icon).swal2-error { border-color: #EF4444 !important; color: #EF4444 !important; } div:where(.swal2-container) div:where(.swal2-popup).swal2-premium-card { background: rgba(255, 255, 255, 0.25) !important; backdrop-filter: blur(40px) !important; border: 1px solid rgba(255, 255, 255, 0.2) !important; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .dark div:where(.swal2-container) div:where(.swal2-popup).swal2-premium-card { background: rgba(0, 0, 0, 0.4) !important; border-color: rgba(255, 255, 255, 0.1) !important; } /* SweetAlert2 Premium Input Styles Override */ .swal2-premium-card .form-label { @apply text-accents-8 dark:text-accents-2 font-bold mb-2; } .swal2-premium-card input:not([type="checkbox"]):not([type="radio"]), .swal2-premium-card select, .swal2-premium-card textarea { display: block; width: 100%; border-radius: 0.5rem; border-width: 1px; border-color: var(--accents-2); background-color: rgb(255 255 255 / 0.5); padding-top: 0.5rem; padding-bottom: 0.5rem; padding-left: 0.75rem; padding-right: 0.75rem; font-size: 0.875rem; line-height: 1.25rem; color: var(--foreground); transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 200ms; } .swal2-premium-card input:not([type="checkbox"]):not([type="radio"]):focus, .swal2-premium-card select:focus, .swal2-premium-card textarea:focus { border-color: var(--foreground); background-color: rgb(255 255 255 / 0.8); outline: 2px solid transparent; outline-offset: 2px; --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); --tw-ring-color: var(--accents-2); } .dark .swal2-premium-card input:not([type="checkbox"]):not([type="radio"]), .dark .swal2-premium-card select, .dark .swal2-premium-card textarea { background-color: rgb(0 0 0 / 0.2); border-color: var(--accents-2); } .dark .swal2-premium-card input:not([type="checkbox"]):not([type="radio"]):focus, .dark .swal2-premium-card select:focus, .dark .swal2-premium-card textarea:focus { background-color: rgb(0 0 0 / 0.4); border-color: var(--foreground); }