Sync from GitHub via hub-sync
Browse files- index.html +1 -0
- port_hf.js +18 -2
- style.css +9 -2
index.html
CHANGED
|
@@ -477,6 +477,7 @@
|
|
| 477 |
<p class="rv-picker-sub">Your online robots appear below</p>
|
| 478 |
</div>
|
| 479 |
<div id="rv-robot-list" class="rv-robot-list"></div>
|
|
|
|
| 480 |
</div>
|
| 481 |
|
| 482 |
<!-- State 3: Monitoring UI -->
|
|
|
|
| 477 |
<p class="rv-picker-sub">Your online robots appear below</p>
|
| 478 |
</div>
|
| 479 |
<div id="rv-robot-list" class="rv-robot-list"></div>
|
| 480 |
+
<button id="rv-connect-btn" class="cta-button" style="margin-top:1.25rem;display:none">Connect →</button>
|
| 481 |
</div>
|
| 482 |
|
| 483 |
<!-- State 3: Monitoring UI -->
|
port_hf.js
CHANGED
|
@@ -506,11 +506,27 @@ async function setupRobot() {
|
|
| 506 |
list.innerHTML = '<p class="rv-no-robots">No robots online. Make sure your robot daemon is running and connected.</p>';
|
| 507 |
return;
|
| 508 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 509 |
robots.forEach(r => {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 510 |
const btn = document.createElement('button');
|
| 511 |
btn.className = 'rv-robot-btn';
|
| 512 |
-
btn.innerHTML = `🤖 <strong>${
|
| 513 |
-
btn.addEventListener('click', () =>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 514 |
list.appendChild(btn);
|
| 515 |
});
|
| 516 |
});
|
|
|
|
| 506 |
list.innerHTML = '<p class="rv-no-robots">No robots online. Make sure your robot daemon is running and connected.</p>';
|
| 507 |
return;
|
| 508 |
}
|
| 509 |
+
let selectedRobotId = null;
|
| 510 |
+
const connectBtn = document.getElementById('rv-connect-btn');
|
| 511 |
+
connectBtn.style.display = 'none';
|
| 512 |
+
connectBtn.onclick = null;
|
| 513 |
+
|
| 514 |
robots.forEach(r => {
|
| 515 |
+
const name = r.meta?.name || r.id;
|
| 516 |
+
const n = name.toLowerCase();
|
| 517 |
+
const mode = n.includes('sim') || n.includes('mockup') ? '🖥 Simulation'
|
| 518 |
+
: n.includes('wireless') || n.includes('wifi') ? '📡 Wireless'
|
| 519 |
+
: '🔌 Lite';
|
| 520 |
const btn = document.createElement('button');
|
| 521 |
btn.className = 'rv-robot-btn';
|
| 522 |
+
btn.innerHTML = `🤖 <strong>${name}</strong><span class="rv-robot-mode">${mode}</span>`;
|
| 523 |
+
btn.addEventListener('click', () => {
|
| 524 |
+
list.querySelectorAll('.rv-robot-btn').forEach(b => b.classList.remove('selected'));
|
| 525 |
+
btn.classList.add('selected');
|
| 526 |
+
selectedRobotId = r.id;
|
| 527 |
+
connectBtn.style.display = '';
|
| 528 |
+
connectBtn.onclick = () => startSession(selectedRobotId);
|
| 529 |
+
});
|
| 530 |
list.appendChild(btn);
|
| 531 |
});
|
| 532 |
});
|
style.css
CHANGED
|
@@ -1991,17 +1991,24 @@ h4, h5, h6, strong {
|
|
| 1991 |
font-family: 'Inter', sans-serif;
|
| 1992 |
}
|
| 1993 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1994 |
.rv-robot-btn:hover {
|
| 1995 |
border-color: var(--coral);
|
| 1996 |
box-shadow: 0 4px 16px rgba(255,107,74,0.15);
|
| 1997 |
transform: translateY(-1px);
|
| 1998 |
}
|
| 1999 |
|
| 2000 |
-
.rv-robot-
|
| 2001 |
margin-left: auto;
|
| 2002 |
font-size: 0.75rem;
|
| 2003 |
color: var(--text-muted);
|
| 2004 |
-
|
|
|
|
|
|
|
| 2005 |
}
|
| 2006 |
|
| 2007 |
.rv-no-robots {
|
|
|
|
| 1991 |
font-family: 'Inter', sans-serif;
|
| 1992 |
}
|
| 1993 |
|
| 1994 |
+
.rv-robot-btn.selected {
|
| 1995 |
+
border-color: var(--coral);
|
| 1996 |
+
background: rgba(255, 107, 74, 0.08);
|
| 1997 |
+
}
|
| 1998 |
+
|
| 1999 |
.rv-robot-btn:hover {
|
| 2000 |
border-color: var(--coral);
|
| 2001 |
box-shadow: 0 4px 16px rgba(255,107,74,0.15);
|
| 2002 |
transform: translateY(-1px);
|
| 2003 |
}
|
| 2004 |
|
| 2005 |
+
.rv-robot-mode {
|
| 2006 |
margin-left: auto;
|
| 2007 |
font-size: 0.75rem;
|
| 2008 |
color: var(--text-muted);
|
| 2009 |
+
background: rgba(255,255,255,0.06);
|
| 2010 |
+
padding: 0.2rem 0.5rem;
|
| 2011 |
+
border-radius: 100px;
|
| 2012 |
}
|
| 2013 |
|
| 2014 |
.rv-no-robots {
|