:root{font-family:Nunito,Noto Sans SC,Microsoft YaHei,sans-serif;color:#51414a;background:#fff7f4;font-synthesis:none;text-rendering:optimizeLegibility;--page: #FFF7F4;--card: #FFFFFF;--pink: #F3A7C3;--pink-strong: #E86F9A;--lilac: #D9C8F5;--blue: #A9D8EF;--yellow: #FFE6A7;--ink: #51414A;--muted: #9A7F8C;--grid: #E9D9DF;--line: #EEDCE4;--shadow: #e6cbd6}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;min-width:320px;background:var(--page)}button,input,select{font:inherit}button{color:inherit}button:focus-visible,input:focus-visible,select:focus-visible,.dropzone:focus-visible{outline:3px solid #A9D8EF;outline-offset:2px}.app-shell{min-height:100vh;padding-bottom:12px;overflow:hidden}.topbar{height:70px;display:flex;align-items:center;gap:16px;padding:0 max(24px,calc((100vw - 1640px)/2));background:var(--card);border-bottom:2px solid var(--line)}.brand{display:inline-flex;align-items:center;gap:11px;color:inherit;text-decoration:none}.brand-mark{width:40px;height:40px;display:grid;place-items:center;border:2px solid var(--pink-strong);background:#fff0f5;box-shadow:3px 3px #f7dce7}.brand-mark svg{width:29px;height:29px}.brand-title{display:block;font-size:16px;line-height:1.05;font-weight:900;letter-spacing:.04em}.brand-sub{display:block;margin-top:4px;color:var(--pink-strong);font:500 9px/1 DM Mono,monospace;letter-spacing:.12em}.top-spacer{flex:1}.topbar-actions{display:flex;align-items:center;gap:18px}.privacy{display:flex;align-items:center;gap:7px;color:var(--muted);font-size:11px}.privacy i{width:8px;height:8px;border-radius:50%;background:#79b99a;box-shadow:0 0 0 3px #e9f5ee}.quiet-btn,.edit-actions button{border:1px solid var(--line);background:#fff;padding:8px 12px;color:var(--ink);font-size:11px;font-weight:800;cursor:pointer;box-shadow:0 2px #f4e8ed}.quiet-btn:hover,.edit-actions button:not(:disabled):hover{background:#fff0f5;border-color:var(--pink)}.birthday-banner{isolation:isolate;position:relative;display:flex;align-items:center;max-width:1640px;min-height:184px;margin:20px auto 0;padding:22px 36px;overflow:hidden;border:2px solid #E8C6D4;border-radius:13px;background:linear-gradient(105deg,#fff,#fff8fa 48%,#fdeaf1);box-shadow:5px 5px #f3dee6}.birthday-banner:before,.birthday-banner:after{content:"";position:absolute;z-index:-1;pointer-events:none}.birthday-banner:before{right:1%;bottom:12px;width:34%;height:11px;background:repeating-linear-gradient(90deg,#F3A7C3 0 13px,transparent 13px 24px);opacity:.28}.birthday-banner:after{right:9%;top:17px;width:22px;height:22px;background:var(--yellow);box-shadow:18px 18px 0 -5px #a9d8ef,-52px 34px 0 -7px #d9c8f5;clip-path:polygon(35% 0,65% 0,65% 35%,100% 35%,100% 65%,65% 65%,65% 100%,35% 100%,35% 65%,0 65%,0 35%,35% 35%);animation:twinkle 3.6s ease-in-out infinite}.banner-copy{position:relative;z-index:2;max-width:58%}.banner-eyebrow{display:flex;align-items:center;gap:8px;color:#b35c7c;font:500 10px/1.2 DM Mono,monospace;letter-spacing:.13em}.pixel-sparkle{width:8px;height:8px;background:var(--yellow);box-shadow:4px 4px #e86f9a;transform:rotate(45deg)}.banner-copy h1{margin:9px 0 6px;color:#623d50;font-size:clamp(25px,3vw,36px);line-height:1.15;font-weight:900;letter-spacing:.04em;text-shadow:2px 2px 0 #F9E3EB}.banner-copy p{margin:0;color:#806775;font-size:13px;font-weight:700}.banner-tag{display:inline-flex;align-items:center;gap:6px;margin-top:12px;padding:5px 9px;border:1px solid #F0D2DE;background:#fff;color:#96647a;font-size:10px;font-weight:800}.tag-heart{color:var(--pink-strong)}.birthday-scene{position:absolute;z-index:1;right:4%;bottom:0;width:min(42%,490px);height:100%;overflow:visible;image-rendering:pixelated}.scene-heart{transform-box:fill-box;transform-origin:center;animation:heart-float 4s ease-in-out infinite}.scene-stars{animation:twinkle 3.1s ease-in-out infinite}.banner-orbit{position:absolute;z-index:2;pointer-events:none;color:var(--pink-strong);font-size:19px;animation:orbit-float 5s ease-in-out infinite}.orbit-one{right:44%;top:18px}.orbit-two{right:2.5%;top:52%;color:#d7a741;font-size:15px;animation-delay:-2s}.workspace{display:grid;grid-template-columns:minmax(245px,290px) minmax(430px,1fr) minmax(335px,375px);gap:16px;align-items:start;max-width:1640px;margin:18px auto 0}.panel,.center-column{min-width:0;border:2px solid var(--line);border-radius:12px;background:var(--card);box-shadow:4px 4px #f5e7ed}.panel{display:flex;flex-direction:column;padding:18px}.panel-heading{display:flex;align-items:center;gap:10px;margin-bottom:16px}.panel-heading.compact{margin:0}.step{display:grid;place-items:center;min-width:32px;height:30px;padding:0 5px;border:1px solid #E9CCDA;background:#fff3f7;color:#a75d7b;font:500 10px/1 DM Mono,monospace;letter-spacing:.02em;box-shadow:2px 2px #f5e3ea}.panel-heading h2{margin:0;color:#5a4650;font-size:14px;font-weight:900;letter-spacing:.02em}.panel-heading p{margin:4px 0 0;color:#a58f99;font-size:10px;line-height:1.35}.dropzone{min-height:184px;display:grid;place-items:center;padding:14px;border:2px dashed #E7C7D5;background:#fffafc;cursor:pointer;overflow:hidden;transition:background .16s ease,border-color .16s ease,transform .16s ease}.dropzone:hover,.dropzone.dragging{border-color:var(--pink-strong);background:#fff0f5}.dropzone.dragging{transform:translateY(-2px)}.dropzone img{width:100%;height:100%;min-height:150px;object-fit:contain;background:repeating-conic-gradient(#f4e9ee 0,#f4e9ee 25%,#fff 0,#fff 50%) 50%/16px 16px}.upload-prompt{display:flex;flex-direction:column;align-items:center;gap:7px;text-align:center}.pixel-photo-icon{width:50px;height:50px;margin-bottom:2px;image-rendering:pixelated}.upload-prompt b{color:#725665;font-size:11px;font-weight:900}.upload-prompt small{color:#9e8491;font-size:10px}.upload-prompt em{color:#b49ca7;font: 9px DM Mono,monospace}.filename{display:flex;align-items:center;gap:7px;margin-top:9px;color:#806c76;font-size:10px}.filename-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.filename button{margin-left:auto;border:0;background:transparent;color:#bb6788;font-size:10px;cursor:pointer}.section-block{margin-top:17px}.control-label{display:flex;align-items:center;justify-content:space-between;color:#795f6d;font-size:10px;font-weight:900}.control-label b{color:#bb5f82;font:500 11px DM Mono,monospace}.hint{color:#ab98a1;font-size:9px;font-weight:500}.segmented{display:flex;gap:3px;margin-top:8px;padding:3px;border:1px solid #F1E5EA;background:#fff8fa}.segmented button{flex:1;padding:7px 4px;border:1px solid transparent;background:transparent;color:#9a828f;font-size:10px;cursor:pointer}.segmented button.selected{border-color:#f0d5e0;background:#fff;color:#9d5070;font-weight:900;box-shadow:2px 2px #f8e8ee}.range-row{display:flex;align-items:center;gap:8px;margin-top:12px;color:#8a7380;font-size:10px}.range-row span{flex:none;width:50px}.range-row input{min-width:0;flex:1;accent-color:var(--pink-strong)}.range-row em{width:38px;color:#8c6a7b;font: 10px DM Mono,monospace;text-align:right}.toggle-row{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:12px;color:#725c68;font-size:10px;font-weight:700}.toggle-row small{display:block;margin-top:2px;color:#a8949e;font-size:9px;font-weight:500}.toggle-row input,.number-switch input{accent-color:#C66084}.divider{height:1px;margin:18px 0;background:var(--line)}.dimensions{display:flex;align-items:end;gap:8px;margin-top:15px}.dimensions label{flex:1;min-width:0;color:#977d8a;font-size:9px;font-weight:800}.dimensions input{display:block;width:100%;margin-top:5px;padding:9px 8px;border:1px solid var(--line);background:#fffcfd;color:var(--ink);font:500 12px DM Mono,monospace}.lock{width:34px;height:35px;border:1px solid var(--line);background:#fff8fa;color:#9f7a8b;cursor:pointer}.lock.on{border-color:#eccad8;background:#fff0f5;color:#b75278}.grid-total{display:flex;align-items:baseline;gap:6px;margin-top:16px;padding:12px 10px;border:1px solid #F1E1E8;background:#fffafc;color:#8f7783;font-size:10px}.grid-total b{margin-left:auto;color:#8d4b69;font:500 14px DM Mono,monospace}.grid-total small{color:#9f8893;font-size:9px}.center-column{display:flex;flex-direction:column;min-height:690px;overflow:hidden}.preview-top{min-height:68px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:13px 17px;border-bottom:1px solid var(--line);background:#fffefe}.number-switch{display:flex;align-items:center;gap:6px;color:#8b7180;font-size:10px;font-weight:700;white-space:nowrap}.preview-stage{position:relative;display:flex;flex:1;min-height:400px;align-items:center;justify-content:center;overflow:auto;padding:18px;background-color:#fffbfc;background-image:radial-gradient(#E9D9DF 1px,transparent 1px);background-size:17px 17px}.pattern-canvas{max-width:none;border:1px solid #EEDCE4;background:#fff;box-shadow:5px 5px #f1e1e8;image-rendering:pixelated;cursor:crosshair}.empty-preview{display:flex;flex-direction:column;align-items:center;gap:8px;padding:22px;text-align:center}.pixel-gift-art{width:118px;height:102px;margin-bottom:4px;image-rendering:pixelated;filter:drop-shadow(4px 4px 0 #F1E1E8)}.empty-preview b{color:#765a69;font-size:13px;font-weight:900}.empty-preview span{color:#a38d98;font-size:10px}.busy-cover{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;gap:9px;background:#fffafced;color:#865c72;font-size:11px;font-weight:800}.spinner{width:18px;height:18px;border:2px solid #F4DCE6;border-top-color:#d66388;animation:spin .8s linear infinite}.celebration-toast{display:flex;align-items:center;justify-content:center;gap:9px;padding:8px 12px;border-bottom:1px solid #F4DDE7;background:#fff4f8;color:#ad5276;font-size:11px;font-weight:900;animation:toast-in .22s ease-out}.celebration-toast span{color:#d1a542}.preview-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 14px;border-top:1px solid var(--line);background:#fff}.stats-pills{display:flex;flex-wrap:wrap;gap:10px}.stats-pills span{color:#937c88;font-size:9px}.stats-pills b{color:#755365;font:500 10px DM Mono,monospace}.dot{display:inline-block;width:7px;height:7px;margin-right:4px;background:#d97b9b}.dot.light{background:#d8c8f5}.edit-actions{display:flex;flex:none;gap:5px}.edit-actions button{padding:6px 8px;font-size:9px}.edit-actions button:disabled,.export-buttons button:disabled,.project-save:disabled{opacity:.46;cursor:not-allowed;box-shadow:none}.status-line{display:flex;min-height:31px;justify-content:space-between;gap:8px;padding:7px 14px 8px;border-top:1px solid var(--line);color:#947e89;font-size:9px}.status-error{color:#b7425e;font-weight:800}.local-note{color:#a28f98}.right-panel{gap:0;padding:15px}.settings-group{min-width:0;padding:1px 0 13px;border-bottom:1px solid #F0E2E8}.settings-group+.settings-group{padding-top:13px}.settings-group .panel-heading{margin-bottom:10px}.section-block.first{margin:0}.color-counts{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:5px;margin:8px 0 10px}.color-counts button{border:1px solid var(--line);background:#fffcfd;padding:6px 0;color:#947987;font:500 9px DM Mono,monospace;cursor:pointer}.color-counts button:hover,.color-counts button.active{border-color:var(--pink-strong);background:#fff0f5;color:#a24669}.color-counts button.active{box-shadow:2px 2px #f3dee6;font-weight:900}.palette-head,.table-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:9px}.text-btn{border:0;background:transparent;color:#ad5d7d;font-size:9px;font-weight:800;cursor:pointer}.text-btn:hover{text-decoration:underline}.palette-tools{display:flex;flex-wrap:wrap;gap:6px;margin-top:7px}.palette-tools button{flex:1 1 38%;border:1px solid var(--line);background:#fff;padding:7px 4px;color:#805f70;font-size:9px;font-weight:800;cursor:pointer;box-shadow:0 2px #f5e9ee}.palette-tools button:hover{border-color:var(--pink);background:#fff4f8}.palette-disclaimer{margin:7px 0 8px;color:#a48f99;font-size:9px;line-height:1.45}.palette-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:5px;max-height:172px;overflow:auto;padding:2px;border:1px solid #F3E8ED;background:#fffbfc}.swatch-item>input{width:12px;height:12px;flex:none;accent-color:var(--pink-strong);margin:0}.swatch{position:relative;display:flex;flex:1;align-items:center;gap:4px;min-width:0;border:1px solid #F1E3E9;background:#fff;padding:3px;text-align:left;cursor:pointer}.swatch i{display:block;width:16px;height:16px;flex:none;background:var(--swatch);border:1px solid #00000014}.swatch span{overflow:hidden;color:#786270;font:500 8px DM Mono,monospace;text-overflow:ellipsis}.swatch small{margin-left:auto;color:#a6909a;font:8px DM Mono,monospace}.swatch.brush{border-color:#c65f82;box-shadow:inset 0 0 0 1px #c65f82}.swatch.disabled{opacity:.38;filter:grayscale(.75)}.palette-foot{margin-top:5px;color:#a28c97;font-size:8px;text-align:right}.table-head{margin-top:0}.table-head select,.orientation select{border:1px solid var(--line);background:#fff;padding:5px 7px;color:#826b78;font-size:9px}.stats-table-wrap{max-height:190px;overflow:auto;margin-top:7px;border:1px solid #F0E2E8}.stats-below-pattern{margin:0 14px 14px;padding:13px;border:1px solid #F0E2E8;background:#fffefe}.stats-below-pattern .stats-table-wrap{max-height:270px}.stats-table-wrap table{width:100%;border-collapse:collapse;font-size:9px}.stats-table-wrap th{position:sticky;top:0;background:#fff4f8;color:#967b89;font-weight:900;text-align:left;padding:7px 5px}.stats-table-wrap td{border-top:1px solid #F4E9EE;padding:6px 5px;color:#725d68;white-space:nowrap}.stats-table-wrap th:nth-child(n+3),.stats-table-wrap td:nth-child(n+3){text-align:right}.table-swatch{display:inline-block;width:10px;height:10px;margin-right:4px;border:1px solid #00000018;vertical-align:-1px}.empty-row{padding:16px!important;color:#aa969f!important;text-align:center!important}.export-area{margin-top:0;border-top:0;padding-top:13px}.export-buttons{display:flex;gap:7px;margin-top:8px}.export-buttons button,.project-save{flex:1;border:1px solid var(--line);background:#fff;padding:8px 7px;color:#765c6a;font-size:10px;font-weight:800;cursor:pointer;box-shadow:0 2px #f3e5eb}.export-buttons button:hover:not(:disabled),.project-save:hover:not(:disabled){border-color:var(--pink);background:#fff5f8}.export-buttons button.primary{border-color:#c75d82;background:var(--pink-strong);color:#fff;box-shadow:0 3px #c9537a}.export-buttons button.primary:hover:not(:disabled){background:#dc608d}.orientation{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:9px;color:#927c88;font-size:9px}.export-buttons.secondary button{padding:7px;font-size:9px}.project-save{width:100%;margin-top:8px}.export-note{margin:7px 0 0;color:#a38e98;font-size:9px;line-height:1.45}.birthday-note{position:relative;display:grid;grid-template-columns:42px minmax(0,1fr) auto;align-items:center;gap:13px;max-width:1640px;margin:18px auto 0;padding:16px 20px;border:2px solid #EEDCE4;background:#fff;box-shadow:4px 4px #f5e7ed}.note-icon{display:grid;place-items:center;width:38px;height:38px;border:1px solid #EBC8D6;background:#fff0f5;color:var(--pink-strong);font-size:19px}.note-copy h2{margin:0;color:#6b4f5d;font-size:12px;font-weight:900}.note-copy p{margin:4px 0 0;color:#a18a95;font-size:10px}.birthday-open-button{border:1px solid #DE90AC;background:#fff0f5;padding:9px 13px;color:#a64e70;font-size:10px;font-weight:900;cursor:pointer;box-shadow:0 3px #f0d2de}.birthday-open-button:hover{background:#fce5ed}.birthday-letter{position:relative;grid-column:1 / -1;margin-top:5px;padding:18px 20px;border:1px dashed #D9B8C7;background:repeating-linear-gradient(#fffefe 0,#fffefe 31px,#f3e5eb,#f3e5eb 33px);animation:letter-open .24s ease-out}.birthday-letter h3{margin:0 0 10px;color:#805b6d;font-size:12px}.birthday-letter p{max-width:800px;margin:0;color:#69535f;font-size:12px;line-height:2;white-space:pre-line}.letter-stamp{position:absolute;top:14px;right:16px;display:grid;place-items:center;width:44px;height:44px;border:2px solid #E8A8BF;color:#d36a8e;font:8px/1.2 DM Mono,monospace;text-align:center;transform:rotate(7deg)}.letter-sign{display:block;margin-top:12px;color:#b65f80;font-size:10px;font-weight:900;text-align:right}footer{max-width:1640px;margin:0 auto;padding:17px 20px 8px;color:#a28d97;font-size:9px;text-align:center}.footer-heart{color:#d86f92}@keyframes spin{to{transform:rotate(360deg)}}@keyframes heart-float{0%,to{transform:translateY(0) scale(1)}50%{transform:translateY(-5px) scale(1.025)}}@keyframes twinkle{0%,to{opacity:.75}50%{opacity:1}}@keyframes orbit-float{0%,to{transform:translateY(0)}50%{transform:translateY(-7px)}}@keyframes toast-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes letter-open{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}@media(max-width:1400px){.birthday-banner,.workspace,.birthday-note,footer{margin-left:18px;margin-right:18px}.workspace{grid-template-columns:minmax(225px,260px) minmax(380px,1fr) minmax(310px,350px);gap:12px}.panel{padding:15px}.right-panel{padding:13px}}@media(max-width:1160px){.workspace{grid-template-columns:minmax(230px,290px) minmax(0,1fr)}.right-panel{display:grid;grid-column:1 / -1;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 18px}.palette-group{grid-row:span 2}.export-area{align-self:start}.center-column{min-height:620px}}@media(max-width:760px){.topbar{height:62px;padding:0 13px}.brand-mark{width:35px;height:35px}.brand-mark svg{width:26px;height:26px}.brand-title{font-size:14px}.brand-sub{font-size:8px}.topbar-actions{gap:9px}.privacy{font-size:9px}.privacy i{width:7px;height:7px}.quiet-btn{padding:7px 8px;font-size:9px}.birthday-banner{min-height:174px;margin:13px 12px 0;padding:20px 17px}.banner-copy{max-width:100%}.banner-copy h1{max-width:67%;font-size:clamp(23px,6vw,31px)}.banner-copy p{max-width:68%;font-size:10px;line-height:1.55}.banner-eyebrow{font-size:8px}.banner-tag{margin-top:9px;font-size:9px}.birthday-scene{right:-7%;width:65%;opacity:.58}.orbit-one{right:42%}.workspace{display:flex;flex-direction:column;gap:12px;margin:13px 12px 0}.left-panel{order:1;width:100%}.center-column{order:2;width:100%;min-height:520px}.right-panel{order:3;display:flex;width:100%}.panel{padding:14px}.dropzone{min-height:150px}.preview-top{min-height:64px;padding:11px 12px}.preview-top .panel-heading h2{font-size:12px}.preview-stage{min-height:330px;padding:12px}.preview-toolbar{align-items:flex-start;flex-direction:column}.stats-pills{gap:8px}.status-line{flex-direction:column}.birthday-note{grid-template-columns:36px minmax(0,1fr);gap:10px;margin:14px 12px 0;padding:13px}.note-icon{width:34px;height:34px}.birthday-open-button{grid-column:1 / -1;justify-self:stretch}.birthday-letter{padding:16px 13px}.birthday-letter p{font-size:11px}.letter-stamp{width:36px;height:36px;top:9px;right:9px;font-size:7px}footer{margin:0 12px;padding-top:13px;line-height:1.8}}@media(max-width:420px){.privacy{display:none}.banner-copy h1{max-width:78%;font-size:22px}.banner-copy p{max-width:78%}.birthday-scene{right:-15%;width:72%;opacity:.42}.number-switch{font-size:9px}.number-switch input{margin:0}.edit-actions button{padding:6px}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}.swatch-item{display:flex;align-items:center;gap:2px;min-width:0}.swatch-item>input{width:12px;height:12px;flex:none;accent-color:#397958;margin:0}.swatch{flex:1}.palette-tools{flex-wrap:wrap}.palette-tools button{flex:1 1 38%;font-size:10px}.export-toggle{margin-top:9px}
