feat: Phases 4-7 — Full Feature Expansion (26 features)

Phase 4 — New Widget Types:
- Clock/Weather, System Stats, RSS/Feed, Calendar, Markdown,
  Metric/Counter, Link Group, Camera/Stream widgets
- Backend services with caching for each data source
- Full creation form with dynamic config fields per type

Phase 5 — Visual & Styling Enhancements:
- Glassmorphism card style (solid/glass/outline)
- Board-level themes with per-board hue/saturation
- Animated SVG status rings replacing static dots
- Card size options (compact/medium/large)
- Custom CSS injection (admin + per-board, sanitized)
- Wallpaper backgrounds with blur/overlay/parallax

Phase 6 — Functional Features:
- Favorites bar with drag-and-drop reordering
- Recent apps tracking with privacy toggle
- Uptime dashboard page (/status, guest-accessible)
- Notifications system (Discord/Slack/Telegram/HTTP webhooks)
- App tags with filtering in board view
- Multi-URL app cards with expandable sub-links
- Personal API tokens with scoped permissions
- Audit log with retention and admin viewer

Phase 7 — Quality of Life:
- Onboarding wizard (5-step first-launch setup)
- App URL health preview with favicon/title detection
- Board templates (4 built-in + custom import/export)
- Keyboard shortcut overlay (j/k nav, 1-9 boards, ? help)

212 files changed, 15641 insertions, 980 deletions.
Build, lint, type check, and 222 tests all pass.
This commit is contained in:
2026-03-25 14:18:10 +03:00
parent 8d7847889e
commit 1c0a7cb850
212 changed files with 15642 additions and 981 deletions
+65 -1
View File
@@ -35,7 +35,15 @@ export const WidgetType = {
BOOKMARK: 'bookmark',
NOTE: 'note',
EMBED: 'embed',
STATUS: 'status'
STATUS: 'status',
CLOCK: 'clock',
SYSTEM_STATS: 'system_stats',
RSS: 'rss',
CALENDAR: 'calendar',
MARKDOWN: 'markdown',
METRIC: 'metric',
LINK_GROUP: 'link_group',
CAMERA: 'camera'
} as const;
export type WidgetType = (typeof WidgetType)[keyof typeof WidgetType];
@@ -84,6 +92,62 @@ export const HealthcheckMethod = {
} as const;
export type HealthcheckMethod = (typeof HealthcheckMethod)[keyof typeof HealthcheckMethod];
// Card sizes
export const CardSize = {
COMPACT: 'compact',
MEDIUM: 'medium',
LARGE: 'large'
} as const;
export type CardSize = (typeof CardSize)[keyof typeof CardSize];
// Notification channel types
export const NotificationType = {
DISCORD: 'discord',
SLACK: 'slack',
TELEGRAM: 'telegram',
HTTP: 'http'
} as const;
export type NotificationType = (typeof NotificationType)[keyof typeof NotificationType];
// Notification events
export const NotificationEvent = {
APP_ONLINE: 'app_online',
APP_OFFLINE: 'app_offline',
APP_DEGRADED: 'app_degraded'
} as const;
export type NotificationEvent = (typeof NotificationEvent)[keyof typeof NotificationEvent];
// API token scopes
export const ApiTokenScope = {
READ: 'read',
WRITE: 'write',
ADMIN: 'admin'
} as const;
export type ApiTokenScope = (typeof ApiTokenScope)[keyof typeof ApiTokenScope];
// Audit log actions
export const AuditAction = {
USER_CREATED: 'user_created',
USER_DELETED: 'user_deleted',
USER_UPDATED: 'user_updated',
BOARD_CREATED: 'board_created',
BOARD_DELETED: 'board_deleted',
APP_CREATED: 'app_created',
APP_DELETED: 'app_deleted',
SETTINGS_UPDATED: 'settings_updated',
IMPORT: 'import',
EXPORT: 'export'
} as const;
export type AuditAction = (typeof AuditAction)[keyof typeof AuditAction];
// Background types for board wallpapers
export const BackgroundType = {
NONE: 'none',
COLOR: 'color',
WALLPAPER: 'wallpaper'
} as const;
export type BackgroundType = (typeof BackgroundType)[keyof typeof BackgroundType];
// Defaults
export const DEFAULTS = {
HEALTHCHECK_INTERVAL: 300,