* { box-sizing: border-box; } body { margin: 0; font-family: "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; background: #f5f7f2; color: #243126; } button, input, select, textarea { font: inherit; } .plant-app { max-width: 1360px; margin: 0 auto; padding: 18px 18px 40px; } .plant-header { display: flex; justify-content: space-between; gap: 24px; align-items: center; padding-bottom: 18px; border-bottom: 1px solid #dce5d6; margin-bottom: 16px; flex-wrap: wrap; } .plant-header .summary-grid { flex: 1; min-width: 300px; gap: 8px; } .plant-brand { display: flex; align-items: center; gap: 14px; } .plant-brand h1 { margin: 0; font-size: 28px; } .plant-brand-icon { width: 52px; height: 52px; border-radius: 16px; display: grid; place-items: center; background: linear-gradient(135deg, #e6f4dd, #d6ebc6); font-size: 28px; } .plant-subtitle { color: #60715f; margin-top: 4px; font-size: 13px; } .plant-tabs { display: flex; gap: 10px; flex-wrap: wrap; } .tab-btn, .ghost-btn, .primary-btn, .mini-btn { border: 1px solid #c8d8c1; background: #fff; color: #2f4632; border-radius: 12px; padding: 10px 16px; cursor: pointer; transition: all 0.2s ease; } .tab-btn.active, .primary-btn { background: #5e8f43; color: #fff; border-color: #5e8f43; } .ghost-btn:hover, .primary-btn:hover, .tab-btn:hover, .mini-btn:hover { transform: translateY(-1px); box-shadow: 0 6px 18px rgba(94, 143, 67, 0.12); } .mini-btn { padding: 6px 10px; border-radius: 10px; font-size: 12px; } .tab-panel { display: none; gap: 16px; } .tab-panel.active { display: grid; } .weather-bar { background: #dbe8ce; color: #3f5f2d; border-radius: 14px; padding: 14px 18px; font-size: 15px; border: 1px solid #cbdbbb; display: grid; grid-template-columns: 1fr 2fr 3fr; gap: 16px; align-items: center; } .weather-location { display: grid; gap: 4px; } .location-icon { font-size: 18px; margin-bottom: 4px; } .location-city { font-weight: 700; font-size: 16px; } .location-env { font-size: 14px; opacity: 0.85; } .weather-main { display: flex; align-items: center; gap: 12px; padding: 0 16px; border-left: 1px solid rgba(180, 200, 170, 0.6); border-right: 1px solid rgba(180, 200, 170, 0.6); } .weather-temp { font-size: 28px; font-weight: 700; } .weather-text { font-size: 14px; color: #5a6c52; } .weather-icon { font-size: 24px; } .weather-details { display: flex; gap: 16px; font-size: 13px; } .detail-item { display: flex; flex-direction: column; gap: 2px; } .detail-label { font-size: 12px; color: #6a7d68; } .detail-value { font-weight: 500; } .weather-advice { display: flex; flex-direction: column; } .weather-status-tip { align-self: flex-start; padding: 3px 10px; border-radius: 999px; font-size: 11px; line-height: 1.4; color: rgba(63, 95, 45, 0.78); background: rgba(255, 255, 255, 0.45); border: 1px solid rgba(94, 143, 67, 0.18); } .weather-status-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; } .weather-pull-btn { border: 1px solid rgba(94, 143, 67, 0.22); background: rgba(255, 255, 255, 0.58); color: #3f5f2d; border-radius: 999px; padding: 3px 10px; font-size: 11px; line-height: 1.4; cursor: pointer; transition: all 0.2s ease; } .weather-pull-btn:hover { background: rgba(255, 255, 255, 0.78); border-color: rgba(94, 143, 67, 0.34); } .advice-text { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; line-height: 1.5; margin-bottom: 8px; } .weather-data-timestamp { font-size: 11px; color: rgba(63, 95, 45, 0.5); margin-bottom: 4px; font-family: "Consolas", "Monaco", monospace; letter-spacing: 0.5px; } .expand-btn { align-self: flex-end; background: transparent; border: 1px solid rgba(94, 143, 67, 0.4); color: #3f5f2d; border-radius: 8px; padding: 4px 10px; font-size: 12px; cursor: pointer; transition: all 0.2s ease; } .expand-btn:hover { background: rgba(94, 143, 67, 0.1); } .advice-popup { position: absolute; background: #fff; border: 1px solid #cbdbbb; border-radius: 14px; padding: 16px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15); z-index: 1000; max-width: 400px; font-size: 14px; line-height: 1.6; } .summary-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; } .summary-card, .section-card, .setting-box { background: #fff; border: 1px solid #dce6d8; border-radius: 18px; box-shadow: 0 10px 26px rgba(74, 103, 67, 0.06); } .summary-card { padding: 10px 12px; display: flex; flex-direction: column; gap: 4px; } .summary-label { font-size: 11px; color: #6c7f6b; } .summary-value { font-size: 20px; font-weight: 700; color: #31552b; } .section-card { padding: 18px; } .section-head { display: flex; justify-content: space-between; gap: 12px; align-items: center; margin-bottom: 14px; flex-wrap: wrap; } .section-head h2 { margin: 0; font-size: 20px; } .section-actions { display: flex; gap: 10px; flex-wrap: wrap; } .form-tip { color: #6e7f6c; font-size: 13px; line-height: 1.6; } .hidden { display: none !important; } .plant-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 16px; } .plant-card { border: 1px solid #e0e8dd; border-radius: 18px; padding: 14px; background: linear-gradient(180deg, #ffffff, #f8fbf5); display: grid; gap: 12px; cursor: pointer; } .plant-card.active { border-color: #7faa63; box-shadow: 0 10px 22px rgba(95, 143, 67, 0.14); } .plant-thumb { width: 100%; aspect-ratio: 1.2 / 1; border-radius: 16px; background: #eef2eb; display: grid; place-items: center; overflow: hidden; color: #78906e; font-size: 44px; } .plant-thumb img { width: 100%; height: 100%; object-fit: cover; } .plant-cover-rotator { position: relative; width: 100%; height: 100%; } .plant-cover-slide { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: 0; transition: opacity 0.35s ease; } .plant-cover-slide.active { opacity: 1; } .plant-cover-dots { position: absolute; left: 50%; bottom: 10px; transform: translateX(-50%); display: flex; gap: 6px; padding: 4px 8px; border-radius: 999px; background: rgba(20, 35, 19, 0.24); } .plant-cover-dot { width: 7px; height: 7px; border-radius: 999px; background: rgba(255, 255, 255, 0.55); } .plant-cover-dot.active { background: #fff; } .plant-name { font-size: 19px; font-weight: 700; } .plant-meta { font-size: 13px; color: #70836f; display: grid; gap: 4px; } .status-chip { display: inline-flex; align-items: center; gap: 6px; border-radius: 999px; padding: 5px 10px; background: #edf5e8; color: #56764d; width: fit-content; font-size: 12px; } .add-card { border-style: dashed; color: #6d826a; place-items: center; text-align: center; } .split-layout { display: grid; grid-template-columns: 1fr 1.2fr; gap: 16px; } .detail-cover { display: grid; grid-template-columns: 116px 1fr; gap: 18px; margin-bottom: 16px; } .detail-cover .plant-thumb { aspect-ratio: 1 / 1; } .detail-title { display: flex; justify-content: space-between; gap: 12px; align-items: flex-start; flex-wrap: wrap; } .detail-title h3 { margin: 0; font-size: 28px; } .detail-title .latin { margin-top: 4px; color: #6b7b69; font-style: italic; } .detail-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; } .metric-box { background: #f5f8f2; border-radius: 14px; padding: 12px 14px; border: 1px solid #e0e8dd; } .metric-label { color: #6a7d6b; font-size: 13px; margin-bottom: 8px; } .metric-value { font-size: 17px; font-weight: 600; } .detail-summary { margin-top: 14px; background: #f6fbf0; border-radius: 14px; border: 1px solid #deead8; padding: 14px; color: #47603e; } .reminder-list, .timeline-list { display: grid; gap: 12px; } .reminder-item, .timeline-item { border-radius: 16px; padding: 14px 16px; border: 1px solid #dde7d9; background: #fff; } .reminder-item[data-type="watering"] { background: #edf5ff; border-color: #c9def7; } .reminder-item[data-type="fertilizing"] { background: #fff5e8; border-color: #f0d8af; } .reminder-item[data-type="pruning"] { background: #eef7e7; border-color: #cfe2bd; } .reminder-head, .timeline-head { display: flex; justify-content: space-between; gap: 12px; align-items: flex-start; flex-wrap: wrap; } .reminder-title, .timeline-title { font-weight: 700; font-size: 17px; } .reminder-body, .timeline-body { color: #51634f; margin-top: 8px; line-height: 1.6; white-space: pre-wrap; } .reminder-actions { display: flex; gap: 8px; margin-top: 12px; flex-wrap: wrap; } .photo-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 16px; } .photo-card { border-radius: 18px; border: 1px solid #dce6d8; background: #fff; overflow: hidden; } .photo-card img { width: 100%; aspect-ratio: 1 / 1; object-fit: cover; display: block; background: #eef2eb; } .photo-info { padding: 12px 14px; display: grid; gap: 8px; } .photo-meta { color: #70836f; font-size: 13px; } .photo-badges { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 4px; } .empty-text { color: #7b8d79; padding: 12px 2px; } .settings-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; } .setting-box { padding: 16px; } .setting-title { font-size: 15px; font-weight: 700; margin-bottom: 8px; } .setting-text { color: #667766; line-height: 1.7; } .plant-dialog { border: none; border-radius: 18px; padding: 0; width: min(560px, calc(100vw - 24px)); box-shadow: 0 24px 60px rgba(0, 0, 0, 0.18); } .plant-dialog-wide { width: min(1080px, calc(100vw - 24px)); max-height: calc(100vh - 24px); } .plant-dialog::backdrop { background: rgba(20, 35, 19, 0.42); } .dialog-form { display: grid; gap: 12px; padding: 20px; max-height: calc(100vh - 32px); overflow: auto; } .dialog-form h3 { margin: 0 0 4px; } .dialog-form label { display: grid; gap: 6px; font-size: 14px; } .dialog-grid-2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; } .dialog-section { display: grid; gap: 12px; align-content: start; padding: 14px; border: 1px solid #dfebd8; border-radius: 16px; background: #fbfdf8; } .dialog-subsection { display: grid; gap: 12px; padding: 12px; border-radius: 14px; background: #f7fbf2; border: 1px solid #dce8d4; } .field-title { font-size: 14px; font-weight: 700; color: #355233; } .section-subtitle { font-size: 16px; font-weight: 700; color: #365033; } .compact-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; } .upload-box { display: grid; gap: 10px; padding: 14px; border-radius: 14px; border: 1px dashed #bfd5b4; background: #f5faf0; } .upload-box-title { font-size: 14px; font-weight: 700; color: #3e5b38; } .inline-action-row { display: grid; grid-template-columns: 1fr auto; gap: 12px; align-items: center; } .dialog-form input, .dialog-form select, .dialog-form textarea { border: 1px solid #cfdbc8; border-radius: 12px; padding: 10px 12px; background: #fff; } .inline-check { display: flex !important; align-items: center; gap: 8px; } .tag-chip-list, .weekday-chip-list { display: flex; flex-wrap: wrap; gap: 10px; } .tag-chip-btn, .tag-chip-option { display: inline-flex; align-items: center; justify-content: center; min-height: 40px; padding: 8px 14px; border-radius: 999px; border: 1px solid #cfdcc8; background: #fff; color: #365033; cursor: pointer; transition: all 0.2s ease; } .tag-chip-option input { position: absolute; opacity: 0; pointer-events: none; } .tag-chip-btn.active, .tag-chip-option.active { background: #5e8f43; color: #fff; border-color: #5e8f43; } .rule-hint-box { padding: 12px 14px; border-radius: 14px; border: 1px solid #dce6d8; background: #f6faf2; color: #4a6144; line-height: 1.6; } .rule-hint-box.is-active { border-color: #cfe1c4; background: #edf6e7; } .asset-inline { display: flex; gap: 8px; flex-wrap: wrap; } .dialog-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 4px; } .analysis-output { margin: 0; background: #f6f8f3; border: 1px solid #dde5d6; border-radius: 14px; padding: 14px; white-space: pre-wrap; line-height: 1.65; color: #445642; max-height: 52vh; overflow: auto; } .interaction-dialog { width: min(860px, calc(100vw - 24px)); max-height: calc(100vh - 24px); overflow: hidden; } .interaction-dialog::backdrop { background: rgba(20, 35, 19, 0.42); } .interaction-header { display: flex; justify-content: space-between; gap: 12px; align-items: flex-start; flex-wrap: wrap; } .interaction-actions { display: flex; gap: 10px; flex-wrap: wrap; } .interaction-status { display: inline-flex; align-items: center; min-height: 40px; padding: 10px 12px; border-radius: 12px; background: #f4f8ef; border: 1px solid #dae6d1; color: #48603e; font-size: 13px; line-height: 1.5; } .interaction-status.success { background: #edf7e8; border-color: #c8dfba; color: #3b6330; } .interaction-status.error { background: #fff1f0; border-color: #f0c3bf; color: #a23f37; } .interaction-output { min-height: 280px; max-height: 58vh; font-family: "Cascadia Mono", "Consolas", monospace; font-size: 12px; } .confirm-dialog { width: min(620px, calc(100vw - 24px)); } .confirm-message { color: #41563b; line-height: 1.7; } .confirm-detail { min-height: 120px; max-height: 36vh; } .choice-list { display: grid; gap: 10px; } .choice-item { width: 100%; text-align: left; border: 1px solid #d8e4d2; border-radius: 14px; background: #f7faf4; padding: 12px 14px; cursor: pointer; transition: all 0.2s ease; } .choice-item:hover { transform: translateY(-1px); box-shadow: 0 8px 18px rgba(94, 143, 67, 0.12); border-color: #9fc287; } .choice-name { font-size: 16px; font-weight: 700; color: #30472f; } .choice-meta { margin-top: 6px; color: #687b68; font-size: 13px; line-height: 1.6; } @media (max-width: 980px) { .summary-grid, .settings-grid, .split-layout, .detail-grid, .dialog-grid-2, .compact-grid { grid-template-columns: 1fr; } .detail-cover { grid-template-columns: 1fr; } } @media (max-width: 640px) { .plant-app { padding: 14px 14px 32px; } .plant-header { align-items: flex-start; } .plant-tabs { width: 100%; } .tab-btn, .ghost-btn, .primary-btn { width: 100%; justify-content: center; } .interaction-actions { width: 100%; } .interaction-dialog { width: calc(100vw - 24px); max-height: calc(100vh - 24px); } .inline-action-row { grid-template-columns: 1fr; } .plant-dialog-mobile { width: 100vw; max-width: 100vw; height: 100vh; max-height: 100vh; border-radius: 0; } .plant-dialog-mobile .dialog-form { max-height: 100vh; padding: 16px; } } .toast { position: fixed; top: 24px; left: 50%; transform: translateX(-50%) translateY(-30px); background: rgba(30, 35, 25, 0.92); color: #fff; padding: 12px 20px; border-radius: 12px; font-size: 14px; z-index: 10000; transition: transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1), opacity 0.3s ease; opacity: 0; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.25); backdrop-filter: blur(12px); border: 1px solid rgba(255, 255, 255, 0.18); } .toast.toast-success { background: rgba(58, 135, 71, 0.95); border-color: rgba(94, 143, 67, 0.4); } .toast.toast-info { background: rgba(30, 35, 25, 0.92); } .toast.toast-error { background: rgba(158, 58, 53, 0.95); border-color: rgba(235, 85, 85, 0.4); } .toast.active { transform: translateX(-50%) translateY(0); opacity: 1; } /* ===== 提醒 tab ===== */ .reminder-tabs { display: flex; gap: 0; margin-bottom: 16px; border-bottom: 2px solid #dce6d8; } .reminder-tab-btn { padding: 10px 20px; border: none; background: none; cursor: pointer; color: #5a6d58; font-size: 15px; font-weight: 600; border-bottom: 2px solid transparent; margin-bottom: -2px; transition: color 0.2s, border-color 0.2s; } .reminder-tab-btn:hover { color: #2f4431; } .reminder-tab-btn.active { color: #1d3b1e; border-bottom-color: #2d6a30; } .hidden { display: none !important; } /* ===== 日志详情 dialog ===== */ .log-detail-content { max-height: 65vh; overflow-y: auto; padding: 4px 0; } .log-detail-section { margin-bottom: 20px; padding-bottom: 16px; border-bottom: 1px solid #eef2eb; } .log-detail-section:last-child { border-bottom: none; } .log-detail-label { font-size: 13px; color: #70836f; font-weight: 600; margin-bottom: 6px; display: block; } .log-detail-field { display: flex; gap: 12px; align-items: baseline; margin-bottom: 8px; } .log-detail-field .log-detail-label { min-width: 50px; margin-bottom: 0; } .log-detail-note { white-space: pre-wrap; line-height: 1.7; color: #243126; font-size: 15px; } .log-detail-photos { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 10px; margin-top: 8px; } .log-detail-photo { width: 100%; aspect-ratio: 1 / 1; object-fit: cover; border-radius: 12px; border: 1px solid #dce6d8; cursor: pointer; transition: opacity 0.2s; } .log-detail-photo:hover { opacity: 0.85; } .log-detail-attachments { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; } .log-detail-attachment { padding: 6px 14px; background: #f0f4ee; border-radius: 20px; font-size: 13px; color: #2f4431; border: 1px solid #dce6d8; }