- Clarify localStorage-only preferences (no server persistence) - Expand category tiles including future ones (weather, sports, crypto) - Define filter UI options with query params (time range, result type) - Add mobile breakpoints and collapse behavior - Reduce quick popover to theme + engines only - Rename Preferences Sidebar to Preferences Nav - Add results count format specification - Add sticky positioning CSS for left sidebar Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
328 lines
14 KiB
Markdown
328 lines
14 KiB
Markdown
# Brave Search Frontend Redesign — Design Specification
|
|
|
|
## Overview
|
|
|
|
Redesign the kafka frontend to match Brave Search's clean, functional aesthetic with emphasis on layout changes: three-column results page, category tiles on homepage, and a hybrid preferences system with full-page `/preferences` route.
|
|
|
|
## Design Principles
|
|
|
|
1. **Brave-like layout** — Three-column results, full-page preferences, homepage tiles
|
|
2. **Preserve existing design tokens** — Keep current CSS variables (colors, spacing, radii)
|
|
3. **CSS Grid for layout** — Three-column grid for results, flexible layouts elsewhere
|
|
4. **Hybrid preferences** — Quick popover for common settings (theme + engines), full `/preferences` page for all options
|
|
5. **Minimal HTML changes** — Restructure templates where needed for layout, reuse existing partials
|
|
6. **localStorage-only preferences** — No server-side persistence; all preferences stored in browser localStorage
|
|
|
|
---
|
|
|
|
## 1. Homepage Redesign
|
|
|
|
### Current State
|
|
- Centered hero with logo, tagline, and search box
|
|
- No visual categorization of search types
|
|
|
|
### New Layout
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ [Logo] [⚙ Preferences]│
|
|
├─────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ [🔍 Search Box] │
|
|
│ │
|
|
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
|
|
│ │ News │ │ Images │ │ Videos │ │ Maps │ ... │
|
|
│ └────────┘ └────────┘ └────────┘ └────────┘ │
|
|
│ │
|
|
│ "Search the web privately..." │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Implementation
|
|
- **File:** `internal/views/templates/index.html`
|
|
- **Structure:** Search hero + category tiles grid
|
|
- **Tiles:** Static links to `/search?q=...` with category parameter (e.g., `&category=images`)
|
|
- **Styling:** Grid of icon+label cards below search box, subtle hover effects
|
|
|
|
### Category Tiles
|
|
| Category | Icon | Notes |
|
|
|----------|------|-------|
|
|
| All | 🌐 | Default, no category param |
|
|
| News | 📰 | |
|
|
| Images | 🖼️ | |
|
|
| Videos | 🎬 | |
|
|
| Maps | 🗺️ | |
|
|
| Shopping | 🛒 | Future: connect to shopping engine |
|
|
| Music | 🎵 | Future: connect to music engine |
|
|
| Weather | 🌤️ | Future: connect to weather API |
|
|
| Sports | ⚽ | Future |
|
|
| Cryptocurrency | ₿ | Future |
|
|
|
|
Categories marked "Future" are included in the UI but may not have backend support yet. Category tiles that lack backend support display grayed out with a "Coming soon" tooltip.
|
|
|
|
---
|
|
|
|
## 2. Results Page — Three-Column Layout
|
|
|
|
### Current State
|
|
- Two columns: compact search bar spanning top, main results + right sidebar
|
|
|
|
### New Layout
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ [Logo] [⚙ Preferences]│
|
|
├─────────────────────────────────────────────────────────────┤
|
|
│ ┌─────────┐ ┌────────────────────────────┐ ┌──────────┐│
|
|
│ │ Nav │ │ 🔍 [ Search Input ] │ │ Related ││
|
|
│ │ ─────── │ └────────────────────────────┘ │ Searches ││
|
|
│ │ All │ About 1,240 results (0.42s) │ ││
|
|
│ │ Images │ ┌──────────────────────────┐ │ │ ─────── ││
|
|
│ │ Videos │ │ Result Card │ │ │ Suggestions│
|
|
│ │ News │ │ Title, URL, Description │ │ │ ││
|
|
│ │ Maps │ └──────────────────────────┘ │ └──────────┘│
|
|
│ │ Shopping│ ┌──────────────────────────┐ │ │
|
|
│ │ ... │ │ Result Card │ │ │
|
|
│ │ │ │ ... │ │ │
|
|
│ │ ─────── │ └──────────────────────────┘ │ │
|
|
│ │ Filters │ ... │ │
|
|
│ │ Time │ │ │
|
|
│ │ Type │ [Pagination] │ │
|
|
│ └─────────┘ │ │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Implementation
|
|
- **Files:** `internal/views/templates/results.html`, `internal/views/templates/base.html`
|
|
- **Left Sidebar (desktop, sticky):**
|
|
- Category navigation links (All, Images, Videos, News, Maps, Shopping, Music, Weather)
|
|
- Filters section (Time range, Result type) — collapsible
|
|
- Hidden on mobile (< 768px)
|
|
|
|
- **Center Column:**
|
|
- Compact search bar
|
|
- Results count meta: "About {n} results ({time}s)"
|
|
- Result cards (unchanged markup)
|
|
- Pagination
|
|
|
|
- **Right Sidebar:**
|
|
- Related searches (existing suggestions)
|
|
- Additional panels as needed
|
|
|
|
### Filters
|
|
**Time Range Options:**
|
|
| Label | Query Param |
|
|
|-------|-------------|
|
|
| Any time | (none) |
|
|
| Past hour | `&time=h` |
|
|
| Past 24 hours | `&time=d` |
|
|
| Past week | `&time=w` |
|
|
| Past month | `&time=m` |
|
|
| Past year | `&time=y` |
|
|
|
|
**Result Type Options:**
|
|
| Label | Query Param |
|
|
|-------|-------------|
|
|
| All results | (none) |
|
|
| News | `&type=news` |
|
|
| Videos | `&type=video` |
|
|
| Images | `&type=image` |
|
|
|
|
Filter state persists in URL query params and is preserved across HTMX navigation via `hx-include`.
|
|
|
|
### Mobile Behavior
|
|
| Breakpoint | Layout |
|
|
|------------|--------|
|
|
| < 768px | Single column, no left sidebar |
|
|
| 768px - 1024px | Two columns (center + right sidebar), no left nav |
|
|
| > 1024px | Full three columns |
|
|
|
|
On mobile (< 768px):
|
|
- Category filters accessible via a horizontal scrollable chip row above results
|
|
- Both sidebars hidden
|
|
- Search bar full-width
|
|
|
|
---
|
|
|
|
## 3. Preferences Page — Full-Page Hybrid
|
|
|
|
### Current State
|
|
- Popover triggered by gear icon in header
|
|
- JavaScript-rendered from localStorage
|
|
- Sections: Appearance, Engines, Search Defaults
|
|
|
|
### New Layout
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ [Logo] [⚙ Preferences]│
|
|
├─────────────────────────────────────────────────────────────┤
|
|
│ ┌────────────────┐ ┌─────────────────────────────────────┐│
|
|
│ │ Nav │ │ Content ││
|
|
│ │ ───────────── │ │ ││
|
|
│ │ Search │ │ [Section Content] ││
|
|
│ │ Privacy │ │ ││
|
|
│ │ Tabs │ │ ││
|
|
│ │ Appearance │ │ ││
|
|
│ │ Sidebar │ │ ││
|
|
│ │ Content │ │ ││
|
|
│ │ Languages │ │ ││
|
|
│ │ Regional │ │ ││
|
|
│ └────────────────┘ └─────────────────────────────────────┘│
|
|
└─────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Sections (Brave-style)
|
|
1. **Search** — Default engine, safe search, language
|
|
2. **Privacy** — Tracking protection toggle (UI only, always on), request DNT header toggle
|
|
3. **Tabs** — New tab behavior (placeholder section)
|
|
4. **Appearance** — Theme (Light/Dark/System), results font size
|
|
5. **Sidebar** — Sidebar visibility toggle
|
|
6. **Content** — Filter explicit results (SafeSearch), auto-play media toggle
|
|
7. **Languages** — UI language (English only for now), search language
|
|
8. **Regional** — Region/Country, timezone (placeholder)
|
|
|
|
### Implementation
|
|
- **Route:** Add `GET /preferences` and `POST /preferences` to `internal/httpapi/`
|
|
- **Template:** `internal/views/templates/preferences.html`
|
|
- **Storage:** localStorage-only. GET handler renders page shell, JavaScript populates form values from localStorage. POST handler receives form data, writes to localStorage, re-renders page.
|
|
- **Quick Settings Popover:** Keep existing popover for **theme toggle and engine toggles only** (lightweight, localStorage). SafeSearch and Format settings move exclusively to full preferences page.
|
|
- **Styling:** Match existing design tokens, section headers, form controls
|
|
|
|
### Preferences Nav (Mobile)
|
|
- Horizontal scrollable nav on mobile (< 768px)
|
|
- Active section highlighted
|
|
|
|
---
|
|
|
|
## 4. Component Changes
|
|
|
|
### Header
|
|
- Logo + site name (unchanged)
|
|
- Preferences button (unchanged)
|
|
|
|
### Search Box
|
|
- Homepage: Larger, prominent, centered
|
|
- Results page: Compact, full-width within center column
|
|
|
|
### Result Cards
|
|
- Keep existing structure
|
|
- Consider subtle styling improvements (spacing, typography)
|
|
|
|
### Category Tiles (Homepage)
|
|
- Icon + label per category
|
|
- Hover: slight scale + shadow
|
|
|
|
### Left Sidebar (Results Page)
|
|
- Sticky positioning (`position: sticky; top: calc(var(--header-height) + 1rem)`)
|
|
- Category links with active state indicator
|
|
- Collapsible filter sections
|
|
|
|
### Preferences Nav
|
|
- Vertical nav with section icons
|
|
- Active state indicator
|
|
- Mobile: horizontal scroll
|
|
|
|
---
|
|
|
|
## 5. CSS Architecture
|
|
|
|
### Existing (Retain)
|
|
- CSS custom properties (design tokens)
|
|
- Component-level styles
|
|
- Dark mode via `[data-theme="dark"]`
|
|
|
|
### New
|
|
|
|
**Layout Grid for three-column results:**
|
|
```css
|
|
.results-layout {
|
|
display: grid;
|
|
grid-template-columns: 200px 1fr 240px;
|
|
gap: 2rem;
|
|
align-items: start;
|
|
}
|
|
```
|
|
|
|
**Sticky Left Sidebar:**
|
|
```css
|
|
.results-layout .left-sidebar {
|
|
position: sticky;
|
|
top: calc(var(--header-height) + 1.5rem);
|
|
max-height: calc(100vh - var(--header-height) - 3rem);
|
|
overflow-y: auto;
|
|
}
|
|
```
|
|
|
|
**Preferences page layout:**
|
|
```css
|
|
.preferences-layout {
|
|
display: grid;
|
|
grid-template-columns: 200px 1fr;
|
|
gap: 2rem;
|
|
}
|
|
```
|
|
|
|
**Category tiles grid:**
|
|
```css
|
|
.category-tiles {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
|
|
gap: 1rem;
|
|
}
|
|
```
|
|
|
|
**Mobile breakpoints:**
|
|
```css
|
|
@media (max-width: 768px) {
|
|
.results-layout {
|
|
grid-template-columns: 1fr;
|
|
}
|
|
.results-layout .left-sidebar,
|
|
.results-layout .right-sidebar {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
@media (min-width: 769px) and (max-width: 1024px) {
|
|
.results-layout {
|
|
grid-template-columns: 1fr 220px;
|
|
}
|
|
.results-layout .left-sidebar {
|
|
display: none;
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 6. Files to Modify
|
|
|
|
| File | Change |
|
|
|------|--------|
|
|
| `internal/views/templates/index.html` | Add category tiles |
|
|
| `internal/views/templates/results.html` | Add left sidebar, restructure for three columns |
|
|
| `internal/views/templates/base.html` | Minimal changes (no structural changes needed) |
|
|
| `internal/views/templates/preferences.html` | **New** — full preferences page |
|
|
| `internal/views/static/css/kafka.css` | Add layout grids, category tiles, sidebar styles, sticky positioning, mobile breakpoints |
|
|
| `internal/views/static/js/settings.js` | Reduce popover to theme + engines; add preferences page JS |
|
|
| `internal/httpapi/httpapi.go` | Add `/preferences` route (GET + POST) |
|
|
| `internal/views/views.go` | Add preferences template rendering |
|
|
|
|
---
|
|
|
|
## 7. Priority Order
|
|
|
|
1. **Phase 1:** CSS layout framework (three-column grid, new variables, breakpoints)
|
|
2. **Phase 2:** Results page three-column layout
|
|
3. **Phase 3:** Homepage category tiles
|
|
4. **Phase 4:** Preferences page (quick popover first, then full page)
|
|
5. **Phase 5:** Polish and mobile responsiveness
|
|
|
|
---
|
|
|
|
## Out of Scope
|
|
|
|
- Backend search logic changes
|
|
- New engine implementations (category tiles for future engines are UI placeholders only)
|
|
- Caching or performance improvements
|
|
- User authentication/account system
|
|
- Server-side preference storage
|