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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user