From 74e2bed34dfa491db3ef2a3074a8a081572e7bcd Mon Sep 17 00:00:00 2001 From: ialcarazsalazar Date: Sun, 15 Feb 2026 01:27:47 +0000 Subject: [PATCH] feat: add dark theme design system with gold accents Co-Authored-By: Claude Opus 4.6 --- .../Frontend-Hotel/src/styles/Dashboard.css | 41 +- frontend/Frontend-Hotel/src/styles/global.css | 4 +- frontend/Frontend-Hotel/src/styles/theme.css | 447 ++++++++++++++++++ 3 files changed, 472 insertions(+), 20 deletions(-) create mode 100644 frontend/Frontend-Hotel/src/styles/theme.css diff --git a/frontend/Frontend-Hotel/src/styles/Dashboard.css b/frontend/Frontend-Hotel/src/styles/Dashboard.css index e5239c5..5d159e0 100644 --- a/frontend/Frontend-Hotel/src/styles/Dashboard.css +++ b/frontend/Frontend-Hotel/src/styles/Dashboard.css @@ -8,7 +8,7 @@ } .sidebar { - background: linear-gradient(to bottom, #961227, #680012); + background: linear-gradient(to bottom, var(--bg-secondary), var(--bg-primary)); color: white; width: 200px; display: flex; @@ -32,8 +32,8 @@ } .sidebar nav a:hover { - background: #fc9b00; - color: rgb(14, 0, 0); + background: var(--accent-gold-muted); + color: var(--accent-gold); } .sidebar-header { @@ -54,9 +54,9 @@ .sidebar-toggle-button:focus { outline: none; - background: #fc9b00; - box-shadow: 0 0 0 3px; - background-color: rgba(255, 207, 48, 0.733); + background: var(--accent-gold-muted); + box-shadow: 0 0 0 3px var(--accent-gold); + background-color: var(--accent-gold-muted); } .menu-btn { @@ -88,7 +88,8 @@ } .menu-items a:hover { - background-color: #a0122b; + background-color: var(--accent-gold-muted); + color: var(--accent-gold); } /* Área principal */ @@ -102,17 +103,18 @@ .content { padding: 2rem; - background-color: #f0eeee; + background-color: var(--bg-primary); flex: 1; overflow-y: auto; /* Permite scroll vertical si es necesario */ } .topbar { - background-color: #e3b600; + background-color: var(--bg-secondary); display: flex; flex-direction: column; padding: 0.1rem 0.4rem; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + border-bottom: 2px solid var(--accent-gold); } .topbar-header { @@ -142,15 +144,15 @@ font-size: 1.2rem; padding: 3px 6px; border-radius: 4px; - background-color: #791313; - color: white; + background: var(--accent-gold-muted); + color: var(--accent-gold); font-weight: 600; text-decoration: none; transition: background-color 0.5s ease; } .submenu-link:hover { - background-color: #a0122b; + background-color: rgba(212, 165, 116, 0.25); } .topbar-left { @@ -173,33 +175,34 @@ } .topbar-icon:hover { - color: #791313; + color: var(--accent-gold); } .submenu-link:hover { - background-color: #f5d600; + background-color: rgba(212, 165, 116, 0.25); } .language-select { padding: 6px 10px; border-radius: 20px; - background-color: #ffffff; - border: none; + background-color: var(--bg-elevated); + border: 1px solid var(--border-color); font-size: 0.9rem; font-weight: bold; - color: #680012; + color: var(--text-primary); cursor: pointer; transition: background-color 0.3s ease; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); } .language-select:hover { - background-color: #f5d600; + background-color: var(--accent-gold-muted); + color: var(--accent-gold); } .language-select:focus { outline: none; - box-shadow: 0 0 0 2px #680012; + box-shadow: 0 0 0 2px var(--accent-gold); } /* diff --git a/frontend/Frontend-Hotel/src/styles/global.css b/frontend/Frontend-Hotel/src/styles/global.css index d23d982..22d2396 100644 --- a/frontend/Frontend-Hotel/src/styles/global.css +++ b/frontend/Frontend-Hotel/src/styles/global.css @@ -1,3 +1,5 @@ +@import './theme.css'; + .app { background-color: rgba(255, 223, 0, 0.85); display: flex; @@ -36,7 +38,7 @@ button { } */ .content { - padding: 20px; + padding: var(--space-lg); } /* Fondo del modal */ diff --git a/frontend/Frontend-Hotel/src/styles/theme.css b/frontend/Frontend-Hotel/src/styles/theme.css new file mode 100644 index 0000000..4ecc3dd --- /dev/null +++ b/frontend/Frontend-Hotel/src/styles/theme.css @@ -0,0 +1,447 @@ +:root { + /* Background layers */ + --bg-primary: #0a0a0a; + --bg-secondary: #1a1a1a; + --bg-elevated: #2a2a2a; + --bg-surface: #1e1e1e; + + /* Accent */ + --accent-gold: #d4a574; + --accent-gold-hover: #e0b88a; + --accent-gold-muted: rgba(212, 165, 116, 0.15); + + /* Text */ + --text-primary: #ffffff; + --text-secondary: #a0a0a0; + --text-muted: #666666; + + /* Status colors */ + --status-available: #22c55e; + --status-occupied: #3b82f6; + --status-cleaning: #eab308; + --status-maintenance: #ef4444; + + /* Semantic colors */ + --success: #22c55e; + --warning: #eab308; + --error: #ef4444; + --info: #3b82f6; + + /* Borders */ + --border-color: #333333; + --border-subtle: #2a2a2a; + + /* Shadows */ + --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3); + --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4); + --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.5); + + /* Border radius */ + --radius-sm: 6px; + --radius-md: 8px; + --radius-lg: 12px; + --radius-xl: 16px; + + /* Spacing */ + --space-xs: 4px; + --space-sm: 8px; + --space-md: 16px; + --space-lg: 24px; + --space-xl: 32px; + + /* Typography */ + --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + --font-mono: 'JetBrains Mono', 'Fira Code', monospace; +} + +body { + background-color: var(--bg-primary); + color: var(--text-primary); + font-family: var(--font-sans); + margin: 0; +} + +/* === Card Components === */ +.card { + background: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: var(--radius-lg); + padding: var(--space-lg); +} + +.card-elevated { + background: var(--bg-elevated); + border: 1px solid var(--border-color); + border-radius: var(--radius-lg); + padding: var(--space-lg); +} + +/* === Status Badges === */ +.badge { + display: inline-flex; + align-items: center; + padding: 2px 10px; + border-radius: 20px; + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.badge-available { background: rgba(34, 197, 94, 0.15); color: var(--status-available); } +.badge-occupied { background: rgba(59, 130, 246, 0.15); color: var(--status-occupied); } +.badge-cleaning { background: rgba(234, 179, 8, 0.15); color: var(--status-cleaning); } +.badge-maintenance { background: rgba(239, 68, 68, 0.15); color: var(--status-maintenance); } +.badge-pending { background: rgba(234, 179, 8, 0.15); color: var(--status-cleaning); } +.badge-confirmed { background: rgba(59, 130, 246, 0.15); color: var(--status-occupied); } +.badge-success { background: rgba(34, 197, 94, 0.15); color: var(--success); } +.badge-error { background: rgba(239, 68, 68, 0.15); color: var(--error); } +.badge-info { background: rgba(59, 130, 246, 0.15); color: var(--info); } + +/* === KPI Cards === */ +.kpi-card { + background: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: var(--radius-lg); + padding: var(--space-lg); + display: flex; + flex-direction: column; + gap: var(--space-sm); +} + +.kpi-card .kpi-value { + font-size: 2rem; + font-weight: 700; + color: var(--text-primary); +} + +.kpi-card .kpi-label { + font-size: 0.875rem; + color: var(--text-secondary); +} + +.kpi-card .kpi-trend { + font-size: 0.75rem; + font-weight: 600; +} + +.kpi-trend.positive { color: var(--success); } +.kpi-trend.negative { color: var(--error); } + +/* === Buttons === */ +.btn-gold { + background: var(--accent-gold); + color: #000; + border: none; + padding: 10px 20px; + border-radius: var(--radius-md); + font-weight: 600; + cursor: pointer; + transition: background 0.2s; + font-size: 0.875rem; +} + +.btn-gold:hover { + background: var(--accent-gold-hover); +} + +.btn-outline { + background: transparent; + color: var(--text-primary); + border: 1px solid var(--border-color); + padding: 10px 20px; + border-radius: var(--radius-md); + cursor: pointer; + transition: all 0.2s; + font-size: 0.875rem; +} + +.btn-outline:hover { + border-color: var(--accent-gold); + color: var(--accent-gold); +} + +.btn-sm { + padding: 6px 12px; + font-size: 0.75rem; +} + +.btn-danger { + background: rgba(239, 68, 68, 0.15); + color: var(--error); + border: 1px solid rgba(239, 68, 68, 0.3); + padding: 10px 20px; + border-radius: var(--radius-md); + cursor: pointer; + transition: all 0.2s; + font-size: 0.875rem; +} + +.btn-danger:hover { + background: rgba(239, 68, 68, 0.25); +} + +.btn-success { + background: rgba(34, 197, 94, 0.15); + color: var(--success); + border: 1px solid rgba(34, 197, 94, 0.3); + padding: 10px 20px; + border-radius: var(--radius-md); + cursor: pointer; + transition: all 0.2s; + font-size: 0.875rem; +} + +.btn-success:hover { + background: rgba(34, 197, 94, 0.25); +} + +/* === Form Inputs === */ +.input-dark { + background: var(--bg-elevated); + border: 1px solid var(--border-color); + color: var(--text-primary); + padding: 10px 14px; + border-radius: var(--radius-md); + font-size: 0.875rem; + width: 100%; + outline: none; + transition: border-color 0.2s; + box-sizing: border-box; +} + +.input-dark:focus { + border-color: var(--accent-gold); +} + +.input-dark::placeholder { + color: var(--text-muted); +} + +.select-dark { + background: var(--bg-elevated); + border: 1px solid var(--border-color); + color: var(--text-primary); + padding: 10px 14px; + border-radius: var(--radius-md); + font-size: 0.875rem; + width: 100%; + outline: none; + cursor: pointer; +} + +.select-dark:focus { + border-color: var(--accent-gold); +} + +.label-dark { + color: var(--text-secondary); + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + margin-bottom: var(--space-xs); + display: block; +} + +/* === Tables === */ +.table-dark { + width: 100%; + border-collapse: collapse; +} + +.table-dark th { + text-align: left; + padding: 12px 16px; + color: var(--text-secondary); + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + border-bottom: 1px solid var(--border-color); +} + +.table-dark td { + padding: 12px 16px; + border-bottom: 1px solid var(--border-subtle); + color: var(--text-primary); + font-size: 0.875rem; +} + +.table-dark tr:hover { + background: var(--bg-elevated); +} + +/* === Grid Layouts === */ +.grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--space-lg); } +.grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-lg); } +.grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-lg); } +.grid-5 { display: grid; grid-template-columns: repeat(5, 1fr); gap: var(--space-lg); } + +@media (max-width: 1024px) { + .grid-4, .grid-5 { grid-template-columns: repeat(2, 1fr); } + .grid-3 { grid-template-columns: repeat(2, 1fr); } +} + +@media (max-width: 640px) { + .grid-2, .grid-3, .grid-4, .grid-5 { grid-template-columns: 1fr; } +} + +/* === Room Grid Cards === */ +.room-card { + background: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: var(--radius-md); + padding: var(--space-md); + cursor: pointer; + transition: all 0.2s; + border-left: 4px solid var(--border-color); +} + +.room-card:hover { + background: var(--bg-elevated); + transform: translateY(-1px); +} + +.room-card.available { border-left-color: var(--status-available); } +.room-card.occupied { border-left-color: var(--status-occupied); } +.room-card.cleaning { border-left-color: var(--status-cleaning); } +.room-card.maintenance { border-left-color: var(--status-maintenance); } + +.room-card .room-number { + font-size: 1.125rem; + font-weight: 700; + color: var(--text-primary); +} + +.room-card .room-info { + font-size: 0.8rem; + color: var(--text-secondary); + margin-top: var(--space-xs); +} + +/* === Modal === */ +.modal-overlay-dark { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.7); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + animation: fadeIn 0.2s ease-out; +} + +.modal-content-dark { + background: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: var(--radius-xl); + padding: var(--space-xl); + max-width: 500px; + width: 90%; + max-height: 85vh; + overflow-y: auto; + box-shadow: var(--shadow-lg); +} + +.modal-content-dark h2 { + color: var(--text-primary); + margin-top: 0; + margin-bottom: var(--space-lg); + font-size: 1.25rem; +} + +/* === Search Input === */ +.search-bar { + display: flex; + align-items: center; + background: var(--bg-elevated); + border: 1px solid var(--border-color); + border-radius: var(--radius-md); + padding: 0 var(--space-md); + transition: border-color 0.2s; +} + +.search-bar:focus-within { + border-color: var(--accent-gold); +} + +.search-bar input { + background: transparent; + border: none; + color: var(--text-primary); + padding: 10px; + flex: 1; + outline: none; + font-size: 0.875rem; +} + +.search-bar input::placeholder { + color: var(--text-muted); +} + +/* === Tab/Filter Pills === */ +.filter-pills { + display: flex; + gap: var(--space-sm); + flex-wrap: wrap; +} + +.filter-pill { + padding: 6px 16px; + border-radius: 20px; + font-size: 0.8rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s; + background: var(--bg-elevated); + color: var(--text-secondary); + border: 1px solid var(--border-color); +} + +.filter-pill:hover { + color: var(--accent-gold); + border-color: var(--accent-gold); +} + +.filter-pill.active { + background: var(--accent-gold-muted); + color: var(--accent-gold); + border-color: var(--accent-gold); +} + +/* === Page Header === */ +.page-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--space-xl); +} + +.page-header h2 { + color: var(--text-primary); + font-size: 1.5rem; + font-weight: 700; + margin: 0; +} + +/* === Empty State === */ +.empty-state { + text-align: center; + padding: var(--space-xl) * 2; + color: var(--text-muted); +} + +.empty-state p { + font-size: 1rem; + margin-top: var(--space-md); +} + +/* === Shift Schedule Colors === */ +.shift-morning { background: rgba(234, 179, 8, 0.2); color: #eab308; } +.shift-afternoon { background: rgba(59, 130, 246, 0.2); color: #3b82f6; } +.shift-night { background: rgba(168, 85, 247, 0.2); color: #a855f7; } +.shift-off { background: rgba(107, 114, 128, 0.2); color: #6b7280; }