<?php if (!defined('DASHBOARD_ROOT')) { http_response_code(403); exit; } ?> <div id="topo-modal" class="modal-overlay" style="display:none"> <div class="modal-box modal-wide"> <div class="modal-header"> <h3 id="topo-modal-title">Add Node</h3> <button data-topo-action="close-modal">&times;</button> </div> <div class="modal-body topo-form-grid"> <input type="hidden" id="tf-id"> <label>Node Name<input type="text" id="tf-name" placeholder="Origin"></label> <label>Role<select id="tf-role"> <option value="origin">Origin</option><option value="shield">Shield</option> <option value="dns">DNS</option><option value="proxy">Proxy</option> <option value="filter">Filter</option><option value="payment">Payment</option> <option value="email">Email</option><option value="other">Other</option> </select></label> <label>Public IP<input type="text" id="tf-pubip" placeholder="x.x.x.x (encrypted)"></label> <label>WireGuard IP<input type="text" id="tf-wgip" placeholder="10.x.x.x (encrypted)"></label> <label>SSH Port<input type="number" id="tf-ssh" value="22"></label> <label>API Port<input type="number" id="tf-api" placeholder="Optional"></label> <label>Provider<input type="text" id="tf-provider" placeholder="Hetzner (encrypted)"></label> <label>Datacenter<input type="text" id="tf-dc" placeholder="Nuremberg (encrypted)"></label> <label>City<input type="text" id="tf-city" placeholder="Frankfurt (encrypted)"></label> <label>Country<input type="text" id="tf-country" maxlength="2" placeholder="DE"></label> <label>OS<input type="text" id="tf-os" placeholder="AlmaLinux 9 (encrypted)"></label> <label>CPU Cores<input type="number" id="tf-cpu" placeholder="4"></label> <label>RAM (GB)<input type="number" id="tf-ram" placeholder="8"></label> <label>Disk (GB)<input type="number" id="tf-disk" placeholder="160"></label> <label>Cost (CAD/mo)<input type="number" step="0.01" id="tf-cost" placeholder="25.00 (encrypted)"></label> <label>Payment Method<input type="text" id="tf-pay" placeholder="Crypto (encrypted)"></label> <label>Renewal Date<input type="date" id="tf-renew"></label> <label>WG Peers<input type="text" id="tf-peers" placeholder="Shield,DNS (encrypted)"></label> <label>Standby For<select id="tf-standby"><option value="">None</option></select></label> <label class="full-width">Notes<textarea id="tf-notes" rows="2" placeholder="Encrypted notes"></textarea></label> </div> <div class="modal-footer"> <button class="btn-ghost btn-danger" id="topo-delete-btn" style="display:none" data-topo-action="delete">Delete Node</button> <button class="btn-ghost" data-topo-action="close-modal">Cancel</button> <button class="btn-primary" data-topo-action="save">Save (Encrypted)</button> </div> </div> </div>