@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;600;700&family=Noto+Serif+SC:wght@400;500;600;700&display=swap');
:root{--red:#7b1825;--red-dark:#57111d;--red-light:#a34950;--gold:#bb9154;--gold-light:#e8d5b3;--paper:#f7f1e7;--ink:#3e2826;--muted:#856d64;--line:#dccbb6;--shadow:0 20px 55px rgba(85,35,30,.13);font-family:'Noto Sans SC',sans-serif;color:var(--ink);background:var(--paper)}
*{box-sizing:border-box}html,body{margin:0;min-height:100%;overscroll-behavior:none}body{background:radial-gradient(circle at 8% 18%,#fffaf0 0,transparent 38%),radial-gradient(circle at 92% 88%,#ebd7c0 0,transparent 36%),var(--paper)}button,input{font:inherit}button{cursor:pointer}a{color:inherit;text-decoration:none}.grain{pointer-events:none;position:fixed;inset:0;z-index:30;opacity:.13;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.2'/%3E%3C/svg%3E")}
.topbar{height:76px;display:flex;align-items:center;justify-content:space-between;padding:0 clamp(24px,5vw,86px);border-bottom:1px solid rgba(136,86,64,.14);background:rgba(255,250,242,.75);backdrop-filter:blur(16px);position:relative;z-index:4}.brand{display:flex;align-items:center;gap:12px;color:var(--red);font-family:'Noto Serif SC',serif;font-weight:700;letter-spacing:.18em;font-size:24px}.brand-mark{width:42px;height:42px;display:grid;place-items:center;color:#f5e7cd;background:var(--red);border-radius:50%;font-size:27px;letter-spacing:0;box-shadow:0 4px 12px #7b18253c}.brand-text small{display:block;font:600 8px 'Noto Sans SC',sans-serif;letter-spacing:.22em;color:var(--gold);margin-top:2px}.topbar nav{display:flex;align-items:center;gap:6px}.topbar nav a{padding:10px 17px;border-radius:999px;color:#775c55;font-size:14px;transition:.25s}.topbar nav a:hover,.topbar nav a.active{background:#7b1825;color:#fff8ed}
#app{min-height:calc(100vh - 76px)}.serif{font-family:'Noto Serif SC',serif}.eyebrow{font-size:11px;font-weight:700;letter-spacing:.36em;color:var(--gold);text-transform:uppercase}.page-head{text-align:center;padding:34px 20px 22px}.page-head h1{font:500 clamp(31px,3.2vw,48px) 'Noto Serif SC',serif;color:var(--red);letter-spacing:.18em;margin:12px 0 8px}.page-head p{color:var(--muted);font-size:14px;letter-spacing:.08em;margin:0}.ornament{display:flex;align-items:center;justify-content:center;gap:14px;color:var(--gold);margin:18px auto}.ornament:before,.ornament:after{content:'';width:65px;height:1px;background:linear-gradient(90deg,transparent,var(--gold))}.ornament:after{transform:rotate(180deg)}
.sign-layout{max-width:1350px;margin:auto;padding:8px 28px 28px;display:grid;grid-template-columns:minmax(0,1fr) 250px;gap:24px;align-items:stretch}.paper-panel{background:#fffaf1;border:1px solid #dac6a9;border-radius:12px;box-shadow:var(--shadow);position:relative;padding:25px 30px}.paper-panel:before{content:'';position:absolute;inset:9px;border:1px solid #e7d8bf;pointer-events:none;border-radius:7px}.form-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px;position:relative}.section-title{color:var(--red);font:500 20px 'Noto Serif SC',serif;letter-spacing:.18em}.number-tag{color:var(--gold);font:600 13px 'Noto Sans SC',sans-serif;letter-spacing:.15em}.field-label{display:flex;align-items:center;justify-content:space-between;color:#6f4c42;font-size:13px;font-weight:600;margin:14px 0 8px}.field-label span{font-size:11px;color:#9e897b;font-weight:400}.writing-wrap{position:relative;height:clamp(135px,18vh,180px);border:1px solid #d7c3a9;background:linear-gradient(90deg,rgba(200,177,143,.075) 1px,transparent 1px),linear-gradient(rgba(200,177,143,.075) 1px,transparent 1px),#fffdf8;background-size:32px 32px;border-radius:6px;overflow:hidden}.writing-wrap.blessing{height:clamp(170px,23vh,240px)}.writing-wrap:after{content:'请在此书写';position:absolute;inset:0;display:grid;place-items:center;color:#c7b8a8;font:24px 'Noto Serif SC',serif;letter-spacing:.2em;pointer-events:none;opacity:.48}.writing-wrap.has-ink:after{display:none}.writing-wrap canvas{width:100%;height:100%;display:block;touch-action:none;position:relative;z-index:1}.canvas-actions{display:flex;gap:12px;justify-content:flex-end;margin-top:6px}.text-action{border:0;background:transparent;color:#a08070;padding:3px 0;font-size:12px}.text-action:hover{color:var(--red)}.form-bottom{display:flex;align-items:end;justify-content:space-between;gap:20px;margin-top:12px}.name-field{display:block;color:#856c5c;font-size:12px;flex:1;max-width:280px}.name-field input{width:100%;height:39px;margin-top:6px;border:0;border-bottom:1px solid #cbb89f;background:transparent;outline:0;color:var(--ink);font-size:15px}.name-field input:focus{border-color:var(--red)}.primary{border:0;color:#fff9ef;background:var(--red);padding:12px 32px;border-radius:4px;letter-spacing:.12em;box-shadow:0 8px 18px #7b18252b;transition:transform .2s,background .2s}.primary:hover{background:var(--red-dark);transform:translateY(-2px)}.primary:disabled{opacity:.5;cursor:default;transform:none}.side-card{min-height:100%;background:var(--red);color:#f5e7d4;border-radius:12px;box-shadow:var(--shadow);position:relative;overflow:hidden;padding:30px 25px;display:flex;flex-direction:column;justify-content:space-between}.side-card:before{content:'囍';position:absolute;right:-50px;bottom:-50px;font:320px 'Noto Serif SC',serif;color:#fff;opacity:.045;line-height:1}.side-card:after{content:'';position:absolute;inset:10px;border:1px solid #d8ac6b60;border-radius:6px;pointer-events:none}.side-date{font-size:12px;letter-spacing:.14em;color:#dbc090}.side-card h2{font:500 30px/1.5 'Noto Serif SC',serif;letter-spacing:.14em;margin:24px 0;color:#fff8e9}.side-card p{line-height:2;color:#ead8c7;font-size:13px}.side-stat{border-top:1px solid #e2c59666;padding-top:20px}.side-stat strong{display:block;font:500 52px 'Noto Serif SC',serif;color:#f6dfb2}.side-stat span{font-size:12px;letter-spacing:.13em;color:#e0c49f}
.result-mask{position:fixed;inset:0;background:#2d0d16a8;z-index:20;display:grid;place-items:center;padding:20px;backdrop-filter:blur(8px)}.result-card{width:min(450px,100%);padding:45px 35px;text-align:center;background:#fffaf0;border:8px double #d7b276;box-shadow:0 25px 80px #22071069;border-radius:8px;animation:pop .5s cubic-bezier(.2,1.4,.3,1)}.result-card .seal{font:66px 'Noto Serif SC',serif;color:var(--red)}.result-card h2{font:500 30px 'Noto Serif SC',serif;color:var(--red);margin:10px 0}.result-card p{color:var(--muted)}.result-card strong{display:block;font:600 74px 'Noto Serif SC',serif;color:var(--red);margin:8px 0 22px}@keyframes pop{from{opacity:0;transform:translateY(20px) scale(.9)}to{opacity:1;transform:none}}
.wall-layout{max-width:1480px;margin:auto;padding:0 38px 30px}.wall-meta{display:flex;justify-content:space-between;align-items:center;margin:0 2px 14px;color:#9c7a6a;font-size:12px;letter-spacing:.1em}.wall-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:18px}.wall-grid:has(.wish-card:first-child:last-child){grid-template-columns:minmax(0,390px);justify-content:center}.wall-grid:has(.wish-card:nth-child(2):last-child){grid-template-columns:repeat(2,minmax(0,390px));justify-content:center}.wish-card{min-height:255px;background:#fffcf6;border:1px solid #dfc9ad;box-shadow:0 8px 22px #7b182510;padding:19px 19px 14px;position:relative;animation:rise .6s both;overflow:hidden}.wish-card:before{content:'';position:absolute;inset:6px;border:1px solid #f0e3ce;pointer-events:none}.wish-card:after{content:'囍';position:absolute;right:13px;bottom:6px;font:60px 'Noto Serif SC',serif;color:#a33839;opacity:.055}.wish-card:nth-child(5n+2){transform:rotate(-1deg)}.wish-card:nth-child(5n+4){transform:rotate(1deg)}.wish-num{color:var(--gold);font-size:11px;letter-spacing:.15em}.wish-sig{display:block;width:100%;height:87px;object-fit:contain;margin:0 auto}.wish-line{height:1px;background:#e9dcc9;margin:2px 0 10px}.wish-blessing{width:100%;height:78px;object-fit:contain}.wish-empty{display:flex;align-items:center;justify-content:center;height:78px;color:#b69a89;font:14px 'Noto Serif SC',serif}.wish-foot{font-size:11px;color:#a8907c;text-align:right;margin-top:6px}@keyframes rise{from{opacity:0;translate:0 18px}to{opacity:1;translate:0 0}}.empty-state{text-align:center;padding:100px 20px;color:#ad8f7c;grid-column:1/-1;font:20px 'Noto Serif SC',serif}.pagination{display:flex;justify-content:center;align-items:center;gap:8px;margin-top:22px}.dot{width:7px;height:7px;border-radius:50%;background:#d8c0a4;border:0;padding:0}.dot.active{width:22px;border-radius:5px;background:var(--red)}
.draw-layout{max-width:1350px;margin:auto;padding:8px 30px 30px;display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:24px}.draw-stage{min-height:480px;background:radial-gradient(circle at 50% 35%,#a83543,var(--red) 60%,#4b101b);color:#fff5df;border:1px solid #c4965b;box-shadow:var(--shadow);border-radius:12px;position:relative;text-align:center;padding:35px;overflow:hidden}.draw-stage:before{content:'';position:absolute;inset:13px;border:1px solid #d2a75e88;border-radius:7px;pointer-events:none}.draw-stage:after{content:'囍';position:absolute;left:50%;top:47%;transform:translate(-50%,-50%);font:420px 'Noto Serif SC',serif;opacity:.035;pointer-events:none}.stage-kicker{font-size:12px;letter-spacing:.3em;color:#e4c58d}.draw-number{font:600 clamp(96px,13vw,174px)/1.3 'Noto Serif SC',serif;color:#ffedc5;text-shadow:0 10px 35px #30070eaa;margin:34px 0 12px;font-variant-numeric:tabular-nums}.draw-number.rolling{animation:glow .22s infinite alternate}@keyframes glow{from{filter:brightness(.9);transform:scale(.98)}to{filter:brightness(1.2);transform:scale(1.02)}}.draw-stage h2{font:400 30px 'Noto Serif SC',serif;letter-spacing:.2em;margin:0 0 22px}.draw-stage .primary{background:#ead3a3;color:var(--red);font-weight:700}.draw-stage .primary:hover{background:#fff0ca}.winner-content{display:none;position:relative;z-index:2;background:#fffbf2;border:1px solid #dbbd8d;color:var(--ink);padding:12px 20px;margin:0 auto 20px;max-width:580px;border-radius:5px;box-shadow:0 8px 20px #33081230}.winner-content.show{display:block;animation:pop .5s both}.winner-content img{display:block;width:100%;max-height:85px;object-fit:contain}.winner-content img.blessing{max-height:95px}.winner-content span{display:block;color:#977467;font-size:12px}.draw-sidebar{background:#fffaf1;border:1px solid #dbc8aa;border-radius:12px;padding:27px 23px;box-shadow:var(--shadow)}.draw-sidebar h3{font:500 21px 'Noto Serif SC',serif;color:var(--red);margin:0 0 17px}.admin-field{display:block;font-size:12px;color:#886b5d;margin:16px 0}.admin-field input{display:block;width:100%;margin-top:7px;border:1px solid #d6c4ad;border-radius:4px;padding:10px 11px;background:#fffdfa;outline:0}.admin-field input:focus{border-color:var(--red)}.draw-count{padding:15px;background:#f6ead7;color:#72544d;font-size:12px;line-height:1.9;border-radius:5px}.draw-count strong{font-size:21px;color:var(--red)}.history{border-top:1px solid #e4d4bc;margin-top:22px;padding-top:20px;max-height:240px;overflow:auto}.history h4{margin:0 0 12px;color:#8f6e5c;font-size:12px;letter-spacing:.1em}.history-row{display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid #eee2d1;font-size:13px}.history-row b{color:var(--red)}.sidebar-link{display:block;margin-top:20px;color:var(--red);font-size:12px;text-decoration:underline;text-underline-offset:4px}.confetti{position:fixed;top:-30px;width:9px;height:15px;z-index:18;pointer-events:none;animation:fall var(--duration) linear forwards}@keyframes fall{to{transform:translate(var(--drift),110vh) rotate(850deg);opacity:.1}}#toast{position:fixed;left:50%;bottom:26px;transform:translateX(-50%) translateY(20px);background:#421822;color:#fff9ed;padding:12px 20px;border-radius:6px;z-index:50;opacity:0;transition:.25s;pointer-events:none;font-size:13px;box-shadow:0 10px 30px #411d2c44}#toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
@media(max-width:1100px){.sign-layout{grid-template-columns:minmax(0,1fr) 210px;gap:14px}.paper-panel{padding:19px}.side-card{padding:24px 18px}.wall-grid{grid-template-columns:repeat(3,1fr)}}@media(max-height:850px) and (min-width:761px){.page-head{padding:16px 20px 12px}.page-head h1{font-size:34px;margin:5px 0}.page-head .ornament{margin:6px auto}.sign-layout,.draw-layout{padding-top:0}.writing-wrap{height:125px}.writing-wrap.blessing{height:150px}.field-label{margin:9px 0 5px}.form-bottom{margin-top:6px}.draw-stage{min-height:410px}.draw-number{margin:12px 0 0;font-size:112px}.draw-stage h2{margin-bottom:13px}}@media(max-width:760px){.topbar{height:64px;padding:0 15px}.brand{font-size:18px}.brand-mark{width:32px;height:32px;font-size:21px}.brand-text small{font-size:6px}.topbar nav a{padding:8px;font-size:11px}.page-head{padding:27px 14px 15px}.page-head h1{font-size:29px}.sign-layout,.draw-layout{display:block;padding:0 13px 22px}.side-card{min-height:200px;margin-top:13px}.side-card h2{margin:6px 0;font-size:23px}.side-stat strong{font-size:35px}.paper-panel{padding:17px 17px 22px}.writing-wrap{height:145px}.writing-wrap.blessing{height:170px}.form-bottom{align-items:stretch;flex-direction:column}.name-field{max-width:none}.primary{width:100%}.wall-layout{padding:0 14px 25px}.wall-grid{grid-template-columns:repeat(2,1fr);gap:10px}.wish-card{min-height:218px;padding:12px}.wish-sig{height:70px}.wish-blessing,.wish-empty{height:65px}.draw-stage{min-height:400px;padding:30px 15px}.draw-sidebar{margin-top:14px}.draw-number{font-size:95px}.draw-stage h2{font-size:24px}}@media(max-width:400px){.brand-text small{display:none}.wall-grid{grid-template-columns:1fr}}
.couple-names{color:#f0d29e;font:500 18px 'Noto Serif SC',serif;letter-spacing:.08em;margin-top:17px}.settings{border-top:1px solid #e4d4bc;margin-top:19px;padding-top:17px}.settings summary{color:var(--red);font-size:13px;font-weight:600;cursor:pointer;list-style:none}.settings summary:after{content:' ＋';float:right}.settings[open] summary:after{content:' −'}.settings form{display:grid;gap:11px;margin-top:15px}.settings label{font-size:11px;color:#80665c}.settings input,.settings textarea{display:block;width:100%;border:1px solid #d6c4ad;border-radius:4px;background:#fffdfa;padding:8px 9px;color:var(--ink);font:13px 'Noto Sans SC',sans-serif;margin-top:4px;outline:none}.settings textarea{min-height:65px;resize:vertical}.settings input:focus,.settings textarea:focus{border-color:var(--red)}.settings .primary{padding:9px 12px;font-size:12px}
.kiosk .topbar{display:none}.kiosk #app{min-height:100vh}.kiosk .page-head{padding-top:14px}
/* Standalone presentation screens */
body.wall,body.draw{height:100vh;overflow:hidden}body.wall #app,body.draw #app{height:100vh;min-height:0;display:flex;flex-direction:column}.wall .page-head{flex:none;padding:18px 16px 7px}.wall .page-head h1{font-size:clamp(27px,3vw,40px);margin:3px 0}.wall .page-head .ornament{margin:6px auto}.wall .page-head p{font-size:12px}.wall .wall-layout{flex:1;min-height:0;width:100%;display:flex;flex-direction:column;padding:0 3vw 12px}.wall .wall-meta{flex:none;margin:0 0 7px}.wall .wall-grid{flex:1;min-height:0;grid-template-columns:repeat(4,minmax(0,1fr));grid-template-rows:repeat(3,minmax(0,1fr));gap:10px}.wall .wish-card{min-height:0;padding:9px 13px;display:flex;flex-direction:column}.wall .wish-sig{height:39%;min-height:0}.wall .wish-line{margin:2px 0 4px}.wall .wish-blessing,.wall .wish-empty{height:33%;min-height:0}.wall .wish-foot{margin-top:auto}.wall .pagination{flex:none;margin-top:8px}.wall .wall-grid:has(.wish-card:first-child:last-child){grid-template-columns:minmax(0,420px);grid-template-rows:minmax(220px,340px);align-content:center}.wall .wall-grid:has(.wish-card:nth-child(2):last-child){grid-template-columns:repeat(2,minmax(0,420px));grid-template-rows:minmax(220px,340px);align-content:center}
.draw .page-head{display:none}.draw .draw-layout{height:100vh;width:100%;max-width:none;padding:0;display:block}.draw .draw-stage{height:100vh;min-height:0;border-radius:0;border:0;box-shadow:none;display:flex;flex-direction:column;justify-content:center;align-items:center;padding:40px}.draw .draw-stage:before{inset:20px}.draw .draw-number{font-size:clamp(110px,22vh,240px);margin:0;line-height:1.15}.draw .draw-stage h2{margin:0 0 18px}.draw .draw-stage .primary{width:auto;min-width:210px}.draw .winner-content{width:min(610px,75vw);margin:0 0 18px}.draw .draw-sidebar{position:fixed;right:0;top:0;bottom:0;width:min(390px,90vw);max-height:none;overflow:auto;z-index:15;border-radius:0;padding:75px 28px 30px;transform:translateX(105%);transition:transform .28s ease}.draw .draw-sidebar.open{transform:translateX(0)}.fullscreen-control,.control-toggle{position:fixed;z-index:16;top:17px;border:1px solid #e1c69a77;background:#5d17248c;color:#fff2d8;padding:8px 14px;border-radius:6px;font-size:12px;opacity:.65;backdrop-filter:blur(8px)}.fullscreen-control{left:18px}.control-toggle{right:18px}.fullscreen-control:hover,.control-toggle:hover{opacity:1}.control-toggle{background:#6f1927}.draw .draw-sidebar.open~.control-toggle{background:#6f1927}
.download-page{min-height:100vh;display:grid;place-items:center;overflow:hidden}.download-card{width:min(530px,90vw);background:#fffaf1;border:1px solid #d4b88b;box-shadow:var(--shadow);padding:55px;text-align:center}.download-card .brand-mark{margin:0 auto 25px}.download-card h1{font:500 34px 'Noto Serif SC',serif;color:var(--red)}.download-card p{color:var(--muted);margin:10px 0 38px}.download-card .primary{display:inline-block}
.wall .wish-card.one-page .wish-sig{height:72%;max-height:none}.draw .winner-content img.single{max-height:190px}
@media(max-height:850px){.wall .wall-grid{grid-template-columns:repeat(3,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr))}.wall .wish-card{min-height:0}.wall .page-head{padding:10px 10px 4px}.wall .page-head .ornament{margin:3px auto}.wall .wish-sig{height:35%}.wall .wish-blessing,.wall .wish-empty{height:30%}}
.prize-field{display:block;margin:15px 0 4px;color:#7b1825;font-size:12px;font-weight:700}.prize-field select{display:block;width:100%;height:43px;margin-top:7px;border:1px solid #d3b98f;border-radius:6px;background:#fffaf0;color:#653634;padding:0 10px;font-weight:600}.prize-settings .secondary,.prize-settings .primary{width:100%;margin-top:9px;padding:9px;border-radius:5px}.prize-edit-row{display:grid;grid-template-columns:78px 1fr 32px;gap:6px;margin-top:8px}.prize-edit-row input{margin:0!important;min-width:0}.prize-edit-row button{border:1px solid #d8aaa8;border-radius:4px;background:#fff5f2;color:#a02e36;font-size:20px}.history-row span{text-align:right;max-width:165px;color:#80645c}
