:root{--bg:#f4f6f3;--paper:#fff;--ink:#18362e;--muted:#6c7c76;--line:#e0e7e0;--teal:#266b56;--teal-light:#e8f0e9;--red:#a24235}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.7 -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans TC",sans-serif}a{color:var(--teal);text-decoration:none}a:hover{text-decoration:underline}button,input,select{font:inherit}button,a,input,select{touch-action:manipulation}button{cursor:pointer}a:focus-visible,button:focus-visible{outline:3px solid #b4cfa6;outline-offset:4px}.site-header{max-width:1280px;margin:auto;padding:25px 48px;display:flex;justify-content:space-between;align-items:center;gap:24px;border-bottom:1px solid var(--line)}.brand{display:flex;gap:12px;align-items:center;font-size:20px;font-weight:650;letter-spacing:-.4px;color:var(--ink)}.brand:hover{text-decoration:none}.brand-mark{font-size:35px;width:46px;height:46px;line-height:42px;text-align:center;background:var(--teal);color:white;border-radius:14px}.brand small{display:block;font-size:10px;letter-spacing:1px;font-weight:400;color:var(--muted)}nav{display:flex;align-items:center;gap:22px;font-size:14px}nav form{margin:0}.link-button{border:0;background:none;color:var(--muted);padding:0}.container{max-width:1184px;padding:50px 32px 80px;margin:auto;min-height:calc(100vh - 180px)}h1,h2,p{margin-top:0}h1{font-size:34px;line-height:1.3;letter-spacing:-1px;margin-bottom:14px}h2{font-size:22px;font-weight:600;margin-bottom:16px}p{margin-bottom:20px}.eyebrow{font-size:11px;letter-spacing:2.2px;color:var(--teal);font-weight:700;margin-bottom:15px}.muted{color:var(--muted)}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px}.panel{background:var(--paper);border:1px solid var(--line);border-radius:20px;padding:32px;box-shadow:0 8px 30px #173c2804}.auth-layout{display:grid;grid-template-columns:1.1fr 1fr;gap:90px;align-items:center;padding:22px 45px}.intro h1{font-size:46px;line-height:1.3;margin-bottom:22px}.intro>p{font-size:15px}.intro .eyebrow{font-size:11px}.auth-panel{padding:40px}.auth-panel h2{font-size:28px;margin-bottom:8px}.clock-illustration{margin:32px 0;max-width:290px;padding:22px 26px 10px;background:#1c3c33;color:#eef1d4;border:8px solid #c8d3c3;border-radius:28px;transform:rotate(-3deg);box-shadow:10px 18px 25px #18362e15}.clock-illustration .tiny{font-size:8px;letter-spacing:3px;display:block;color:#b2c6a4}.clock-illustration strong{font:60px/1.5 ui-monospace,monospace;letter-spacing:-4px}.clock-illustration strong span{opacity:.5}.clock-line{display:flex;justify-content:space-between;font-size:10px}.clock-dots{text-align:center;font-size:6px;letter-spacing:8px;margin-top:15px;color:#8da890}label{display:block;font-size:13px;font-weight:600;margin:22px 0 6px}input,select{display:block;width:100%;border:1px solid #d8e1d9;background:#fff;border-radius:9px;padding:11px 13px;color:var(--ink);margin-top:7px;min-height:46px;min-width:0}input:focus,select:focus{outline:2px solid #c3d9ca;border-color:var(--teal)}input[readonly]{background:#f4f6f3;color:var(--muted)}.button{border:1px solid var(--teal);background:var(--teal);color:#fff;border-radius:9px;padding:11px 21px;font-weight:550;display:inline-flex;align-items:center;justify-content:center;gap:16px;min-height:46px;font-size:14px}.button:hover{text-decoration:none;filter:brightness(.96)}.wide{display:flex;justify-content:space-between;width:100%;margin-top:27px}.secondary{background:#f5f8f3;color:var(--teal);border-color:#d9e3d6}.small{min-height:36px;padding:6px 14px;font-size:12px}.danger{background:var(--red);border-color:var(--red)}.danger-outline{color:var(--red);border-color:#ddc2b8;background:#fff}.hint{font-size:12px;color:var(--muted);margin:8px 0 20px}.auth-switch{font-size:13px;text-align:center;color:var(--muted);margin:26px 0 0}.notice{padding:16px 20px;border-radius:10px;background:#f2f5ed;font-size:13px;margin:24px 0}.notice p{margin:4px 0 0}.notice.error{background:#fcf0eb;color:#973f31}.notice.success{background:#e4f0e5;color:#28613c;margin-top:0}.page-heading{display:flex;justify-content:space-between;align-items:center;gap:20px;margin-bottom:32px}.page-heading p:last-child{margin-bottom:0}.count-pill,.badge{display:inline-block;background:var(--teal-light);color:var(--teal);font-size:12px;border-radius:20px;padding:5px 12px;white-space:nowrap}.count-pill{background:#e6ece2;padding:9px 17px}.badge.off{color:#866356;background:#f6ebe5}.empty{text-align:center;padding:70px 24px}.empty p{color:var(--muted)}.empty-icon{margin:auto auto 24px;border-radius:22px;background:#edf3e8;color:var(--teal);font-size:48px;width:85px}.device-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:22px}.device-card{padding:26px}.card-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:26px}.device-icon{font-size:30px;color:var(--teal)}.device-card h2{overflow-wrap:anywhere;margin-bottom:2px}dl{margin:24px 0;font-size:13px}dt{color:var(--muted)}dd{margin:2px 0 16px;overflow-wrap:anywhere}.settings-grid{display:grid;grid-template-columns:minmax(0,.85fr) minmax(0,1.15fr);gap:24px;align-items:start}.section-number{font-family:ui-monospace,monospace;color:#96aa9b;font-size:12px;margin-bottom:20px}.section-number span{margin-left:12px;font:600 18px -apple-system,sans-serif;color:var(--ink)}#map{height:360px;background:#eaf0e6;border-radius:13px;overflow:hidden;display:flex;align-items:center;justify-content:center}#map-status{padding:24px;text-align:center;color:var(--muted);font-size:14px;margin:0}.map-panel>p{font-size:13px}.coordinates{display:grid;grid-template-columns:1fr 1fr;gap:12px}.coordinates input{font-family:ui-monospace,monospace;font-size:13px}.back{display:inline-block;font-size:13px;margin-bottom:22px}.narrow{max-width:560px;margin:30px auto;padding:40px}.narrow h1{font-size:28px}.narrow .back{margin-top:24px}.device-id{font-size:22px;letter-spacing:2px}.search{display:flex;align-items:center;gap:12px;margin-bottom:24px}.search input{margin:0;max-width:440px}.table-panel{padding:0;overflow:hidden}.table-scroll{overflow:auto}table{border-collapse:collapse;width:100%;white-space:nowrap;text-align:left;font-size:13px}th{font-weight:500;color:var(--muted);background:#f8faf7;font-size:12px}td,th{padding:19px 24px;border-bottom:1px solid var(--line)}tr:last-child td{border-bottom:0}td small{display:block;color:var(--muted);max-width:230px;white-space:normal;overflow-wrap:anywhere}.empty-row{text-align:center;padding:50px}.pagination{margin-top:20px;justify-content:flex-end;color:var(--muted)}.action-panel{display:flex;justify-content:space-between;align-items:center;gap:25px;margin-top:24px}.action-panel p{margin:0;font-size:13px}.action-panel .back{margin:0 0 0 15px}.detail-list dd{font-size:15px}.detail-list dt{font-size:12px}footer{max-width:1184px;border-top:1px solid var(--line);margin:auto;padding:22px 32px;color:var(--muted);font-size:11px;display:flex;justify-content:space-between;letter-spacing:.4px}@media(max-width:1000px){.auth-layout{gap:40px;padding:0}.device-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:680px){.site-header{padding:20px;flex-wrap:wrap;gap:18px}.brand{font-size:18px}.site-header nav{gap:18px;font-size:12px;width:100%;justify-content:space-between}.container{padding:30px 20px 55px}.auth-layout{display:block}.intro{margin-bottom:28px}.intro h1{font-size:32px}.intro>p:not(.eyebrow),.clock-illustration{display:none}.intro h1 br{display:none}.panel,.auth-panel{padding:24px;border-radius:16px}.auth-panel h2{font-size:25px}h1{font-size:28px}.device-grid,.settings-grid{grid-template-columns:1fr}.page-heading{align-items:flex-start;margin-bottom:24px}.page-heading>.badge{display:none}.count-pill{font-size:11px;padding:6px 10px}.empty{padding:45px 20px}.empty h2{font-size:19px}.table-panel{padding:0}.action-panel{align-items:stretch;flex-direction:column}.search{flex-wrap:wrap}.search input{flex:1;min-width:180px}#map{height:300px}.narrow{margin:10px auto}.coordinates{gap:8px}.coordinates input{padding:9px 8px;font-size:12px}footer{padding:20px}.intro .eyebrow{margin-bottom:12px}}

/* MapLibre manages its canvas and absolutely positioned controls. */
#map{display:block;position:relative}#map-status[hidden]{display:none}.maplibregl-ctrl-attrib{max-width:100%;font-size:10px;line-height:16px}.maplibregl-ctrl-attrib a{color:#333}.maplibregl-ctrl button{min-height:0}.maplibregl-marker:focus-visible{outline:3px solid #266b56;outline-offset:3px}
