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 */}
-
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 */}
-
-
- .
-
-
- .
-
-
- .
-
+ {/* typewriter ellipsis: 1 → 2 → 3 dots, looping */}
+
+ {'.'.repeat(dotCount)}
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 (
-
+ {/* Native Cmd/Ctrl+V pastes into the terminal, so no dedicated paste button. */}
{fullscreenHref && (