Files
opencode-krates-connector/design/spotlight.md
Hermes Agent 78f19cde7d feat: Add comprehensive design documentation for Krates
- Canvas: Infinite zoomable workspace with LOD and navigation
- Spotlight: Fuzzy search with type filters and view shortcuts
- Krate: Window group container with non-overlapping placement
- Detail Window: YAML/Describe/Logs/Shell views with maximize
- Top Bar: Cluster info, user presence, admin toggle
- Admin Drawer: Multi-user presence and spectate functionality
- Minimap: Browse and navigate canvas overview
- Collection Window: List/tree views with filtering and sorting
- Shell/Logs: Real-time terminal and log streaming
- Backend: Go service with K8s API, WebSocket handlers, CRDT sync
- Architecture: Full project structure and tech stack
2026-06-16 08:32:47 -04:00

4.5 KiB
Raw Blame History

Spotlight Search Feature Specification

Overview

The spotlight is the global search overlay that allows users to find any Kubernetes object or existing krate. It provides fuzzy-ranked search results with quick view shortcuts.

Core Responsibilities

  • Display search results ranked by fuzzy matching
  • Support typed filters (Tab to cycle through types)
  • Provide view shortcuts (Logs, Shell, Describe, YAML)
  • Auto-close after keyboard idle and open selected object

UI Components

Layout

  • Full-screen backdrop: rgba(7,9,13,.55), backdrop-filter: blur(2px)
  • Search panel: width: min(660px, 93vw), top: 15%, centered horizontally
  • Panel: background: rgba(16,20,28,.97), border: 1px solid rgba(140,165,200,.26), border-radius: 14px

Sections (top→bottom)

  1. Input row (~52px):

    • glyph (accent color)
    • Optional type-filter pill
    • Input field (font-size: 18px, IBM Plex Sans)
    • Optional Tab ghost hint
  2. Type chips row (scrollable):

    • All / deploy / svc / pods / secrets / config / sts / crd / namespace / ns
    • Scrollable horizontally on small screens
    • Shows selected filter as pill
  3. Results list (max-height: 48vh, overflow: auto):

    • Each row: shape glyph + name + subtext (type · ns/namespace) + CRD badge + type badge
    • Selected row highlight: accent background
    • Scrollbar styled (8px, rgba(140,165,200,.18))
  4. View chips (expanded on selected row only):

    • ⌥L logs · ⌥S shell · ⌥D describe · ⌥Y yaml
    • Only available views shown (YAML and Describe always shown; Logs and Shell for pods/deployments/daemonsets/statefulsets)
    • Click to open that view for selected result
  5. Footer:

    • ↑↓ pick · ⌥L/S/D/Y open views · ⏎ open default · ⇥ filter type · esc done

Fuzzy Search Algorithm

Scoring Formula

Score = character-match score × 10 + type boost

Type Boosts

  • CRD: 60
  • Deployment: 50
  • StatefulSet: 48
  • Service: 46
  • DaemonSet: 44
  • Ingress: 42
  • Secret: 24
  • ConfigMap: 22
  • PVC: 18
  • Pod: 16

Character Matching

  • Sequential character match
  • Bonus for consecutive matches: +3
  • Bonus for word-boundary starts: +5

Results

  • Capped at 8 results
  • Debounce: 16ms (one animation frame) for performance with large datasets

Type Filter

Tab Quick-Filter

  • Typing type alias (e.g., pod, svc) shows ghost hint: ⇥ Pods
  • Tab locks filter as pill
  • Backspace removes filter (only when empty query and filter active)
  • Tab cycles through type filters (most-recently-opened first)

View Shortcuts

Key Mapping

All use ⌥ (Alt/Option), NOT Ctrl (reserved for terminal):

  • ⌥L = logs
  • ⌥S = shell
  • ⌥D = describe
  • ⌥Y = yaml

Implementation

  • Use event.code (layout-safe, e.g., KeyL), not event.key
  • Multiple views can be opened before closing spotlight
  • Views stack as windows in one krate

Keyboard Navigation

Key Context Action
↑ / ↓ Spotlight Navigate results
Tab Spotlight Apply type filter / cycle filters
Backspace Spotlight (empty query, filter active) Clear type filter
Enter Spotlight (result selected) Open default view + close
⌥L/S/D/Y Spotlight Open that view for selected result
Esc Spotlight Close spotlight

Auto-Close Behavior

  • After 500ms of keyboard idle (no more keypresses)
  • Spotlight closes automatically
  • Camera flies to the newly created krate
  • Debounce timer resets on each keypress

Search Results Include

  • Existing krates (jump to working set, camera flies there)
  • Namespace results (ns/payments) → opens collection window
  • Category results (All Pods, All Services) → opens collection window
  • Kubernetes objects: pods, deployments, services, secrets, configmaps, etc.

State

interface SpotlightState {
  open: boolean;
  query: string;
  filterType: string | null;
  sel: number;                 // selected result index
  navigated: boolean;          // true after ↑/↓ press
  session: {                   // tracks views opened before closing
    kid: string;
    objId: string;
    views: string[];
  } | null;
}

Gotchas

  1. Fuzzy search speed: For real clusters with thousands of objects, debounce by 16ms or run in Web Worker
  2. View shortcuts: Must use event.code for layout safety across OS/keyboard layouts
  3. Auto-close timer: Reset on each keypress, don't close during active typing
  4. Pre-seeding: All printable characters (not just letters) should pre-seed spotlight