Comprehensive design for 12 visual polish improvements including settings infrastructure, UI zoom, accent colors, density toggle, board/column/card colors, toasts, and onboarding.
7.7 KiB
OpenPylon Visual Glow-Up Design
Date: 2026-02-15 Goal: Transform OpenPylon from functional-but-bare to visually polished and delightful Approach: Settings-first foundation — build the settings infrastructure, then layer visual features on top
1. Settings Model & Infrastructure
Expand AppSettings in src/types/settings.ts:
export interface AppSettings {
theme: "light" | "dark" | "system";
dataDirectory: string | null;
recentBoardIds: string[];
// Appearance
accentColor: string; // OKLCH hue (0-360), default "160" (teal)
uiZoom: number; // 0.75-1.5, default 1.0
density: "compact" | "comfortable" | "spacious";
// Board defaults
defaultColumnWidth: ColumnWidth; // default "standard"
}
Zoom
Set font-size on <html> to uiZoom * 16px. Everything uses rem via Tailwind, so the entire UI scales proportionally.
Accent Color
Store an OKLCH hue value. On apply, regenerate --pylon-accent as oklch(55% 0.12 {hue}) (light) / oklch(60% 0.12 {hue}) (dark).
Density
Set CSS custom property --density-factor (compact=0.75, comfortable=1.0, spacious=1.25). Use it to scale padding on columns, cards, and gaps.
App Store Changes
Add setAccentColor, setUiZoom, setDensity, setDefaultColumnWidth actions to app-store.ts. Each saves immediately (no Save button). Add applyAppearance() function that applies zoom, accent, and density to the DOM — called on init and on any change.
2. Settings Panel UI
Transform SettingsDialog.tsx from a tiny modal into a tabbed panel.
- Widen to
sm:max-w-lg - 4 tabs: Appearance | Boards | Keyboard Shortcuts | About
- Simple button-based tab navigation (no library needed)
Appearance Tab
- Theme — existing 3-button toggle (unchanged)
- UI Zoom — slider 75%-150% in 5% steps, live preview, reset button, shows current %
- Accent Color — 10 preset OKLCH hue swatches: teal/160, blue/240, purple/300, pink/350, red/25, orange/55, yellow/85, lime/130, cyan/200, slate/achromatic. Click to apply immediately.
- Density — 3-button toggle: Compact / Comfortable / Spacious
Boards Tab
- Default column width — 3-button toggle: Narrow / Standard / Wide
Keyboard Shortcuts Tab
- Read-only reference table, two-column: key combo (mono font) | description
- All shortcuts: Ctrl+K, Ctrl+Z, Ctrl+Y, Ctrl+N, ?, etc.
About Tab
- App name, version, tagline
- Link to repo (opens via Tauri shell)
3. Board Color Applied to UI
Currently board.color only shows on BoardCard in the home screen.
- TopBar: 2px bottom border in board color when viewing a board. Color dot next to board title.
- Column headers: 3px top-border in board color at 30% opacity.
- No full background tinting — structural accents only (borders, dots).
4. Column Colors
Extend Column interface:
export interface Column {
id: string;
title: string;
cardIds: string[];
width: ColumnWidth;
color: string | null; // optional OKLCH hue, null = use board color
}
- Set via "Color" submenu in ColumnHeader dropdown (same 10 swatches + "None")
- Column's 3px top-border uses column color when set, falls back to board color
- Column background stays neutral
5. Card Cover Colors
Extend Card interface:
export interface Card {
// ...existing
coverColor: string | null; // OKLCH hue for color strip
}
- No image uploads for v1 — just a color bar
- 4px colored bar at top of CardThumbnail
- Set via swatch picker in CardDetailModal
- Simple CSS, no layout disruption
6. Richer Card Thumbnails
Add to existing CardThumbnail footer row:
- Attachment indicator — paperclip icon + count (if
attachments.length > 0) - Description indicator — text-lines icon (if
descriptionis non-empty) - Cover color bar — from Section 5
No priority badges or assignees — keeping thumbnails clean.
7. Toast Notification System
useToastStore— Zustand store:{ id, message, type }[]<ToastContainer>in App.tsx — fixed bottom-right, pills with auto-dismiss (3s + fade)- Types:
success(green),error(red),info(neutral) - Fires on: board deleted, board exported, board imported, import failed, save error
8. Undo/Redo Buttons in TopBar
- Two icon buttons: RotateCcw (undo) and RotateCw (redo)
- Placed in TopBar right section, before command palette button
- Disabled when at start/end of history
- Only visible in board view
- Tooltips show keyboard shortcuts (Ctrl+Z / Ctrl+Y)
9. Keyboard Shortcut Help Modal
- Triggered by
?key (when not in an input/textarea) - Two-column grid grouped by category: Navigation, Board, Cards
- Same data as Settings keyboard shortcuts tab
- Lightweight modal, dismissible with Escape or clicking outside
10. Board Backgrounds
Extend BoardSettings:
export interface BoardSettings {
attachmentMode: "link" | "copy";
background: "none" | "dots" | "grid" | "gradient";
}
- none — plain (current)
- dots — subtle radial-gradient dot pattern, 5% opacity
- grid — subtle grid lines via CSS
- gradient — soft gradient using board color at 3-5% opacity
- Set via board settings dropdown (gear icon in TopBar when viewing a board)
11. Onboarding / Empty States
- First launch (zero boards): Upgraded empty state — welcoming message, prominent "Create Board" button, secondary "Import Board" option
- Empty column: Dashed-border area with "Drop or add a card" text
- Empty description: "Click to add a description..." placeholder
- Empty checklist: "Add your first item..." when empty
12. Polish Pass
- Consistent hover transitions (200ms ease) across all interactive elements
- Verify focus rings work with all accent colors
- Test Framer Motion springs at different zoom levels
- Dark mode testing for all new features (column colors, card covers, backgrounds)
- Thin, themed scrollbars on column scroll areas
Implementation Order
- Settings model + app store actions + CSS variable application
- Settings panel UI (tabbed, all sections)
- UI zoom
- Accent color
- Density toggle
- Board color in UI (TopBar + column headers)
- Column colors
- Card cover colors
- Richer card thumbnails
- Toast notification system
- Undo/redo buttons
- Keyboard shortcut help modal
- Board backgrounds
- Onboarding / empty states
- Polish pass
Files Affected
src/types/settings.ts— expanded AppSettingssrc/types/board.ts— Column.color, Card.coverColor, BoardSettings.backgroundsrc/stores/app-store.ts— new actions, applyAppearance()src/components/settings/SettingsDialog.tsx— full rewrite (tabbed)src/index.css— density variables, zoom hook, background patternssrc/components/layout/TopBar.tsx— board color, undo/redo buttons, board settings gearsrc/components/board/KanbanColumn.tsx— column color bordersrc/components/board/ColumnHeader.tsx— color submenusrc/components/board/CardThumbnail.tsx— cover bar, attachment/description indicatorssrc/components/card-detail/CardDetailModal.tsx— cover color pickersrc/components/board/BoardView.tsx— background patternssrc/App.tsx— ToastContainer, shortcut help modal, appearance initsrc/stores/toast-store.ts— NEWsrc/components/toast/ToastContainer.tsx— NEWsrc/components/shortcuts/ShortcutHelpModal.tsx— NEWsrc/stores/board-store.ts— new actions for column color, card coversrc/lib/board-factory.ts— defaults for new fieldssrc/lib/schemas.ts— migration for new fieldssrc/components/boards/BoardList.tsx— upgraded empty statesrc/hooks/useKeyboardShortcuts.ts— ? key handler