/* === Tour Planner Design System === */ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Outfit:wght@400;500;600;700;800&family=Playfair+Display:ital,wght@0,600;0,700;1,600&display=swap'); :root { /* Core Colors */ --color-primary: hsl(220, 90%, 56%); --color-primary-dark: hsl(220, 90%, 42%); --color-primary-light: hsl(220, 90%, 70%); --color-primary-glow: hsla(220, 90%, 56%, 0.35); --color-accent: hsl(38, 95%, 55%); --color-accent-dark: hsl(38, 95%, 40%); --color-accent-light: hsl(38, 95%, 70%); --color-accent-glow: hsla(38, 95%, 55%, 0.3); /* Background (Dark Mode Default) */ --color-bg-base: hsl(222, 28%, 8%); --color-bg-surface: hsl(222, 22%, 13%); --color-bg-elevated: hsl(222, 18%, 18%); --color-bg-card: hsla(222, 22%, 15%, 0.85); --color-bg-overlay: hsla(222, 28%, 5%, 0.82); /* Text */ --color-text-primary: hsl(210, 40%, 96%); --color-text-secondary: hsl(210, 20%, 68%); --color-text-muted: hsl(210, 15%, 48%); /* Borders */ --color-border: hsl(220, 15%, 22%); --color-border-light: hsl(220, 15%, 30%); --color-border-focus: hsl(220, 90%, 60%); /* Status Colors */ --color-success: hsl(142, 70%, 45%); --color-success-bg: hsla(142, 70%, 45%, 0.15); --color-warning: hsl(38, 95%, 55%); --color-warning-bg: hsla(38, 95%, 55%, 0.15); --color-danger: hsl(0, 75%, 55%); --color-danger-bg: hsla(0, 75%, 55%, 0.15); --color-info: hsl(199, 89%, 48%); --color-info-bg: hsla(199, 89%, 48%, 0.15); /* Category Colors */ --color-cat-wisata: hsl(220, 90%, 56%); --color-cat-makan: hsl(142, 70%, 45%); --color-cat-transportasi: hsl(280, 70%, 60%); --color-cat-checkin: hsl(38, 95%, 55%); --color-cat-akomodasi: hsl(265, 80%, 65%); --color-cat-belanja: hsl(340, 75%, 58%); --color-cat-lainnya: hsl(210, 20%, 55%); /* Typography */ --font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; --font-display: 'Outfit', sans-serif; --font-hero: 'Playfair Display', serif; --text-xs: 0.75rem; /* 12px */ --text-sm: 0.875rem; /* 14px */ --text-base: 1rem; /* 16px */ --text-lg: 1.125rem; /* 18px */ --text-xl: 1.25rem; /* 20px */ --text-2xl: 1.5rem; /* 24px */ --text-3xl: 1.875rem; /* 30px */ --text-4xl: 2.25rem; /* 36px */ --text-5xl: 3rem; /* 48px */ /* Spacing */ --space-1: 0.25rem; --space-2: 0.5rem; --space-3: 0.75rem; --space-4: 1rem; --space-5: 1.25rem; --space-6: 1.5rem; --space-8: 2rem; --space-10: 2.5rem; --space-12: 3rem; --space-16: 4rem; --space-20: 5rem; /* Border Radius */ --radius-xs: 0.25rem; --radius-sm: 0.375rem; --radius-md: 0.5rem; --radius-lg: 0.75rem; --radius-xl: 1rem; --radius-2xl: 1.5rem; --radius-full: 9999px; /* Shadows & Glow */ --shadow-sm: 0 2px 4px hsla(0, 0%, 0%, 0.3); --shadow-md: 0 6px 18px hsla(0, 0%, 0%, 0.4); --shadow-lg: 0 12px 36px hsla(0, 0%, 0%, 0.5); --shadow-glow-primary: 0 0 25px var(--color-primary-glow); --shadow-glow-accent: 0 0 25px var(--color-accent-glow); /* Transitions */ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1); --transition-base: 300ms cubic-bezier(0.4, 0, 0.2, 1); --transition-slow: 500ms cubic-bezier(0.4, 0, 0.2, 1); /* Z-Index */ --z-dropdown: 100; --z-sticky: 150; --z-modal-backdrop: 200; --z-modal: 210; --z-toast: 300; --z-tooltip: 400; } /* === CSS Reset & Base Rules === */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { scroll-behavior: smooth; } body { font-family: var(--font-body); background-color: var(--color-bg-base); color: var(--color-text-primary); line-height: 1.6; min-height: 100vh; overflow-x: hidden; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* Custom Scrollbar */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: var(--color-bg-base); } ::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: var(--radius-full); } ::-webkit-scrollbar-thumb:hover { background: var(--color-border-light); } /* Typography Hierarchy */ h1, h2, h3, h4, h5, h6 { font-family: var(--font-display); font-weight: 700; line-height: 1.25; color: var(--color-text-primary); } h1 { font-size: var(--text-4xl); } h2 { font-size: var(--text-3xl); } h3 { font-size: var(--text-2xl); } h4 { font-size: var(--text-xl); } h5 { font-size: var(--text-lg); } h6 { font-size: var(--text-base); } p { color: var(--color-text-secondary); font-size: var(--text-base); } a { color: var(--color-primary-light); text-decoration: none; transition: color var(--transition-fast); } a:hover { color: var(--color-accent); } button { font-family: var(--font-body); cursor: pointer; border: none; outline: none; background: none; } input, select, textarea { font-family: var(--font-body); color: var(--color-text-primary); } /* === Utility Classes === */ .container { width: 100%; max-width: 1280px; margin: 0 auto; padding: 0 var(--space-6); } .page-wrapper { min-height: calc(100vh - 80px); padding: var(--space-8) 0 var(--space-16); } .page-header { margin-bottom: var(--space-8); } .page-title { font-size: var(--text-3xl); font-family: var(--font-display); margin-bottom: var(--space-2); display: flex; align-items: center; gap: var(--space-3); } .page-subtitle { font-size: var(--text-base); color: var(--color-text-secondary); max-width: 650px; } /* Glassmorphism */ .glass { background: hsla(222, 22%, 15%, 0.75); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border: 1px solid var(--color-border); border-radius: var(--radius-xl); box-shadow: var(--shadow-md); } .glass-dark { background: hsla(222, 28%, 10%, 0.85); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid var(--color-border); border-radius: var(--radius-xl); } .glass-card { background: linear-gradient(135deg, hsla(222, 22%, 18%, 0.8), hsla(222, 22%, 12%, 0.9)); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid var(--color-border); border-radius: var(--radius-xl); transition: transform var(--transition-base), border-color var(--transition-base), box-shadow var(--transition-base); } .glass-card:hover { border-color: var(--color-border-light); box-shadow: var(--shadow-lg), var(--shadow-glow-primary); transform: translateY(-4px); } /* Gradient Utilities */ .text-gradient { background: linear-gradient(135deg, var(--color-primary-light) 0%, var(--color-accent) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .text-gradient-hero { background: linear-gradient(135deg, hsl(0, 0%, 100%) 30%, var(--color-accent-light) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .bg-gradient-hero { background: radial-gradient(ellipse at 15% 30%, hsla(220, 90%, 40%, 0.25) 0%, transparent 60%), radial-gradient(ellipse at 85% 20%, hsla(38, 95%, 45%, 0.18) 0%, transparent 50%), radial-gradient(ellipse at 50% 80%, hsla(280, 70%, 40%, 0.12) 0%, transparent 60%), var(--color-bg-base); } /* Grid System */ .grid-1 { display: grid; grid-template-columns: 1fr; gap: var(--space-6); } .grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--space-6); } .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-6); } .grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-6); } /* Responsive Grids */ @media (max-width: 1100px) { .grid-4 { grid-template-columns: repeat(3, 1fr); } } @media (max-width: 860px) { .grid-4 { grid-template-columns: repeat(2, 1fr); } .grid-3 { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 600px) { .grid-4, .grid-3, .grid-2 { grid-template-columns: 1fr; } .container { padding: 0 var(--space-4); } h1 { font-size: var(--text-3xl); } .page-title { font-size: var(--text-2xl); } } /* Flex Utilities */ .flex-center { display: flex; align-items: center; justify-content: center; } .flex-between { display: flex; align-items: center; justify-content: space-between; } .flex-gap-2 { display: flex; gap: var(--space-2); } .flex-gap-4 { display: flex; gap: var(--space-4); } .flex-col { display: flex; flex-direction: column; } /* Form Controls */ .input-field, .select-field, .textarea-field { width: 100%; background: hsla(222, 28%, 10%, 0.8); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-3) var(--space-4); font-size: var(--text-sm); color: var(--color-text-primary); transition: border-color var(--transition-fast), box-shadow var(--transition-fast); } .input-field:focus, .select-field:focus, .textarea-field:focus { border-color: var(--color-border-focus); box-shadow: 0 0 0 3px hsla(220, 90%, 56%, 0.2); outline: none; } .input-field::placeholder, .textarea-field::placeholder { color: var(--color-text-muted); } .input-group { display: flex; flex-direction: column; gap: var(--space-2); margin-bottom: var(--space-4); } .input-label { font-size: var(--text-sm); font-weight: 500; color: var(--color-text-secondary); } /* Badges */ .badge { display: inline-flex; align-items: center; gap: var(--space-1); padding: var(--space-1) var(--space-3); border-radius: var(--radius-full); font-size: var(--text-xs); font-weight: 600; letter-spacing: 0.02em; text-transform: uppercase; } .badge-primary { background: var(--color-primary-glow); color: var(--color-primary-light); border: 1px solid hsla(220, 90%, 56%, 0.3); } .badge-accent { background: var(--color-accent-glow); color: var(--color-accent-light); border: 1px solid hsla(38, 95%, 55%, 0.3); } .badge-success { background: var(--color-success-bg); color: var(--color-success); border: 1px solid hsla(142, 70%, 45%, 0.3); } .badge-warning { background: var(--color-warning-bg); color: var(--color-warning); border: 1px solid hsla(38, 95%, 55%, 0.3); } .badge-danger { background: var(--color-danger-bg); color: var(--color-danger); border: 1px solid hsla(0, 75%, 55%, 0.3); } .badge-neutral { background: hsla(220, 15%, 25%, 0.6); color: var(--color-text-secondary); border: 1px solid var(--color-border); } /* Buttons */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2); padding: var(--space-3) var(--space-5); font-size: var(--text-sm); font-weight: 600; border-radius: var(--radius-md); transition: all var(--transition-fast); cursor: pointer; user-select: none; white-space: nowrap; } .btn-primary { background: linear-gradient(135deg, var(--color-primary), var(--color-primary-dark)); color: #ffffff; box-shadow: 0 4px 14px var(--color-primary-glow); } .btn-primary:hover { background: linear-gradient(135deg, var(--color-primary-light), var(--color-primary)); box-shadow: 0 6px 20px hsla(220, 90%, 56%, 0.5); transform: translateY(-1px); } .btn-primary:active { transform: translateY(0); } .btn-accent { background: linear-gradient(135deg, var(--color-accent), var(--color-accent-dark)); color: hsl(222, 28%, 8%); font-weight: 700; box-shadow: 0 4px 14px var(--color-accent-glow); } .btn-accent:hover { background: linear-gradient(135deg, var(--color-accent-light), var(--color-accent)); box-shadow: 0 6px 20px hsla(38, 95%, 55%, 0.5); transform: translateY(-1px); } .btn-secondary { background: var(--color-bg-elevated); color: var(--color-text-primary); border: 1px solid var(--color-border); } .btn-secondary:hover { background: hsla(222, 18%, 24%, 1); border-color: var(--color-border-light); transform: translateY(-1px); } .btn-ghost { background: transparent; color: var(--color-text-secondary); } .btn-ghost:hover { background: hsla(220, 15%, 25%, 0.4); color: var(--color-text-primary); } .btn-danger { background: var(--color-danger-bg); color: var(--color-danger); border: 1px solid hsla(0, 75%, 55%, 0.3); } .btn-danger:hover { background: var(--color-danger); color: #ffffff; } .btn-sm { padding: var(--space-1) var(--space-3); font-size: var(--text-xs); border-radius: var(--radius-sm); } .btn-lg { padding: var(--space-4) var(--space-8); font-size: var(--text-base); border-radius: var(--radius-lg); } .btn-icon { padding: var(--space-2); border-radius: var(--radius-md); display: inline-flex; align-items: center; justify-content: center; } /* Animations Keyframes */ @keyframes pulse-slow { 0%, 100% { opacity: 0.6; transform: scale(1); } 50% { opacity: 0.9; transform: scale(1.05); } } .animate-pulse-slow { animation: pulse-slow 6s ease-in-out infinite; }