5.2 KiB
5.2 KiB
Design Document: Spotlight Feature Specification
Overview
Spotlight is the universal search and discovery interface that allows users to quickly find and create krates for Kubernetes resources. It's triggered by clicking the canvas or typing any character.
Core Responsibilities
- Handle universal search across Kubernetes resources
- Support fuzzy matching of names, namespaces, labels
- Allow quick creation of krates from search results
- Support filtering by resource type
Trigger
- Click on empty canvas: Open spotlight
- Type any key: Open spotlight with that character pre-seeded
- Esc key: Close spotlight
- Spotlight open: Prevent canvas shortcuts from triggering
Spotlight Anatomy
Search Input
- Position: Top of spotlight panel
- Auto-focused on open
- Placeholder:
Search... - Clear on Esc
- Debounced: 16ms for fuzzy search
Filter Bar
- Location: Below search input
- Filter chips: All, Krates, Namespaces, Pods, Deployments, Services
- Click filter: Apply filter
- Click active filter: Clear filter
Results List
- Position: Below filter bar
- Max height: ~400px
- Scrollable
- Results: Search results + quick actions
- Keyboard navigation: ↑↓ to navigate, Enter to select, Esc to close
Results Item
Content per item:
- Shape glyph (8px, color-coded by type)
- Name (primary text)
- Type badge (muted color)
- Namespace (muted, optional)
- View shortcuts:
L,S,D,Y - Hover: Highlight, show view shortcut tooltips
Search Implementation
Fuzzy Algorithm
function fuzzy(query: string, text: string): number {
// Prefer starts-with matches
if (text.toLowerCase().startsWith(query.toLowerCase())) {
return 1 - query.length / text.length
}
// Then scoring based on character matching
let score = 0
let queryIndex = 0
for (let i = 0; i < text.length && queryIndex < query.length; i++) {
if (text[i].toLowerCase() === query[queryIndex].toLowerCase()) {
score++
queryIndex++
}
}
return score / query.length
}
Search Scope
- Namespaces
- Pods
- Deployments
- Services
- ConfigMaps
- Secrets
- Krates (created by user)
Resource Discovery
- Initial load: Fetch all resources from
/api/resources - Real-time updates: WebSocket
/ws/watchfor changes - Local cache: Store in Zustand krateStore
- Filtering: Apply fuzzy search + type filter
Results Organization
Search vs Quick Actions
- Search results: Resource matches (top section)
- Quick actions: Create new krate, open specific view (bottom section)
Quick Actions
Create krate for ns/{namespace}All podsAll servicesAll deploymentsSearch again for...
Keyboard Navigation
| Key | Context | Action |
|---|---|---|
| ↑ / ↓ | Spotlight open | Move selection |
| PageUp / PageDown | Spotlight open | Page navigation |
| Home / End | Spotlight open | First / last item |
| Enter | Item selected | Create krate / open resource |
| Esc | Spotlight open | Close spotlight |
| Space | Input focused | Search space character |
| Ctrl+K | Anywhere | Open spotlight |
| / | Anywhere | Open spotlight |
View Shortcuts
All use Option/Alt key:
⌥L: Open logs view (if supported)⌥S: Open shell view (if supported)⌥D: Open describe view⌥Y: Open YAML view
Krate Creation Flow
- User selects resource from spotlight
- Create new krate with:
- Title: Resource name
- Color: Namespace color palette
- Position: Find non-overlapping location
- Windows: Create detail windows for selected views
- Fly camera to new krate
- Zoom to 0.92
State Management
Spotlight State
interface SpotlightState {
open: boolean;
query: string;
filterType: string | null;
sel: number;
navigated: boolean;
}
type FilterType = 'all' | 'krate' | 'namespace' | 'pod' | 'deployment' | 'service'
Search State
interface SearchState {
results: SearchResult[];
loading: boolean;
error: string | null;
}
interface SearchResult {
id: string;
type: string;
name: string;
namespace?: string;
score: number;
icon: string;
}
Visual Design
Spotlight Panel
- Position: Fixed, centered horizontally at top of canvas
- Width: 600px
- Max height: 500px
- Background:
#1a1e26 - Border:
1px solid rgba(140,165,200,0.18) - Border-radius: 12px
- Shadow:
0 10px 40px rgba(0,0,0,0.5)
Results Item
- Hover background:
rgba(255,255,255,0.04) - Selected:
accentDim(subtle accent color) - Left border: 2px solid accent when selected
- Padding: 8px 12px
- Font-size: 14px
Color Palette (by namespace)
default:#6fb1ffkube-system:#9c88ffkube-public:#4dd6e8- Custom namespaces: Pick from palette
Gotchas
- Space character: When spotlight open, space goes to search (not canvas pan)
- Esc handling: Must be handled in spotlight, not propagate to canvas
- Fuzzy search: Use debounced search for large datasets
- Keyboard routing: When spotlight open, route keys to spotlight, not canvas
- Focus management: Auto-focus input, trap Tab cycle when open
- Selection reset: Reset selection on query change
Future Enhancements
- Quick pick recent resources
- Star/favorite resources
- Saved searches
- Search history
- Resource previews
- Multi-resource selection