diff --git a/frontend/src/routes/lesson/[slug]/DeployTab.svelte b/frontend/src/routes/lesson/[slug]/DeployTab.svelte
index 6876215..ebc6fde 100644
--- a/frontend/src/routes/lesson/[slug]/DeployTab.svelte
+++ b/frontend/src/routes/lesson/[slug]/DeployTab.svelte
@@ -60,14 +60,10 @@
return () => mq.removeEventListener('change', handler);
});
- function detectMode() {
- usbSupported = typeof navigator !== 'undefined' && 'serial' in navigator;
- isDesktop = typeof window !== 'undefined' && window.matchMedia('(min-width: 1024px)').matches;
- if (usbSupported && isDesktop) {
- deployMode = 'usb';
- } else {
- deployMode = 'ble';
- }
+ function detectDeviceMode(): DeployMode {
+ const hasWebSerial = typeof navigator !== 'undefined' && 'serial' in navigator;
+ const isDesktop = typeof window !== 'undefined' && window.matchMedia('(hover: hover)').matches;
+ return hasWebSerial && isDesktop ? 'usb' : 'ble';
}
function createDeployer(mode: DeployMode): HardwareDeployer {
@@ -76,7 +72,8 @@
}
function initDeployer() {
- detectMode();
+ deployMode = detectDeviceMode();
+ usbSupported = typeof navigator !== 'undefined' && 'serial' in navigator;
deployer = createDeployer(deployMode);
bleSupported = deployer.checkSupport();
if (!bleSupported) {
@@ -296,24 +293,6 @@
{deployMode === 'usb' ? 'USB Deployer' : 'BLE Deployer'}
- {#if usbSupported && isDesktop}
-
-
-
-
- {/if}
{isPaired ? (deployer?.deviceName ? `Terhubung (${deployer.deviceName})` : 'Terhubung') : 'Terputus'}
@@ -359,6 +338,20 @@
{#if !serialActive}
@@ -622,4 +620,54 @@
.mode-btn:not(.active):hover {
background: #e5e7eb;
}
+
+ .mode-toggle-inline {
+ display: flex;
+ gap: 2px;
+ border-radius: 4px;
+ overflow: hidden;
+ border: 1px solid #d1d5db;
+ padding: 2px;
+ }
+
+ .mode-chip {
+ padding: 2px 8px;
+ font-size: 0.7rem;
+ background: #f9fafb;
+ border: none;
+ cursor: pointer;
+ transition: all 0.15s;
+ color: #374151;
+ }
+
+ .mode-chip.active {
+ background: #3b82f6;
+ color: white;
+ }
+
+ .mode-chip:not(.active):hover {
+ background: #e5e7eb;
+ }
+
+ .deploy-fab {
+ background: #22c55e;
+ border: none;
+ border-radius: 50%;
+ width: 28px;
+ height: 28px;
+ cursor: pointer;
+ font-size: 14px;
+ color: white;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-left: auto;
+ transition: all 0.2s;
+ flex-shrink: 0;
+ }
+
+ .deploy-fab:hover {
+ background: #16a34a;
+ transform: scale(1.05);
+ }