/* === Fonts ================================================================= */ @import url('https://fonts.googleapis.com/css2?family=Quicksand:wght@500;600;700&display=swap'); /* === Theme tokens — recolor Gradio's defaults with the Guarden palette ===== */ :root, .dark { --body-background-fill: linear-gradient(180deg, #eef7ee 0%, #f7f4ec 100%); --background-fill-primary: #ffffff; --background-fill-secondary: #f3f9f1; --border-color-primary: #e3efe0; --border-color-accent: #cfe8cf; --border-color-accent-subdued: #e3efe0; --body-text-color: #2f3e2f; --body-text-color-subdued: #7c9a7c; --block-background-fill: #ffffff; --block-border-color: #e6f0e3; --block-border-width: 1px; --block-radius: 18px; --block-shadow: 0 4px 18px rgba(76, 175, 80, 0.07); --block-label-background-fill: transparent; --block-label-border-width: 0px; --block-label-text-color: #6f9170; --block-title-text-color: #2f3e2f; --block-info-text-color: #84a584; --input-background-fill: #fbfdf9; --input-border-color: #dfeedb; --input-border-color-focus: #81c784; --input-border-width: 1.5px; --input-radius: 12px; --input-shadow: none; --input-shadow-focus: 0 0 0 3px rgba(76, 175, 80, 0.16); --button-primary-background-fill: linear-gradient(135deg, #66bb6a 0%, #43a047 100%); --button-primary-background-fill-hover: linear-gradient(135deg, #5cb860 0%, #388e3c 100%); --button-primary-text-color: #ffffff; --button-primary-border-color: transparent; --button-primary-shadow: 0 3px 10px rgba(67, 160, 71, 0.25); --button-primary-shadow-hover: 0 5px 16px rgba(67, 160, 71, 0.32); --button-secondary-background-fill: #ffffff; --button-secondary-background-fill-hover: #f3f9f1; --button-secondary-border-color: #dfeedb; --button-secondary-text-color: #3f5b3f; --color-accent: #4caf50; --color-accent-soft: rgba(76, 175, 80, 0.12); --link-text-color: #2e7d32; --link-text-color-hover: #1b5e20; --shadow-drop: 0 4px 14px rgba(76, 175, 80, 0.08); --shadow-drop-lg: 0 10px 30px rgba(76, 175, 80, 0.12); } /* === App shell ============================================================ */ html, body { min-height: 100%; } body, .gradio-container { background: linear-gradient(180deg, #eef7ee 0%, #f7f4ec 100%) !important; } .gradio-container { max-width: 1680px !important; width: 100% !important; margin: 0 auto !important; padding: 1.5rem clamp(1rem, 3vw, 3rem) 3rem !important; min-height: 100vh; } .gradio-container, .gradio-container .prose { font-family: 'Quicksand', 'Segoe UI', sans-serif; } .gradio-container h1, .gradio-container h2, .gradio-container h3 { font-weight: 700; } /* Hide the default "Built with Gradio" footer for a cleaner, full-page feel */ footer { display: none !important; } /* === Buttons =============================================================== */ .gradio-container button { border-radius: 12px; font-weight: 600; transition: transform 0.08s ease, box-shadow 0.15s ease, filter 0.15s ease; } .gradio-container button:active { transform: scale(0.98); } /* === Header ================================================================ */ #header-bar { align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 1rem; background: linear-gradient(135deg, #ffffff 0%, #f3f9f1 100%); border: 1px solid #e3efe0; border-radius: 20px; box-shadow: 0 6px 24px rgba(76, 175, 80, 0.10); padding: 1.25rem 1.75rem; margin-bottom: 1.5rem; } #header-bar .prose { text-align: left; } #header-bar h1 { margin: 0 !important; font-size: 2rem; background: linear-gradient(135deg, #2e7d32 0%, #66bb6a 100%); -webkit-background-clip: text; background-clip: text; color: transparent; } #header-bar .prose p { margin: 0.25rem 0 0 !important; color: #6f9170; font-size: 1rem; } /* === "Add a plant" call-to-action ========================================== */ #add-plant-fab { flex-shrink: 0; border-radius: 999px !important; padding: 0 1.75rem !important; height: 48px; font-size: 1rem; } /* === Add-plant drawer (inline card) ========================================= */ #add-drawer { background: #fffdf8; border: 1px solid #e6f0e3; border-radius: 20px; box-shadow: 0 10px 30px rgba(76, 175, 80, 0.12); padding: 1.5rem; margin-bottom: 1.5rem; } #close-drawer-btn { margin-top: 0.5rem; } /* === Garden board (free drag & drop) ======================================= */ #garden-board { padding: 12px !important; } .garden-board-inner { position: relative; height: 440px; border-radius: 12px; overflow: hidden; background: repeating-linear-gradient( to bottom, #e7f3e3 0px, #e7f3e3 96px, #d9ecd2 96px, #d9ecd2 100px ); } .garden-sprite { position: absolute; transform: translate(-50%, -50%); display: flex; flex-direction: column; align-items: center; cursor: grab; touch-action: none; user-select: none; -webkit-user-select: none; z-index: 1; } .garden-sprite.dragging { cursor: grabbing; z-index: 10; opacity: 0.85; } #garden-board.link-mode .garden-sprite { cursor: crosshair; } .garden-sprite.link-source img { outline: 3px solid #43a047; outline-offset: 2px; border-radius: 8px; } /* SVG overlay drawing lines between hand-linked ("neighbor") plants */ .garden-links { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; z-index: 0; } .garden-links line { stroke: #8d6e63; stroke-width: 2; stroke-dasharray: 5 4; stroke-linecap: round; vector-effect: non-scaling-stroke; } /* "Relier des plantes" toggle button */ #link-mode-btn { border-radius: 999px !important; padding: 0.45rem 1.25rem !important; background: #ffffff !important; border: 1.5px solid #cfe8cf !important; color: #3f5b3f !important; box-shadow: 0 2px 8px rgba(76, 175, 80, 0.10); } #link-mode-btn:hover { background: #f3f9f1 !important; border-color: #81c784 !important; } #link-mode-btn.link-mode-active { background: linear-gradient(135deg, #66bb6a 0%, #43a047 100%) !important; color: #ffffff !important; border-color: transparent !important; box-shadow: 0 3px 10px rgba(67, 160, 71, 0.25); } .garden-sprite img { width: 88px; height: 88px; image-rendering: pixelated; image-rendering: -moz-crisp-edges; image-rendering: crisp-edges; } .garden-caption { margin-top: 2px; padding: 1px 8px; font-size: 0.75rem; font-weight: 600; color: #3f5b3f; background: rgba(255, 255, 255, 0.8); border-radius: 999px; white-space: nowrap; pointer-events: none; } /* Hidden bridge widgets used by the garden board's drag/click JS */ .board-sync { position: absolute !important; width: 1px !important; height: 1px !important; min-width: 1px !important; padding: 0 !important; margin: 0 !important; overflow: hidden !important; opacity: 0 !important; pointer-events: none !important; border: none !important; } /* === Detail card =========================================================== */ #plant-detail { background: #ffffff; border: 1px solid #e6f0e3; border-radius: 16px; padding: 0.5rem 1.25rem; margin-top: 1rem; } /* === Sidebar ================================================================ */ #sidebar { background: #ffffff; border: 1px solid #e6f0e3; border-radius: 20px; box-shadow: 0 4px 18px rgba(76, 175, 80, 0.07); padding: 1.25rem !important; } #sidebar h3 { margin-top: 0.25rem; margin-bottom: 0.5rem; } /* Card-ify the recommendation / forecast tables */ #watering-cards .table-wrap, #forecast-strip .table-wrap { border: none !important; background: transparent !important; } #watering-cards .header-table thead { display: none; } /* Forecast table: show the column titles as a styled label row above the cards */ #forecast-strip .header-table { display: block; width: 100% !important; margin-bottom: 6px; } #forecast-strip .header-table thead { display: block; } #forecast-strip .header-table thead tr { display: flex; width: 100%; gap: 6px; } #forecast-strip .header-table tbody { display: none; } #forecast-strip .header-cell { border: none !important; background: #e3efe0 !important; border-radius: 10px !important; flex: 1 1 0% !important; width: auto !important; min-width: 0 !important; } #forecast-strip .header-cell .header-content span { font-size: 0.7rem; font-weight: 700; color: #2e7d32; text-transform: uppercase; letter-spacing: 0.02em; } #forecast-strip .header-cell .cell-menu-button { display: none; } #watering-cards .virtual-body, #forecast-strip .virtual-body { width: 100% !important; } #watering-cards .virtual-row, #forecast-strip .virtual-row { background: transparent !important; width: 100% !important; } #watering-cards .body-cell, #forecast-strip .body-cell { border: none !important; background: #f3f9f1 !important; border-radius: 10px !important; flex: 1 1 0% !important; width: auto !important; min-width: 0 !important; } #watering-cards .cell-wrap, #forecast-strip .cell-wrap { padding: 0.4rem 0.5rem !important; width: auto !important; } /* === Location gate (welcome card) ========================================== */ #location-gate { max-width: 480px; margin: 4rem auto !important; text-align: center; background: #ffffff; border: 1px solid #e6f0e3; border-radius: 20px; padding: 2rem !important; box-shadow: 0 10px 30px rgba(76, 175, 80, 0.12); } #location-gate h1 { background: linear-gradient(135deg, #2e7d32 0%, #66bb6a 100%); -webkit-background-clip: text; background-clip: text; color: transparent; }