/* ============================================ Farm Geofencing - Nature-Professional Theme Based on UI/UX Style Guide ============================================ */ /* Import Outfit Font */ @import url('https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap'); /* ============================================ 1. CSS CUSTOM PROPERTIES (COLOR SYSTEM) ============================================ */ :root { /* Primary Colors */ --color-deep-green: #1a5d3a; --color-accent-green: #198754; --color-darker-accent: #143d2e; /* Neutral Colors */ --color-background: #f8f9fa; --color-surface: #ffffff; --color-text-dark: #212529; --color-text-muted: #6c757d; --color-border: #dee2e6; /* Upload Zone */ --color-upload-bg: #fcfcfc; --color-upload-active: #f0fff4; /* Shadows */ --shadow-card: 0 10px 40px rgba(0, 0, 0, 0.08); --shadow-input-focus: 0 0 0 4px rgba(25, 135, 84, 0.1); /* Border Radius */ --radius-card: 20px; --radius-button: 8px; --radius-pill: 50px; /* Spacing */ --spacing-xs: 0.5rem; --spacing-sm: 1rem; --spacing-md: 1.5rem; --spacing-lg: 2rem; --spacing-xl: 3rem; } /* ============================================ 2. GLOBAL STYLES & TYPOGRAPHY ============================================ */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Outfit', sans-serif; font-weight: 400; color: var(--color-text-dark); background-color: var(--color-background); line-height: 1.6; } h1, h2, h3, h4, h5, h6 { font-weight: 700; color: var(--color-text-dark); margin-bottom: var(--spacing-sm); } h1 { font-size: 2.5rem; font-weight: 700; } h2 { font-size: 2rem; font-weight: 600; } h3 { font-size: 1.75rem; font-weight: 600; } h4 { font-size: 1.5rem; font-weight: 600; } h5 { font-size: 1.25rem; font-weight: 600; } h6 { font-size: 1rem; font-weight: 600; } p { margin-bottom: var(--spacing-sm); } /* ============================================ 3. CURVED HERO HEADER ============================================ */ .hero-header { background: var(--color-deep-green); color: var(--color-surface); padding: var(--spacing-xl) var(--spacing-lg); border-bottom-left-radius: 50% 20px; border-bottom-right-radius: 50% 20px; margin-bottom: var(--spacing-lg); box-shadow: var(--shadow-card); } .hero-header h1 { color: var(--color-surface); margin-bottom: 0; } /* ============================================ 4. BUTTONS ============================================ */ /* Primary Action Button */ .btn-primary-action { background-color: var(--color-deep-green); color: var(--color-surface); border: none; border-radius: var(--radius-button); padding: 0.75rem 1.5rem; font-family: 'Outfit', sans-serif; font-weight: 500; font-size: 1rem; cursor: pointer; transition: all 0.3s ease; display: inline-flex; align-items: center; gap: 0.5rem; } .btn-primary-action:hover { background-color: var(--color-darker-accent); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(26, 93, 58, 0.3); } .btn-primary-action:active { transform: translateY(0); } /* Secondary/Pill Button */ .btn-secondary-pill { background-color: var(--color-surface); color: var(--color-accent-green); border: 1px solid var(--color-accent-green); border-radius: var(--radius-pill); padding: 0.75rem 1.5rem; font-family: 'Outfit', sans-serif; font-weight: 500; font-size: 1rem; cursor: pointer; transition: all 0.3s ease; display: inline-flex; align-items: center; gap: 0.5rem; } .btn-secondary-pill:hover { background-color: var(--color-accent-green); color: var(--color-surface); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(25, 135, 84, 0.3); } /* Bootstrap Button Overrides */ .btn-success { background-color: var(--color-accent-green) !important; border-color: var(--color-accent-green) !important; border-radius: var(--radius-button) !important; font-family: 'Outfit', sans-serif !important; font-weight: 500 !important; transition: all 0.3s ease !important; } .btn-success:hover { background-color: var(--color-darker-accent) !important; border-color: var(--color-darker-accent) !important; transform: translateY(-2px); } .btn-danger { border-radius: var(--radius-button) !important; font-family: 'Outfit', sans-serif !important; font-weight: 500 !important; } .btn-info, .btn-warning { border-radius: var(--radius-button) !important; font-family: 'Outfit', sans-serif !important; font-weight: 500 !important; } /* ============================================ 5. CARDS ============================================ */ .card { background-color: var(--color-surface); border-radius: var(--radius-card) !important; box-shadow: var(--shadow-card); border: none !important; padding: var(--spacing-xl); margin-bottom: var(--spacing-lg); } .card-body { padding: var(--spacing-lg); } .control-panel { background: var(--color-surface) !important; padding: var(--spacing-lg); border-radius: var(--radius-card); box-shadow: var(--shadow-card); border: none; } /* Weather and Event Cards */ .weather-card, .event-card { background-color: var(--color-surface); border-radius: var(--radius-card); padding: var(--spacing-lg); box-shadow: var(--shadow-card); transition: transform 0.3s ease, box-shadow 0.3s ease; cursor: pointer; border: 1px solid var(--color-border); } .weather-card:hover, .event-card:hover { transform: translateY(-5px); box-shadow: 0 15px 50px rgba(0, 0, 0, 0.12); } /* ============================================ 6. INPUTS & FORMS ============================================ */ .form-control { background-color: var(--color-background); border: 1px solid var(--color-border); border-radius: var(--radius-button); padding: 0.75rem 1rem; font-family: 'Outfit', sans-serif; font-weight: 400; font-size: 1rem; color: var(--color-text-dark); transition: all 0.3s ease; } .form-control:focus { background-color: var(--color-surface); border-color: var(--color-accent-green); box-shadow: var(--shadow-input-focus); outline: none; } .form-label { font-family: 'Outfit', sans-serif; font-weight: 500; color: var(--color-text-dark); margin-bottom: var(--spacing-xs); } .form-check-label { font-family: 'Outfit', sans-serif; font-weight: 400; color: var(--color-text-dark); } /* Input Groups */ .input-group .form-control { border-radius: var(--radius-button); } /* ============================================ 7. UPLOAD ZONE (if needed) ============================================ */ .upload-zone { border: 2px dashed var(--color-border); background-color: var(--color-upload-bg); border-radius: var(--radius-card); padding: var(--spacing-xl); text-align: center; transition: all 0.3s ease; cursor: pointer; } .upload-zone:hover, .upload-zone.active { background-color: var(--color-upload-active); border-color: var(--color-accent-green); } /* ============================================ 8. TABLES ============================================ */ .table { font-family: 'Outfit', sans-serif; color: var(--color-text-dark); } .table thead { background-color: var(--color-deep-green); color: var(--color-surface); font-weight: 600; } .table thead th { border: none; padding: var(--spacing-sm) var(--spacing-md); } .table tbody td { padding: var(--spacing-sm) var(--spacing-md); border-color: var(--color-border); } .table-bordered { border: 1px solid var(--color-border); border-radius: var(--radius-button); overflow: hidden; } /* ============================================ 9. TABS ============================================ */ .nav-tabs { border-bottom: 2px solid var(--color-border); } .nav-tabs .nav-link { font-family: 'Outfit', sans-serif; font-weight: 500; color: var(--color-text-muted); border: none; border-bottom: 3px solid transparent; padding: var(--spacing-sm) var(--spacing-md); transition: all 0.3s ease; } .nav-tabs .nav-link:hover { color: var(--color-accent-green); border-bottom-color: var(--color-accent-green); } .nav-tabs .nav-link.active { color: var(--color-accent-green); background-color: transparent; border-bottom-color: var(--color-accent-green); font-weight: 600; } /* ============================================ 10. MODALS ============================================ */ .modal-content { border-radius: var(--radius-card); border: none; box-shadow: var(--shadow-card); } .modal-header { background-color: var(--color-deep-green); color: var(--color-surface); border-top-left-radius: var(--radius-card); border-top-right-radius: var(--radius-card); border-bottom: none; padding: var(--spacing-lg); } .modal-header .modal-title { color: var(--color-surface); font-weight: 600; } .modal-header .btn-close { filter: brightness(0) invert(1); } .modal-body { padding: var(--spacing-lg); font-family: 'Outfit', sans-serif; } /* ============================================ 11. MAP CONTAINER ============================================ */ #map { height: 70vh; width: 100%; border-radius: var(--radius-card); box-shadow: var(--shadow-card); border: 1px solid var(--color-border); } /* ============================================ 12. LOADING OVERLAY ============================================ */ .loading-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.9); display: none; justify-content: center; align-items: center; z-index: 9999; } .spinner { width: 50px; height: 50px; border: 5px solid var(--color-border); border-top: 5px solid var(--color-accent-green); border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* ============================================ 13. UTILITIES ============================================ */ .text-muted { color: var(--color-text-muted) !important; font-weight: 300; } .bg-surface { background-color: var(--color-surface); } .bg-deep-green { background-color: var(--color-deep-green); } .text-accent { color: var(--color-accent-green); } /* Spacing Utilities */ .mb-custom { margin-bottom: var(--spacing-lg); } .p-custom { padding: var(--spacing-lg); } /* ============================================ 14. RESPONSIVE DESIGN ============================================ */ @media (max-width: 768px) { h1 { font-size: 2rem; } .hero-header { padding: var(--spacing-lg) var(--spacing-sm); } .card { padding: var(--spacing-lg); } .control-panel { margin-bottom: var(--spacing-md); } #map { height: 50vh; } } @media (max-width: 576px) { h1 { font-size: 1.75rem; } .btn-primary-action, .btn-secondary-pill { width: 100%; justify-content: center; } } /* ============================================ 15. CUSTOM SCROLLBAR ============================================ */ ::-webkit-scrollbar { width: 10px; height: 10px; } ::-webkit-scrollbar-track { background: var(--color-background); } ::-webkit-scrollbar-thumb { background: var(--color-accent-green); border-radius: 5px; } ::-webkit-scrollbar-thumb:hover { background: var(--color-deep-green); }