<?php if (!defined('DASHBOARD_ROOT')) { http_response_code(403); exit; } RBAC::enforce('view.fleet'); ?> <link rel="stylesheet" href="assets/css/topology.css" nonce="<?= $cspNonce ?? '' ?>"> <div class="workspace" id="ws-topology"> <div class="workspace-header"> <h1>Fleet Topology</h1> <div class="header-actions"> <button class="btn-ghost" id="topo-ping-btn" data-topo-action="ping"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg> Ping All</button> <button class="btn-ghost" data-topo-action="refresh"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M23 4v6h-6"/><path d="M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg> Refresh</button> <button class="btn-primary" data-topo-action="add">+ Add Node</button> </div> </div> <?php require_once __DIR__.'/../modules/fleet/topology_map.php'; ?> <?php require_once __DIR__.'/../modules/fleet/topology_table.php'; ?> <?php require_once __DIR__.'/../modules/fleet/topology_modal.php'; ?> </div> <script src="/assets/js/topology.js" nonce="<?= $cspNonce ?? '' ?>" data-api="<?= htmlspecialchars(rtrim(dirname($_SERVER['SCRIPT_NAME']), '/')) ?>/api/fleet/topology.php"></script>