:root{--bg: #f4f5f7;--panel: #ffffff;--border: #e4e6eb;--text: #1f2329;--text-muted: #6b7280;--primary: #e4000f;--primary-dark: #b8000c;--accent: #1a73e8;--shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .04);--radius: 10px;font-family:system-ui,-apple-system,Segoe UI,Roboto,PingFang SC,Microsoft YaHei,sans-serif}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased}button{font-family:inherit;cursor:pointer}button:disabled{cursor:not-allowed;opacity:.5}.app{min-height:100%;display:flex;flex-direction:column}.app__header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;background:var(--panel);border-bottom:1px solid var(--border);box-shadow:var(--shadow)}.app__brand{display:flex;align-items:center;gap:12px}.app__logo{font-size:28px}.app__brand h1{margin:0;font-size:18px;font-weight:700}.app__brand p{margin:2px 0 0;font-size:12px;color:var(--text-muted)}.link-btn{background:none;border:none;color:var(--accent);font-size:14px;padding:6px 10px;border-radius:6px}.link-btn:hover{background:#1a73e814}.app__main{flex:1;display:grid;grid-template-columns:320px 1fr 320px;gap:16px;padding:16px 24px;align-items:start}.app__sidebar,.app__shopping{position:sticky;top:16px;max-height:calc(100vh - 32px);overflow-y:auto}.app__canvas{position:relative;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px;min-height:400px;display:flex;flex-direction:column}.app__footer{text-align:center;padding:16px;color:var(--text-muted);font-size:12px;border-top:1px solid var(--border);background:var(--panel)}.uploader{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:12px}.dropzone{border:2px dashed var(--border);border-radius:var(--radius);padding:36px 16px;text-align:center;transition:all .15s ease;background:#fafbfc}.dropzone:hover,.dropzone--over{border-color:var(--primary);background:#e4000f0a}.dropzone__icon{font-size:40px;margin-bottom:8px}.dropzone__title{font-weight:600;margin-bottom:4px}.dropzone__hint{font-size:12px;color:var(--text-muted)}.uploader__error{margin-top:10px;padding:8px 12px;background:#fef2f2;border:1px solid #fecaca;color:#b91c1c;border-radius:6px;font-size:13px}.sidebar-sections{display:flex;flex-direction:column;gap:12px}.sidebar-sections>.control-panel,.sidebar-sections>.palette-selector,.sidebar-sections>.brush-picker,.sidebar-sections>.source-preview{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:14px}.source-preview img{width:100%;height:120px;object-fit:contain;border-radius:6px;background:#fafafa;display:block}.source-preview__meta{margin-top:8px;font-size:12px;color:var(--text-muted);word-break:break-all}.field{margin-bottom:14px}.field:last-child{margin-bottom:0}.field__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.field__label{font-size:13px;font-weight:600}.field__value{font-size:13px;color:var(--primary);font-weight:700;font-variant-numeric:tabular-nums}.field__hint{font-size:11px;color:var(--text-muted);margin-top:6px;line-height:1.5}input[type=range]{width:100%;accent-color:var(--primary)}.checkbox{display:flex;align-items:center;gap:6px;font-size:13px;margin-top:8px;color:var(--text-muted);cursor:pointer}.checkbox--accent{font-size:14px;font-weight:600;color:var(--text);margin-top:0}.field--disabled{opacity:.45;pointer-events:none}.preset-row{display:flex;gap:6px;margin-top:8px;flex-wrap:wrap;align-items:center}.preset{padding:4px 10px;border:1px solid var(--border);background:#fafafa;border-radius:6px;font-size:12px}.preset--active{border-color:var(--primary);background:#e4000f14;color:var(--primary);font-weight:600}.preset-input{width:60px;padding:4px 6px;border:1px solid var(--border);border-radius:6px;font-size:12px;text-align:center}.palette-tabs{display:flex;gap:6px;margin-bottom:10px}.palette-tab{flex:1;padding:8px;border:1px solid var(--border);background:#fafafa;border-radius:6px;font-size:13px;font-weight:600}.palette-tab--active{border-color:var(--primary);background:var(--primary);color:#fff}.palette-info{display:flex;flex-direction:column;gap:8px}.palette-info__note{font-size:11px;color:var(--text-muted)}.palette-strip{display:flex;flex-wrap:wrap;gap:2px}.palette-swatch{width:14px;height:14px;border-radius:3px;display:inline-block;border:1px solid rgba(0,0,0,.1)}.brush-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(26px,1fr));gap:4px;margin-top:8px}.brush-swatch{width:100%;aspect-ratio:1;border-radius:5px;border:2px solid transparent;position:relative;padding:0}.brush-swatch--active{border-color:var(--accent);box-shadow:0 0 0 1px #fff inset}.brush-swatch--eraser{background:repeating-conic-gradient(#eee,#eee 25%,#fff 0%,#fff 50%) 50% / 8px 8px;color:var(--text-muted);font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center}.brush-swatch__check{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;color:#fff;font-size:14px;text-shadow:0 0 3px rgba(0,0,0,.7)}.brush-swatch__check:after{content:"✓"}.canvas-toolbar{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;flex-wrap:wrap;gap:8px}.canvas-toolbar__info{font-size:13px;color:var(--text-muted);font-weight:600}.canvas-toolbar__actions{display:flex;gap:8px;flex-wrap:wrap}.canvas-toolbar__actions button{padding:7px 12px;border:1px solid var(--border);background:#fafafa;border-radius:6px;font-size:13px}.canvas-toolbar__actions button:hover{background:#f0f0f0}.toggle-btn--active{border-color:var(--accent)!important;background:#1a73e81a!important;color:var(--accent)!important;font-weight:600}.primary-btn{background:var(--primary)!important;color:#fff!important;border-color:var(--primary)!important}.primary-btn:hover{background:var(--primary-dark)!important}.pattern-canvas-wrap{position:relative;overflow:hidden;border:1px solid var(--border);border-radius:8px;background:#fafafa;flex:1;min-height:300px;height:min(72vh,560px);touch-action:none}.pattern-canvas{position:absolute;top:0;left:0;transform-origin:0 0;display:block;image-rendering:pixelated;image-rendering:crisp-edges;touch-action:none;cursor:crosshair}.canvas-zoom-controls{position:absolute;bottom:8px;right:8px;display:flex;gap:4px;align-items:center;background:#ffffffeb;border:1px solid var(--border);border-radius:8px;padding:3px 5px;box-shadow:0 1px 4px #00000014;z-index:2}.canvas-zoom-controls button{min-width:26px;height:26px;padding:0 6px;border:1px solid var(--border);background:#fff;border-radius:6px;font-size:15px;line-height:1;cursor:pointer}.canvas-zoom-controls button:hover{background:var(--bg-alt, #f0f4ff)}.canvas-zoom-pct{font-size:12px;font-variant-numeric:tabular-nums;min-width:38px;text-align:center;color:var(--text-muted)}.canvas-zoom-reset{font-size:11px!important}.canvas-zoom-hint{position:absolute;bottom:8px;left:8px;font-size:11px;color:var(--text-muted);background:#ffffffd1;padding:2px 7px;border-radius:6px;z-index:2;pointer-events:none}.canvas-empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;color:var(--text-muted);padding:40px 20px}.spinner{width:34px;height:34px;border:3px solid var(--border);border-top-color:var(--primary);border-radius:50%;animation:spin .8s linear infinite;margin-bottom:10px}@keyframes spin{to{transform:rotate(360deg)}}.canvas-loading-overlay{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;background:#fafafab3;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px);color:var(--text);font-size:13px;z-index:3;pointer-events:none}.canvas-loading-overlay .spinner{margin-bottom:0}.canvas-empty__icon{font-size:56px;margin-bottom:12px}.canvas-empty p{margin:0 0 16px}.canvas-empty__tips{list-style:none;padding:0;margin:0;font-size:13px;line-height:2;text-align:left}.canvas-empty__tips li:before{content:"✓ ";color:#16a34a;font-weight:700}.shopping-empty{background:var(--panel);border:1px dashed var(--border);border-radius:var(--radius);padding:24px;text-align:center;color:var(--text-muted);font-size:13px}.shopping-list{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:14px}.shopping-list__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.shopping-list__summary{font-size:12px;color:var(--text-muted);font-weight:600}.shopping-list__rows{display:flex;flex-direction:column}.shopping-row{display:grid;grid-template-columns:28px 60px 1fr 50px;align-items:center;gap:8px;padding:6px 4px;border-bottom:1px solid #f0f0f0;font-size:13px}.shopping-row--head{font-size:11px;color:var(--text-muted);font-weight:600;text-transform:uppercase;border-bottom:1px solid var(--border)}.shopping-row .swatch{width:22px;height:22px;border-radius:4px;border:1px solid rgba(0,0,0,.15);display:inline-block}.shopping-row .num{text-align:right;font-weight:700}.shopping-row .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mono{font-family:ui-monospace,Consolas,monospace;font-size:12px}@media (max-width: 1100px){.app__main{grid-template-columns:1fr;gap:12px;padding:12px}.app__sidebar,.app__shopping{position:static;max-height:none}}@media (max-width: 768px){.app__header{padding:10px 14px}.app__brand{gap:8px}.app__logo{font-size:22px}.app__brand h1{font-size:15px}.app__brand p{font-size:11px}.app__main{padding:10px;gap:10px}.app__canvas{padding:10px;min-height:auto}.pattern-canvas-wrap{padding:6px}.canvas-toolbar{flex-direction:column;align-items:stretch;gap:10px}.canvas-toolbar__info{text-align:center}.canvas-toolbar__actions{flex-direction:column}.canvas-toolbar__actions button{width:100%;padding:11px;font-size:14px}.canvas-empty{padding:24px 16px}.canvas-empty__icon{font-size:44px}.canvas-empty__tips{font-size:12px}.dropzone{padding:26px 12px}.dropzone__icon{font-size:32px}.preset{padding:7px 12px;font-size:13px}.preset-input{flex:1}.palette-tab{padding:10px 4px}.checkbox{padding:6px 0;font-size:14px}.brush-grid{grid-template-columns:repeat(auto-fill,minmax(34px,1fr));gap:6px}.shopping-row{grid-template-columns:24px 52px 1fr 44px;gap:6px;font-size:12px;padding:8px 4px}.shopping-row .swatch{width:18px;height:18px}.app__footer{padding:12px;font-size:11px}}
