:root{--paper:#efe8da;--paper-warm:#fdfaf0;--paper-shadow:#e3dcc8;--primary-green:#4a6b47;--primary-green-dark:#3d5938;--primary-green-soft:#4a6b4714;--accent-red:#8b3a3a;--ink:#2a2620;--ink-soft:#5c5547;--ink-mute:#8a8268;--rule:#c9c0a8;--rule-soft:#4a6b472e;--font-zh:"Noto Serif TC", "Source Han Serif TC", serif;--font-en:"Newsreader", "Fraunces", serif}*{box-sizing:border-box}html,body,#root,.app-root{background:var(--paper);height:100%;color:var(--ink);font-family:var(--font-zh);font-feature-settings:"palt";margin:0;padding:0}html[data-texture=on] body{background-image:repeating-linear-gradient(90deg,#4a6b4708 0 1px,#0000 1px 7px),radial-gradient(circle at 20% 30%,#b8956a0a 0 12%,#0000 12%),radial-gradient(circle at 80% 70%,#4a6b470a 0 14%,#0000 14%)}button{cursor:pointer;font-family:inherit}input{font-family:inherit}.app{grid-template-rows:auto auto 1fr;max-width:100vw;height:100%;display:grid;position:relative;overflow:hidden}.app-header{border-bottom:1px solid var(--rule);z-index:5;justify-content:space-between;align-items:baseline;gap:12px;padding:14px 20px 8px;display:flex;position:relative}.app-header:before{content:"";background:var(--rule);opacity:.5;height:1px;position:absolute;bottom:-3px;left:20px;right:20px}.brand-mark{align-items:baseline;gap:10px;display:flex}.brand-zh{font-family:var(--font-zh);letter-spacing:.06em;color:var(--primary-green);font-size:19px;font-weight:600}.brand-divider{background:var(--ink-mute);width:12px;height:1px}.brand-version{font-family:var(--font-en);color:var(--ink-mute);letter-spacing:.04em;align-self:center;font-size:10px}.brand-en{font-family:var(--font-en);color:var(--ink-mute);letter-spacing:.02em;font-size:14px;font-style:italic;font-weight:400}.header-meta{color:var(--accent-red);letter-spacing:.12em;text-transform:uppercase;font-size:11px}.header-loc{font-family:var(--font-en);letter-spacing:.04em;text-transform:none;align-items:center;gap:5px;font-size:12px;font-style:italic;display:inline-flex}.header-loc[data-state=error]{color:var(--accent-red)}.search-wrap{z-index:5;padding:12px 20px 10px;position:relative}.search-bar{background:var(--paper-warm);border:1px solid var(--rule);color:var(--ink-soft);border-radius:2px;align-items:center;gap:10px;padding:10px 14px;transition:border-color .15s;display:flex}.search-bar:focus-within{border-color:var(--primary-green);box-shadow:0 0 0 1px var(--primary-green-soft)}.search-input{color:var(--ink);font-size:14px;font-family:var(--font-zh);background:0 0;border:none;outline:none;flex:1}.search-input::placeholder{color:var(--ink-mute)}.search-clear{color:var(--ink-mute);background:0 0;border:none;padding:2px;display:flex}.search-result-count{font-family:var(--font-en);color:var(--ink-mute);letter-spacing:.04em;margin-top:6px;font-size:11px;font-style:italic}.map-wrap{isolation:isolate;min-height:300px;position:relative;overflow:hidden}.veg-map{background:var(--paper-shadow);position:absolute;inset:0}.leaflet-container{background:var(--paper-shadow);width:100%;height:100%;font-family:var(--font-zh)}.veg-tiles-paper{filter:sepia(.62)saturate(.5)brightness(1.04)contrast(.82)hue-rotate(-8deg)}.veg-pin{background:var(--accent-red);width:28px;height:28px;color:var(--paper);font-family:var(--font-en);border:1px solid #00000026;border-radius:2px;justify-content:center;align-items:center;font-size:13px;font-style:italic;font-weight:500;transition:transform .12s;display:flex;box-shadow:0 1px #00000014,0 2px 6px #0000001a}.veg-pin.overseas{background:var(--primary-green)}.veg-pin:hover{transform:scale(1.15)}.veg-pin.selected{outline:2px solid var(--paper-warm);outline-offset:1px;transform:scale(1.3)}.veg-user{width:14px;height:14px;position:relative}.veg-user-dot{background:var(--primary-green);border:2px solid var(--paper-warm);border-radius:50%;width:14px;height:14px;box-shadow:0 1px 4px #0003}.veg-user-pulse{background:var(--primary-green);opacity:.15;border-radius:50%;animation:2.4s ease-out infinite pulse;position:absolute;inset:-10px}@keyframes pulse{0%{opacity:.3;transform:scale(.6)}to{opacity:0;transform:scale(1.6)}}.map-style-toggle{z-index:500;background:var(--paper-warm);border:1px solid var(--rule);border-radius:2px;display:inline-flex;position:absolute;top:14px;left:14px;overflow:hidden;box-shadow:0 2px 6px #00000014}.map-style-toggle button{font-family:var(--font-zh);letter-spacing:.08em;color:var(--ink-soft);background:0 0;border:none;padding:6px 12px;font-size:12px;transition:background .12s,color .12s}.map-style-toggle button+button{border-left:1px solid var(--rule)}.map-style-toggle button.active{background:var(--primary-green);color:var(--paper-warm);font-weight:500}.map-locate-btn{background:var(--paper-warm);border:1px solid var(--rule);width:38px;height:38px;color:var(--primary-green);z-index:500;border-radius:2px;justify-content:center;align-items:center;display:flex;position:absolute;bottom:14px;right:14px;box-shadow:0 2px 6px #00000014}.sheet{background:var(--paper-warm);border-top:2px solid var(--primary-green);z-index:10;border-radius:0;flex-direction:column;transition:height .28s cubic-bezier(.4,0,.2,1);display:flex;position:absolute;bottom:0;left:0;right:0;box-shadow:0 -8px 24px #0000000f}.sheet-peek{height:130px}.sheet-half{height:55%}.sheet-full{height:calc(100% - 60px)}.sheet-handle-area{background:0 0;border:none;flex-direction:column;align-items:center;gap:4px;width:100%;padding:8px 0 4px;display:flex}.sheet-handle{background:var(--ink-mute);opacity:.4;border-radius:2px;width:36px;height:3px}.sheet-handle-label{font-family:var(--font-en);color:var(--ink-mute);letter-spacing:.08em;text-transform:uppercase;font-size:10px;font-style:italic}.sheet-content{-webkit-overflow-scrolling:touch;flex:1;padding:0 20px 20px;overflow-y:auto}.sheet-list-header{border-bottom:1px solid var(--rule);margin-bottom:4px;padding:12px 0 14px}.sheet-title{font-family:var(--font-zh);color:var(--primary-green);letter-spacing:.04em;margin:0;font-size:16px;font-weight:500}.sheet-count{font-family:var(--font-en);color:var(--ink-mute);letter-spacing:0;margin-left:8px;font-size:13px;font-style:italic;font-weight:400}.sheet-list{flex-direction:column;display:flex}.sheet-loading,.sheet-error{text-align:center;font-family:var(--font-zh);color:var(--ink-soft);padding:30px 0;font-size:13px}.sheet-error{color:var(--accent-red)}.shop-card{border-bottom:1px solid var(--rule);cursor:pointer;flex-direction:column;gap:8px;padding:16px 0;transition:background .1s;display:flex}.shop-card:hover,.shop-card.selected{background:var(--primary-green-soft);margin:0 -8px;padding-left:8px;padding-right:8px}.shop-card.compact{gap:6px;padding:12px 0}.shop-card-head{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.shop-card-name-row{flex-wrap:wrap;align-items:baseline;gap:8px;min-width:0;display:flex}.shop-card-name{font-family:var(--font-zh);color:var(--ink);letter-spacing:.02em;margin:0;font-size:17px;font-weight:600;line-height:1.3}.shop-card-country{font-family:var(--font-en);color:var(--accent-red);letter-spacing:.04em;font-size:12px;font-style:italic}.shop-card-distance{font-family:var(--font-en);color:var(--accent-red);letter-spacing:.02em;flex-shrink:0;font-size:14px;font-style:italic}.shop-card-meta{color:var(--ink-soft);flex-wrap:wrap;align-items:center;gap:8px;font-size:12px;display:flex}.meta-dot{color:var(--ink-mute);opacity:.6}.shop-card-veg{font-family:var(--font-zh);letter-spacing:.04em;font-size:12px}.shop-card-region{font-family:var(--font-zh);color:var(--primary-green);background:var(--primary-green-soft);letter-spacing:.06em;border-radius:1px;padding:2px 8px;font-size:11px;font-weight:500}.shop-card-price{font-family:var(--font-en);font-size:12px;font-style:italic}.shop-card-addr{font-family:var(--font-zh);color:var(--ink-mute);font-size:12px;line-height:1.5}.shop-card-dishes{flex-wrap:wrap;gap:4px 10px;margin-top:2px;display:flex}.dish-tag{font-family:var(--font-zh);color:var(--primary-green);padding-left:10px;font-size:12px;position:relative}.dish-tag:before{content:"";background:var(--primary-green);border-radius:50%;width:4px;height:4px;position:absolute;top:50%;left:0;transform:translateY(-50%)}.shop-card-features{flex-wrap:wrap;gap:5px;display:flex}.feature-tag{font-family:var(--font-zh);background:var(--paper);border:1px solid var(--primary-green);color:var(--primary-green);letter-spacing:.04em;border-radius:1px;padding:2px 7px;font-size:10px}.shop-card-actions{gap:8px;margin-top:4px;display:flex}.btn-ghost{border:1px solid var(--rule);color:var(--ink-soft);font-family:var(--font-zh);letter-spacing:.04em;background:0 0;border-radius:1px;align-items:center;gap:5px;padding:6px 12px;font-size:12px;transition:all .12s;display:inline-flex}.btn-ghost:hover{border-color:var(--primary-green);color:var(--primary-green);background:var(--primary-green-soft)}.pin-preview{background:var(--paper-warm);border:1px solid var(--rule);border-top:2px solid var(--accent-red);z-index:11;cursor:pointer;padding:14px 16px 12px;animation:.22s cubic-bezier(.2,.8,.3,1) slideUp;position:absolute;bottom:140px;left:16px;right:16px;box-shadow:0 8px 24px #0000001a}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.pin-preview .shop-card{border:none;padding:0}.pin-preview .shop-card:hover{background:0 0;margin:0;padding:0}.pin-preview-close{width:22px;height:22px;color:var(--ink-mute);z-index:2;background:0 0;border:none;justify-content:center;align-items:center;display:flex;position:absolute;top:6px;right:6px}.btn-primary,.btn-secondary{font-family:var(--font-zh);letter-spacing:.06em;border:1px solid;border-radius:1px;justify-content:center;align-items:center;gap:6px;padding:11px 18px;font-size:14px;font-weight:500;transition:all .15s;display:inline-flex}.btn-primary{background:var(--primary-green);color:var(--paper-warm);border-color:var(--primary-green)}.btn-primary:hover{background:var(--primary-green-dark);border-color:var(--primary-green-dark)}.btn-primary:disabled{opacity:.4;cursor:not-allowed}.btn-secondary{color:var(--primary-green);border-color:var(--primary-green);background:0 0}.btn-secondary:hover{background:var(--primary-green-soft)}.btn-compact{padding:9px 14px;font-size:13px}.modal-backdrop{backdrop-filter:blur(2px);z-index:100;background:#2a262080;justify-content:center;align-items:flex-end;animation:.16s fadeIn;display:flex;position:fixed;inset:0}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.modal{background:var(--paper-warm);border-top:3px solid var(--primary-green);width:100%;max-width:640px;max-height:92vh;padding:28px 24px 40px;animation:.28s cubic-bezier(.2,.8,.3,1) slideUp;position:relative;overflow-y:auto}.modal-narrow{max-width:460px}@media (width>=720px){.modal-backdrop{align-items:center}.modal{max-height:86vh;padding:36px 40px 48px}}.modal-close{border:1px solid var(--rule);width:32px;height:32px;color:var(--ink-soft);z-index:2;background:0 0;justify-content:center;align-items:center;display:flex;position:absolute;top:14px;right:14px}.modal-eyebrow{font-family:var(--font-en);color:var(--accent-red);letter-spacing:.08em;flex-wrap:wrap;align-items:baseline;gap:8px;margin-bottom:8px;font-size:12px;font-style:italic;display:flex}.modal-title{font-family:var(--font-zh);letter-spacing:.02em;color:var(--ink);margin:0 0 4px;font-size:26px;font-weight:700;line-height:1.2}.modal-status-row{border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);color:var(--ink-soft);flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:22px;padding:12px 0;font-size:13px;display:flex}.modal-divider{background:var(--rule);width:1px;height:12px}.modal-meta-item{font-family:var(--font-zh);font-size:13px}.modal-section{margin-bottom:22px}.modal-section-label{font-family:var(--font-en);color:var(--accent-red);letter-spacing:.12em;text-transform:uppercase;margin-bottom:8px;font-size:11px;font-style:italic}.modal-quote blockquote{font-family:var(--font-zh);color:var(--ink);background:var(--paper);border-left:2px solid var(--primary-green);letter-spacing:.02em;text-wrap:pretty;margin:0;padding:14px 16px;font-size:15px;line-height:1.85}.modal-grid{grid-template-columns:1fr;gap:4px;display:grid}@media (width>=720px){.modal-grid{grid-template-columns:1fr 1fr;gap:4px 32px}.modal-quote{grid-column:1/-1}}.modal-dishes{margin:0;padding:0;list-style:none}.modal-dishes li{font-family:var(--font-zh);border-bottom:1px dotted var(--rule);color:var(--ink);padding:6px 0 6px 14px;font-size:14px;position:relative}.modal-dishes li:before{content:"—";color:var(--primary-green);font-family:var(--font-en);position:absolute;left:0}.modal-addr{font-family:var(--font-zh);color:var(--ink);font-size:14px;line-height:1.6}.modal-hours{font-family:var(--font-zh);color:var(--ink);white-space:pre-line;font-size:14px;line-height:1.6}.modal-actions{border-top:2px solid var(--primary-green);flex-wrap:wrap;gap:10px;margin-top:24px;padding-top:20px;display:flex}.modal-actions .btn-primary,.modal-actions .btn-secondary{flex:1;min-width:140px}.modal-body-note{font-family:var(--font-zh);color:var(--ink-soft);margin:-8px 0 18px;font-size:13px}.loc-prompt-backdrop{backdrop-filter:blur(3px);z-index:200;background:#2a26208c;justify-content:center;align-items:center;padding:24px;animation:.2s fadeIn;display:flex;position:fixed;inset:0}.loc-prompt{background:var(--paper-warm);border-top:3px solid var(--primary-green);text-align:center;background-image:repeating-linear-gradient(0deg,#0000 0 22px,#4a6b470a 22px 23px);width:100%;max-width:380px;padding:36px 32px;position:relative}.loc-prompt-mark{border:1px solid var(--rule);width:56px;height:56px;color:var(--primary-green);background:var(--paper);border-radius:50%;justify-content:center;align-items:center;margin:0 auto 16px;display:flex}.loc-prompt-eyebrow{font-family:var(--font-en);color:var(--accent-red);letter-spacing:.1em;margin-bottom:10px;font-size:12px;font-style:italic}.loc-prompt-title{font-family:var(--font-zh);letter-spacing:.04em;color:var(--ink);margin:0 0 14px;font-size:22px;font-weight:600}.loc-prompt-body{font-family:var(--font-zh);color:var(--ink-soft);margin:0 0 24px;font-size:14px;line-height:1.85}.loc-prompt-actions{flex-direction:column;gap:10px;display:flex}.manual-input-row{gap:8px;margin-bottom:18px;display:flex}.manual-input{background:var(--paper);border:1px solid var(--rule);font-size:14px;font-family:var(--font-zh);color:var(--ink);border-radius:1px;outline:none;flex:1;padding:10px 12px}.manual-input:focus{border-color:var(--primary-green)}.manual-cities{border-top:1px solid var(--rule);flex-direction:column;gap:1px;display:flex}.manual-city{border:none;border-bottom:1px dotted var(--rule);text-align:left;font-family:var(--font-zh);color:var(--ink);letter-spacing:.04em;background:0 0;align-items:center;gap:10px;padding:12px 0;font-size:14px;transition:color .1s;display:flex}.manual-city:hover{color:var(--primary-green)}.manual-city svg{color:var(--accent-red)}.empty-state{text-align:center;padding:40px 20px 60px}.empty-mark{border:1px solid var(--rule);width:60px;height:60px;color:var(--ink-mute);border-radius:50%;justify-content:center;align-items:center;margin:0 auto 14px;display:flex}.empty-eyebrow{font-family:var(--font-en);color:var(--accent-red);letter-spacing:.12em;margin-bottom:8px;font-size:11px;font-style:italic}.empty-title{font-family:var(--font-zh);color:var(--ink);letter-spacing:.02em;margin:0 0 8px;font-size:18px;font-weight:500}.empty-body{font-family:var(--font-zh);color:var(--ink-soft);margin:0 0 16px;font-size:13px}.empty-tags{flex-wrap:wrap;justify-content:center;gap:6px;margin-bottom:24px;display:flex}.empty-tag{font-family:var(--font-zh);background:var(--paper);border:1px solid var(--primary-green);color:var(--primary-green);letter-spacing:.06em;border-radius:1px;padding:5px 12px;font-size:12px}.empty-tag:hover{background:var(--primary-green);color:var(--paper-warm)}.empty-clear{font-family:var(--font-en);color:var(--ink-mute);text-underline-offset:4px;letter-spacing:.04em;background:0 0;border:none;font-size:12px;font-style:italic;text-decoration:underline}@media (width>=900px){.app{grid-template:"header header""sidebar map"1fr/380px 1fr}.app-header{grid-area:header;padding:18px 28px 12px}.search-wrap{border-right:1px solid var(--rule);background:var(--paper-warm);grid-area:2/sidebar;padding:16px 24px 0}.map-wrap{grid-area:map}.sheet{border-top:1px solid var(--rule);box-shadow:none;background:var(--paper-warm);border-right:1px solid var(--rule);grid-area:2/sidebar;margin-top:60px;transition:none;position:static;height:auto!important}.sheet-handle-area{display:none}.sheet-content{padding:0 24px 24px}.pin-preview{max-width:360px;bottom:24px;left:auto;right:24px}}@media (width<=899px){.sheet-peek .sheet-content{pointer-events:none}.sheet-peek .sheet-list-header{display:none}.sheet-peek .shop-card{padding:8px 0}.sheet-peek .shop-card:first-child{padding-top:4px}}
