:root{font-family:PingFang TC,Noto Sans TC,Microsoft JhengHei,system-ui,sans-serif;color:#253c34;background:#fafbf8;font-synthesis:none;font-weight:400;--ink:#253c34;--accent:#b55332;--muted:#758079;--line:#e0e5df;--sage:#eaf0e7}*{box-sizing:border-box}body{margin:0}button,input,select{font:inherit;color:inherit}button,a,input,select{-webkit-tap-highlight-color:transparent}button{cursor:pointer;border:0;background:transparent}a{color:inherit;text-decoration:none}button,a{touch-action:manipulation}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,.event-row:focus{outline:2px solid var(--accent);outline-offset:3px}button:hover,a:hover{color:var(--accent)}button:disabled{cursor:default}svg{flex-shrink:0;stroke-width:1.7}h1,h2,p{margin:0}.app{max-width:1224px;margin:auto;padding:32px 32px 64px}.filters{display:flex;gap:12px}.search-field{display:flex;align-items:center;gap:10px;flex:1;min-width:0;height:46px;padding:0 14px;border:1px solid var(--line);background:#fff;border-radius:7px;color:var(--muted)}.search-field input{border:0;background:none;outline:none;width:100%;min-width:0;font-size:14px;color:var(--ink)}.search-field input::placeholder{color:var(--muted)}.search-field:focus-within{border-color:var(--accent)}.search-field button{display:grid;place-items:center;min-width:32px;height:36px}.filters>select{width:182px;padding:0 12px;border:1px solid var(--line);background:#fff;border-radius:7px;font-size:14px}.view-toolbar{display:flex;justify-content:space-between;align-items:center;gap:16px;margin:24px 0 16px}.view-tabs{display:flex;padding:3px;border-radius:7px;background:#edf0eb}.view-tabs button{display:flex;align-items:center;justify-content:center;gap:7px;padding:9px 19px;white-space:nowrap;font-size:14px;border-radius:5px;min-height:38px}.view-tabs button[aria-selected=true]{background:#fff;box-shadow:0 1px 3px #23362912;font-weight:600}.month-controls{display:flex;align-items:center;gap:6px}.month-controls h1{font-size:18px;font-weight:550;min-width:137px;text-align:center;white-space:nowrap}.month-controls button{display:flex;align-items:center;justify-content:center;min-width:36px;height:38px;border-radius:5px}.month-controls button:hover{background:var(--sage)}.month-controls .this-month{border:1px solid var(--line);padding:0 11px;font-size:12px;margin-left:6px;background:#fff}.calendar-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));border-top:1px solid var(--line);border-left:1px solid var(--line);border-radius:6px;overflow:hidden;background:#fff}.weekday{border-right:1px solid var(--line);border-bottom:1px solid var(--line);text-align:center;font-size:12px;color:var(--muted);padding:9px;background:#f4f6f1}.calendar-day{min-width:0;min-height:82px;display:flex;flex-direction:column;align-items:stretch;gap:3px;padding:7px 9px;text-align:left;border-right:1px solid var(--line);border-bottom:1px solid var(--line)}.calendar-day.outside{color:#abb3ac;background:#f8f9f6}.calendar-day:hover:not(:disabled){background:#f0f4ed}.calendar-day.selected{background:#f7e9df}.calendar-day.today .day-number{background:var(--ink);color:#fff;border-radius:50%}.day-number{display:grid;place-items:center;width:24px;height:24px;font-size:12px}.calendar-labels{display:block;min-width:0}.calendar-labels>span{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:10px;line-height:1.75;color:#4c6355}.calendar-labels i{display:inline-block;width:4px;height:4px;border-radius:50%;background:var(--accent);margin-right:4px;vertical-align:middle}.calendar-labels small{font-size:10px;color:var(--muted)}.mobile-dots{display:none}.calendar-note{font-size:11px;color:var(--muted);margin-top:9px}.results{margin-top:22px}.results-toolbar{display:flex;justify-content:space-between;align-items:center;min-height:35px;padding-bottom:10px;font-size:12px;color:var(--muted)}.results-toolbar button{font-size:12px;text-decoration:underline;text-underline-offset:4px;min-height:30px}.event-list{display:grid;grid-template-columns:1fr 1fr;column-gap:40px}.event-row{min-width:0;padding:19px 0 22px;border-top:1px solid var(--line);scroll-margin:24px}.event-meta{display:flex;flex-wrap:wrap;gap:6px 12px;font-size:12px;color:var(--muted);margin-bottom:7px}.event-meta .date-note{color:#9b653d;font-size:11px}.event-row h2{font-size:18px;line-height:1.45;font-weight:600;overflow-wrap:anywhere;letter-spacing:-.25px}.event-summary{font-size:13px;line-height:1.8;color:#64726a;margin-top:9px}.official-link{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--accent);margin-top:8px;min-height:30px}.official-link:hover{text-decoration:underline;text-underline-offset:3px}.empty,.loading{padding:42px 12px;text-align:center;font-size:14px;color:var(--muted)}.map-panel{position:relative}.map-canvas{height:446px;border:1px solid var(--line);border-radius:7px;background:#dce8e9;z-index:0}.map-canvas.leaflet-container{background:#dce8e9}.map-reset{position:absolute;top:12px;right:12px;background:#fffffff2;display:flex;gap:6px;align-items:center;padding:10px;font-size:12px;border-radius:5px;box-shadow:0 1px 5px #0001}.map-caption{padding-top:9px;color:var(--muted);font-size:11px}.map-error{position:absolute;bottom:50px;left:20px;right:20px;background:#fff;padding:14px;font-size:13px;z-index:500}.leaflet-container{font-family:inherit!important}.event-pin{background:transparent;border:0;color:var(--accent)}.event-pin .pin-shape{position:absolute;top:0;left:4px;width:36px;height:42px;fill:#fff;stroke:currentColor;stroke-width:1.7;filter:drop-shadow(0 2px 3px #253c3433)}.event-pin>.category-icon{position:absolute;top:8px;left:12px;width:20px;height:20px}.event-pin:hover .pin-shape,.event-pin[aria-expanded=true] .pin-shape{filter:drop-shadow(0 0 2px #b5533280) drop-shadow(0 2px 3px #253c3433);stroke-width:2.2}.event-pin:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:22px}.event-popup .leaflet-popup-content-wrapper{border-radius:7px;box-shadow:0 3px 16px #253c3430}.event-popup .leaflet-popup-content{margin:16px 20px}.event-popup .leaflet-popup-tip{box-shadow:none}.map-popup{display:flex;flex-direction:column;color:var(--ink)}.map-popup strong{font-size:17px;line-height:1.4;font-weight:600;padding-bottom:10px}.map-popup button{display:flex;align-items:center;gap:12px;min-height:44px;padding:11px 0;text-align:left;border-bottom:1px solid var(--line);font-size:14px;line-height:1.5;font-weight:500;color:var(--accent)}.map-popup button:last-child{border-bottom:0}.map-popup button:hover{color:#914027}.map-popup button span{min-width:0;overflow-wrap:anywhere}.map-popup .category-icon{width:20px;height:20px;flex:none}.event-popup a.leaflet-popup-close-button{width:28px;height:28px;color:var(--muted);font-size:20px}.leaflet-control-attribution{font-size:9px!important}@media(max-width:700px){.app{padding:20px 18px 40px}.view-toolbar{flex-wrap:wrap;gap:14px;margin-top:18px}.month-controls{margin-left:auto}.event-list{grid-template-columns:1fr}.calendar-day{min-height:70px;padding:6px}.calendar-labels>span{font-size:9px}.event-row h2{font-size:18px}.map-canvas{height:390px}}@media(max-width:480px){.filters{gap:8px;flex-wrap:wrap}.search-field{flex-basis:100%;height:44px}.filters>select{height:42px;width:100%;font-size:13px}.view-toolbar{margin:18px 0 13px;gap:13px}.view-tabs{width:100%}.view-tabs button{flex:1;padding:7px 16px}.month-controls{width:100%;justify-content:center;gap:3px}.month-controls h1{font-size:17px;min-width:137px}.month-controls .this-month{margin-left:7px}.weekday{padding:7px 2px;font-size:11px}.calendar-day{min-height:52px;padding:4px;gap:0}.calendar-labels{display:none}.mobile-dots{display:block;color:var(--accent);font-size:12px;line-height:13px;padding-left:7px;letter-spacing:1px}.day-number{font-size:12px;width:24px;height:24px}.calendar-note{font-size:10px}.results{margin-top:17px}.event-row{padding:16px 0 18px}.event-meta{font-size:11px}.event-summary{font-size:13px}.map-canvas{height:354px}}.activity-panel{min-width:0}.activity-views.split{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:24px}.split .map-panel{height:100%;display:flex;flex-direction:column}.split .map-canvas{flex:1;min-height:360px}.split .map-caption{flex-shrink:0}
