관리-도구
편집 파일: custom.css
/* ============================================================================ ✦ PORCELAIN LUXE — Elegant Admin Redesign (matches approved bento concept) ---------------------------------------------------------------------------- REPLACE THE CONTENTS OF: public/assets/backend/admin/css/custom.css (back up the original first) Works together with 3 redesigned Blade files (dashboard + 2 partials). Every other page (400+) is themed by this CSS alone. ZERO FUNCTIONALITY CHANGES: all routes, IDs, JS hooks, and data intact. ============================================================================ */ @import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,500;9..144,600&family=Inter:wght@400;500;600;700&display=swap'); /* ═══════════════════════════════════════════ 1 · TOKENS ═══════════════════════════════════════════ */ :root:root, [data-bs-theme="light"] { --panel-sidebar-primary: #7C3AED !important; --bs-primary: #7C3AED; --bs-primary-rgb: 124, 58, 237; --lx-violet: #7C3AED; --lx-violet-deep: #6D28D9; --lx-violet-soft: #EDE9FE; --lx-violet-mist: #F1EDFA; --lx-ink: #1D1729; /* floating sidebar + hero band */ --lx-ink-2: #211A31; --lx-porcelain: #F4F2F9; /* page canvas */ --lx-card: #FFFFFF; --lx-line: #E9E5F2; --lx-text: #241E33; --lx-text-2: #5F5878; --lx-text-3: #8F86B0; --bs-body-bg: var(--lx-porcelain); --bs-body-color: var(--lx-text); --bs-secondary-color: var(--lx-text-2); --bs-border-color: var(--lx-line); --bs-border-radius: 1.1rem; --bs-border-radius-sm: .7rem; --bs-border-radius-lg: 1.35rem; --lx-serif: "Fraunces", Georgia, serif; --lx-sans: "Inter", system-ui, sans-serif; --lx-shadow: 0 1px 2px rgba(29,23,41,.04), 0 10px 30px -14px rgba(109,40,217,.10); --lx-shadow-hover: 0 2px 4px rgba(29,23,41,.05), 0 18px 44px -16px rgba(109,40,217,.22); } body { background: var(--lx-porcelain); color: var(--lx-text); font-family: var(--lx-sans); -webkit-font-smoothing: antialiased; } /* serif numerals & display moments — the signature of this design */ .for-card-count, .lx-tile-num, .lx-wallet-num, .lx-wallet-num-sm, .lx-hero-title, .lx-hero-chip-num, .fz-24 { font-family: var(--lx-serif); letter-spacing: -0.01em; font-variant-numeric: tabular-nums; } /* ═══════════════════════════════════════════ 2 · FLOATING SIDEBAR (detached, rounded, ink) ═══════════════════════════════════════════ */ .aside { background: var(--lx-ink) !important; margin: 12px 0 12px 12px; height: calc(100% - 24px) !important; max-height: calc(100vh - 24px); border-radius: 22px; border: none !important; overflow: hidden; box-shadow: 0 20px 50px -20px rgba(29,23,41,.45); } .aside .aside-header, .aside .aside-body { background: transparent !important; } .aside, .aside .nav-link, .aside .text-truncate, .aside .aside-mini-hidden-element, .aside [class^="fi "], .aside [class*=" fi-"] { color: #A99DCB !important; } .aside .nav-subtitle { display: block; color: #6F6592 !important; font-size: 10.5px; font-weight: 700; letter-spacing: .15em; text-transform: uppercase; padding: 1.15rem .95rem .35rem; } .aside .nav-link { border-radius: .8rem; margin-inline: .5rem; transition: background-color .18s ease, color .18s ease; } .aside .nav-link:hover { background: rgba(139,92,246,.14) !important; color: #F4F1FA !important; } .aside .nav-link:hover [class^="fi "], .aside .nav-link:hover [class*=" fi-"] { color: #F4F1FA !important; } .aside .nav-link.active { background: linear-gradient(120deg, #8B5CF6, #6D28D9) !important; color: #fff !important; box-shadow: 0 8px 20px -8px rgba(124,58,237,.6); } .aside .nav-link.active [class^="fi "], .aside .nav-link.active [class*=" fi-"] { color: #fff !important; } .aside-submenu { background: rgba(255,255,255,.04) !important; border-inline-start: 1px solid rgba(139,92,246,.28); margin-inline-start: 1.2rem; border-radius: 0 .8rem .8rem 0; } .aside-submenu .nav-link { font-size: .875rem; } .aside-submenu .nav-link.active { background: rgba(139,92,246,.18) !important; box-shadow: none; } .aside .badge { background: rgba(139,92,246,.24) !important; color: #DDD5F6 !important; border-radius: 999px; } .aside .badge.text-bg-danger { background: rgba(244,63,94,.28) !important; color: #FECDD3 !important; } .aside .badge.text-bg-success { background: rgba(16,185,129,.24) !important; color: #A7F3D0 !important; } .aside .badge.text-bg-warning { background: rgba(245,158,11,.24) !important; color: #FDE68A !important; } .aside .form-control, .aside-search-form .form-control { background: rgba(255,255,255,.07) !important; border: 1px solid rgba(255,255,255,.10) !important; color: #F4F1FA !important; border-radius: .8rem; } .aside .form-control::placeholder { color: #6F6592; } .aside .form-control:focus { border-color: rgba(167,139,250,.6) !important; box-shadow: 0 0 0 .2rem rgba(124,58,237,.22); } .aside .aside-mini-show-element.bg-section2 { background: var(--lx-ink) !important; color: #F4F1FA !important; } .aside ::-webkit-scrollbar { width: 6px; } .aside ::-webkit-scrollbar-thumb { background: rgba(139,92,246,.35); border-radius: 99px; } /* give the page content air next to the floating rail */ @media (min-width: 992px) { .main-content { padding-inline-start: 12px; } } /* ═══════════════════════════════════════════ 3 · HEADER — airy, blends with the canvas ═══════════════════════════════════════════ */ .navbar, header .navbar { background: rgba(244,242,249,.85) !important; backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); border-bottom: 1px solid var(--lx-line); } .bg-section2 { background-color: var(--lx-card) !important; border: 1px solid var(--lx-line) !important; border-radius: 999px !important; color: var(--lx-text-3) !important; } .btn-icon, .btn-icon.topbar-link { background: var(--lx-card); border: 1px solid var(--lx-line); border-radius: 50%; color: var(--lx-text-2); transition: border-color .16s ease, color .16s ease, transform .16s ease; } .btn-icon:hover { border-color: #C9B8F5; color: var(--lx-violet-deep); transform: translateY(-1px); } /* ═══════════════════════════════════════════ 4 · HERO BAND (.lx-hero) — dashboard greeting ═══════════════════════════════════════════ */ .lx-hero { position: relative; overflow: hidden; background: var(--lx-ink-2); border-radius: 20px; padding: 24px 28px; display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap; animation: lx-rise .5s cubic-bezier(.22,.8,.32,1) both; } .lx-hero-glow { position: absolute; right: -50px; top: -70px; width: 260px; height: 260px; border-radius: 50%; background: rgba(139,92,246,.22); pointer-events: none; } .lx-hero-glow::after { content: ""; position: absolute; left: -160px; top: 150px; width: 180px; height: 180px; border-radius: 50%; background: rgba(139,92,246,.12); } .lx-hero-left { position: relative; } .lx-hero-date { font-size: 11.5px; letter-spacing: .1em; text-transform: uppercase; color: #A99DCB; margin-bottom: 4px; } .lx-hero-title { font-size: clamp(1.5rem, 2.4vw, 1.9rem); font-weight: 600; color: #F4F1FA; margin: 0; } .lx-hero-sub { font-size: 13px; color: #A99DCB; margin-top: 4px; } .lx-hero-right { position: relative; display: flex; gap: 12px; } .lx-hero-chip { background: rgba(255,255,255,.07); border: 1px solid rgba(255,255,255,.10); border-radius: 16px; padding: 10px 18px; text-align: center; min-width: 96px; } .lx-hero-chip-num { display: block; font-size: 24px; font-weight: 600; color: #fff; line-height: 1.15; } .lx-hero-chip-label { font-size: 11.5px; color: #A99DCB; } @keyframes lx-rise { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: translateY(0); } } /* ═══════════════════════════════════════════ 5 · ANALYTICS TILES (.lx-tile) ═══════════════════════════════════════════ */ .business-analytics.lx-tile { display: flex; flex-direction: column; gap: 2px; padding: 16px 18px; background: var(--lx-card); border: 1px solid var(--lx-line) !important; border-radius: 18px; box-shadow: none; text-decoration: none; transition: transform .2s ease, border-color .2s ease, box-shadow .2s ease; } .business-analytics.lx-tile:hover { transform: translateY(-3px); border-color: #C9B8F5 !important; box-shadow: var(--lx-shadow-hover); } .lx-tile-top { display: flex; align-items: center; justify-content: space-between; } .lx-tile-label { font-size: 12px; color: var(--lx-text-3); text-transform: none; letter-spacing: 0; font-weight: 500; } .lx-tile-icon { width: 34px; height: 34px; border-radius: 11px; background: var(--lx-violet-soft); border: 1px solid #DFD4F9; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; } .lx-tile-icon img { width: 18px; height: 18px; object-fit: contain; } .lx-tile-num { font-size: 1.7rem; font-weight: 600; color: var(--lx-text); margin: 2px 0 0; } /* ═══════════════════════════════════════════ 6 · FULFILLMENT RING (.lx-fulfillment) ═══════════════════════════════════════════ */ .lx-fulfillment { padding: 16px 18px; border-radius: 18px; border: 1px solid var(--lx-line); background: var(--lx-card); } .lx-fulfillment-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 8px; } .lx-section-label { font-size: 13px; font-weight: 600; color: var(--lx-text); } .lx-fulfillment-total { font-size: 11.5px; color: var(--lx-text-3); } .lx-fulfillment-body { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; } .lx-ring-track { stroke: #EFEBF8; } .lx-ring-bar { stroke: var(--lx-violet); transition: stroke-dashoffset 1s cubic-bezier(.22,.8,.32,1); } .lx-ring-pct { font-size: 19px; font-weight: 600; fill: var(--lx-text); font-family: var(--lx-serif); } .lx-ring-cap { font-size: 9.5px; fill: var(--lx-text-3); } .lx-ring-legend { flex: 1; min-width: 150px; display: flex; flex-direction: column; gap: 8px; } .lx-legend-row { display: flex; align-items: center; gap: 8px; font-size: 12.5px; } .lx-legend-name { color: var(--lx-text-2); flex: 1; } .lx-legend-val { font-weight: 600; color: var(--lx-text); } .lx-dot { width: 9px; height: 9px; border-radius: 3px; display: inline-block; } .lx-dot-primary { background: var(--lx-violet); } .lx-dot-danger { background: #D4537E; } .lx-dot-muted { background: #D3D1C7; } /* ═══════════════════════════════════════════ 7 · STATUS CHIPS (.lx-chip) + generic rows ═══════════════════════════════════════════ */ .lx-chip, a.bg-section.rounded, .bg-section.rounded { background: var(--lx-card) !important; border: 1px solid var(--lx-line); border-radius: 14px !important; padding: 12px 14px; transition: transform .18s ease, border-color .18s ease, box-shadow .18s ease; text-decoration: none; } .lx-chip:hover, a.bg-section.rounded:hover { transform: translateX(4px); border-color: #C9B8F5; box-shadow: var(--lx-shadow); } .lx-chip h4, a.bg-section.rounded h4, .bg-section.rounded h4 { font-size: 13px; font-weight: 500; color: var(--lx-text); font-family: var(--lx-sans); } .lx-chip .h3, a.bg-section.rounded .h3, .bg-section.rounded .h3 { min-width: 2.3rem; text-align: center; padding: .1rem .65rem; background: var(--lx-violet-mist); color: var(--lx-violet-deep); border-radius: 999px; font-size: 1rem; font-weight: 600; font-family: var(--lx-serif); } /* ═══════════════════════════════════════════ 8 · WALLET STRIP (.lx-wallet) ═══════════════════════════════════════════ */ .lx-wallet { border-radius: 18px; border: 1px solid var(--lx-line); background: var(--lx-card); padding: 16px 20px; display: flex; align-items: center; gap: 20px; flex-wrap: wrap; } .lx-wallet-featured { display: flex; align-items: center; gap: 14px; padding-right: 20px; border-right: 1px solid #EFEBF8; } .lx-wallet-icon { width: 46px; height: 46px; border-radius: 14px; background: var(--lx-violet-soft); border: 1px solid #DFD4F9; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; } .lx-wallet-num { font-size: 1.55rem; font-weight: 600; color: var(--lx-text); } .lx-wallet-num-sm { font-size: 1.2rem; font-weight: 600; color: var(--lx-text); } .lx-wallet-pending { color: var(--lx-violet-deep); } .lx-wallet-label { font-size: 11px; letter-spacing: .05em; text-transform: uppercase; color: var(--lx-text-3); margin-top: 2px; } .lx-wallet-grid { flex: 1; display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 14px 24px; min-width: 260px; } @media (max-width: 767px) { .lx-wallet-featured { border-right: none; border-bottom: 1px solid #EFEBF8; padding: 0 0 14px; width: 100%; } } /* ═══════════════════════════════════════════ 9 · GLOBAL — cards, buttons, forms, tables (styles the other 400+ pages elegantly) ═══════════════════════════════════════════ */ .page-header-title { font-family: var(--lx-serif); font-weight: 600; color: var(--lx-text); } .card { border: 1px solid var(--lx-line); border-radius: 18px; background: var(--lx-card); box-shadow: var(--lx-shadow); transition: box-shadow .2s ease; } .card:hover { box-shadow: var(--lx-shadow-hover); } .remove-card-shadow, .remove-card-shadow:hover { box-shadow: none; } .card-header { background: transparent; border-bottom: 1px solid #EFEBF8; font-weight: 600; } .btn { border-radius: .75rem; font-weight: 600; letter-spacing: .01em; transition: transform .08s ease, box-shadow .2s ease, background-color .2s ease; } .btn:active { transform: translateY(1px) scale(.99); } .btn-primary { background: linear-gradient(135deg, #8B5CF6, #6D28D9); border: none; box-shadow: 0 6px 16px -6px rgba(124,58,237,.5); } .btn-primary:hover, .btn-primary:focus { background: linear-gradient(135deg, #7C3AED, #6D28D9); box-shadow: 0 8px 22px -6px rgba(124,58,237,.6); } .btn-outline-primary { color: var(--lx-violet-deep); border-color: #C9B8F5; } .btn-outline-primary:hover { background: var(--lx-violet); border-color: var(--lx-violet); color: #fff; } .form-control, .form-select, .custom-select { border-radius: .75rem; border-color: var(--lx-line); transition: border-color .15s ease, box-shadow .15s ease; } .form-control:focus, .form-select:focus, .custom-select:focus { border-color: #A78BFA; box-shadow: 0 0 0 .22rem rgba(124,58,237,.14); } .form-label { font-weight: 600; color: #3B3452; } .form-check-input:checked { background-color: var(--lx-violet); border-color: var(--lx-violet); } .form-check-input:focus { box-shadow: 0 0 0 .2rem rgba(124,58,237,.14); } .select2-container--default .select2-selection--single, .select2-container--default .select2-selection--multiple { border-radius: .75rem !important; border-color: var(--lx-line) !important; } .select2-container--default .select2-results__option--highlighted[aria-selected] { background-color: var(--lx-violet) !important; } .select2-container--default .select2-selection--multiple .select2-selection__choice { background: var(--lx-violet-soft); border: 1px solid #DFD4F9; color: var(--lx-violet-deep); border-radius: 999px; } .table thead th, .table-thead-bordered thead th { background: var(--lx-violet-mist); color: var(--lx-text-2); font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; border-bottom: 1px solid var(--lx-line); } .table tbody tr { transition: background-color .12s ease; } .table tbody tr:hover, .table-hover tbody tr:hover { background: rgba(124,58,237,.035); } .table td, .table th { vertical-align: middle; } .nav-tabs .nav-link { border: none; color: var(--lx-text-3); } .nav-tabs .nav-link.active { color: var(--lx-violet-deep); font-weight: 700; border-bottom: 2px solid var(--lx-violet); background: transparent; } .nav-pills .nav-link.active { background: var(--lx-violet); } .page-link { color: var(--lx-violet-deep); border-radius: .6rem; margin-inline: 2px; border-color: var(--lx-line); } .page-link:hover { background: var(--lx-violet-soft); color: var(--lx-violet-deep); } .page-item.active .page-link { background: var(--lx-violet); border-color: var(--lx-violet); box-shadow: 0 6px 16px -6px rgba(124,58,237,.5); } .dropdown-menu { border: 1px solid var(--lx-line); border-radius: .9rem; box-shadow: 0 16px 40px -12px rgba(29,23,41,.20); overflow: hidden; } .dropdown-item:hover, .dropdown-item.active { background: var(--lx-violet-soft); color: var(--lx-violet-deep); } .modal-content { border: none; border-radius: 1.2rem; box-shadow: 0 28px 72px -16px rgba(29,23,41,.35); } .modal-header, .modal-footer { border-color: #EFEBF8; } .badge { border-radius: 999px; font-weight: 600; letter-spacing: .02em; } .alert { border-radius: .9rem; } a { color: var(--lx-violet-deep); } a:hover { color: var(--lx-violet); } .text-primary { color: var(--lx-violet-deep) !important; } .bg-primary { background: var(--lx-violet) !important; } /* ═══════════════════════════════════════════ 10 · LOGIN PAGE ═══════════════════════════════════════════ */ .auth-wrapper-left { background: radial-gradient(700px 400px at 18% 0%, rgba(139,92,246,.28), transparent 55%), linear-gradient(160deg, #2A2140, var(--lx-ink) 70%) !important; } .auth-wrapper-left, .auth-wrapper-left .title { color: #F4F1FA !important; } .auth-wrapper-left .text-primary { color: #C4B5FD !important; } .auth-wrapper-form { border-radius: 1.3rem; box-shadow: var(--lx-shadow-hover); animation: lx-rise .5s cubic-bezier(.22,.8,.32,1) both; } /* ═══════════════════════════════════════════ 11 · POLISH — scrollbars, loader, a11y ═══════════════════════════════════════════ */ ::-webkit-scrollbar { width: 9px; height: 9px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: #CFC6E8; border-radius: 99px; border: 2px solid var(--lx-porcelain); } ::-webkit-scrollbar-thumb:hover { background: #A78BFA; } #loader { border-top-color: var(--lx-violet) !important; } .apexcharts-tooltip { border-radius: 10px !important; } :focus-visible { outline: 2px solid var(--lx-violet); outline-offset: 2px; } /* ── 12 · CLEAN SIDEBAR SEARCH BAR ── */ .aside-search-form { background: transparent !important; background-color: transparent !important; border: none !important; padding-inline: 16px !important; } .aside-search-form .input-group { background: rgba(255, 255, 255, 0.05) !important; border: 1px solid rgba(255, 255, 255, 0.08) !important; border-radius: 0.6rem !important; padding: 2px 4px !important; display: flex !important; align-items: center !important; } .aside-search-form .form-control { background: transparent !important; border: none !important; color: #F4F1FA !important; box-shadow: none !important; height: auto !important; padding: 6px 8px !important; } .aside-search-form .input-group-text { background: transparent !important; border: none !important; color: #C4B5FD !important; /* soft violet/lavender search icon */ padding: 6px 8px !important; } .aside-search-form .form-control::placeholder { color: #6F6592 !important; } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition: none !important; animation: none !important; } }