diff --git a/apps/dashboard/src/components/BoxTable/index.tsx b/apps/dashboard/src/components/BoxTable/index.tsx index 27f85d1f9..573c96ef2 100644 --- a/apps/dashboard/src/components/BoxTable/index.tsx +++ b/apps/dashboard/src/components/BoxTable/index.tsx @@ -63,7 +63,7 @@ function statusOf(box: Box): { label: string; color: string } { // Proportional columns so the gaps stay even as the table widens, instead of // dumping all the slack into the Name column. -const GRID = 'grid-cols-[2fr_1.3fr_1fr_1.7fr_1fr_120px] gap-x-4' +const GRID = 'grid-cols-[2fr_1.3fr_1fr_120px] gap-x-4' function IconButton({ title, @@ -188,8 +188,6 @@ export function BoxTable({ Name Box ID Status - Resource Quota - Created Actions @@ -213,7 +211,6 @@ export function BoxTable({ data.map((box) => { const st = statusOf(box) const name = getBoxDisplayName(box) - const created = getRelativeTimeString(box.createdAt).relativeTimeString.toUpperCase() const busy = boxIsLoading[box.id] const transitioning = boxStateIsTransitioning[box.id] @@ -242,16 +239,6 @@ export function BoxTable({ {st.label} - {/* resource quota */} -
- - - -
- - {/* created */} - {created} - {/* actions */}
e.stopPropagation()}> {renderActions(box)} diff --git a/apps/dashboard/src/components/LoadingFallback.tsx b/apps/dashboard/src/components/LoadingFallback.tsx index 5bc4fd495..0bb6deedf 100644 --- a/apps/dashboard/src/components/LoadingFallback.tsx +++ b/apps/dashboard/src/components/LoadingFallback.tsx @@ -11,6 +11,7 @@ import { useEffect, useState } from 'react' // pixel/mono aesthetic instead of a generic skeleton shell. const LoadingFallback = () => { const [showLongLoadingMessage, setShowLongLoadingMessage] = useState(false) + const [dotCount, setDotCount] = useState(1) useEffect(() => { const timer = setTimeout(() => { @@ -20,6 +21,12 @@ const LoadingFallback = () => { return () => clearTimeout(timer) }, []) + // Typewriter ellipsis: cycle 1 → 2 → 3 dots and back, a touch retro. + useEffect(() => { + const id = setInterval(() => setDotCount((d) => (d % 3) + 1), 400) + return () => clearInterval(id) + }, []) + return (
@@ -30,17 +37,9 @@ const LoadingFallback = () => { style={{ boxShadow: '0 0 12px hsl(var(--brand))' }} /> booting console - {/* animated ellipsis */} -
diff --git a/apps/dashboard/src/components/boxes/BoxTerminalFrame.tsx b/apps/dashboard/src/components/boxes/BoxTerminalFrame.tsx index b187eb0bb..36a1c1285 100644 --- a/apps/dashboard/src/components/boxes/BoxTerminalFrame.tsx +++ b/apps/dashboard/src/components/boxes/BoxTerminalFrame.tsx @@ -5,10 +5,10 @@ import { Button } from '@/components/ui/button' import { cn } from '@/lib/utils' -import { ClipboardPaste, Maximize2 } from '@/components/ui/icon' +import { Maximize2 } from '@/components/ui/icon' import { useEffect, useRef, type SyntheticEvent } from 'react' import { Link } from 'react-router-dom' -import { buildTerminalIframeSrc, pasteIntoTerminalIframe, registerActiveTerminalFrame } from './terminalIframeSrc' +import { buildTerminalIframeSrc, registerActiveTerminalFrame } from './terminalIframeSrc' interface BoxTerminalFrameProps { sessionUrl: string @@ -17,16 +17,9 @@ interface BoxTerminalFrameProps { } export function BoxTerminalFrame({ sessionUrl, fullscreenHref, className }: BoxTerminalFrameProps) { - const frameRef = useRef(null) const deregisterRef = useRef<(() => void) | null>(null) const iframeSrc = buildTerminalIframeSrc(sessionUrl) - const handlePaste = async () => { - const frame = frameRef.current?.contentWindow - if (!frame) return - await pasteIntoTerminalIframe(frame, sessionUrl) - } - const handleLoad = (event: SyntheticEvent) => { const frame = event.currentTarget.contentWindow if (!frame) return @@ -44,23 +37,12 @@ export function BoxTerminalFrame({ sessionUrl, fullscreenHref, className }: BoxT return (