.guide-page{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:var(--spacing-lg);background:linear-gradient(135deg,var(--color-paper) 0%,var(--color-cream) 100%)}.guide-container{width:100%;max-width:480px;background:#fff;border-radius:var(--border-radius-xl);box-shadow:var(--shadow-soft);overflow:hidden}.guide-progress{display:flex;justify-content:center;gap:var(--spacing-sm);padding:var(--spacing-lg);border-bottom:1px solid rgba(212,165,116,.2)}.progress-dot{width:8px;height:8px;border-radius:50%;background:var(--color-latte);transition:all var(--transition-normal)}.progress-dot.active{background:var(--color-primary);transform:scale(1.2)}.guide-content{padding:var(--spacing-xl);min-height:400px}.step-content h2{font-size:1.5rem;font-weight:600;color:var(--color-text-primary);margin-bottom:var(--spacing-sm);text-align:center}.step-description{text-align:center;color:var(--color-text-secondary);font-size:.875rem;margin-bottom:var(--spacing-xl)}.input-group{position:relative;margin-bottom:var(--spacing-lg)}.guide-input{width:100%;padding:var(--spacing-md);border:2px solid var(--color-latte);border-radius:var(--border-radius-md);font-size:1rem;transition:all var(--transition-normal);background:#fff}.guide-input:focus{border-color:var(--color-primary);box-shadow:0 0 0 4px #e8b4a333}.char-count{position:absolute;right:var(--spacing-sm);top:50%;transform:translateY(-50%);font-size:.75rem;color:var(--color-text-muted)}.quick-suggestions{display:flex;flex-wrap:wrap;gap:var(--spacing-sm);align-items:center}.quick-suggestions span{font-size:.75rem;color:var(--color-text-muted)}.suggestion-chip{padding:var(--spacing-xs) var(--spacing-sm);background:var(--color-cream);border:1px solid var(--color-latte);border-radius:var(--border-radius-md);font-size:.75rem;color:var(--color-text-secondary);cursor:pointer;transition:all var(--transition-fast)}.suggestion-chip:hover{background:var(--color-primary-light);border-color:var(--color-primary);color:var(--color-text-primary)}.theme-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--spacing-md)}.theme-card{background:#fff;border:2px solid var(--color-latte);border-radius:var(--border-radius-lg);padding:var(--spacing-lg);text-align:center;cursor:pointer;transition:all var(--transition-normal);position:relative}.theme-card:hover{border-color:var(--color-primary);transform:translateY(-2px);box-shadow:var(--shadow-soft)}.theme-card.selected{border-color:var(--color-primary);background:linear-gradient(135deg,#e8b4a31a,#f0c9bc1a)}.theme-emoji{font-size:2.5rem;margin-bottom:var(--spacing-sm)}.theme-name{font-weight:500;color:var(--color-text-primary);font-size:.875rem}.selected-indicator{position:absolute;top:var(--spacing-sm);right:var(--spacing-sm);width:20px;height:20px;background:var(--color-primary);border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff;font-size:.75rem;font-weight:700}.date-picker-container{display:flex;flex-direction:column;gap:var(--spacing-lg)}.date-picker{width:100%;padding:var(--spacing-md);border:2px solid var(--color-latte);border-radius:var(--border-radius-md);font-size:1rem;color:var(--color-text-primary);background:#fff;transition:all var(--transition-normal)}.date-picker:focus{border-color:var(--color-primary);box-shadow:0 0 0 4px #e8b4a333}.date-preview{background:var(--color-cream);border-radius:var(--border-radius-md);padding:var(--spacing-md)}.preview-content{text-align:center}.preview-label{display:block;font-size:.75rem;color:var(--color-text-muted);margin-bottom:var(--spacing-xs)}.preview-date{display:block;font-size:1.125rem;font-weight:600;color:var(--color-text-primary);margin-bottom:var(--spacing-xs)}.preview-days{display:block;font-size:.875rem;color:var(--color-primary);font-weight:500}.mood-input-container{position:relative}.mood-textarea{width:100%;min-height:120px;padding:var(--spacing-md);border:2px solid var(--color-latte);border-radius:var(--border-radius-md);font-size:.875rem;line-height:1.6;color:var(--color-text-primary);background:#fff;resize:vertical;transition:all var(--transition-normal);font-family:inherit}.mood-textarea:focus{border-color:var(--color-primary);box-shadow:0 0 0 4px #e8b4a333}.mood-textarea::placeholder{color:var(--color-text-muted)}.mood-input-container .char-count{position:absolute;bottom:var(--spacing-sm);right:var(--spacing-sm);background:#fffc;padding:2px 6px;border-radius:var(--border-radius-sm);font-size:.75rem;color:var(--color-text-muted)}.mood-suggestions{display:flex;flex-wrap:wrap;gap:var(--spacing-sm);align-items:center;margin-top:var(--spacing-md)}.mood-suggestions span{font-size:.75rem;color:var(--color-text-muted)}.mood-chip{padding:var(--spacing-xs) var(--spacing-sm);background:var(--color-cream);border:1px solid var(--color-latte);border-radius:var(--border-radius-md);font-size:.75rem;color:var(--color-text-secondary);cursor:pointer;transition:all var(--transition-fast)}.mood-chip:hover{background:var(--color-primary-light);border-color:var(--color-primary);color:var(--color-text-primary)}.guide-navigation{display:flex;justify-content:space-between;align-items:center;padding:var(--spacing-lg);border-top:1px solid rgba(212,165,116,.2);gap:var(--spacing-md)}.guide-navigation .btn{flex:1;justify-content:center}.guide-navigation .btn:disabled{opacity:.5;cursor:not-allowed}@media(max-width:480px){.guide-page{padding:var(--spacing-sm)}.guide-content{padding:var(--spacing-lg)}.theme-grid{grid-template-columns:repeat(2,1fr);gap:var(--spacing-sm)}.theme-card{padding:var(--spacing-md)}.theme-emoji{font-size:2rem}.step-content h2{font-size:1.25rem}.quick-suggestions{gap:var(--spacing-xs)}.suggestion-chip{font-size:.7rem;padding:var(--spacing-xs)}}.countdown-card{background:linear-gradient(135deg,#fffffff2,#fffdfae6);border-radius:var(--border-radius-xl);padding:var(--spacing-xl);box-shadow:0 4px 20px #8b77651a,0 1px 3px #8b77650d,inset 0 1px #fffc;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.6);position:relative;overflow:hidden}.countdown-card:before{content:"";position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(90deg,var(--color-primary) 0%,var(--color-secondary) 50%,var(--color-accent) 100%);opacity:.6}.countdown-card.expired{background:linear-gradient(135deg,#fff8f0fa,#fff5eef2)}.countdown-header{display:flex;flex-direction:column;align-items:center;margin-bottom:var(--spacing-lg)}.countdown-icon{font-size:2.5rem;margin-bottom:var(--spacing-sm);filter:drop-shadow(0 2px 4px rgba(139,119,101,.2))}.countdown-title{font-size:1.125rem;font-weight:600;color:var(--color-text-primary);text-align:center;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.countdown-display{display:flex;flex-direction:column;align-items:center;gap:var(--spacing-lg)}.countdown-main{display:flex;flex-direction:column;align-items:center;gap:var(--spacing-xs)}.days-number{font-size:5rem;font-weight:800;line-height:1;background:linear-gradient(135deg,var(--color-primary) 0%,var(--color-secondary) 50%,var(--color-accent) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;text-shadow:none;filter:drop-shadow(0 2px 4px rgba(139,119,101,.15))}.days-label{font-size:1.25rem;font-weight:500;color:var(--color-text-secondary);letter-spacing:.5em;text-indent:.5em}.countdown-details{display:flex;align-items:center;gap:var(--spacing-sm);padding:var(--spacing-md);background:linear-gradient(135deg,#fffc,#fffdfa99);border-radius:var(--border-radius-lg);border:1px solid rgba(212,165,116,.2)}.time-unit{display:flex;flex-direction:column;align-items:center;min-width:48px}.time-value{font-size:1.5rem;font-weight:700;color:var(--color-text-primary);font-variant-numeric:tabular-nums;line-height:1}.time-label{font-size:.625rem;color:var(--color-text-muted);margin-top:2px;text-transform:uppercase;letter-spacing:.5px}.time-separator{font-size:1.25rem;color:var(--color-text-muted);font-weight:300;opacity:.5;margin-top:-8px}.countdown-footer{margin-top:var(--spacing-lg);padding-top:var(--spacing-md);border-top:1px dashed rgba(212,165,116,.3);display:flex;justify-content:center}.pulse-indicator{display:flex;align-items:center;gap:var(--spacing-xs)}.pulse-dot{width:6px;height:6px;background:linear-gradient(135deg,var(--color-primary) 0%,var(--color-secondary) 100%);border-radius:50%;animation:pulse 1.5s ease-in-out infinite}@keyframes pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(1.2)}}.pulse-text{font-size:.75rem;color:var(--color-text-muted);letter-spacing:.5px}.expired-content{display:flex;flex-direction:column;align-items:center;text-align:center;padding:var(--spacing-xl)}.expired-icon{font-size:4rem;margin-bottom:var(--spacing-lg)}.expired-title{font-size:1.5rem;font-weight:600;color:var(--color-text-primary);margin-bottom:var(--spacing-sm)}.expired-message{font-size:1rem;color:var(--color-text-secondary)}@media(max-width:480px){.countdown-card{padding:var(--spacing-lg)}.days-number{font-size:3.5rem}.time-value{font-size:1.25rem}.time-unit{min-width:40px}.countdown-details{gap:var(--spacing-xs);padding:var(--spacing-sm)}}@media(min-width:481px)and (max-width:768px){.days-number{font-size:4rem}}.polaroid-wrapper{width:180px;height:240px;perspective:1000px;cursor:pointer}.polaroid-flipper{width:100%;height:100%;position:relative;transform-style:preserve-3d;transition:transform .6s cubic-bezier(.4,0,.2,1)}.polaroid-flipper.flipped{transform:rotateY(180deg)}.polaroid-front,.polaroid-back{position:absolute;width:100%;height:100%;backface-visibility:hidden;background:#fff;border-radius:4px;padding:8px 8px 32px;box-shadow:2px 4px 12px #8b776526,0 2px 4px #8b77651a}.polaroid-back{transform:rotateY(180deg);background:linear-gradient(135deg,#faf8f5,#f5f0ea)}.polaroid-tape{position:absolute;top:-10px;left:50%;transform:translate(-50%);width:50px;height:24px;background:#fff9;border:1px solid rgba(255,255,255,.8);border-radius:2px;box-shadow:0 1px 3px #00000014,inset 0 10px #ffffff4d;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:10}.polaroid-tape.back{background:#f0ebe4cc}.polaroid-image-container{width:100%;aspect-ratio:1;background:linear-gradient(135deg,var(--color-latte) 0%,var(--color-cream) 100%);border-radius:2px;overflow:hidden;display:flex;align-items:center;justify-content:center}.polaroid-image{width:100%;height:100%;object-fit:cover}.polaroid-emoji{font-size:3rem;line-height:1}.polaroid-caption{margin-top:8px;text-align:center;font-family:var(--font-family-handwritten);font-size:.75rem;color:var(--color-text-secondary)}.polaroid-hint{position:absolute;bottom:8px;left:0;right:0;text-align:center;font-size:.625rem;color:var(--color-text-muted);opacity:.7}.polaroid-note{padding:12px;height:calc(100% - 24px);display:flex;flex-direction:column}.note-header{margin-bottom:12px;padding-bottom:8px;border-bottom:1px dashed var(--color-latte)}.note-date{font-size:.625rem;color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.5px}.note-content{flex:1;font-size:.8125rem;line-height:1.6;color:var(--color-text-secondary);font-family:var(--font-family-handwritten)}.note-signature{margin-top:12px;font-size:.6875rem;color:var(--color-text-muted);text-align:right;font-style:italic}@media(max-width:480px){.polaroid-wrapper{width:150px;height:200px}.polaroid-emoji{font-size:2.5rem}.polaroid-caption{font-size:.6875rem}.note-content{font-size:.75rem}}import React from "react"; import{motion}from "framer-motion"; import type{UserConfig}from "../types"; import "./GuidePage.css"; interface GuidePageProps{onComplete:(config: Partial<UserConfig>) => void}const presetThemes = [{id: "graduation",name: "毕业季",emoji: "🎓",color: "#E8B4A3"},{id: "summer",name: "暑假",emoji: "☀️",color: "#F0C9BC"},{id: "winter",name: "寒假",emoji: "❄️",color: "#D4E5F7"},{id: "custom",name: "自定义",emoji: "✨",color: "#E8D4A3"},]; export const GuidePage: React.FC<GuidePageProps> = ({onComplete}) =>{const [step,setStep] = React.useState(1);const [title,setTitle] = React.useState("");const [selectedTheme,setSelectedTheme] = React.useState("graduation");const [targetDate,setTargetDate] = React.useState("");const [mood,setMood] = React.useState("");const handleNext = () =>{if (step < 4){setStep(step + 1)}else{onComplete({title: title || "我的倒计时",theme: selectedTheme as UserConfig["theme"],targetDate,mood,})}}const handleBack = () =>{if (step > 1){setStep(step - 1)}}const canProceed = () =>{switch (step){case 1: return title.trim().length > 0;case 2: return true;case 3: return targetDate !== "";case 4: return true;default:return false}}return (<motion.div className="guide-page" initial={{opacity: 0,y: 20}} animate={{opacity: 1,y: 0}} exit={{opacity: 0,y: -20}} transition={{duration: .5}} > <div className="guide-container"> {} <div className="guide-progress"> {[1,2,3,4].map((i) => (<div key={i} className={`progress-dot ${i <= step ? "active" : ""}`} />))} </div> {} <div className="guide-content"> {step === 1 && (<motion.div key="step1" initial={{opacity: 0,x: 20}} animate={{opacity: 1,x: 0}} exit={{opacity: 0,x: -20}} className="step-content" > <h2>✨ 给你的倒计时起个名字</h2> <p className="step-description"> 这将是你的专属倒计时，记录每一个珍贵的时刻 </p> <div className="input-group"> <input type="text" className="guide-input" placeholder="例如：我的毕业季 🎓" value={title} onChange={(e) => setTitle(e.target.value)} maxLength={20} /> <span className="char-count">{title.length}/20</span> </div> <div className="quick-suggestions"> <span>快速选择：</span> {["我的毕业季 🎓","暑假倒计时 ☀️","寒假来了 ❄️","考研冲刺 📚"].map((suggestion) => (<button key={suggestion} className="suggestion-chip" onClick={() => setTitle(suggestion)} > {suggestion} </button>))} </div> </motion.div>)} {step === 2 && (<motion.div key="step2" initial={{opacity: 0,x: 20}} animate={{opacity: 1,x: 0}} exit={{opacity: 0,x: -20}} className="step-content" > <h2>🎨 选择一个主题</h2> <p className="step-description"> 不同的主题会给你的倒计时带来不同的氛围 </p> <div className="theme-grid"> {presetThemes.map((theme) => (<div key={theme.id} className={`theme-card ${selectedTheme === theme.id ? "selected" : ""}`} onClick={() => setSelectedTheme(theme.id)} style={{"--theme-color": theme.color} as React.CSSProperties} > <div className="theme-emoji">{theme.emoji}</div> <div className="theme-name">{theme.name}</div> {selectedTheme === theme.id && (<motion.div className="selected-indicator" layoutId="selectedTheme" initial={{scale: 0}} animate={{scale: 1}} > ✓ </motion.div>)} </div>))} </div> </motion.div>)} {step === 3 && (<motion.div key="step3" initial={{opacity: 0,x: 20}} animate={{opacity: 1,x: 0}} exit={{opacity: 0,x: -20}} className="step-content" > <h2>📅 选择目标日期</h2> <p className="step-description"> 设置你期待的那一天，我们会帮你记录每一个倒数时刻 </p> <div className="date-picker-container"> <input type="datetime-local" className="date-picker" value={targetDate} onChange={(e) => setTargetDate(e.target.value)} min={new Date().toISOString().slice(0,16)} /> <div className="date-preview"> {targetDate && (<motion.div initial={{opacity: 0,y: 10}} animate={{opacity: 1,y: 0}} className="preview-content" > <span className="preview-label">距离</span> <span className="preview-date"> {new Date(targetDate).toLocaleDateString("zh-CN",{year: "numeric",month: "long",day: "numeric",weekday: "long",hour: "2-digit",minute: "2-digit",})} </span> <span className="preview-days"> 还有 {Math.ceil((new Date(targetDate).getTime() - Date.now()) / (1000 * 60 * 60 * 24))} 天 </span> </motion.div>)} </div> </div> </motion.div>)} {step === 4 && (<motion.div key="step4" initial={{opacity: 0,x: 20}} animate={{opacity: 1,x: 0}} exit={{opacity: 0,x: -20}} className="step-content" > <h2>📝 记录此刻的心情</h2> <p className="step-description"> 写下你现在的感受，这将是未来美好的回忆 </p> <div className="mood-input-container"> <textarea className="mood-textarea" placeholder="例如：期待又舍不得..." value={mood} onChange={(e) => setMood(e.target.value)} maxLength={100} rows={4} /> <span className="char-count">{mood.length}/100</span> </div> <div className="mood-suggestions"> <span>快速选择：</span> {["期待 🎉","舍不得 💕","紧张 😰","开心 😊","平静 😌"].map((m) => (<button key={m} className="mood-chip" onClick={() => setMood(m)} > {m} </button>))} </div> </motion.div>)} </div> {} <div className="guide-navigation"> {step > 1 && (<button className="btn btn-secondary" onClick={handleBack}> ← 上一步 </button>)} <button className="btn btn-primary" onClick={handleNext} disabled={!canProceed()} > {step === 4 ? "完成设置 ✨" : "下一步 →"} </button> </div> </div> </motion.div>)}; export default GuidePage; .sticky-note{background:linear-gradient(135deg,#fff9e6,#fff3d4);border-radius:2px 16px;padding:var(--spacing-md);box-shadow:1px 2px 4px #8b77651a,inset 0 1px #fffc;position:relative;transform:rotate(-1deg);transition:all var(--transition-normal)}.sticky-note:hover{transform:rotate(0) translateY(-2px);box-shadow:2px 4px 8px #8b776526,inset 0 1px #fffc}.sticky-note:before{content:"";position:absolute;top:-8px;left:50%;transform:translate(-50%);width:60px;height:20px;background:#fff6;border:1px solid rgba(255,255,255,.6);border-radius:2px;box-shadow:0 1px 2px #0000000d,inset 0 20px #fff3;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.polaroid{background:#fff;padding:var(--spacing-sm);padding-bottom:var(--spacing-xl);border-radius:var(--border-radius-sm);box-shadow:2px 3px 8px #8b776526,0 1px 3px #8b77651a;transform:rotate(2deg);transition:all var(--transition-normal);cursor:pointer;position:relative}.polaroid:hover{transform:rotate(0) scale(1.02);box-shadow:4px 6px 12px #8b776533,0 2px 4px #8b776526}.polaroid-image{width:100%;aspect-ratio:1;background:linear-gradient(135deg,var(--color-latte) 0%,var(--color-cream) 100%);border-radius:var(--border-radius-xs);display:flex;align-items:center;justify-content:center;font-size:3rem;overflow:hidden}.polaroid-caption{margin-top:var(--spacing-sm);text-align:center;font-family:var(--font-family-handwritten);font-size:.875rem;color:var(--color-text-secondary)}.diary-cover{background:linear-gradient(135deg,#f5e6d3,#ede0d0,#e8d9c5);border-radius:var(--border-radius-lg);box-shadow:0 4px 20px #8b776533,inset 0 1px #ffffff80,inset 0 -1px #0000000d;padding:var(--spacing-xl);position:relative;overflow:hidden}.diary-cover:before{content:"";position:absolute;top:0;left:50%;transform:translate(-50%);width:40px;height:100%;background:linear-gradient(90deg,transparent 0%,rgba(139,119,101,.05) 30%,rgba(139,119,101,.1) 50%,rgba(139,119,101,.05) 70%,transparent 100%);pointer-events:none}.countdown-card{background:linear-gradient(135deg,#ffffffe6,#ffffffb3);border-radius:var(--border-radius-xl);padding:var(--spacing-xl);box-shadow:0 4px 16px #8b77651a,inset 0 1px #fffc;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.5)}.countdown-number{font-size:4rem;font-weight:700;color:var(--color-text-primary);line-height:1;font-variant-numeric:tabular-nums;background:linear-gradient(135deg,var(--color-text-primary) 0%,var(--color-secondary) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.countdown-label{font-size:.875rem;color:var(--color-text-secondary);margin-top:var(--spacing-xs);text-transform:uppercase;letter-spacing:1px}.countdown-unit{display:flex;flex-direction:column;align-items:center;padding:var(--spacing-sm)}.countdown-separator{font-size:2rem;color:var(--color-text-muted);font-weight:300;align-self:flex-start;margin-top:var(--spacing-md)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--spacing-sm);padding:var(--spacing-sm) var(--spacing-lg);border-radius:var(--border-radius-md);font-size:.875rem;font-weight:500;transition:all var(--transition-normal);cursor:pointer;border:none;outline:none}.btn-primary{background:linear-gradient(135deg,var(--color-primary) 0%,var(--color-secondary) 100%);color:#fff;box-shadow:0 2px 8px #e8b4a366}.btn-primary:hover{transform:translateY(-1px);box-shadow:0 4px 12px #e8b4a380}.btn-secondary{background:#fffc;color:var(--color-text-primary);border:1px solid rgba(212,165,116,.3)}.btn-secondary:hover{background:#fff;border-color:#d4a57480}.input{width:100%;padding:var(--spacing-sm) var(--spacing-md);border:1px solid rgba(212,165,116,.3);border-radius:var(--border-radius-md);background:#fffc;color:var(--color-text-primary);font-size:.875rem;transition:all var(--transition-normal)}.input:focus{border-color:var(--color-primary);background:#fff;box-shadow:0 0 0 3px #e8b4a333}.input::placeholder{color:var(--color-text-muted)}@media(max-width:640px){.countdown-number{font-size:2.5rem}.diary-cover{padding:var(--spacing-lg)}.polaroid{transform:rotate(1deg)}}@media(min-width:641px)and (max-width:1024px){.countdown-number{font-size:3rem}}@media(min-width:1025px){.countdown-number{font-size:4rem}}:root{--color-cream: #FFF8F0;--color-warm-white: #FFFCF8;--color-paper: #FEF9F3;--color-latte: #F5EDE4;--color-primary: #E8B4A3;--color-primary-light: #F0C9BC;--color-secondary: #D4A574;--color-accent: #C49A6C;--color-text-primary: #4A4039;--color-text-secondary: #7A6F65;--color-text-muted: #A99E93;--shadow-soft: 2px 3px 8px rgba(139, 119, 101, .15);--shadow-medium: 3px 4px 12px rgba(139, 119, 101, .2);--shadow-hard: 4px 6px 16px rgba(139, 119, 101, .25);--border-radius-sm: 4px;--border-radius-md: 8px;--border-radius-lg: 12px;--border-radius-xl: 16px;--spacing-xs: 4px;--spacing-sm: 8px;--spacing-md: 16px;--spacing-lg: 24px;--spacing-xl: 32px;--spacing-xxl: 48px;--font-family-primary: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;--font-family-handwritten: "Comic Sans MS", "Chalkboard SE", "Marker Felt", cursive;--transition-fast: .15s ease;--transition-normal: .3s ease;--transition-slow: .5s ease}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{font-size:16px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{font-family:var(--font-family-primary);background-color:var(--color-paper);color:var(--color-text-primary);line-height:1.6;min-height:100vh;overflow-x:hidden}body:before{content:"";position:fixed;inset:0;background-image:repeating-linear-gradient(0deg,transparent,transparent 31px,rgba(212,165,116,.1) 31px,rgba(212,165,116,.1) 32px);pointer-events:none;z-index:-1}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--color-latte);border-radius:var(--border-radius-sm)}::-webkit-scrollbar-thumb{background:var(--color-secondary);border-radius:var(--border-radius-sm)}::-webkit-scrollbar-thumb:hover{background:var(--color-accent)}::selection{background:var(--color-primary-light);color:var(--color-text-primary)}:disabled{opacity:.6;cursor:not-allowed}button{font-family:inherit;cursor:pointer;border:none;outline:none;transition:all var(--transition-normal)}input,textarea{font-family:inherit;outline:none;border:none;background:transparent}img{max-width:100%;height:auto;display:block}a{color:inherit;text-decoration:none}ul,ol{list-style:none}
