{"id":6,"date":"2026-11-01T18:58:54","date_gmt":"2026-11-01T17:58:54","guid":{"rendered":"https:\/\/www.dronmetrie.cz\/?page_id=6"},"modified":"2026-11-01T19:01:32","modified_gmt":"2026-11-01T18:01:32","slug":"6-2","status":"publish","type":"page","link":"https:\/\/www.dronmetrie.cz\/?page_id=6","title":{"rendered":""},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"cs\">\n<head>\n<meta charset=\"UTF-8\">\n<title>DRONMETRIE \u2014 kalkulace n\u00e1letu<\/title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Space+Grotesk:wght@500;600;700&#038;family=Inter:wght@400;500;600&#038;family=JetBrains+Mono:wght@400;500;700&#038;display=swap\" rel=\"stylesheet\">\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\">\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\n<script src=\"https:\/\/unpkg.com\/@turf\/turf@6\/turf.min.js\"><\/script>\n<script src=\"zones_data.js\"><\/script>\n<style>\n  :root{\n    --bg:#0A0E13; --panel:#121820; --panel-2:#1A222C; --border:#262F3B;\n    --text:#E7ECF2; --text-dim:#8592A3;\n    --signal:#FF7A21;\n    --mapovani:#34C9B0; --agro:#9FB53E; --inspekce:#E8543A; --termo:#FF4B4B; --lidar:#8B7FFF;\n    --active-accent:var(--mapovani);\n    --c-blue:#3B9EFF; --c-pink:#E85DA8; --c-purple:#9B6BFF; --c-brown:#C48A5A; --c-red:#FF4B4B; --c-yellow:#F2C94C;\n  }\n  *{box-sizing:border-box;}\n  html,body{margin:0;height:100%;background:var(--bg);color:var(--text);font-family:'Inter',sans-serif;-webkit-font-smoothing:antialiased;}\n  .app{display:flex;flex-direction:column;height:100vh;min-height:640px;}\n\n  .topbar{display:flex;align-items:center;gap:24px;padding:0 20px;height:64px;flex-shrink:0;background:var(--panel);border-bottom:1px solid var(--border);position:relative;z-index:2000;}\n  .logo{font-family:'Space Grotesk',sans-serif;font-weight:700;font-size:19px;letter-spacing:.02em;display:flex;align-items:center;gap:8px;}\n  .logo .mark{display:flex;flex-shrink:0;}\n  .tabs{display:flex;gap:4px;flex:1;flex-wrap:wrap;}\n  .tab{font-family:'Space Grotesk',sans-serif;font-weight:600;font-size:13.5px;color:var(--text-dim);background:transparent;border:1px solid transparent;padding:9px 14px;border-radius:7px;cursor:pointer;transition:all .15s ease;}\n  .tab:hover{color:var(--text);background:var(--panel-2);}\n  .tab.active{color:var(--bg);background:var(--active-accent);}\n  .tab:disabled{opacity:.4;cursor:not-allowed;}\n  .tab:disabled:hover{color:var(--text-dim);background:transparent;}\n  .tab-soon{margin-left:6px;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;background:var(--panel-2);border:1px solid var(--border);color:var(--text-dim);padding:2px 5px;border-radius:4px;vertical-align:1px;}\n  .header-right{display:flex;align-items:center;gap:14px;flex-shrink:0;}\n  .bm-toggle{display:flex;gap:3px;background:var(--panel-2);border:1px solid var(--border);border-radius:8px;padding:3px;flex-shrink:0;}\n  .bm-chip{font-family:'Space Grotesk',sans-serif;font-weight:600;font-size:12px;color:var(--text-dim);background:transparent;border:none;padding:7px 13px;border-radius:6px;cursor:pointer;transition:.15s;}\n  .bm-chip:hover{color:var(--text);}\n  .bm-chip.active{background:var(--active-accent);color:var(--bg);}\n  .header-search{position:relative;width:230px;flex-shrink:0;}\n\n  .contact-widget{position:relative;flex-shrink:0;}\n  .contact-toggle{display:flex;align-items:center;gap:6px;background:var(--panel-2);border:1px solid var(--border);color:var(--text-dim);font-family:'Space Grotesk',sans-serif;font-weight:600;font-size:12.5px;padding:8px 13px;border-radius:8px;cursor:pointer;transition:.15s;}\n  .contact-toggle:hover{color:var(--text);border-color:var(--active-accent);}\n  .contact-popover{position:absolute;top:calc(100% + 8px);left:0;background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:14px 16px;width:230px;box-shadow:0 10px 28px rgba(0,0,0,.4);display:none;z-index:2500;}\n  .contact-popover.show{display:block;}\n  .contact-row{display:flex;flex-direction:column;gap:2px;margin-bottom:10px;}\n  .contact-row:last-child{margin-bottom:0;}\n  .contact-label{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);}\n  .contact-row a{color:var(--text);font-family:'JetBrains Mono',monospace;font-size:13px;text-decoration:none;}\n  .contact-row a:hover{color:var(--active-accent);}\n\n  .vm-opt{display:flex;gap:6px;flex-wrap:wrap;}\n  .vm-btn{display:flex;align-items:center;gap:7px;font-family:'Space Grotesk',sans-serif;font-size:12.5px;font-weight:600;color:var(--text-dim);background:var(--panel-2);border:1px solid var(--border);padding:6px 12px;border-radius:8px;cursor:pointer;transition:all .15s;}\n  .vm-btn:hover{border-color:var(--active-accent);}\n  .vm-btn .box{width:14px;height:14px;border-radius:4px;border:1.5px solid var(--text-dim);flex-shrink:0;display:flex;align-items:center;justify-content:center;transition:all .15s;}\n  .vm-btn.active{color:var(--text);border-color:var(--active-accent);background:var(--panel);}\n  .vm-btn.active .box{background:var(--active-accent);border-color:var(--active-accent);}\n  .vm-btn.active .box::after{content:\"\u2713\";font-size:10px;color:var(--bg);font-weight:700;}\n  .vm-btn.locked{cursor:default;opacity:.85;}\n\n  .workspace{display:flex;flex:1;min-height:0;}\n  .map-panel{flex:1;position:relative;overflow:hidden;background:#0d1a16;}\n  #map{position:absolute;inset:0;width:100%;height:100%;cursor:crosshair;background:#0d1a16;}\n  .map-hint{position:absolute;top:16px;left:16px;z-index:1000;background:rgba(18,24,32,.85);border:1px solid var(--border);border-radius:8px;padding:10px 14px;font-size:12.5px;color:var(--text-dim);max-width:280px;line-height:1.5;backdrop-filter:blur(4px);}\n  .map-hint b{color:var(--text);}\n  .map-hint.muted{opacity:.55;}\n\n  .map-top-right{position:absolute;top:16px;right:16px;z-index:1000;display:flex;flex-direction:column;align-items:flex-end;gap:8px;width:260px;}\n  .search-box{display:flex;align-items:center;background:var(--panel);border:1px solid var(--border);border-radius:8px;box-shadow:0 4px 16px rgba(0,0,0,.35);}\n  .search-box input{flex:1;min-width:0;background:transparent;border:none;color:var(--text);font-family:'Inter',sans-serif;font-size:13px;padding:10px 4px 10px 12px;outline:none;}\n  .search-box button{background:transparent;border:none;color:var(--text-dim);cursor:pointer;font-size:14px;padding:8px 11px;flex-shrink:0;}\n  .search-box button:hover{color:var(--active-accent);}\n  .search-results{position:absolute;top:calc(100% + 6px);left:0;right:0;background:var(--panel);border:1px solid var(--border);border-radius:8px;overflow-y:auto;max-height:240px;box-shadow:0 8px 24px rgba(0,0,0,.4);display:none;}\n  .search-result-item{padding:9px 12px;font-size:12.5px;color:var(--text);cursor:pointer;border-bottom:1px solid var(--border);line-height:1.4;}\n  .search-result-item:last-child{border-bottom:none;}\n  .search-result-item:hover{background:var(--panel-2);}\n  .search-empty{padding:10px 12px;font-size:12px;color:var(--text-dim);}\n\n  .map-controls{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;}\n  .map-btn{font-family:'Space Grotesk',sans-serif;font-weight:600;font-size:12.5px;background:var(--panel);border:1px solid var(--border);color:var(--text);padding:8px 13px;border-radius:7px;cursor:pointer;transition:.15s;}\n  .map-btn:hover{border-color:var(--active-accent);color:var(--active-accent);}\n  .map-btn.primary{background:var(--signal);border-color:var(--signal);color:#1a0e04;}\n  .map-btn.primary:hover{filter:brightness(1.08);color:#1a0e04;}\n  .map-btn:disabled{opacity:.4;cursor:not-allowed;}\n  .map-btn:disabled:hover{border-color:var(--border);color:var(--text);}\n\n  .zone-legend{background:rgba(18,24,32,.92);border:1px solid var(--border);border-radius:8px;padding:10px 12px;font-size:11.5px;color:var(--text-dim);display:none;flex-direction:column;gap:6px;width:100%;backdrop-filter:blur(4px);}\n  .zone-legend.show{display:flex;}\n  .zone-legend-item{display:flex;align-items:center;gap:8px;line-height:1.3;}\n  .zone-legend-swatch{width:11px;height:11px;border-radius:3px;flex-shrink:0;}\n\n  .hud{position:absolute;bottom:16px;right:16px;z-index:900;text-align:right;pointer-events:none;font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--text-dim);background:rgba(18,24,32,.85);padding:8px 12px;border-radius:8px;border:1px solid var(--border);backdrop-filter:blur(4px);}\n  .hud .live{color:var(--active-accent);}\n\n  .leaflet-control-attribution{background:rgba(18,24,32,.75)!important;color:var(--text-dim)!important;font-size:10.5px!important;border-radius:6px!important;box-shadow:none!important;}\n  .leaflet-control-attribution a{color:var(--text-dim)!important;}\n  .leaflet-control-scale-line{background:rgba(18,24,32,.75)!important;color:var(--text-dim)!important;border-color:var(--text-dim)!important;font-family:'JetBrains Mono',monospace!important;font-size:11px!important;}\n\n  .sidebar{width:340px;flex-shrink:0;background:var(--panel);border-left:1px solid var(--border);display:flex;flex-direction:column;overflow-y:auto;}\n  .block{padding:17px 20px;border-bottom:1px solid var(--border);border-left:3px solid transparent;}\n  .block.acc-blue{border-left-color:var(--c-blue);}\n  .block.acc-pink{border-left-color:var(--c-pink);}\n  .block.acc-purple{border-left-color:var(--c-purple);}\n  .block.acc-brown{border-left-color:var(--c-brown);}\n  .block h3{margin:0 0 12px;font-family:'Space Grotesk',sans-serif;font-size:12px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim);font-weight:600;}\n  .block h4{margin:16px 0 10px;font-family:'Space Grotesk',sans-serif;font-size:11px;text-transform:uppercase;letter-spacing:.07em;color:var(--text-dim);font-weight:600;padding-top:14px;border-top:1px dashed var(--border);}\n  .block h4:first-of-type{padding-top:0;border-top:none;margin-top:0;}\n  .field-label{display:block;font-size:12px;color:var(--text-dim);margin:0 0 6px;}\n  .field-label:not(:first-child){margin-top:12px;}\n  select, input[type=number]{\n    width:100%;background:var(--panel-2);border:1px solid var(--border);color:var(--text);\n    border-radius:7px;padding:9px 11px;font-family:'Inter',sans-serif;font-size:13px;outline:none;transition:border-color .15s;\n  }\n  select:focus, input[type=number]:focus{border-color:var(--active-accent);}\n  .hint-small{font-size:12px;color:var(--text-dim);line-height:1.5;}\n  .hint-small a{color:var(--active-accent);text-decoration:none;}\n  .hint-small a:hover{text-decoration:underline;}\n\n  .price-table{width:100%;border-collapse:collapse;margin-top:16px;font-size:12.5px;}\n  .price-table th{text-align:left;font-family:'Space Grotesk',sans-serif;font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);padding:8px 10px;border-bottom:1px solid var(--border);}\n  .price-table th:last-child{text-align:right;}\n  .price-table td{padding:10px;border-bottom:1px solid var(--border);color:var(--text);line-height:1.4;}\n  .price-table td:last-child{font-family:'JetBrains Mono',monospace;white-space:nowrap;text-align:right;color:var(--active-accent);font-weight:600;}\n  .price-table tr:last-child td{border-bottom:none;}\n  .cfg{display:none;}\n  .cfg.show{display:block;}\n\n  .includes-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px;}\n  .includes-list li{display:flex;align-items:center;gap:9px;font-size:13.5px;color:var(--text);}\n  .includes-list li::before{content:\"\";width:6px;height:6px;border-radius:50%;background:var(--active-accent);flex-shrink:0;}\n  .row{display:flex;justify-content:space-between;align-items:baseline;margin-top:14px;padding-top:14px;border-top:1px dashed var(--border);}\n  .row .label{font-size:13px;color:var(--text-dim);}\n  .row .value{font-family:'JetBrains Mono',monospace;font-size:15px;font-weight:500;color:var(--text);}\n\n  .price-lines{display:flex;flex-direction:column;gap:9px;}\n  .pline{display:flex;justify-content:space-between;gap:10px;font-size:12.5px;color:var(--text-dim);}\n  .pline span:first-child{flex:1;}\n  .pline .amt{font-family:'JetBrains Mono',monospace;color:var(--text);white-space:nowrap;}\n  .pline.sub{border-top:1px solid var(--border);margin-top:6px;padding-top:9px;color:var(--text);font-weight:500;}\n  .pline.disc .amt{color:var(--mapovani);}\n  .empty-note{font-size:12.5px;color:var(--text-dim);}\n\n  .discount-row{display:flex;gap:8px;margin-top:4px;}\n  .discount-row input{flex:1;font-family:'JetBrains Mono',monospace;}\n  .discount-row button{font-family:'Space Grotesk',sans-serif;font-weight:600;font-size:12.5px;background:var(--panel-2);border:1px solid var(--border);color:var(--text);padding:0 15px;border-radius:7px;cursor:pointer;transition:.15s;}\n  .discount-row button:hover{border-color:var(--active-accent);color:var(--active-accent);}\n  .discount-msg{font-size:12px;margin-top:8px;min-height:14px;}\n  .discount-msg.ok{color:var(--mapovani);} .discount-msg.err{color:var(--termo);}\n\n  .zone-banner{display:none;background:rgba(255,75,75,.12);border:1px solid var(--termo);color:var(--termo);border-radius:8px;padding:10px 12px;font-size:12px;line-height:1.5;font-weight:500;margin-bottom:10px;}\n  @keyframes pulseDim{0%,100%{opacity:.55;}50%{opacity:1;}}\n  .zone-checking{font-size:12px;color:var(--text-dim);font-style:italic;animation:pulseDim 1.3s ease-in-out infinite;}\n  .order-btn:disabled{background:var(--panel-2);border:1px solid var(--border);color:var(--text-dim);cursor:not-allowed;}\n  .order-btn:disabled:hover{filter:none;}\n  .call-cta{display:flex;align-items:center;justify-content:center;gap:6px;margin-top:10px;font-size:12.5px;color:var(--text-dim);text-decoration:none;text-align:center;}\n  .call-cta:hover{color:var(--active-accent);}\n  .call-cta b{color:var(--text);font-family:'JetBrains Mono',monospace;font-weight:500;}\n\n  .discount-amount-block{padding-top:2px;}\n  .discount-amount-block .damt{font-family:'JetBrains Mono',monospace;font-size:22px;font-weight:600;color:var(--c-brown);}\n  .discount-amount-block .dnote{font-size:12px;color:var(--text-dim);margin-top:4px;}\n\n  .final-block{margin-top:auto;padding:20px 20px 16px;background:var(--panel-2);border-left:3px solid var(--c-red);}\n  .final-block .label{font-family:'Space Grotesk',sans-serif;font-size:12px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim);}\n  .final-block .amount{font-family:'JetBrains Mono',monospace;font-size:32px;font-weight:700;color:var(--c-red);margin-top:6px;letter-spacing:-0.01em;}\n  .final-block .amount small{font-size:15px;font-weight:500;color:var(--text-dim);}\n  .order-block{padding:16px 20px;background:var(--panel-2);border-left:3px solid var(--c-yellow);border-top:1px solid var(--border);}\n  .order-btn{width:100%;padding:13px 0;border:none;border-radius:9px;background:var(--c-yellow);color:#241e05;font-family:'Space Grotesk',sans-serif;font-weight:700;font-size:14px;cursor:pointer;transition:filter .15s;}\n  .order-btn:hover{filter:brightness(1.06);}\n  .disclaimer{padding:10px 20px 18px;background:var(--panel-2);font-size:10.5px;line-height:1.5;color:#5b6675;}\n\n  .footer-bar{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:16px;padding:8px 20px;background:var(--panel);border-top:1px solid var(--border);font-size:11px;color:var(--text-dim);flex-shrink:0;}\n  .footer-nav{display:flex;gap:18px;flex-wrap:wrap;justify-content:center;}\n  .footer-links{display:flex;gap:18px;flex-wrap:wrap;justify-content:flex-end;}\n  .footer-bar a{color:var(--text-dim);text-decoration:none;cursor:pointer;white-space:nowrap;}\n  .footer-bar a:hover{color:var(--text);text-decoration:underline;}\n\n  .legal-modal .modal-card{max-width:560px;}\n  .legal-modal h4{margin:18px 0 6px;font-family:'Space Grotesk',sans-serif;font-size:13px;color:var(--text);}\n  .legal-modal h4:first-of-type{margin-top:4px;}\n  .legal-modal p{margin:0 0 10px;font-size:12.5px;line-height:1.6;color:var(--text-dim);}\n  .legal-modal .draft-note{background:rgba(255,122,33,.12);border:1px solid var(--signal);color:var(--signal);border-radius:8px;padding:10px 12px;font-size:11.5px;line-height:1.5;margin-bottom:16px;}\n\n  ::-webkit-scrollbar{width:8px;}\n  ::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px;}\n\n  html,body{overflow-x:hidden;}\n\n  @media (max-width: 860px){\n    .topbar{flex-wrap:wrap;height:auto;padding:10px 16px;row-gap:8px;}\n    .logo{order:1;}\n    .header-right{order:2;margin-left:auto;flex-wrap:wrap;justify-content:flex-end;}\n    .header-search{width:auto;flex:1 1 160px;min-width:140px;}\n    .tabs{order:3;flex:1 1 100%;width:100%;}\n\n    .workspace{flex-direction:column;}\n    .map-panel{flex:0 0 auto;height:48vh;min-height:280px;}\n    .sidebar{width:100%;flex:1 1 auto;min-height:0;border-left:none;border-top:1px solid var(--border);}\n\n    .map-top-right{width:auto;max-width:calc(100% - 32px);}\n    .map-hint{max-width:calc(100% - 32px);}\n  }\n\n  @media (max-width: 480px){\n    .header-right{width:100%;margin-left:0;}\n    .header-search{flex:1 1 100%;width:100%;}\n    .map-controls{width:100%;}\n    .map-controls .map-btn{flex:1;}\n    .footer-bar{grid-template-columns:1fr;justify-items:center;text-align:center;}\n    .footer-nav,.footer-links{justify-content:center;}\n  }\n\n  .wide-modal .modal-card{max-width:720px;}\n\n  .about-stats{display:flex;gap:32px;flex-wrap:wrap;margin-top:6px;}\n  .about-stat{display:flex;flex-direction:column;gap:2px;}\n  .about-stat b{font-family:'JetBrains Mono',monospace;font-size:22px;color:var(--text);}\n  .about-stat span{font-size:12px;color:var(--text-dim);}\n\n  .portfolio-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:14px;margin:6px 0 16px;}\n  .portfolio-card{background:var(--bg);border:1px solid var(--border);border-radius:12px;overflow:hidden;text-align:center;}\n  .portfolio-photo{width:100%;height:140px;object-fit:contain;background:var(--bg);display:block;cursor:zoom-in;}\n\n  .lightbox-overlay{position:fixed;inset:0;background:rgba(5,7,10,.92);display:none;align-items:center;justify-content:center;z-index:6000;padding:28px;cursor:zoom-out;}\n  .lightbox-overlay.show{display:flex;}\n  .lightbox-overlay img{max-width:100%;max-height:100%;object-fit:contain;border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,.6);}\n  .lightbox-close{position:fixed;top:18px;right:22px;background:rgba(18,24,32,.9);border:1px solid var(--border);color:var(--text);font-size:18px;line-height:1;padding:8px 12px;border-radius:8px;cursor:pointer;z-index:6001;}\n  .lightbox-close:hover{color:var(--active-accent);}\n  .portfolio-card .portfolio-body{padding:12px 14px 16px;}\n  .portfolio-card h4{margin:0 0 6px;font-family:'Space Grotesk',sans-serif;font-size:12.5px;color:var(--text);}\n  .portfolio-card p{margin:0;font-size:11px;line-height:1.45;color:var(--text-dim);}\n\n  .reviews-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px;margin:6px 0 16px;}\n  .review-card{background:var(--bg);border:1px solid var(--border);border-radius:12px;padding:18px;}\n  .review-card p{margin:0 0 12px;font-size:12.5px;line-height:1.6;color:var(--text);font-style:italic;}\n  .review-author{font-size:11.5px;color:var(--text-dim);}\n\n  .faq-list{display:flex;flex-direction:column;gap:9px;margin-top:4px;}\n  .faq-item{background:var(--bg);border:1px solid var(--border);border-radius:10px;padding:13px 15px;}\n  .faq-item summary{cursor:pointer;font-family:'Space Grotesk',sans-serif;font-weight:600;font-size:13px;color:var(--text);list-style:none;}\n  .faq-item summary::-webkit-details-marker{display:none;}\n  .faq-item summary::after{content:'+';float:right;color:var(--active-accent);font-weight:700;}\n  .faq-item[open] summary::after{content:'\u2212';}\n  .faq-item p{margin:10px 0 0;font-size:12.5px;line-height:1.6;color:var(--text-dim);}\n\n  .modal-overlay{position:fixed;inset:0;background:rgba(5,7,10,.65);backdrop-filter:blur(3px);display:none;align-items:center;justify-content:center;z-index:5000;padding:20px;}\n  .modal-overlay.show{display:flex;}\n  .modal-card{background:var(--panel);border:1px solid var(--border);border-radius:14px;padding:26px 28px 22px;width:100%;max-width:420px;max-height:90vh;overflow-y:auto;position:relative;box-shadow:0 20px 60px rgba(0,0,0,.5);}\n  .modal-close{position:absolute;top:14px;right:14px;background:transparent;border:none;color:var(--text-dim);font-size:16px;line-height:1;cursor:pointer;padding:6px 9px;border-radius:6px;}\n  .modal-close:hover{color:var(--text);background:var(--panel-2);}\n  .modal-card h3{margin:0 0 6px;font-family:'Space Grotesk',sans-serif;font-size:18px;color:var(--text);}\n  .modal-sub{margin:0 0 18px;font-size:12.5px;color:var(--text-dim);line-height:1.5;}\n  .modal-card form{display:flex;flex-direction:column;}\n  .modal-card .field-label{margin-top:14px;}\n  .modal-card .field-label:first-child{margin-top:0;}\n  .modal-card input[type=text],.modal-card input[type=email],.modal-card input[type=tel],.modal-card textarea{\n    width:100%;background:var(--panel-2);border:1px solid var(--border);color:var(--text);\n    border-radius:7px;padding:10px 12px;font-family:'Inter',sans-serif;font-size:13.5px;outline:none;resize:vertical;\n  }\n  .modal-card textarea{min-height:90px;}\n  .modal-card input:focus,.modal-card textarea:focus{border-color:var(--signal);}\n  .modal-checkbox{display:flex;align-items:flex-start;gap:9px;margin-top:16px;font-size:12.5px;color:var(--text-dim);line-height:1.5;cursor:pointer;}\n  .modal-checkbox input{margin-top:2px;width:15px;height:15px;flex-shrink:0;accent-color:var(--signal);}\n  .modal-submit{margin-top:18px;width:100%;padding:13px 0;border:none;border-radius:9px;background:var(--signal);color:#1a0e04;font-family:'Space Grotesk',sans-serif;font-weight:700;font-size:14px;cursor:pointer;transition:filter .15s;}\n  .modal-submit:hover{filter:brightness(1.08);}\n  .modal-submit:disabled{opacity:.6;cursor:default;}\n  .modal-note{text-align:center;font-size:11.5px;color:var(--text-dim);margin-top:10px;}\n  .modal-status{text-align:center;font-size:12.5px;margin-top:10px;min-height:16px;line-height:1.5;}\n  .modal-status.ok{color:var(--mapovani);}\n  .modal-status.err{color:var(--termo);}\n<\/style>\n<\/head>\n<body>\n<div class=\"app\" id=\"top\">\n\n  <header class=\"topbar\">\n    <div class=\"logo\">\n      <svg class=\"mark\" width=\"26\" height=\"26\" viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\">\n        <line x1=\"10\" y1=\"8\" x2=\"10\" y2=\"56\" stroke=\"var(--text-dim)\" stroke-width=\"4\"\/>\n        <line x1=\"10\" y1=\"16\" x2=\"15\" y2=\"16\" stroke=\"var(--text-dim)\" stroke-width=\"4\"\/>\n        <line x1=\"10\" y1=\"28\" x2=\"16\" y2=\"28\" stroke=\"var(--text-dim)\" stroke-width=\"4\"\/>\n        <line x1=\"10\" y1=\"40\" x2=\"15\" y2=\"40\" stroke=\"var(--text-dim)\" stroke-width=\"4\"\/>\n        <line x1=\"10\" y1=\"52\" x2=\"16\" y2=\"52\" stroke=\"var(--text-dim)\" stroke-width=\"4\"\/>\n        <line x1=\"44\" y1=\"32\" x2=\"29\" y2=\"18\" stroke=\"var(--text-dim)\" stroke-width=\"4\"\/>\n        <line x1=\"44\" y1=\"32\" x2=\"57\" y2=\"18\" stroke=\"var(--text-dim)\" stroke-width=\"4\"\/>\n        <line x1=\"44\" y1=\"32\" x2=\"29\" y2=\"46\" stroke=\"var(--text-dim)\" stroke-width=\"4\"\/>\n        <line x1=\"44\" y1=\"32\" x2=\"57\" y2=\"46\" stroke=\"var(--text-dim)\" stroke-width=\"4\"\/>\n        <circle cx=\"29\" cy=\"18\" r=\"6\" stroke=\"var(--text-dim)\" stroke-width=\"4\"\/>\n        <circle cx=\"57\" cy=\"18\" r=\"6\" stroke=\"var(--text-dim)\" stroke-width=\"4\"\/>\n        <circle cx=\"29\" cy=\"46\" r=\"6\" stroke=\"var(--text-dim)\" stroke-width=\"4\"\/>\n        <circle cx=\"57\" cy=\"46\" r=\"6\" stroke=\"var(--text-dim)\" stroke-width=\"4\"\/>\n        <rect x=\"40\" y=\"28\" width=\"8\" height=\"8\" rx=\"2\" fill=\"var(--signal)\"\/>\n      <\/svg>\n      DRONMETRIE\n    <\/div>\n    <div class=\"contact-widget\">\n      <button class=\"contact-toggle\" id=\"contactToggle\" type=\"button\">\ud83d\udcde Kontakt<\/button>\n      <div class=\"contact-popover\" id=\"contactPopover\">\n        <div class=\"contact-row\">\n          <span class=\"contact-label\">Telefon<\/span>\n          <a href=\"tel:+420776527672\">+420 776 527 672<\/a>\n        <\/div>\n        <div class=\"contact-row\">\n          <span class=\"contact-label\">E-mail<\/span>\n          <a href=\"mailto:info@flexi-trade.cz\">info@flexi-trade.cz<\/a>\n        <\/div>\n      <\/div>\n    <\/div>\n    <nav class=\"tabs\">\n      <button class=\"tab active\" data-tab=\"mapovani\">Mapov\u00e1n\u00ed<\/button>\n      <button class=\"tab\" data-tab=\"agro\">Agro<\/button>\n      <button class=\"tab\" data-tab=\"inspekce\">Inspekce<\/button>\n      <button class=\"tab\" data-tab=\"termo\">Termovize<\/button>\n      <button class=\"tab\" data-tab=\"lidar\">3D sken (LIDAR)<span class=\"tab-soon\">p\u0159edobjedn\u00e1vky<\/span><\/button>\n    <\/nav>\n    <div class=\"header-right\">\n      <div class=\"bm-toggle\">\n        <button class=\"bm-chip active\" id=\"layerOsmBtn\" type=\"button\">Z\u00e1kladn\u00ed<\/button>\n        <button class=\"bm-chip\" id=\"layerSatBtn\" type=\"button\">Satelitn\u00ed<\/button>\n      <\/div>\n      <button class=\"bm-chip\" id=\"zonesToggleBtn\" type=\"button\" title=\"Zobrazit ochrann\u00e1 p\u00e1sma a z\u00f3ny (leti\u0161t\u011b, silnice, chr\u00e1n\u011bn\u00e1 \u00fazem\u00ed\u2026) na map\u011b\">Z\u00f3ny na map\u011b<\/button>\n      <div class=\"header-search\">\n        <div class=\"search-box\">\n          <input type=\"text\" id=\"searchInput\" placeholder=\"Hledat adresu nebo m\u00edsto\u2026\" autocomplete=\"off\">\n          <button id=\"searchBtn\" title=\"Hledat\">\ud83d\udd0d<\/button>\n        <\/div>\n        <div class=\"search-results\" id=\"searchResults\"><\/div>\n      <\/div>\n    <\/div>\n  <\/header>\n\n  <main class=\"workspace\">\n    <section class=\"map-panel\">\n      <div id=\"map\"><\/div>\n      <div class=\"map-hint\" id=\"mapHint\">Klik\u00e1n\u00edm vyzna\u010d hranici pozemku \/ haly. <b>Dokon\u010dit oblast<\/b> uzav\u0159e polygon a spo\u010d\u00edt\u00e1 plochu \u2014 pak m\u016f\u017ee\u0161 nakreslit dal\u0161\u00ed samostatn\u00fd objekt. Vrcholy jde po dokon\u010den\u00ed p\u0159et\u00e1hnout my\u0161\u00ed, kliknut\u00edm na &#8222;+&#8220; uprost\u0159ed hrany p\u0159id\u00e1\u0161 nov\u00fd bod.<\/div>\n\n      <div class=\"map-top-right\">\n        <div class=\"map-controls\">\n          <button class=\"map-btn\" id=\"undoBtn\" disabled>Zp\u011bt o bod<\/button>\n          <button class=\"map-btn\" id=\"clearBtn\">Smazat v\u00fdb\u011br<\/button>\n          <button class=\"map-btn primary\" id=\"finishBtn\">Dokon\u010dit oblast<\/button>\n        <\/div>\n        <div class=\"zone-legend\" id=\"zoneLegend\">\n          <div class=\"zone-legend-item\"><span class=\"zone-legend-swatch\" style=\"background:#3B9EFF\"><\/span>Leti\u0161t\u011b \/ \u0159\u00edzen\u00fd vzdu\u0161n\u00fd prostor<\/div>\n          <div class=\"zone-legend-item\"><span class=\"zone-legend-swatch\" style=\"background:#F2C94C\"><\/span>Silnice \/ d\u00e1lnice<\/div>\n          <div class=\"zone-legend-item\"><span class=\"zone-legend-swatch\" style=\"background:#9B6BFF\"><\/span>\u017deleznice<\/div>\n          <div class=\"zone-legend-item\"><span class=\"zone-legend-swatch\" style=\"background:#FF7A21\"><\/span>Elektrick\u00e1 stanice \/ veden\u00ed VN<\/div>\n          <div class=\"zone-legend-item\"><span class=\"zone-legend-swatch\" style=\"background:#E8543A\"><\/span>Chr\u00e1n\u011bn\u00e9 \u00fazem\u00ed \/ vojensk\u00fd objekt<\/div>\n          <div class=\"zone-legend-item\"><span class=\"zone-legend-swatch\" style=\"background:#FF4B4B\"><\/span>Zak\u00e1zan\u00e1 z\u00f3na (let bez v\u00fdjimky nemo\u017en\u00fd)<\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"hud\">\n        <div>SOU\u0158ADNICE&nbsp;&nbsp;<span class=\"live\" id=\"coordVal\">\u2014<\/span><\/div>\n        <div>BOD\u016e V\u00ddB\u011aRU&nbsp;&nbsp;<span id=\"ptCount\">0<\/span><\/div>\n      <\/div>\n    <\/section>\n\n    <aside class=\"sidebar\">\n\n      <div class=\"block acc-blue\">\n        <h3>V\u00fdb\u011br mo\u017enost\u00ed<\/h3>\n        <div class=\"field-label\" style=\"margin-top:0;\" id=\"vmFieldLabel\">V\u00fdstup: mapa, 3D, DTM\/DSM<\/div>\n        <div class=\"vm-opt\">\n          <button class=\"vm-btn active locked\" data-vm=\"mapa\" id=\"vmMapaBtn\" disabled><span class=\"box\"><\/span><span class=\"vm-label\">Mapa<\/span><\/button>\n          <button class=\"vm-btn\" data-vm=\"3d\" id=\"vm3dBtn\"><span class=\"box\"><\/span><span class=\"vm-label\">3D<\/span><\/button>\n          <button class=\"vm-btn\" data-vm=\"dtmdsm\" id=\"vmDtmBtn\"><span class=\"box\"><\/span><span class=\"vm-label\">DTM\/DSM<\/span><\/button>\n          <button class=\"vm-btn\" data-vm=\"bim\" id=\"vmBimBtn\"><span class=\"box\"><\/span><span class=\"vm-label\">BIM LOD 200<\/span><\/button>\n        <\/div>\n\n        <div class=\"cfg\" data-cfg=\"mapovani\" style=\"margin-top:14px;\">\n          <div class=\"hint-small\">Cena = p\u0159\u00edprava, povolen\u00ed, let + cena za ka\u017ed\u00fd zvolen\u00fd v\u00fdstup v\u00fd\u0161e (Mapa\/3D\/V\u00fd\u0161kov\u00fd model), degresivn\u011b dle plochy.<\/div>\n        <\/div>\n\n        <div class=\"cfg\" data-cfg=\"agro\" style=\"margin-top:14px;\">\n          <label class=\"field-label\">Rozli\u0161en\u00ed sn\u00edmkov\u00e1n\u00ed<\/label>\n          <select id=\"agroRes\"><\/select>\n          <label class=\"field-label\">Po\u010det n\u00e1let\u016f v roce<\/label>\n          <select id=\"agroFlights\"><\/select>\n          <div class=\"hint-small\" style=\"margin-top:10px;\">Sez\u00f3nn\u00ed sleva dle po\u010dtu n\u00e1let\u016f v roce.<\/div>\n        <\/div>\n\n        <div class=\"cfg\" data-cfg=\"inspekce\" style=\"margin-top:14px;\">\n          <label class=\"field-label\">Typ inspekce<\/label>\n          <select id=\"inspPackage\"><\/select>\n          <div id=\"inspHoursWrap\" style=\"display:none;\">\n            <label class=\"field-label\">Po\u010det hodin (min. 2)<\/label>\n            <input type=\"number\" id=\"inspHours\" min=\"2\" step=\"0.5\" value=\"2\">\n          <\/div>\n        <\/div>\n\n        <div class=\"cfg\" data-cfg=\"termo\" style=\"margin-top:14px;\">\n          <label class=\"field-label\">Typ objektu<\/label>\n          <select id=\"termoType\">\n            <option value=\"fve\">Fotovoltaick\u00e1 elektr\u00e1rna (FVE)<\/option>\n            <option value=\"budova\">Budova<\/option>\n          <\/select>\n          <div id=\"termoKwpWrap\">\n            <label class=\"field-label\">Instalovan\u00fd v\u00fdkon (kWp)<\/label>\n            <input type=\"number\" id=\"termoKwp\" min=\"0\" step=\"1\" value=\"30\">\n          <\/div>\n        <\/div>\n\n        <div class=\"cfg\" data-cfg=\"lidar\" style=\"margin-top:14px;\">\n          <label class=\"field-label\">Typ skenov\u00e1n\u00ed<\/label>\n          <select id=\"lidarType\">\n            <option value=\"interier\">Interi\u00e9r<\/option>\n            <option value=\"exterier\">Exteri\u00e9r<\/option>\n          <\/select>\n          <div class=\"hint-small\" style=\"margin-top:10px;\">Slu\u017eba je zat\u00edm v p\u0159edobjedn\u00e1vk\u00e1ch.<\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"block acc-pink\">\n        <h3>Co obsahuje &amp; cena<\/h3>\n        <ul class=\"includes-list\" id=\"includesList\"><\/ul>\n        <div class=\"row\" id=\"areaRow\"><span class=\"label\">Vybran\u00e1 plocha (kolik m\u00b2 je vybr\u00e1no)<\/span><span class=\"value\" id=\"areaVal\">0 m\u00b2<\/span><\/div>\n\n        <h4>Cena podle v\u00fdb\u011bru v\u00fd\u0161e<\/h4>\n        <div class=\"price-lines\" id=\"priceLines\"><\/div>\n\n        <div class=\"zone-banner\" id=\"zakazanoBanner\">\u26a0 Zakreslen\u00e1 oblast zasahuje do zak\u00e1zan\u00e9 z\u00f3ny (nap\u0159. ochrana jadern\u00e9 elektr\u00e1rny, vojensk\u00fd prostor). Let zde bez v\u00fdjimky \u00daCL nen\u00ed mo\u017en\u00fd \u2014 popt\u00e1vku pros\u00edm \u0159e\u0161te s n\u00e1mi individu\u00e1ln\u011b.<\/div>\n        <div class=\"zone-banner\" id=\"selfIntersectBanner\">\u26a0 Nakreslen\u00e1 oblast se sama prot\u00edn\u00e1 (hrany se k\u0159\u00ed\u017e\u00ed) \u2014 plocha ani cena proto nejsou spolehliv\u00e9. P\u0159et\u00e1hn\u011bte vrcholy do spr\u00e1vn\u00e9 polohy, nebo sma\u017ete v\u00fdb\u011br a nakreslete oblast znovu.<\/div>\n      <\/div>\n\n      <div class=\"block acc-purple\">\n        <h3>Slevov\u00fd k\u00f3d<\/h3>\n        <div class=\"discount-row\">\n          <input id=\"discountInput\" placeholder=\"nap\u0159. DRON10\" maxlength=\"16\">\n          <button id=\"applyDiscount\">Pou\u017e\u00edt<\/button>\n        <\/div>\n        <div class=\"discount-msg\" id=\"discountMsg\"><\/div>\n      <\/div>\n\n      <div class=\"block acc-brown\" id=\"discountBlock\" style=\"display:none;\">\n        <h3>Va\u0161e sleva<\/h3>\n        <div class=\"discount-amount-block\">\n          <div class=\"damt\" id=\"discountAmountVal\">0 K\u010d<\/div>\n          <div class=\"dnote\" id=\"discountAmountNote\"><\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"final-block\">\n        <div class=\"label\" id=\"finalPriceLabel\">V\u00fdsledn\u00e1 cena<\/div>\n        <div class=\"amount\" id=\"finalPrice\">0 <small>K\u010d<\/small><\/div>\n      <\/div>\n      <div class=\"order-block\">\n        <button class=\"order-btn\" id=\"orderBtn\">Odeslat nez\u00e1vaznou popt\u00e1vku<\/button>\n        <a class=\"call-cta\" href=\"tel:+420776527672\">nebo n\u00e1m rovnou zavolejte na <b>+420 776 527 672<\/b><\/a>\n      <\/div>\n      <div class=\"disclaimer\">Ceny jsou orienta\u010dn\u00ed a bez DPH. Doprava je zahrnut\u00e1 v cen\u011b v\u00fd\u0161e \u2014 zdarma do 50 km od Fr\u00fddku-M\u00edstku, nad tento limit 15 K\u010d\/km (tam i zp\u011bt) za vzd\u00e1lenost nad limitem. Nezahrnuje p\u0159\u00edpadn\u00e9 poplatky za povolen\u00ed letu.<\/div>\n\n    <\/aside>\n  <\/main>\n\n  <footer class=\"footer-bar\">\n    <span>\u00a9 2026 DRONMETRIE<\/span>\n    <nav class=\"footer-nav\">\n      <a href=\"#\" id=\"aboutLink\">O n\u00e1s<\/a>\n      <a href=\"#\" id=\"portfolioLink\">Uk\u00e1zky v\u00fdstup\u016f<\/a>\n      <a href=\"#\" id=\"referenceLink\">Reference<\/a>\n      <a href=\"#\" id=\"faqLink\">\u010cast\u00e9 dotazy<\/a>\n    <\/nav>\n    <div class=\"footer-links\">\n      <a href=\"#\" id=\"gdprLink\">Ochrana osobn\u00edch \u00fadaj\u016f (GDPR)<\/a>\n      <a href=\"#\" id=\"termsLink\">Obchodn\u00ed podm\u00ednky<\/a>\n    <\/div>\n  <\/footer>\n<\/div>\n\n<div class=\"modal-overlay legal-modal wide-modal\" id=\"aboutModal\">\n  <div class=\"modal-card\">\n    <button class=\"modal-close\" data-close-legal aria-label=\"Zav\u0159\u00edt\">\u2715<\/button>\n    <h3>O n\u00e1s<\/h3>\n    <p class=\"modal-sub\">DRONMETRIE poskytuje profesion\u00e1ln\u00ed leteck\u00e9 sn\u00edmkov\u00e1n\u00ed a zpracov\u00e1n\u00ed dat \u2014 od ortofotomap a 3D model\u016f p\u0159es multispektr\u00e1ln\u00ed agro sn\u00edmkov\u00e1n\u00ed a\u017e po termovizn\u00ed a stavebn\u00ed inspekce. Kalkula\u010dku pou\u017eijte pro okam\u017eit\u00fd orienta\u010dn\u00ed odhad ceny podle va\u0161eho z\u00e1kresu na map\u011b.<\/p>\n    <div class=\"about-stats\">\n      <div class=\"about-stat\"><b>5<\/b><span>let zku\u0161enost\u00ed<\/span><\/div>\n      <div class=\"about-stat\"><b>50+<\/b><span>dokon\u010den\u00fdch zak\u00e1zek<\/span><\/div>\n      <div class=\"about-stat\"><b>\u00daCL<\/b><span>registrovan\u00fd provoz dron\u016f<\/span><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div class=\"modal-overlay legal-modal wide-modal\" id=\"portfolioModal\">\n  <div class=\"modal-card\">\n    <button class=\"modal-close\" data-close-legal aria-label=\"Zav\u0159\u00edt\">\u2715<\/button>\n    <h3>Uk\u00e1zky v\u00fdstup\u016f<\/h3>\n    <p class=\"modal-sub\">Co dostanete na v\u00fdstupu podle zvolen\u00e9 slu\u017eby.<\/p>\n    <div class=\"portfolio-grid\">\n      <div class=\"portfolio-card\"><img decoding=\"async\" class=\"portfolio-photo\" src=\"media\/portfolio-mapovani.jpg\" alt=\"Uk\u00e1zka ortofotomapy\"><div class=\"portfolio-body\"><h4>Ortofotomapa<\/h4><p>P\u0159esn\u00e1 leteck\u00e1 mapa v S-JTSK, export GeoTIFF.<\/p><\/div><\/div>\n      <div class=\"portfolio-card\"><img decoding=\"async\" class=\"portfolio-photo\" src=\"media\/portfolio-vyskovy-model.jpg\" alt=\"Uk\u00e1zka v\u00fd\u0161kov\u00e9ho modelu ter\u00e9nu\"><div class=\"portfolio-body\"><h4>V\u00fd\u0161kov\u00fd model<\/h4><p>V\u00fd\u0161kov\u00fd TIFF a vrstevnice (DTM\/DSM).<\/p><\/div><\/div>\n      <div class=\"portfolio-card\"><img decoding=\"async\" class=\"portfolio-photo\" src=\"media\/portfolio-lidar.jpg\" alt=\"Uk\u00e1zka mra\u010dna bod\u016f z LIDAR skenu\"><div class=\"portfolio-body\"><h4>3D sken \/ LIDAR<\/h4><p>Mra\u010dno bod\u016f a mesh, export LAZ \/ OBJ.<\/p><\/div><\/div>\n      <div class=\"portfolio-card\"><img decoding=\"async\" class=\"portfolio-photo\" src=\"media\/portfolio-cad.jpg\" alt=\"Uk\u00e1zka CAD\/BIM v\u00fdkresu z LIDAR skenu\"><div class=\"portfolio-body\"><h4>CAD \/ BIM v\u00fdkresy<\/h4><p>2D v\u00fdkresy a BIM model jako p\u0159\u00edplatek k LIDAR skenu.<\/p><\/div><\/div>\n      <div class=\"portfolio-card\"><img decoding=\"async\" class=\"portfolio-photo\" src=\"media\/portfolio-agro.jpg\" alt=\"Uk\u00e1zka agro NDVI\/MSAVI sn\u00edmku\"><div class=\"portfolio-body\"><h4>Agro \/ NDVI<\/h4><p>Multispektr\u00e1ln\u00ed mapa stavu porostu pro podnik.<\/p><\/div><\/div>\n      <div class=\"portfolio-card\"><img decoding=\"async\" class=\"portfolio-photo\" src=\"media\/portfolio-zonalni.jpg\" alt=\"Uk\u00e1zka zon\u00e1ln\u00edch statistik pro agro\"><div class=\"portfolio-body\"><h4>Zon\u00e1ln\u00ed statistiky<\/h4><p>Mapa v\u00fdnosov\u00fdch z\u00f3n pro variabiln\u00ed aplikaci vstup\u016f.<\/p><\/div><\/div>\n      <div class=\"portfolio-card\"><img decoding=\"async\" class=\"portfolio-photo\" src=\"media\/portfolio-termovize.jpg\" alt=\"Uk\u00e1zka termosn\u00edmku FVE panel\u016f\"><div class=\"portfolio-body\"><h4>Termovize<\/h4><p>Teplotn\u00ed mapa FVE panel\u016f nebo pl\u00e1\u0161t\u011b budovy.<\/p><\/div><\/div>\n      <div class=\"portfolio-card\"><img decoding=\"async\" class=\"portfolio-photo\" src=\"media\/portfolio-inspekce.jpg\" alt=\"Uk\u00e1zka 3D modelu budovy z inspekce\"><div class=\"portfolio-body\"><h4>Inspekce<\/h4><p>Foto\/video dokumentace a protokol se z\u00e1vadami.<\/p><\/div><\/div>\n    <\/div>\n    <div class=\"draft-note\">\u26a0 Fotky jsou re\u00e1ln\u00e9 uk\u00e1zky z va\u0161ich zak\u00e1zek. Pokud budete cht\u00edt pozd\u011bji n\u011bkterou vym\u011bnit, sta\u010d\u00ed nahradit soubor ve slo\u017ece <code>media\/<\/code> stejn\u00fdm n\u00e1zvem.<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"modal-overlay legal-modal wide-modal\" id=\"referenceModal\">\n  <div class=\"modal-card\">\n    <button class=\"modal-close\" data-close-legal aria-label=\"Zav\u0159\u00edt\">\u2715<\/button>\n    <h3>Reference<\/h3>\n    <p class=\"modal-sub\">Co \u0159\u00edkaj\u00ed klienti.<\/p>\n    <div class=\"reviews-grid\">\n      <div class=\"review-card\"><p>\u201e[doplnit citace klienta]\u201c<\/p><div class=\"review-author\">[Jm\u00e9no], [firma \/ pozice]<\/div><\/div>\n      <div class=\"review-card\"><p>\u201e[doplnit citace klienta]\u201c<\/p><div class=\"review-author\">[Jm\u00e9no], [firma \/ pozice]<\/div><\/div>\n      <div class=\"review-card\"><p>\u201e[doplnit citace klienta]\u201c<\/p><div class=\"review-author\">[Jm\u00e9no], [firma \/ pozice]<\/div><\/div>\n    <\/div>\n    <div class=\"draft-note\">\u26a0 Toto jsou z\u00e1stupn\u00e9 texty pro n\u00e1hled rozvr\u017een\u00ed \u2014 nahra\u010fte je re\u00e1ln\u00fdmi citacemi od skute\u010dn\u00fdch klient\u016f (s jejich souhlasem). Nepublikujte vymy\u0161len\u00e9 recenze.<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"modal-overlay legal-modal wide-modal\" id=\"faqModal\">\n  <div class=\"modal-card\">\n    <button class=\"modal-close\" data-close-legal aria-label=\"Zav\u0159\u00edt\">\u2715<\/button>\n    <h3>\u010cast\u00e9 dotazy<\/h3>\n    <div class=\"faq-list\">\n      <details class=\"faq-item\">\n        <summary>Jak prob\u00edh\u00e1 objedn\u00e1vka?<\/summary>\n        <p>Nakresl\u00edte oblast letu v kalkula\u010dce v\u00fd\u0161e, syst\u00e9m spo\u010d\u00edt\u00e1 orienta\u010dn\u00ed cenu podle plochy, zvolen\u00fdch v\u00fdstup\u016f a p\u0159\u00edpadn\u00fdch z\u00f3n. Ode\u0161lete nez\u00e1vaznou popt\u00e1vku a my se ozveme s potvrzen\u00edm term\u00ednu.<\/p>\n      <\/details>\n      <details class=\"faq-item\">\n        <summary>V jak\u00e9m form\u00e1tu dostanu v\u00fdstup?<\/summary>\n        <p>Podle zvolen\u00e9 slu\u017eby \u2014 ortofotomapa jako GeoTIFF, 3D model jako LAZ\/OBJ, v\u00fd\u0161kov\u00fd model jako TIFF s vrstevnicemi. V\u0161e zpracov\u00e1no v sou\u0159adnicov\u00e9m syst\u00e9mu S-JTSK.<\/p>\n      <\/details>\n      <details class=\"faq-item\">\n        <summary>Co kdy\u017e bude v den n\u00e1letu \u0161patn\u00e9 po\u010das\u00ed?<\/summary>\n        <p>Let p\u0159esuneme na nejbli\u017e\u0161\u00ed vhodn\u00fd term\u00edn bez p\u0159\u00edplatku \u2014 bezpe\u010dnost provozu m\u00e1 v\u017edy p\u0159ednost.<\/p>\n      <\/details>\n      <details class=\"faq-item\">\n        <summary>Pot\u0159ebuji povolen\u00ed k letu na sv\u00e9m pozemku?<\/summary>\n        <p>Pokud zakreslen\u00e1 oblast zasahuje do chr\u00e1n\u011bn\u00e9 z\u00f3ny (leti\u0161t\u011b, silnice, \u017eeleznice, chr\u00e1n\u011bn\u00e9 \u00fazem\u00ed apod.), kalkula\u010dka v\u00e1s na to sama upozorn\u00ed a p\u0159\u00edpadn\u00fd p\u0159\u00edplatek nebo nutnost individu\u00e1ln\u00edho povolen\u00ed zahrne do ceny.<\/p>\n      <\/details>\n      <details class=\"faq-item\">\n        <summary>Jak daleko od v\u00e1s doj\u00ed\u017ed\u00edte?<\/summary>\n        <p>Doprava je zdarma do 50 km od Fr\u00fddku-M\u00edstku, nad tento limit \u00fa\u010dtujeme 15 K\u010d\/km (tam i zp\u011bt) za vzd\u00e1lenost nad limitem \u2014 po\u010d\u00edt\u00e1no podle skute\u010dn\u00e9 silni\u010dn\u00ed trasy.<\/p>\n      <\/details>\n      <details class=\"faq-item\">\n        <summary>Jste poji\u0161t\u011bni a m\u00e1te opr\u00e1vn\u011bn\u00ed k l\u00e9t\u00e1n\u00ed?<\/summary>\n        <p>Ano. Provozovatel je registrov\u00e1n u \u00daCL (eviden\u010dn\u00ed \u010d\u00edslo CZEjgrgquqlpp1fq) s opr\u00e1vn\u011bn\u00edm pro kategorii Open i Specific (podkategorie A1, A2, A3) a m\u00e1 sjednan\u00e9 poji\u0161t\u011bn\u00ed odpov\u011bdnosti za \u0161kodu zp\u016fsobenou provozem dronu (Cover Drone).<\/p>\n      <\/details>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div class=\"modal-overlay\" id=\"modalOverlay\">\n  <div class=\"modal-card\">\n    <button class=\"modal-close\" id=\"modalClose\" aria-label=\"Zav\u0159\u00edt\">\u2715<\/button>\n    <h3>Nez\u00e1vazn\u00e1 popt\u00e1vka<\/h3>\n    <p class=\"modal-sub\">Vypl\u0148te kontakt a po\u0161leme v\u00e1m nab\u00eddku na m\u00edru podle v\u00fdb\u011bru v\u00fd\u0161e.<\/p>\n    <form id=\"inquiryForm\">\n      <label class=\"field-label\">Jm\u00e9no a p\u0159\u00edjmen\u00ed<\/label>\n      <input type=\"text\" id=\"fName\" placeholder=\"Jana Nov\u00e1kov\u00e1\" required>\n\n      <label class=\"field-label\">E-mail<\/label>\n      <input type=\"email\" id=\"fEmail\" placeholder=\"jana@email.cz\" required>\n\n      <label class=\"field-label\">Telefon (nepovinn\u00e9)<\/label>\n      <input type=\"tel\" id=\"fPhone\" placeholder=\"+420 ...\">\n\n      <label class=\"field-label\">Zpr\u00e1va<\/label>\n      <textarea id=\"fMessage\" placeholder=\"Co byste r\u00e1da \/ r\u00e1d \u0159e\u0161ila\/l?\"><\/textarea>\n\n      <label class=\"modal-checkbox\">\n        <input type=\"checkbox\" id=\"fConsent\" required>\n        <span>Souhlas\u00edm se zpracov\u00e1n\u00edm osobn\u00edch \u00fadaj\u016f za \u00fa\u010delem vy\u0159\u00edzen\u00ed m\u00e9ho dotazu.<\/span>\n      <\/label>\n\n      <button type=\"submit\" class=\"modal-submit\" id=\"modalSubmitBtn\">Odeslat zpr\u00e1vu<\/button>\n      <div class=\"modal-note\">Odpov\u00edd\u00e1m obvykle do 2 pracovn\u00edch dn\u016f.<\/div>\n      <div class=\"modal-status\" id=\"modalStatus\"><\/div>\n    <\/form>\n  <\/div>\n<\/div>\n\n<div class=\"modal-overlay legal-modal\" id=\"gdprModal\">\n  <div class=\"modal-card\">\n    <button class=\"modal-close\" data-close-legal aria-label=\"Zav\u0159\u00edt\">\u2715<\/button>\n    <h3>Ochrana osobn\u00edch \u00fadaj\u016f (GDPR)<\/h3>\n    <div class=\"draft-note\">\u26a0 Toto je orienta\u010dn\u00ed vzor pro \u00fa\u010dely n\u00e1hledu. P\u0159ed nasazen\u00edm na ostr\u00fd web nechte text zkontrolovat pr\u00e1vn\u00edkem \/ specialistou na GDPR \u2014 zejm\u00e9na p\u0159esn\u00fd v\u00fd\u010det zpracovatel\u016f, pr\u00e1vn\u00ed z\u00e1klad a lh\u016fty uchov\u00e1n\u00ed.<\/div>\n\n    <h4>Kdo je spr\u00e1vcem \u00fadaj\u016f<\/h4>\n    <p>DRONMETRIE \u2014 Ale\u0161 B\u00edlek, I\u010cO 11642009, se s\u00eddlem Mysl\u00edk ev. \u010d. 61, 739 41 Palkovice, e-mail honemdronem@yahoo.com.<\/p>\n\n    <h4>Jak\u00e9 \u00fadaje zpracov\u00e1v\u00e1me<\/h4>\n    <p>Jm\u00e9no a p\u0159\u00edjmen\u00ed, e-mail, telefon a obsah zpr\u00e1vy, kter\u00e9 n\u00e1m poskytnete v popt\u00e1vkov\u00e9m formul\u00e1\u0159i. Sou\u010d\u00e1st\u00ed popt\u00e1vky je i souhrn va\u0161\u00ed kalkulace (vybran\u00e1 slu\u017eba, plocha, cena) a z\u00e1kres oblasti na map\u011b.<\/p>\n\n    <h4>\u00da\u010del a pr\u00e1vn\u00ed z\u00e1klad<\/h4>\n    <p>Zpracov\u00e1n\u00ed slou\u017e\u00ed v\u00fdhradn\u011b k vy\u0159\u00edzen\u00ed va\u0161\u00ed popt\u00e1vky a vz\u00e1jemn\u00e9 komunikaci \u2014 na z\u00e1klad\u011b va\u0161eho souhlasu ud\u011blen\u00e9ho za\u0161krtnut\u00edm pol\u00ed\u010dka ve formul\u00e1\u0159i.<\/p>\n\n    <h4>Komu \u00fadaje p\u0159ed\u00e1v\u00e1me<\/h4>\n    <p>Formul\u00e1\u0159 technicky zaji\u0161\u0165uje t\u0159et\u00ed strana Web3Forms (zpracovatel formul\u00e1\u0159ov\u00fdch dat, p\u0159enos prob\u00edh\u00e1 mimo EU) \u2014 \u00fadaje j\u00ed slou\u017e\u00ed pouze k doru\u010den\u00ed zpr\u00e1vy na n\u00e1\u0161 e-mail, d\u00e1l je nesd\u00edl\u00ed.<\/p>\n\n    <h4>Doba uchov\u00e1n\u00ed<\/h4>\n    <p>Po dobu nezbytnou k vy\u0159\u00edzen\u00ed popt\u00e1vky a p\u0159\u00edpadn\u00e9 navazuj\u00edc\u00ed obchodn\u00ed komunikaci, nejd\u00e9le 2 roky.<\/p>\n\n    <h4>Va\u0161e pr\u00e1va<\/h4>\n    <p>M\u00e1te pr\u00e1vo na p\u0159\u00edstup k \u00fadaj\u016fm, jejich opravu, v\u00fdmaz, omezen\u00ed zpracov\u00e1n\u00ed a vznesen\u00ed n\u00e1mitky \u2014 kontaktujte n\u00e1s na e-mailu v\u00fd\u0161e.<\/p>\n  <\/div>\n<\/div>\n\n<div class=\"modal-overlay legal-modal\" id=\"termsModal\">\n  <div class=\"modal-card\">\n    <button class=\"modal-close\" data-close-legal aria-label=\"Zav\u0159\u00edt\">\u2715<\/button>\n    <h3>Obchodn\u00ed podm\u00ednky<\/h3>\n    <div class=\"draft-note\">\u26a0 Toto je orienta\u010dn\u00ed vzor pro \u00fa\u010dely n\u00e1hledu, ne fin\u00e1ln\u00ed pr\u00e1vn\u00ed dokument. Dopl\u0148te konkr\u00e9tn\u00ed podm\u00ednky va\u0161eho provozu (storno, platba, odpov\u011bdnost, poji\u0161t\u011bn\u00ed) a nechte je zkontrolovat pr\u00e1vn\u00edkem p\u0159ed zve\u0159ejn\u011bn\u00edm.<\/div>\n\n    <h4>Ceny a kalkulace<\/h4>\n    <p>Ceny zobrazen\u00e9 v kalkula\u010dce jsou orienta\u010dn\u00ed a bez DPH, vych\u00e1zej\u00ed ze zadan\u00fdch parametr\u016f a z\u00e1kresu na map\u011b. Kone\u010dn\u00e1 cena je potvrzena po individu\u00e1ln\u00edm posouzen\u00ed zak\u00e1zky (nap\u0159. po kontrole z\u00e1kresu, dostupnosti povolen\u00ed k letu a z\u00f3ny).<\/p>\n\n    <h4>Objedn\u00e1vka<\/h4>\n    <p>Odesl\u00e1n\u00edm formul\u00e1\u0159e &#8222;Odeslat nez\u00e1vaznou popt\u00e1vku&#8220; nevznik\u00e1 z\u00e1vazn\u00e1 objedn\u00e1vka ani platebn\u00ed povinnost \u2014 jde o \u017e\u00e1dost o cenovou nab\u00eddku, kterou v\u00e1m za\u0161leme zp\u011bt e-mailem nebo telefonicky.<\/p>\n\n    <h4>Povolen\u00ed k letu a z\u00f3ny<\/h4>\n    <p>P\u0159\u00edtomnost ochrann\u00fdch p\u00e1sem (leti\u0161t\u011b, silnice, \u017eeleznice, chr\u00e1n\u011bn\u00e1 \u00fazem\u00ed) m\u016f\u017ee vy\u017eadovat dodate\u010dn\u00e9 povolen\u00ed a \u010das nav\u00edc \u2014 bereme v potaz, ale kone\u010dn\u00e9 schv\u00e1len\u00ed letu podl\u00e9h\u00e1 pravidl\u016fm \u00daCL a dot\u010den\u00fdch \u00fa\u0159ad\u016f\/spr\u00e1vc\u016f.<\/p>\n\n    <h4>Storno a platba<\/h4>\n    <p>Zak\u00e1zku lze bezplatn\u011b zru\u0161it nejpozd\u011bji 5 pracovn\u00edch dn\u00ed p\u0159ed sjednan\u00fdm term\u00ednem letu, p\u0159i pozd\u011bj\u0161\u00edm zru\u0161en\u00ed m\u016f\u017ee b\u00fdt \u00fa\u010dtov\u00e1n storno poplatek. Faktura je splatn\u00e1 do 30 dn\u016f od vystaven\u00ed, platba prob\u00edh\u00e1 bankovn\u00edm p\u0159evodem na \u00fa\u010det; u zak\u00e1zek je vy\u017eadov\u00e1na z\u00e1loha ve v\u00fd\u0161i 20 % z ceny.<\/p>\n\n    <h4>Odpov\u011bdnost<\/h4>\n    <p>Provoz dronu je kryt poji\u0161t\u011bn\u00edm odpov\u011bdnosti za \u0161kodu (Cover Drone). Za \u0161kodu zp\u016fsobenou p\u0159i realizaci zak\u00e1zky odpov\u00edd\u00e1me v rozsahu dan\u00e9m t\u00edmto poji\u0161t\u011bn\u00edm a platnou legislativou. Nep\u0159\u00edzniv\u00e9 po\u010das\u00ed (d\u00e9\u0161\u0165, siln\u00fd v\u00edtr, n\u00edzk\u00e1 obla\u010dnost) m\u016f\u017ee vy\u017eadovat p\u0159esun term\u00ednu letu bez dal\u0161\u00edho poplatku \u2014 bezpe\u010dnost provozu m\u00e1 v\u017edy p\u0159ednost.<\/p>\n  <\/div>\n<\/div>\n\n<div class=\"lightbox-overlay\" id=\"lightboxOverlay\">\n  <button class=\"lightbox-close\" id=\"lightboxClose\" aria-label=\"Zav\u0159\u00edt\">\u2715<\/button>\n  <img decoding=\"async\" id=\"lightboxImg\" src=\"\" alt=\"\">\n<\/div>\n\n<script>\n\/* ============== Leaflet map (OpenStreetMap + satelit) ============== *\/\nconst map = L.map('map', {zoomControl:false, attributionControl:false}).setView([49.8175, 15.4730], 8);\n\nconst osmLayer = L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\n  maxZoom:19,\n  attribution:'\u00a9 <a href=\"https:\/\/www.openstreetmap.org\/copyright\" target=\"_blank\" rel=\"noopener\">OpenStreetMap<\/a> contributors'\n}).addTo(map);\nconst satLayer = L.tileLayer('https:\/\/server.arcgisonline.com\/ArcGIS\/rest\/services\/World_Imagery\/MapServer\/tile\/{z}\/{y}\/{x}', {\n  maxZoom:19,\n  attribution:'Tiles \u00a9 Esri \u2014 Source: Esri, Maxar, Earthstar Geographics, GIS User Community'\n});\n\n\/* LPIS (eagri.cz) \u2014 hranice d\u00edl\u016f p\u016fdn\u00edch blok\u016f, vizu\u00e1ln\u00ed vrstva pro z\u00e1lo\u017eku Agro.\n   Pozn.: ve\u0159ejn\u00e9 WMS m\u00e1 GetFeatureInfo i WFS vypnut\u00e9 (ov\u011b\u0159eno dotazem na server),\n   tak\u017ee identifikace pozemku kliknut\u00edm nen\u00ed p\u0159es tuto slu\u017ebu mo\u017en\u00e1 \u2014 jde jen o\n   podkladovou vrstvu pro p\u0159esn\u011bj\u0161\u00ed ru\u010dn\u00ed kreslen\u00ed. *\/\nconst lpisLayer = L.tileLayer.wms('https:\/\/mze.gov.cz\/public\/app\/wms\/public_DPB_PB_OPV.fcgi', {\n  layers: 'DPB_UCINNE,DPB_UCINNE_KOD',\n  format: 'image\/png',\n  transparent: true,\n  version: '1.3.0',\n  styles: '',\n  attribution: 'LPIS \u00a9 MZe \u010cR'\n});\nfunction setLpisVisible(show){\n  if(show){ if(!map.hasLayer(lpisLayer)) lpisLayer.addTo(map); }\n  else { if(map.hasLayer(lpisLayer)) map.removeLayer(lpisLayer); }\n}\n\n\/* ---- vizu\u00e1ln\u00ed vrstva ochrann\u00fdch z\u00f3n\/p\u00e1sem (leti\u0161t\u011b, silnice, \u017eel., el., chr\u00e1n\u011bn\u00e9, zak\u00e1zan\u00e9) ---- *\/\nconst ZONE_COLORS = {\n  letiste:'#3B9EFF', silnice:'#F2C94C', zeleznice:'#9B6BFF',\n  elektrina:'#FF7A21', chranene:'#E8543A', zakazano:'#FF4B4B',\n};\nlet zonesOverlay = null, zonesVisible = false;\nfunction buildZonesOverlay(){\n  if(zonesOverlay || !window.ZONES_DATA) return;\n  zonesOverlay = L.geoJSON(window.ZONES_DATA, {\n    renderer: L.canvas(),\n    style: f => {\n      const c = ZONE_COLORS[f.properties.id] || '#888';\n      return {color:c, weight:1.2, fillColor:c, fillOpacity:f.properties.kind==='block'?0.30:0.14, dashArray: f.properties.kind==='block'?null:'4,4'};\n    }\n  });\n}\ndocument.getElementById('zonesToggleBtn').addEventListener('click', ()=>{\n  buildZonesOverlay();\n  zonesVisible = !zonesVisible;\n  document.getElementById('zonesToggleBtn').classList.toggle('active', zonesVisible);\n  document.getElementById('zoneLegend').classList.toggle('show', zonesVisible);\n  if(!zonesOverlay) return;\n  if(zonesVisible){ if(!map.hasLayer(zonesOverlay)) zonesOverlay.addTo(map); }\n  else { if(map.hasLayer(zonesOverlay)) map.removeLayer(zonesOverlay); }\n});\n\nL.control.attribution({position:'bottomleft', prefix:false}).addTo(map);\nL.control.scale({position:'bottomleft', metric:true, imperial:false}).addTo(map);\nwindow.addEventListener('resize', ()=>map.invalidateSize());\nsetTimeout(()=>map.invalidateSize(), 0);\n\ndocument.getElementById('layerOsmBtn').addEventListener('click', ()=>{\n  if(map.hasLayer(satLayer)) map.removeLayer(satLayer);\n  if(!map.hasLayer(osmLayer)) osmLayer.addTo(map);\n  document.getElementById('layerOsmBtn').classList.add('active');\n  document.getElementById('layerSatBtn').classList.remove('active');\n});\ndocument.getElementById('layerSatBtn').addEventListener('click', ()=>{\n  if(map.hasLayer(osmLayer)) map.removeLayer(osmLayer);\n  if(!map.hasLayer(satLayer)) satLayer.addTo(map);\n  document.getElementById('layerSatBtn').classList.add('active');\n  document.getElementById('layerOsmBtn').classList.remove('active');\n});\n\n\/* ---- vyhled\u00e1v\u00e1n\u00ed (Nominatim geok\u00f3dov\u00e1n\u00ed) ---- *\/\nconst searchInput = document.getElementById('searchInput');\nconst searchResults = document.getElementById('searchResults');\nlet searchDebounce;\n\nasync function runSearch(q){\n  q = q.trim();\n  if(q.length<3){ searchResults.style.display='none'; searchResults.innerHTML=''; return; }\n  try{\n    const res = await fetch(`https:\/\/nominatim.openstreetmap.org\/search?format=json&#038;limit=6&#038;accept-language=cs&#038;q=${encodeURIComponent(q)}`);\n    const data = await res.json();\n    if(!data.length){\n      searchResults.innerHTML = `<div class=\"search-empty\">Nic nenalezeno<\/div>`;\n    } else {\n      searchResults.innerHTML = data.map((d,i)=>`<div class=\"search-result-item\" data-i=\"${i}\">${d.display_name}<\/div>`).join('');\n      searchResults.querySelectorAll('.search-result-item').forEach(el=>{\n        el.addEventListener('click', ()=>{\n          const d = data[Number(el.dataset.i)];\n          map.setView([parseFloat(d.lat), parseFloat(d.lon)], 17);\n          searchInput.value = d.display_name;\n          searchResults.style.display='none';\n        });\n      });\n    }\n    searchResults.style.display='block';\n  }catch(err){\n    searchResults.innerHTML = `<div class=\"search-empty\">Vyhled\u00e1v\u00e1n\u00ed selhalo \u2014 zkontroluj p\u0159ipojen\u00ed k internetu.<\/div>`;\n    searchResults.style.display='block';\n  }\n}\nsearchInput.addEventListener('input', ()=>{\n  clearTimeout(searchDebounce);\n  searchDebounce = setTimeout(()=>runSearch(searchInput.value), 450);\n});\nsearchInput.addEventListener('keydown', e=>{\n  if(e.key==='Enter'){ e.preventDefault(); clearTimeout(searchDebounce); runSearch(searchInput.value); }\n});\ndocument.getElementById('searchBtn').addEventListener('click', ()=>runSearch(searchInput.value));\n\n\/* ---- kontakt (rozklik\u00e1vac\u00ed popover u loga) ---- *\/\nconst contactPopover = document.getElementById('contactPopover');\ndocument.getElementById('contactToggle').addEventListener('click', e=>{\n  e.stopPropagation();\n  contactPopover.classList.toggle('show');\n});\n\ndocument.addEventListener('click', e=>{\n  if(!e.target.closest('.header-search')) searchResults.style.display='none';\n  if(!e.target.closest('.contact-widget')) contactPopover.classList.remove('show');\n});\n\n\/* ---- kreslen\u00ed v\u00edce samostatn\u00fdch polygon\u016f (nap\u0159. jednotliv\u00e9 haly v are\u00e1lu) ---- *\/\nlet polygons = [];       \/\/ dokon\u010den\u00e9 polygony: [{points:[LatLng,...], layer:L.Polygon, markers:[L.Marker,...]}]\nlet currentPoints = [];  \/\/ rozkreslovan\u00fd (zat\u00edm nedokon\u010den\u00fd) polygon\nconst finishedLayer = L.layerGroup().addTo(map); \/\/ dokon\u010den\u00e9 polygony + editovateln\u00e9 vrcholy (nema\u017ee se p\u0159i ka\u017ed\u00e9m p\u0159ekreslen\u00ed)\nconst draftLayer = L.layerGroup().addTo(map);    \/\/ rozpracovan\u00fd polygon (ma\u017ee a kresl\u00ed se znovu p\u0159i ka\u017ed\u00e9m kliknut\u00ed)\nconst EARTH_R = 6378137;\nconst toRad = d => d*Math.PI\/180;\n\nfunction polygonArea(latlngs){\n  if(latlngs.length<3) return 0;\n  const latRef = latlngs.reduce((s,p)=>s+p.lat,0)\/latlngs.length;\n  const cosRef = Math.cos(toRad(latRef));\n  const pts = latlngs.map(p=>({x:EARTH_R*toRad(p.lng)*cosRef, y:EARTH_R*toRad(p.lat)}));\n  let a=0;\n  for(let i=0;i<pts.length;i++){ const p1=pts[i],p2=pts[(i+1)%pts.length]; a+=p1.x*p2.y-p2.x*p1.y; }\n  return Math.abs(a\/2);\n}\nfunction totalArea(){ return polygons.reduce((s,poly)=>s+polygonArea(poly.points),0); }\nfunction accentHex(){ return getComputedStyle(document.documentElement).getPropertyValue('--active-accent').trim(); }\n\nfunction vertexIcon(isFirst,color){\n  const size = isFirst?13:11;\n  return L.divIcon({\n    className:'',\n    html:`<div style=\"width:${size}px;height:${size}px;border-radius:50%;background:${isFirst?'#fff':color};border:1.5px solid #fff;box-shadow:0 0 0 1px rgba(0,0,0,.35);cursor:grab;\"><\/div>`,\n    iconSize:[size,size], iconAnchor:[size\/2,size\/2]\n  });\n}\nfunction midpointIcon(color){\n  return L.divIcon({\n    className:'',\n    html:`<div style=\"width:14px;height:14px;border-radius:50%;background:rgba(0,0,0,.35);border:1.5px dashed ${color};display:flex;align-items:center;justify-content:center;line-height:1;color:${color};font-size:11px;font-weight:700;cursor:copy;\">+<\/div>`,\n    iconSize:[14,14], iconAnchor:[7,7]\n  });\n}\nfunction midLatLng(a,b){ return L.latLng((a.lat+b.lat)\/2, (a.lng+b.lng)\/2); }\n\nfunction rebuildVertexMarkers(entry){\n  entry.markers.forEach(m=>finishedLayer.removeLayer(m));\n  entry.markers = [];\n  const color = accentHex();\n  entry.points.forEach((p, idx)=>{\n    const marker = L.marker(p, {draggable:true, icon: vertexIcon(idx===0, color)}).addTo(finishedLayer);\n    marker.on('click', e=>{ L.DomEvent.stopPropagation(e); });\n    marker.on('mousedown', e=>{ L.DomEvent.stopPropagation(e); });\n    marker.on('drag', ()=>{\n      entry.points[idx] = marker.getLatLng();\n      entry.layer.setLatLngs(entry.points);\n      repositionMidpoints(entry);\n    });\n    marker.on('dragend', ()=>{ recomputeAll(); });\n    entry.markers.push(marker);\n  });\n}\n\nfunction repositionMidpoints(entry){\n  const n = entry.points.length;\n  entry.midpoints.forEach((marker, i)=>{\n    marker.setLatLng(midLatLng(entry.points[i], entry.points[(i+1)%n]));\n  });\n}\n\nfunction rebuildMidpoints(entry){\n  entry.midpoints.forEach(m=>finishedLayer.removeLayer(m));\n  entry.midpoints = [];\n  const color = accentHex();\n  const n = entry.points.length;\n  for(let i=0;i<n;i++){\n    const marker = L.marker(midLatLng(entry.points[i], entry.points[(i+1)%n]), {icon: midpointIcon(color)}).addTo(finishedLayer);\n    marker.on('click', e=>{\n      L.DomEvent.stopPropagation(e);\n      insertVertex(entry, i+1, marker.getLatLng());\n    });\n    marker.on('mousedown', e=>{ L.DomEvent.stopPropagation(e); });\n    entry.midpoints.push(marker);\n  }\n}\n\nfunction insertVertex(entry, index, latlng){\n  entry.points.splice(index, 0, latlng);\n  entry.layer.setLatLngs(entry.points);\n  rebuildVertexMarkers(entry);\n  rebuildMidpoints(entry);\n  recomputeAll();\n}\n\nfunction addFinishedPolygon(pts){\n  const color = accentHex();\n  const layer = L.polygon(pts, {color, weight:2, fillColor:color, fillOpacity:0.18}).addTo(finishedLayer);\n  const entry = {points: pts, layer, markers: [], midpoints: []};\n  polygons.push(entry);\n  rebuildVertexMarkers(entry);\n  rebuildMidpoints(entry);\n}\n\nfunction restyleFinished(){\n  const color = accentHex();\n  polygons.forEach(entry=>{\n    entry.layer.setStyle({color, fillColor:color});\n    entry.markers.forEach((m,idx)=>m.setIcon(vertexIcon(idx===0, color)));\n    entry.midpoints.forEach(m=>m.setIcon(midpointIcon(color)));\n  });\n}\n\nfunction drawScene(){\n  draftLayer.clearLayers();\n  const color = accentHex();\n  if(currentPoints.length){\n    if(currentPoints.length>1){\n      L.polyline(currentPoints, {color, weight:2, dashArray:'6,6'}).addTo(draftLayer);\n    }\n    currentPoints.forEach((p,i)=>{\n      L.circleMarker(p, {radius:i===0?6:5, color:'#fff', weight:1.5, fillColor:i===0?'#fff':color, fillOpacity:1}).addTo(draftLayer);\n    });\n  }\n  document.getElementById('ptCount').textContent = polygons.length>0\n    ? `${currentPoints.length} (+${polygons.length} hotov\u00fdch)`\n    : `${currentPoints.length}`;\n  document.getElementById('undoBtn').disabled = currentPoints.length===0;\n}\nmap.on('click', e=>{\n  currentPoints.push(e.latlng);\n  drawScene(); updatePricing();\n});\ndocument.getElementById('undoBtn').addEventListener('click', ()=>{\n  if(!currentPoints.length) return;\n  currentPoints.pop();\n  drawScene(); updatePricing();\n});\nmap.on('mousemove', e=>{\n  document.getElementById('coordVal').textContent = `${e.latlng.lat.toFixed(5)}, ${e.latlng.lng.toFixed(5)}`;\n});\n\/* ---- doprava (vzd\u00e1lenost od Fr\u00fddku-M\u00edstku ke st\u0159edu zakreslen\u00e9 oblasti) ---- *\/\nconst FM_LATLNG = {lat:49.6846, lng:18.3502};\nconst TRAVEL_FREE_KM = 50;\nconst TRAVEL_RATE = 15; \/\/ K\u010d \/ km, po\u010d\u00edt\u00e1no pro cestu tam i zp\u011bt\n\nlet travelKm = 0, travelCost = 0, travelMethod = null, travelLoading = false;\n\nfunction straightLineKm(centroid){\n  const from = turf.point([FM_LATLNG.lng, FM_LATLNG.lat]);\n  return turf.distance(from, centroid, {units:'kilometers'});\n}\n\nfunction polygonsToCoords(polys){\n  return polys.map(pts=>{\n    const ring = pts.map(p=>[p.lng, p.lat]);\n    ring.push(ring[0]);\n    return [ring];\n  });\n}\n\nasync function computeTravel(polys){\n  if(!window.turf || polys.length === 0) return {km:0, cost:0, method:null};\n  let multi;\n  try{ multi = turf.multiPolygon(polygonsToCoords(polys)); } catch(e){ return {km:0, cost:0, method:null}; }\n  const centroid = turf.centroid(multi);\n  const [destLng, destLat] = centroid.geometry.coordinates;\n\n  let km = null, method = 'road';\n  try{\n    const url = `https:\/\/router.project-osrm.org\/route\/v1\/driving\/${FM_LATLNG.lng},${FM_LATLNG.lat};${destLng},${destLat}?overview=false`;\n    const res = await fetch(url);\n    const data = await res.json();\n    if(data.code === 'Ok' && data.routes && data.routes[0]){\n      km = data.routes[0].distance \/ 1000;\n    }\n  }catch(e){ \/* routing API nedostupn\u00e9, spadneme na odhad n\u00ed\u017ee *\/ }\n\n  if(km === null){\n    \/\/ fallback: vzdu\u0161n\u00e1 \u010d\u00e1ra s korekc\u00ed na klikatost silni\u010dn\u00ed s\u00edt\u011b (~+30 %)\n    km = straightLineKm(centroid) * 1.3;\n    method = 'estimate';\n  }\n\n  const excess = Math.max(km - TRAVEL_FREE_KM, 0);\n  return {km, cost: excess * 2 * TRAVEL_RATE, method};\n}\n\nasync function recomputeAll(){\n  drawScene();\n  detectedZones = checkZones(polygons.map(p=>p.points));\n  renderZones();\n  renderIncludes();\n  travelLoading = true; travelMethod = null;\n  updatePricing();\n  const t = await computeTravel(polygons.map(p=>p.points));\n  travelKm = t.km; travelCost = t.cost; travelMethod = t.method; travelLoading = false;\n  updatePricing();\n}\n\ndocument.getElementById('finishBtn').addEventListener('click', async ()=>{\n  if(currentPoints.length>=3){\n    addFinishedPolygon(currentPoints);\n    currentPoints = [];\n    await recomputeAll();\n  }\n});\ndocument.getElementById('clearBtn').addEventListener('click', ()=>{\n  finishedLayer.clearLayers();\n  polygons=[]; currentPoints=[]; detectedZones=[]; travelKm=0; travelCost=0; travelMethod=null; travelLoading=false;\n  drawScene(); renderZones(); renderIncludes(); updatePricing();\n});\n\nconst selectedOutputs = new Set(['mapa']);\ndocument.querySelectorAll('.vm-btn').forEach(b=>{\n  if(b.disabled) return;\n  b.addEventListener('click', ()=>{\n    const key = b.dataset.vm;\n    b.classList.toggle('active');\n    if(b.classList.contains('active')) selectedOutputs.add(key); else selectedOutputs.delete(key);\n    renderIncludes();\n    updatePricing();\n  });\n});\n\nfunction updateOutputOptions(){\n  const mapaLabel = document.querySelector('#vmMapaBtn .vm-label');\n  const btn3d = document.getElementById('vm3dBtn');\n  const label3d = document.querySelector('#vm3dBtn .vm-label');\n  const dtmLabel = document.querySelector('#vmDtmBtn .vm-label');\n  const bimBtn = document.getElementById('vmBimBtn');\n  const bimLabel = document.querySelector('#vmBimBtn .vm-label');\n  const fieldLabel = document.getElementById('vmFieldLabel');\n\n  bimBtn.style.display = 'none';\n  if(bimBtn.classList.contains('active')){\n    bimBtn.classList.remove('active');\n    selectedOutputs.delete('bim');\n  }\n\n  if(currentTab === 'agro'){\n    btn3d.style.display = 'none';\n    if(btn3d.classList.contains('active')){\n      btn3d.classList.remove('active');\n      selectedOutputs.delete('3d');\n    }\n    mapaLabel.textContent = 'Mapa';\n    label3d.textContent = '3D';\n    dtmLabel.textContent = 'V\u00fd\u0161kov\u00fd model';\n    bimBtn.style.display = '';\n    bimLabel.textContent = 'Zon\u00e1ln\u00ed statistika';\n    fieldLabel.textContent = 'V\u00fdstup: mapa, v\u00fd\u0161kov\u00fd model, zon\u00e1ln\u00ed statistika';\n  } else if(currentTab === 'lidar'){\n    btn3d.style.display = '';\n    mapaLabel.textContent = 'Mra\u010dno bod\u016f';\n    label3d.textContent = '3D prohl\u00eddka';\n    dtmLabel.textContent = '2D dokumentace';\n    bimBtn.style.display = '';\n    bimLabel.textContent = 'BIM LOD 200';\n    fieldLabel.textContent = 'V\u00fdstup: mra\u010dno bod\u016f, 3D prohl\u00eddka, 2D dokumentace, BIM LOD 200';\n  } else {\n    btn3d.style.display = '';\n    mapaLabel.textContent = 'Mapa';\n    label3d.textContent = '3D';\n    dtmLabel.textContent = 'DTM\/DSM';\n    fieldLabel.textContent = 'V\u00fdstup: mapa, 3D, DTM\/DSM';\n  }\n}\n\n\/* ============== pricing data (z Cenik_DRONMETRIE.xlsx) ============== *\/\nfunction bandLookup(bands,val){\n  for(const b of bands){ if(val>=b.from && val<=b.to) return b; }\n  return bands[bands.length-1];\n}\nfunction fmt(n){ return Math.round(n).toLocaleString('cs-CZ'); }\n\nconst MAPOVANI_ZAKLAD_LET = 3500; \/\/ fixn\u00ed n\u00e1klad na v\u00fdjezd\/GCP\/p\u0159\u00edpravu letu, \u00fa\u010dtuje se jen jednou\nconst MAPOVANI_MULTIPLIERS = { mapa: 380, '3d': 300, dtmdsm: 150 };\nconst MAPOVANI_EXPORT_LABELS = {\n  mapa: 'Ortofotomapa \u2014 GeoTIFF, 2 cm\/px',\n  '3d': '3D mesh \u2014 LAZ, OBJ',\n  dtmdsm: 'V\u00fd\u0161kov\u00fd model \u2014 V\u00fd\u0161kov\u00fd TIFF, vrstevnice 0,5 m',\n};\nconst MAPOVANI_MIN_INVOICE = 4500;\n\nconst AGRO_RES = [\n  {label:'RGB 5 cm \/ Multi 10 cm', rate:125},\n  {label:'RGB 4 cm \/ Multi 8 cm', rate:150},\n  {label:'RGB 3 cm \/ Multi 6 cm', rate:180},\n  {label:'RGB 2 cm \/ Multi 4 cm', rate:216},\n  {label:'RGB 1 cm \/ Multi 2 cm', rate:259.2},\n];\nconst AGRO_DISCOUNT = [\n  {from:0,to:200,disc:0},\n  {from:201,to:400,disc:0.05},\n  {from:401,to:600,disc:0.10},\n  {from:601,to:800,disc:0.15},\n  {from:801,to:1000,disc:0.20},\n  {from:1001,to:Infinity,disc:0.25},\n];\nconst AGRO_FLIGHTS_DISCOUNT = [\n  {label:'1\u00d7', disc:0.00},\n  {label:'2\u00d7', disc:0.07},\n  {label:'3\u00d7', disc:0.14},\n  {label:'4\u00d7', disc:0.21},\n  {label:'5\u00d7', disc:0.28},\n  {label:'6\u00d7 a v\u00edce', disc:0.35},\n];\n\nconst INSPEKCE_PACKAGES = [\n  {id:'zakladni', label:'Z\u00e1kladn\u00ed vizu\u00e1ln\u00ed inspekce', type:'flat', price:2500, note:'ka\u017ed\u00e1 dal\u0161\u00ed hod. +1 800 K\u010d'},\n  {id:'protokol_rd', label:'Inspekce s protokolem (RD \/ men\u0161\u00ed objekt)', type:'flat', price:4900},\n  {id:'protokol_prum', label:'Inspekce s protokolem \u2014 komer\u010dn\u00ed\/pr\u016fmyslov\u00e1', type:'flat', price:8900, note:'od'},\n  {id:'strechy', label:'Kontrola st\u0159ech a fas\u00e1d', type:'area_step', base:3900, baseTo:500, stepSize:100, stepPrice:200},\n  {id:'mosty', label:'Kontrola most\u016f a liniov\u00fdch staveb', type:'hourly', rate:3500, minHours:2},\n  {id:'kominy', label:'Inspekce kom\u00edn\u016f', type:'flat', price:12000, note:'od \/ p\u016flden'},\n  {id:'areal_pul', label:'Pr\u016fmyslov\u00fd are\u00e1l \u2014 p\u016fldenn\u00ed bal\u00ed\u010dek', type:'flat', price:8500},\n  {id:'areal_cely', label:'Pr\u016fmyslov\u00fd are\u00e1l \u2014 celodenn\u00ed bal\u00ed\u010dek', type:'flat', price:15000},\n];\n\nconst FVE_BANDS = [\n  {from:0,to:10,type:'flat',price:2900},\n  {from:10.01,to:30,type:'flat',price:3900},\n  {from:30.01,to:50,type:'perkwp',rate:150},\n  {from:50.01,to:100,type:'perkwp',rate:110},\n  {from:100.01,to:250,type:'perkwp',rate:85},\n  {from:250.01,to:500,type:'perkwp',rate:65},\n  {from:500.01,to:1000,type:'perkwp',rate:50},\n  {from:1000.01,to:Infinity,type:'perkwp',rate:35,individual:true},\n];\nconst BUDOVA_BANDS = [\n  {from:0,to:150,type:'flat',price:3200},\n  {from:151,to:250,type:'flat',price:4200},\n  {from:251,to:400,type:'perm2',rate:22},\n  {from:401,to:1000,type:'perm2',rate:16},\n  {from:1001,to:Infinity,type:'perm2',rate:10,individual:true},\n];\n\nconst LIDAR_INT_BANDS = [\n  {from:0,to:100,type:'flat',price:3500},\n  {from:101,to:300,type:'perm2',rate:30},\n  {from:301,to:600,type:'perm2',rate:24},\n  {from:601,to:1500,type:'perm2',rate:18},\n  {from:1501,to:5000,type:'perm2',rate:13},\n  {from:5001,to:Infinity,type:'perm2',rate:9,individual:true},\n];\nconst LIDAR_EXT_BANDS = [\n  {from:0,to:300,type:'flat',price:6900},\n  {from:301,to:1000,type:'perm2',rate:18},\n  {from:1001,to:3000,type:'perm2',rate:13},\n  {from:3001,to:Infinity,type:'perm2',rate:9,individual:true},\n];\n\nconst DISCOUNTS = {\n  'DRON10': {content:0.10, travel:0.10},\n  'NOVY': {content:0.15, travel:0.15},\n  'ESCO': {content:0.25, travel:0.50},\n};\n\nconst TAB_INCLUDES = {\n  mapovani: ['Zpracov\u00e1n\u00ed v S-JTSK, form\u00e1t v\u00fdstupu dle zvolen\u00fdch mo\u017enost\u00ed n\u00ed\u017ee','Cena roste s plochou degresivn\u011b (men\u0161\u00ed p\u0159\u00edr\u016fstek u v\u011bt\u0161\u00edch zak\u00e1zek)'],\n  agro: ['Multispektr\u00e1ln\u00ed \/ NDVI sn\u00edmkov\u00e1n\u00ed dle zvolen\u00e9ho rozli\u0161en\u00ed','Report pro zem\u011bd\u011blsk\u00fd podnik'],\n  inspekce: ['Foto\/video dokumentace dle zvolen\u00e9ho bal\u00ed\u010dku','Voliteln\u011b PDF protokol se z\u00e1vadami','Pilot, poji\u0161t\u011bn\u00ed, z\u00e1kladn\u00ed zpracov\u00e1n\u00ed'],\n  termo: ['Termosn\u00edmkov\u00e1n\u00ed FVE panel\u016f nebo pl\u00e1\u0161t\u011b budovy','Detekce tepeln\u00fdch \u00fanik\u016f \/ vadn\u00fdch \u010dl\u00e1nk\u016f','Protokol s teplotn\u00ed mapou'],\n  lidar: ['Sb\u011br dat LIDAR \u2014 mra\u010dno bod\u016f','Export do E57 \/ LAS\/LAZ'],\n};\n\nlet currentTab = 'mapovani';\nlet appliedDiscount = {content:0, travel:0};\n\ndocument.querySelectorAll('.tab').forEach(btn=>{\n  btn.addEventListener('click', ()=>{\n    document.querySelectorAll('.tab').forEach(b=>b.classList.remove('active'));\n    btn.classList.add('active');\n    currentTab = btn.dataset.tab;\n    document.documentElement.style.setProperty('--active-accent', `var(--${currentTab})`);\n    document.querySelectorAll('.cfg').forEach(c=>c.classList.toggle('show', c.dataset.cfg===currentTab));\n    updateOutputOptions();\n    renderIncludes();\n    updateMapHint();\n    restyleFinished();\n    setLpisVisible(currentTab==='agro');\n    drawScene();\n    updatePricing();\n  });\n});\n\nfunction renderIncludes(){\n  const list = document.getElementById('includesList');\n  list.innerHTML='';\n  TAB_INCLUDES[currentTab].forEach(t=>{ const li=document.createElement('li'); li.textContent=t; list.appendChild(li); });\n  if(currentTab==='mapovani'){\n    const liMapa=document.createElement('li'); liMapa.textContent=MAPOVANI_EXPORT_LABELS.mapa; list.appendChild(liMapa);\n    if(selectedOutputs.has('3d')){ const li=document.createElement('li'); li.textContent=MAPOVANI_EXPORT_LABELS['3d']; list.appendChild(li); }\n    if(selectedOutputs.has('dtmdsm')){ const li=document.createElement('li'); li.textContent=MAPOVANI_EXPORT_LABELS.dtmdsm; list.appendChild(li); }\n  } else if(currentTab==='lidar'){\n    if(selectedOutputs.has('3d')){ const li=document.createElement('li'); li.textContent='3D prohl\u00eddka prostoru (interaktivn\u00ed model)'; list.appendChild(li); }\n    if(selectedOutputs.has('dtmdsm')){ const li=document.createElement('li'); li.textContent='2D dokumentace \u2014 p\u016fdorysy'; list.appendChild(li); }\n    if(selectedOutputs.has('bim')){ const li=document.createElement('li'); li.textContent='BIM model LOD 200'; list.appendChild(li); }\n  } else {\n    if(selectedOutputs.has('3d')){ const li=document.createElement('li'); li.textContent='Dopl\u0148kov\u00fd v\u00fdstup: 3D model'; list.appendChild(li); }\n    if(selectedOutputs.has('dtmdsm')){ const li=document.createElement('li'); li.textContent = currentTab==='agro' ? MAPOVANI_EXPORT_LABELS.dtmdsm : 'Dopl\u0148kov\u00fd v\u00fdstup: DTM \/ DSM'; list.appendChild(li); }\n    if(currentTab==='agro' && selectedOutputs.has('bim')){ const li=document.createElement('li'); li.textContent='Zon\u00e1ln\u00ed statistika (druh souboru podle domluvy)'; list.appendChild(li); }\n  }\n  if(currentTab==='agro'){\n    const flightsDisc = AGRO_FLIGHTS_DISCOUNT[Number(agroFlightsSel.value)];\n    if(flightsDisc.disc>0){\n      const li=document.createElement('li');\n      li.textContent = `Sez\u00f3nn\u00ed mno\u017estevn\u00ed sleva dle po\u010dtu n\u00e1let\u016f: ${(flightsDisc.disc*100).toFixed(0)} %`;\n      list.appendChild(li);\n    }\n  }\n  if(currentTab!=='lidar'){\n    detectedZones.forEach(z=>{\n      const li=document.createElement('li'); li.textContent = `Povolen\u00ed k letu \u2014 ${z.label}`; list.appendChild(li);\n    });\n  }\n}\n\nfunction areaRelevant(){\n  if(currentTab==='mapovani') return true;\n  if(currentTab==='agro') return true;\n  if(currentTab==='lidar') return true;\n  if(currentTab==='termo') return document.getElementById('termoType').value==='budova';\n  if(currentTab==='inspekce') return document.getElementById('inspPackage').value==='strechy';\n  return false;\n}\nfunction updateMapHint(){\n  const hint = document.getElementById('mapHint');\n  if(areaRelevant()){\n    hint.classList.remove('muted');\n    hint.innerHTML = currentTab==='agro'\n      ? 'Polopr\u016fhledn\u00e1 vrstva ukazuje hranice p\u016fdn\u00edch blok\u016f (LPIS). Klik\u00e1n\u00edm podle n\u00ed vyzna\u010d hranici pozemku. <b>Dokon\u010dit oblast<\/b> uzav\u0159e polygon a spo\u010d\u00edt\u00e1 plochu, vrcholy jde pak p\u0159et\u00e1hnout my\u0161\u00ed a doladit p\u0159esn\u011b na hranici, kliknut\u00edm na \"+\" uprost\u0159ed hrany p\u0159id\u00e1\u0161 nov\u00fd bod.'\n      : 'Klik\u00e1n\u00edm vyzna\u010d hranici pozemku \/ haly. <b>Dokon\u010dit oblast<\/b> uzav\u0159e polygon a spo\u010d\u00edt\u00e1 plochu \u2014 pak m\u016f\u017ee\u0161 stejn\u00fdm zp\u016fsobem nakreslit dal\u0161\u00ed samostatn\u00fd objekt (nap\u0159. dal\u0161\u00ed halu v are\u00e1lu). Vrcholy dokon\u010den\u00fdch polygon\u016f jde p\u0159et\u00e1hnout my\u0161\u00ed a opravit tak nep\u0159esnost, kliknut\u00edm na \"+\" uprost\u0159ed hrany p\u0159id\u00e1\u0161 nov\u00fd bod.';\n  } else {\n    hint.classList.add('muted');\n    hint.innerHTML = 'Pro tento typ zak\u00e1zky se plocha z mapy nepou\u017e\u00edv\u00e1 \u2014 cena se po\u010d\u00edt\u00e1 z parametr\u016f vlevo v panelu.';\n  }\n  document.getElementById('areaRow').style.display = areaRelevant() ? 'flex' : 'none';\n}\n\nconst agroSel = document.getElementById('agroRes');\nAGRO_RES.forEach((r,i)=>{ const o=document.createElement('option'); o.value=i; o.textContent=`${r.label} \u2014 ${r.rate} K\u010d\/ha`; agroSel.appendChild(o); });\n\nconst agroFlightsSel = document.getElementById('agroFlights');\nAGRO_FLIGHTS_DISCOUNT.forEach((f,i)=>{ const o=document.createElement('option'); o.value=i; o.textContent=f.label; agroFlightsSel.appendChild(o); });\nagroFlightsSel.addEventListener('change', ()=>{ renderIncludes(); updatePricing(); });\n\nconst inspSel = document.getElementById('inspPackage');\nINSPEKCE_PACKAGES.forEach(p=>{ const o=document.createElement('option'); o.value=p.id; o.textContent=p.label; inspSel.appendChild(o); });\ninspSel.addEventListener('change', ()=>{\n  document.getElementById('inspHoursWrap').style.display = inspSel.value==='mosty' ? 'block' : 'none';\n  updateMapHint(); drawScene(); updatePricing();\n});\ndocument.getElementById('inspHours').addEventListener('input', updatePricing);\n\ndocument.getElementById('termoType').addEventListener('change', ()=>{\n  const isFve = document.getElementById('termoType').value==='fve';\n  document.getElementById('termoKwpWrap').style.display = isFve ? 'block' : 'none';\n  updateMapHint(); drawScene(); updatePricing();\n});\ndocument.getElementById('termoKwp').addEventListener('input', updatePricing);\ndocument.getElementById('lidarType').addEventListener('change', updatePricing);\nagroSel.addEventListener('change', updatePricing);\n\nfunction bandRangeLabel(b, unit){\n  const to = b.to===Infinity ? 'a v\u00edce' : fmt(b.to);\n  return `${fmt(b.from)}\u2013${to} ${unit}`;\n}\n\nfunction computeMapovani(area){\n  if(area<=0) return {lines:[], total:0, empty:true};\n  const ha = area\/10000;\n  let total = MAPOVANI_ZAKLAD_LET;\n  const lines = [{label:'Z\u00e1klad letu (v\u00fdjezd, GCP, p\u0159\u00edprava)', amt: MAPOVANI_ZAKLAD_LET}];\n  ['mapa','3d','dtmdsm'].forEach(key=>{\n    if(!selectedOutputs.has(key)) return;\n    const cena = 12 * Math.pow(ha, 0.55) * MAPOVANI_MULTIPLIERS[key];\n    lines.push({label: MAPOVANI_EXPORT_LABELS[key], amt: cena});\n    total += cena;\n  });\n  if(total < MAPOVANI_MIN_INVOICE){\n    lines.push({label:'Doplatek do minim\u00e1ln\u00ed fakturace (4 500 K\u010d)', amt: MAPOVANI_MIN_INVOICE-total});\n    total = MAPOVANI_MIN_INVOICE;\n  }\n  return {lines, total};\n}\n\nfunction computeAgro(area){\n  const ha = area\/10000;\n  if(ha<=0) return {lines:[], total:0, empty:true};\n  const res = AGRO_RES[Number(agroSel.value)];\n  const base = ha*res.rate;\n  const discBand = bandLookup(AGRO_DISCOUNT, ha);\n  const lines = [{label:`${ha.toFixed(2)} ha \u00d7 ${res.rate} K\u010d\/ha`, amt: base}];\n  let total = base;\n  const volumeDiscount = base*discBand.disc;\n  const afterVolume = base - volumeDiscount;\n  if(selectedOutputs.has('dtmdsm')){\n    const dtmCena = base * 0.25;\n    lines.push({label: MAPOVANI_EXPORT_LABELS.dtmdsm, amt: dtmCena});\n    total += dtmCena;\n  }\n  if(selectedOutputs.has('bim')){\n    const zonalCena = base * 0.15;\n    lines.push({label: 'Zon\u00e1ln\u00ed statistika (5x5m)', amt: zonalCena});\n    total += zonalCena;\n  }\n  \/\/ sez\u00f3nn\u00ed sleva dle po\u010dtu n\u00e1let\u016f se po\u010d\u00edt\u00e1 z ceny U\u017d sn\u00ed\u017een\u00e9 o mno\u017estevn\u00ed slevu\n  \/\/ (sazba za ha se sni\u017euje postupn\u011b, slevy se n\u00e1sob\u00ed, ne s\u010d\u00edtaj\u00ed \u2014 dle cen\u00edku)\n  const flightsDisc = AGRO_FLIGHTS_DISCOUNT[Number(agroFlightsSel.value)];\n  const flightsDiscount = flightsDisc ? afterVolume*flightsDisc.disc : 0;\n  const autoDiscount = volumeDiscount + flightsDiscount;\n  const autoDiscountParts = [];\n  if(discBand.disc>0) autoDiscountParts.push({label:`Mno\u017estevn\u00ed sleva (${(discBand.disc*100).toFixed(0)} %)`, amt:volumeDiscount});\n  if(flightsDisc && flightsDisc.disc>0) autoDiscountParts.push({label:`Sez\u00f3nn\u00ed sleva dle po\u010dtu n\u00e1let\u016f (${(flightsDisc.disc*100).toFixed(0)} %)`, amt:flightsDiscount});\n  return {lines, total, autoDiscount, autoDiscountParts};\n}\n\nfunction computeInspekce(area){\n  const pkg = INSPEKCE_PACKAGES.find(p=>p.id===inspSel.value);\n  const lines = []; let total = 0;\n  if(pkg.type==='flat'){\n    total = pkg.price;\n    lines.push({label:`${pkg.label}${pkg.note?` (${pkg.note})`:''}`, amt: total});\n  } else if(pkg.type==='area_step'){\n    if(area<=0) return {lines:[], total:0, empty:true};\n    if(area<=pkg.baseTo){\n      total = pkg.base;\n      lines.push({label:`${pkg.label} (do ${pkg.baseTo} m\u00b2)`, amt: total});\n    } else {\n      const extra = area - pkg.baseTo;\n      const steps = Math.ceil(extra\/pkg.stepSize);\n      total = pkg.base + steps*pkg.stepPrice;\n      lines.push({label:`Z\u00e1klad do ${pkg.baseTo} m\u00b2`, amt: pkg.base});\n      lines.push({label:`+${steps}\u00d7 ${pkg.stepPrice} K\u010d (dal\u0161\u00edch ${pkg.stepSize} m\u00b2)`, amt: steps*pkg.stepPrice});\n    }\n  } else if(pkg.type==='hourly'){\n    const hours = Math.max(parseFloat(document.getElementById('inspHours').value)||pkg.minHours, pkg.minHours);\n    total = hours*pkg.rate;\n    lines.push({label:`${pkg.label} \u2014 ${hours} h \u00d7 ${pkg.rate} K\u010d\/h`, amt: total});\n  }\n  return {lines, total};\n}\n\nfunction computeTermo(area){\n  const isFve = document.getElementById('termoType').value==='fve';\n  const lines = [];\n  let total = 0;\n  if(isFve){\n    const kwp = Math.max(parseFloat(document.getElementById('termoKwp').value)||0, 0);\n    if(kwp<=0) return {lines:[], total:0, empty:true};\n    const band = bandLookup(FVE_BANDS, kwp);\n    if(band.type==='flat'){ total = band.price; lines.push({label:`FVE do ${band.to} kWp \u2014 pau\u0161\u00e1l`, amt: total}); }\n    else { total = kwp*band.rate; lines.push({label:`${kwp} kWp \u00d7 ${band.rate} K\u010d\/kWp${band.individual?' (individu\u00e1ln\u00ed, orienta\u010dn\u011b)':''}`, amt: total}); }\n  } else {\n    if(area<=0) return {lines:[], total:0, empty:true};\n    const band = bandLookup(BUDOVA_BANDS, area);\n    if(band.type==='flat'){ total = band.price; lines.push({label:`Budova do ${band.to} m\u00b2 \u2014 pau\u0161\u00e1l`, amt: total}); }\n    else { total = area*band.rate; lines.push({label:`${fmt(area)} m\u00b2 \u00d7 ${band.rate} K\u010d\/m\u00b2${band.individual?' (individu\u00e1ln\u00ed, orienta\u010dn\u011b)':''}`, amt: total}); }\n  }\n  return {lines, total};\n}\n\nconst LIDAR_OUTPUT_RATES = {dtmdsm:46.67, bim:48.87}; \/\/ K\u010d\/m\u00b2, z Cen\u00edku 3D skenov\u00e1n\u00ed \u2014 2D dokumentace, BIM LOD 200\nconst LIDAR_OUTPUT_LABELS = {dtmdsm:'2D dokumentace', bim:'BIM model LOD 200'};\n\nfunction computeLidar(area){\n  if(area<=0) return {lines:[], total:0, empty:true};\n  const isInt = document.getElementById('lidarType').value==='interier';\n  const band = bandLookup(isInt?LIDAR_INT_BANDS:LIDAR_EXT_BANDS, area);\n  const lines = []; let total;\n  if(band.type==='flat'){ total = band.price; lines.push({label:`${isInt?'Interi\u00e9r':'Exteri\u00e9r'} do ${band.to} m\u00b2 \u2014 pau\u0161\u00e1l (mra\u010dno bod\u016f)`, amt: total}); }\n  else { total = area*band.rate; lines.push({label:`${fmt(area)} m\u00b2 \u00d7 ${band.rate} K\u010d\/m\u00b2 (mra\u010dno bod\u016f)${band.individual?' \u2014 individu\u00e1ln\u00ed, orienta\u010dn\u011b':''}`, amt: total}); }\n\n  ['dtmdsm','bim'].forEach(key=>{\n    if(selectedOutputs.has(key)){\n      const rate = LIDAR_OUTPUT_RATES[key];\n      const amt = area*rate;\n      lines.push({label:`${LIDAR_OUTPUT_LABELS[key]} \u2014 ${fmt(area)} m\u00b2 \u00d7 ${rate} K\u010d\/m\u00b2`, amt});\n      total += amt;\n    }\n  });\n\n  return {lines, total};\n}\n\n\/* ---- automatick\u00e1 detekce z\u00f3n (\u00daCL \/ aim.rlp.cz, ed_318) ---- *\/\nlet detectedZones = [];\n\nfunction checkZones(polys){\n  if(!window.ZONES_DATA || !window.turf || polys.length === 0) return [];\n  let drawn;\n  try{ drawn = turf.multiPolygon(polygonsToCoords(polys)); } catch(e){ return []; }\n  const found = [];\n  window.ZONES_DATA.features.forEach(zf=>{\n    try{\n      if(turf.booleanIntersects(drawn, zf)) found.push(zf.properties);\n    }catch(e){ \/* skip malformed geometry *\/ }\n  });\n  return found;\n}\n\nfunction polygonHasKinks(pts){\n  if(!window.turf || pts.length<3) return false;\n  try{\n    const ring = pts.map(p=>[p.lng,p.lat]);\n    ring.push(ring[0]);\n    return turf.kinks(turf.polygon([ring])).features.length>0;\n  }catch(e){ return false; }\n}\n\nfunction renderZones(){\n  const bannerEl = document.getElementById('zakazanoBanner');\n  const kinkBannerEl = document.getElementById('selfIntersectBanner');\n  const orderBtn = document.getElementById('orderBtn');\n\n  const zakazano = currentTab!=='lidar' && polygons.length > 0 && detectedZones.some(z=>z.kind==='block');\n  const hasKinks = polygons.some(entry=>polygonHasKinks(entry.points));\n\n  bannerEl.style.display = zakazano ? 'block' : 'none';\n  kinkBannerEl.style.display = hasKinks ? 'block' : 'none';\n\n  orderBtn.disabled = zakazano || hasKinks;\n  orderBtn.title = zakazano ? 'Oblast zasahuje do zak\u00e1zan\u00e9 z\u00f3ny \u2014 kontaktujte n\u00e1s individu\u00e1ln\u011b.'\n    : hasKinks ? 'Nakreslen\u00e1 oblast se sama prot\u00edn\u00e1 \u2014 opravte tvar p\u0159ed odesl\u00e1n\u00edm popt\u00e1vky.'\n    : '';\n}\n\nfunction updatePricing(){\n  const area = totalArea();\n  document.getElementById('areaVal').textContent = `${fmt(area)} m\u00b2`;\n  document.getElementById('finalPriceLabel').textContent = currentTab==='agro' ? 'V\u00fdsledn\u00e1 cena za 1 n\u00e1let' : 'V\u00fdsledn\u00e1 cena';\n\n  let result;\n  if(currentTab==='mapovani') result = computeMapovani(area);\n  else if(currentTab==='agro') result = computeAgro(area);\n  else if(currentTab==='inspekce') result = computeInspekce(area);\n  else if(currentTab==='termo') result = computeTermo(area);\n  else if(currentTab==='lidar') result = computeLidar(area);\n\n  const linesEl = document.getElementById('priceLines');\n  const discAmtEl = document.getElementById('discountAmountVal');\n  const discNoteEl = document.getElementById('discountAmountNote');\n  const discBlockEl = document.getElementById('discountBlock');\n\n  if(result.empty || result.lines.length===0){\n    linesEl.innerHTML = `<div class=\"empty-note\">${areaRelevant() ? 'Zakresli a dokon\u010di oblast na map\u011b pro v\u00fdpo\u010det ceny.' : 'Zadej parametry zak\u00e1zky vlevo v panelu pro v\u00fdpo\u010det ceny.'}<\/div>`;\n    document.getElementById('finalPrice').innerHTML = `0 <small>K\u010d<\/small>`;\n    discBlockEl.style.display = 'none';\n    return;\n  }\n\n  const activeZones = currentTab==='lidar' ? [] : detectedZones.filter(z=>z.kind!=='block');\n  const autoDiscount = result.autoDiscount || 0;\n  const contentSubtotal = result.total + activeZones.reduce((s,z)=>s+z.surcharge,0);\n  const contentDiscountAmt = contentSubtotal * appliedDiscount.content;\n  const travelDiscountAmt = travelCost * appliedDiscount.travel;\n  let subtotal = contentSubtotal + travelCost;\n  let discountAmt = contentDiscountAmt + travelDiscountAmt + autoDiscount;\n  let final = Math.max(subtotal-discountAmt, 0);\n\n  linesEl.innerHTML = result.lines.map(l=>`<div class=\"pline${l.disc?' disc':''}\"><span>${l.label}<\/span><span class=\"amt\">${l.amt<0?'\u2212':''}${fmt(Math.abs(l.amt))} K\u010d<\/span><\/div>`).join('');\n  activeZones.forEach(z=>{\n    linesEl.innerHTML += `<div class=\"pline\"><span>${z.kind==='warning'?'Upozorn\u011bn\u00ed':'P\u0159\u00edplatek'} \u2014 ${z.label}<\/span><span class=\"amt\">${fmt(z.surcharge)} K\u010d<\/span><\/div>`;\n  });\n  if(polygons.length>0 && travelLoading){\n    linesEl.innerHTML += `<div class=\"pline\"><span class=\"zone-checking\">Doprava \u2014 po\u010d\u00edt\u00e1m vzd\u00e1lenost po silnici\u2026<\/span><span class=\"amt\"><\/span><\/div>`;\n  } else if(polygons.length>0){\n    const distSrc = travelMethod === 'estimate' ? 'odhad vzdu\u0161nou \u010darou, routing nedostupn\u00fd' : 'po silnici';\n    const travelLabel = travelCost > 0\n      ? `Doprava \u2014 ${travelKm.toFixed(0)} km (${distSrc}) od Fr\u00fddku-M\u00edstku (${(travelKm-TRAVEL_FREE_KM).toFixed(0)} km nad limit ${TRAVEL_FREE_KM} km)`\n      : `Doprava \u2014 ${travelKm.toFixed(0)} km (${distSrc}) od Fr\u00fddku-M\u00edstku (zdarma do ${TRAVEL_FREE_KM} km)`;\n    linesEl.innerHTML += `<div class=\"pline\"><span>${travelLabel}<\/span><span class=\"amt\">${travelCost>0?fmt(travelCost):0} K\u010d<\/span><\/div>`;\n  }\n  linesEl.innerHTML += `<div class=\"pline sub\"><span>Celkem<\/span><span class=\"amt\">${fmt(subtotal)} K\u010d<\/span><\/div>`;\n\n  document.getElementById('finalPrice').innerHTML = `${fmt(final)} <small>K\u010d<\/small>`;\n\n  const hasCodeDiscount = appliedDiscount.content>0 || appliedDiscount.travel>0;\n  if(hasCodeDiscount || autoDiscount>0){\n    discBlockEl.style.display = 'block';\n    discAmtEl.textContent = `\u2212${fmt(discountAmt)} K\u010d`;\n    const parts = [];\n    (result.autoDiscountParts || []).forEach(p=>{\n      parts.push(`${p.label}: \u2212${fmt(p.amt)} K\u010d`);\n    });\n    if(appliedDiscount.content>0 && appliedDiscount.content===appliedDiscount.travel){\n      parts.push(`Slevov\u00fd k\u00f3d (${(appliedDiscount.content*100).toFixed(0)} %): \u2212${fmt(contentDiscountAmt+travelDiscountAmt)} K\u010d`);\n    } else {\n      if(appliedDiscount.content>0) parts.push(`Sleva na obsah (${(appliedDiscount.content*100).toFixed(0)} %): \u2212${fmt(contentDiscountAmt)} K\u010d`);\n      if(appliedDiscount.travel>0) parts.push(`Sleva na dopravu (${(appliedDiscount.travel*100).toFixed(0)} %): \u2212${fmt(travelDiscountAmt)} K\u010d`);\n    }\n    discNoteEl.innerHTML = parts.join('<br>');\n  } else {\n    discBlockEl.style.display = 'none';\n  }\n}\n\ndocument.getElementById('applyDiscount').addEventListener('click', ()=>{\n  const code = document.getElementById('discountInput').value.trim().toUpperCase();\n  const msg = document.getElementById('discountMsg');\n  if(DISCOUNTS[code]){\n    appliedDiscount = DISCOUNTS[code];\n    msg.textContent = appliedDiscount.content===appliedDiscount.travel\n      ? `K\u00f3d uplatn\u011bn \u2014 sleva ${(appliedDiscount.content*100).toFixed(0)} %`\n      : `K\u00f3d uplatn\u011bn \u2014 sleva ${(appliedDiscount.content*100).toFixed(0)} % na obsah, ${(appliedDiscount.travel*100).toFixed(0)} % na dopravu`;\n    msg.className='discount-msg ok';\n  } else {\n    appliedDiscount = {content:0, travel:0};\n    msg.textContent='Neplatn\u00fd slevov\u00fd k\u00f3d'; msg.className='discount-msg err';\n  }\n  updatePricing();\n});\n\n\/* ---- mod\u00e1l \"Nez\u00e1vazn\u00e1 popt\u00e1vka\" -> Web3Forms ---- *\/\nconst WEB3FORMS_ACCESS_KEY = 'd40d35b4-1245-4513-b776-8c00756b6966';\nconst WEB3FORMS_TO_EMAIL = 'honemdronem@yahoo.com';\n\nconst modalOverlay = document.getElementById('modalOverlay');\nconst orderBtnEl = document.getElementById('orderBtn');\n\norderBtnEl.addEventListener('click', ()=>{\n  if(orderBtnEl.disabled) return;\n  document.getElementById('modalStatus').textContent = '';\n  document.getElementById('modalStatus').className = 'modal-status';\n  modalOverlay.classList.add('show');\n});\ndocument.getElementById('modalClose').addEventListener('click', ()=> modalOverlay.classList.remove('show'));\nmodalOverlay.addEventListener('click', e=>{ if(e.target===modalOverlay) modalOverlay.classList.remove('show'); });\n\n\/* ---- pati\u010dkov\u00e9 odkazy: O n\u00e1s \/ uk\u00e1zky \/ reference \/ FAQ \/ GDPR \/ obchodn\u00ed podm\u00ednky ---- *\/\nconst aboutModal = document.getElementById('aboutModal');\nconst portfolioModal = document.getElementById('portfolioModal');\nconst referenceModal = document.getElementById('referenceModal');\nconst faqModal = document.getElementById('faqModal');\nconst gdprModal = document.getElementById('gdprModal');\nconst termsModal = document.getElementById('termsModal');\ndocument.getElementById('aboutLink').addEventListener('click', e=>{ e.preventDefault(); aboutModal.classList.add('show'); });\ndocument.getElementById('portfolioLink').addEventListener('click', e=>{ e.preventDefault(); portfolioModal.classList.add('show'); });\ndocument.getElementById('referenceLink').addEventListener('click', e=>{ e.preventDefault(); referenceModal.classList.add('show'); });\ndocument.getElementById('faqLink').addEventListener('click', e=>{ e.preventDefault(); faqModal.classList.add('show'); });\ndocument.getElementById('gdprLink').addEventListener('click', e=>{ e.preventDefault(); gdprModal.classList.add('show'); });\ndocument.getElementById('termsLink').addEventListener('click', e=>{ e.preventDefault(); termsModal.classList.add('show'); });\ndocument.querySelectorAll('.legal-modal').forEach(overlay=>{\n  overlay.addEventListener('click', e=>{ if(e.target===overlay) overlay.classList.remove('show'); });\n  overlay.querySelector('[data-close-legal]').addEventListener('click', ()=> overlay.classList.remove('show'));\n});\n\n\/* ---- lightbox: zv\u011bt\u0161en\u00ed fotky z \"Uk\u00e1zky v\u00fdstup\u016f\" po kliknut\u00ed ---- *\/\nconst lightboxOverlay = document.getElementById('lightboxOverlay');\nconst lightboxImg = document.getElementById('lightboxImg');\ndocument.querySelectorAll('.portfolio-photo').forEach(img=>{\n  img.addEventListener('click', ()=>{\n    lightboxImg.src = img.src;\n    lightboxImg.alt = img.alt;\n    lightboxOverlay.classList.add('show');\n  });\n});\nlightboxOverlay.addEventListener('click', ()=> lightboxOverlay.classList.remove('show'));\ndocument.getElementById('lightboxClose').addEventListener('click', e=>{ e.stopPropagation(); lightboxOverlay.classList.remove('show'); });\ndocument.addEventListener('keydown', e=>{ if(e.key==='Escape') lightboxOverlay.classList.remove('show'); });\n\nfunction buildMapLink(){\n  if(polygons.length===0) return null;\n  const features = polygons.map(entry=>{\n    const ring = entry.points.map(p=>[p.lng, p.lat]);\n    ring.push(ring[0]);\n    return {type:'Feature', properties:{}, geometry:{type:'Polygon', coordinates:[ring]}};\n  });\n  const fc = {type:'FeatureCollection', features};\n  return `https:\/\/geojson.io\/#data=data:application\/json,${encodeURIComponent(JSON.stringify(fc))}`;\n}\n\nfunction buildSelectionSummary(){\n  const lines = [];\n  lines.push(`Slu\u017eba: ${document.querySelector('.tab.active').textContent.trim()}`);\n  lines.push(`Vybran\u00e1 plocha: ${document.getElementById('areaVal').textContent.trim()}`);\n  document.querySelectorAll('#priceLines .pline').forEach(el=>{\n    lines.push(el.innerText.replace(\/\\n\/g, ': '));\n  });\n  if(detectedZones.length){\n    lines.push(`Detekovan\u00e9 z\u00f3ny: ${detectedZones.map(z=>z.label).join(', ')}`);\n  }\n  lines.push(`V\u00fdsledn\u00e1 cena: ${document.getElementById('finalPrice').innerText.replace(\/\\n\/g,' ')}`);\n\n  const mapLink = buildMapLink();\n  if(mapLink){\n    lines.push('');\n    lines.push(`Z\u00e1kres na map\u011b (klikni pro zobrazen\u00ed): ${mapLink}`);\n    polygons.forEach((entry,i)=>{\n      const coords = entry.points.map(p=>`${p.lat.toFixed(6)}, ${p.lng.toFixed(6)}`).join(' | ');\n      lines.push(`Objekt ${i+1} \u2014 sou\u0159adnice vrchol\u016f: ${coords}`);\n    });\n  }\n  return lines.join('\\n');\n}\n\ndocument.getElementById('inquiryForm').addEventListener('submit', async (e)=>{\n  e.preventDefault();\n  const statusEl = document.getElementById('modalStatus');\n  const btn = document.getElementById('modalSubmitBtn');\n\n  const payload = {\n    access_key: WEB3FORMS_ACCESS_KEY,\n    subject: 'Nov\u00e1 nez\u00e1vazn\u00e1 popt\u00e1vka \u2014 DRONMETRIE',\n    from_name: document.getElementById('fName').value,\n    to: WEB3FORMS_TO_EMAIL,\n    'Jm\u00e9no a p\u0159\u00edjmen\u00ed': document.getElementById('fName').value,\n    email: document.getElementById('fEmail').value,\n    'Telefon': document.getElementById('fPhone').value || '\u2014',\n    'Zpr\u00e1va': document.getElementById('fMessage').value || '\u2014',\n    'Souhrn popt\u00e1vky (data z kalkula\u010dky)': buildSelectionSummary(),\n  };\n\n  btn.disabled = true;\n  statusEl.textContent = 'Odes\u00edl\u00e1m\u2026';\n  statusEl.className = 'modal-status';\n\n  try{\n    const res = await fetch('https:\/\/api.web3forms.com\/submit', {\n      method: 'POST',\n      headers: {'Content-Type':'application\/json', 'Accept':'application\/json'},\n      body: JSON.stringify(payload)\n    });\n    const data = await res.json();\n    if(data.success){\n      const firstName = (payload['Jm\u00e9no a p\u0159\u00edjmen\u00ed'] || '').trim().split(\/\\s+\/)[0] || '';\n      statusEl.textContent = `D\u00edky${firstName?', '+firstName:''}! Popt\u00e1vku jsme p\u0159ijali a ozveme se v\u00e1m na ${payload.email}.`;\n      statusEl.className = 'modal-status ok';\n      document.getElementById('inquiryForm').reset();\n      setTimeout(()=>modalOverlay.classList.remove('show'), 3600);\n    } else {\n      throw new Error(data.message || 'Odesl\u00e1n\u00ed selhalo');\n    }\n  }catch(err){\n    statusEl.textContent = `Odesl\u00e1n\u00ed se nepovedlo \u2014 napi\u0161te n\u00e1m pros\u00edm p\u0159\u00edmo na ${WEB3FORMS_TO_EMAIL}.`;\n    statusEl.className = 'modal-status err';\n  }\n  btn.disabled = false;\n});\n\ndocument.querySelector('.cfg[data-cfg=\"mapovani\"]').classList.add('show');\nupdateOutputOptions();\nrenderIncludes();\nupdateMapHint();\ndrawScene();\nrenderZones();\nupdatePricing();\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>DRONMETRIE \u2014 kalkulace n\u00e1letu DRONMETRIE \ud83d\udcde Kontakt Telefon +420 776 527 672 E-mail info@flexi-trade.cz Mapov\u00e1n\u00ed Agro Inspekce Termovize 3D sken (LIDAR)p\u0159edobjedn\u00e1vky Z\u00e1kladn\u00ed Satelitn\u00ed Z\u00f3ny na map\u011b \ud83d\udd0d Klik\u00e1n\u00edm vyzna\u010d hranici pozemku \/ haly. Dokon\u010dit oblast uzav\u0159e polygon a spo\u010d\u00edt\u00e1 plochu \u2014 pak m\u016f\u017ee\u0161 nakreslit dal\u0161\u00ed samostatn\u00fd objekt. Vrcholy jde po dokon\u010den\u00ed p\u0159et\u00e1hnout my\u0161\u00ed, kliknut\u00edm na [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>- WordPress Web<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dronmetrie.cz\/?page_id=6\" \/>\n<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"- WordPress Web\" \/>\n<meta property=\"og:description\" content=\"DRONMETRIE \u2014 kalkulace n\u00e1letu DRONMETRIE \ud83d\udcde Kontakt Telefon +420 776 527 672 E-mail info@flexi-trade.cz Mapov\u00e1n\u00ed Agro Inspekce Termovize 3D sken (LIDAR)p\u0159edobjedn\u00e1vky Z\u00e1kladn\u00ed Satelitn\u00ed Z\u00f3ny na map\u011b \ud83d\udd0d Klik\u00e1n\u00edm vyzna\u010d hranici pozemku \/ haly. Dokon\u010dit oblast uzav\u0159e polygon a spo\u010d\u00edt\u00e1 plochu \u2014 pak m\u016f\u017ee\u0161 nakreslit dal\u0161\u00ed samostatn\u00fd objekt. Vrcholy jde po dokon\u010den\u00ed p\u0159et\u00e1hnout my\u0161\u00ed, kliknut\u00edm na [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dronmetrie.cz\/?page_id=6\" \/>\n<meta property=\"og:site_name\" content=\"WordPress Web\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-01T18:01:32+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Odhadovan\u00e1 doba \u010dten\u00ed\" \/>\n\t<meta name=\"twitter:data1\" content=\"8 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dronmetrie.cz\\\/?page_id=6\",\"url\":\"https:\\\/\\\/www.dronmetrie.cz\\\/?page_id=6\",\"name\":\"- WordPress Web\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dronmetrie.cz\\\/#website\"},\"datePublished\":\"2026-11-01T17:58:54+00:00\",\"dateModified\":\"2026-11-01T18:01:32+00:00\",\"inLanguage\":\"cs\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dronmetrie.cz\\\/?page_id=6\"]}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dronmetrie.cz\\\/#website\",\"url\":\"https:\\\/\\\/www.dronmetrie.cz\\\/\",\"name\":\"WordPress Web\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dronmetrie.cz\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"cs\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"- WordPress Web","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dronmetrie.cz\/?page_id=6","og_locale":"cs_CZ","og_type":"article","og_title":"- WordPress Web","og_description":"DRONMETRIE \u2014 kalkulace n\u00e1letu DRONMETRIE \ud83d\udcde Kontakt Telefon +420 776 527 672 E-mail info@flexi-trade.cz Mapov\u00e1n\u00ed Agro Inspekce Termovize 3D sken (LIDAR)p\u0159edobjedn\u00e1vky Z\u00e1kladn\u00ed Satelitn\u00ed Z\u00f3ny na map\u011b \ud83d\udd0d Klik\u00e1n\u00edm vyzna\u010d hranici pozemku \/ haly. Dokon\u010dit oblast uzav\u0159e polygon a spo\u010d\u00edt\u00e1 plochu \u2014 pak m\u016f\u017ee\u0161 nakreslit dal\u0161\u00ed samostatn\u00fd objekt. Vrcholy jde po dokon\u010den\u00ed p\u0159et\u00e1hnout my\u0161\u00ed, kliknut\u00edm na [&hellip;]","og_url":"https:\/\/www.dronmetrie.cz\/?page_id=6","og_site_name":"WordPress Web","article_modified_time":"2026-11-01T18:01:32+00:00","twitter_card":"summary_large_image","twitter_misc":{"Odhadovan\u00e1 doba \u010dten\u00ed":"8 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.dronmetrie.cz\/?page_id=6","url":"https:\/\/www.dronmetrie.cz\/?page_id=6","name":"- WordPress Web","isPartOf":{"@id":"https:\/\/www.dronmetrie.cz\/#website"},"datePublished":"2026-11-01T17:58:54+00:00","dateModified":"2026-11-01T18:01:32+00:00","inLanguage":"cs","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dronmetrie.cz\/?page_id=6"]}]},{"@type":"WebSite","@id":"https:\/\/www.dronmetrie.cz\/#website","url":"https:\/\/www.dronmetrie.cz\/","name":"WordPress Web","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dronmetrie.cz\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"cs"}]}},"_links":{"self":[{"href":"https:\/\/www.dronmetrie.cz\/index.php?rest_route=\/wp\/v2\/pages\/6","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dronmetrie.cz\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.dronmetrie.cz\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.dronmetrie.cz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dronmetrie.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6"}],"version-history":[{"count":2,"href":"https:\/\/www.dronmetrie.cz\/index.php?rest_route=\/wp\/v2\/pages\/6\/revisions"}],"predecessor-version":[{"id":10,"href":"https:\/\/www.dronmetrie.cz\/index.php?rest_route=\/wp\/v2\/pages\/6\/revisions\/10"}],"wp:attachment":[{"href":"https:\/\/www.dronmetrie.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}