Spaces:
Sleeping
Sleeping
| /* ============================================ | |
| 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) ; | |
| border-color: var(--color-accent-green) ; | |
| border-radius: var(--radius-button) ; | |
| font-family: 'Outfit', sans-serif ; | |
| font-weight: 500 ; | |
| transition: all 0.3s ease ; | |
| } | |
| .btn-success:hover { | |
| background-color: var(--color-darker-accent) ; | |
| border-color: var(--color-darker-accent) ; | |
| transform: translateY(-2px); | |
| } | |
| .btn-danger { | |
| border-radius: var(--radius-button) ; | |
| font-family: 'Outfit', sans-serif ; | |
| font-weight: 500 ; | |
| } | |
| .btn-info, | |
| .btn-warning { | |
| border-radius: var(--radius-button) ; | |
| font-family: 'Outfit', sans-serif ; | |
| font-weight: 500 ; | |
| } | |
| /* ============================================ | |
| 5. CARDS | |
| ============================================ */ | |
| .card { | |
| background-color: var(--color-surface); | |
| border-radius: var(--radius-card) ; | |
| box-shadow: var(--shadow-card); | |
| border: none ; | |
| padding: var(--spacing-xl); | |
| margin-bottom: var(--spacing-lg); | |
| } | |
| .card-body { | |
| padding: var(--spacing-lg); | |
| } | |
| .control-panel { | |
| background: var(--color-surface) ; | |
| 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) ; | |
| 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); | |
| } |