openpetswithchatandmcp/DESIGN.md
OpenPets Dev 6ab3bb64d8 feat(rebrand): rename OpenPets to FamiliarOS and pets to familiars
- Rename all user-facing and technical identifiers from OpenPets/Pet to FamiliarOS/Familiar.
- Rename packages from @open-pets/* to @familiaros/*; rename install-pet/pet-format packages.
- Rename plugin IDs and directories from openpets.* to familiaros.*.
- Rename IPC namespace from openpets:* to familiaros:* and state filenames from openpets-* to familiaros-* with legacy migration.
- Rename source files (pet-window, built-in-pet, default-pet-controller, etc.) to familiar equivalents.
- Update locales (en, es-419, ja, ko, pt-BR, zh-Hans, zh-Hant) and tray/pet context menu strings.
- Add Familiar naming feature: preference, settings input, tray menu display.
- Update assets and packaging config; all desktop tests pass.
2026-06-17 01:42:08 +00:00

201 lines
11 KiB
Markdown

# FamiliarOS Control Center: Design System & Engineering Manual
This document outlines the visual direction, component patterns, and front-end engineering guidelines for the FamiliarOS Control Center. It serves as a practical implementation guide for migrating existing views (Settings, Plugins, Integrations, Onboarding) and building new pages using a cohesive, high-fidelity tactile design system.
---
## 1. Visual Direction & Heritage
The FamiliarOS Control Center blends the nostalgic, playful charm of late-90s/early-2000s desktop familiar managers with a modern, glassmorphic utility interface.
- **The Core Tension**: Playful nostalgia meets crisp, modern desktop productivity.
- **Atmospheric Depth**: Instead of flat, sterile surfaces, interfaces leverage rich color gradients, subtle mesh backdrops, structured panels, and tactile control elements.
- **Physicality**: Interactive components feel physical. They have distinct borders, inset highlights, drop shadows, and visual feedback on click/press.
---
## 2. Backgrounds & Surface Treatments
Surfaces are layered to establish clear spatial hierarchy and keep the interface readable.
### Page Backdrop
- **Formula**: A radial ambient glow on top of a subtle linear gradient.
- **Implementation**:
```css
background: radial-gradient(circle at 12% 8%, rgba(219, 234, 254, 0.9), transparent 24%),
linear-gradient(180deg, #f8fbff 0%, #eff7ff 54%, #e9f3ff 100%);
```
### Glass Panels (`.glass` / `GlassCard`)
- Panels use semi-transparent white fills coupled with a distinct double-border look (using inset box shadows) to simulate thick, polished acrylic sheets.
- **Specifications**:
- Background: `rgba(255, 255, 255, 0.76)`
- Border: `1px solid rgba(126, 161, 210, 0.48)`
- Inner Highlight: `inset 0 1px 0 rgba(255, 255, 255, 0.96)`
- Shadow: `0 24px 60px rgba(61, 99, 160, 0.15)`
- Blur: `backdrop-blur-xl`
- Border Radius: `28px` (`rounded-[28px]`)
---
## 3. Page Shell, Layout & Grids
The desktop shell is designed to be self-contained, fitting exactly within the viewport height without scrolling the entire window.
- **Page Shell**: Max-width of `1160px` centered, utilizing a full-height flexbox column (`h-screen p-6`).
- **Hero Header**: A balanced layout placing title text and description on the left (`.hero-content`) and the wider brand artwork (`familiaros.webp`) on the right (`.hero-logo-container`). Keep artwork large enough to feel intentional, use `object-contain`, and avoid rounded wrappers or distortion.
- **Layout Split**: A clean grid split, typically:
- **Left Gallery/List Panel**: `1.25fr` — for browsing, searching, and filtering.
- **Right Detail/Action Panel**: `0.75fr` — for contextual inspection and heavy operations.
- **Scroll Containers**: Sub-panels (like grids and lists) scroll internally (`overflow-y-auto`) with customized scrollbars so that headers, filters, and primary action bars remain pinned.
---
## 4. Typography & Tone
- **Font Family**: Refined sans-serif (e.g., `Inter`, `system-ui`) for maximum readability in body copy, labels, and metadata.
- **Display Typography**: Strong, characterful monospace or display-sans fonts (e.g., Lucida Console, geometric display fonts) for headers and uppercase labels to evoke retro desktop applications.
- **Typographic Hierarchy**:
- **Hero Title**: `text-5xl font-black tracking-tight`
- **Panel Title**: `text-3xl font-black`
- **Eyebrow / Section Header**: `text-xs font-bold uppercase tracking-[.18em] text-brand`
- **Card Title**: `text-sm font-semibold text-navy`
- **Metadata / Descriptions**: `text-xs text-slate-500`
- **Copy Tone**: Conversational, clean, and helpful. Avoid overly dense technical jargon; explain state transitions clearly (e.g., *"Ready to become your default familiar"* instead of *"State: INSTALLED, ACTIVE: FALSE"*).
---
## 5. Colors & Semantic Palette
All colors are mapped to functional roles to ensure consistency across themes.
| Role | Color / Hex | Tailwind Equivalent | Semantic Usage |
| :--- | :--- | :--- | :--- |
| **Brand Primary** | `#176df2` / `#3b96ff` | `bg-brand` / `text-brand` | Active filters, primary buttons, hero accents |
| **Dark Neutral** | `#102149` | `text-navy` | Main body text, card titles, heavy headings |
| **Light Neutral** | `#f8fbff` to `#e9f3ff` | `bg-slate-50` / `bg-blue-50` | Page backdrops, card backgrounds, empty states |
| **Slate Copy** | `#5c6e91` | `text-slatecopy` | Subtitles, helper text, inactive buttons, labels |
| **Success / Ready** | `#059669` / `#34d399` | `emerald` | Active indicators, successfully installed badges |
| **Warning / Import** | `#d97706` / `#fbbf24` | `amber` | Codex source indicators, imports, attention states |
| **Featured** | `#7e22ce` / `#a855f7` | `purple` | Featured catalog filters and badges |
| **Originals** | `#ca8a04` / `#facc15` | `yellow` | Original FamiliarOS catalog filters and badges |
| **Danger / Remove** | `#dc2626` / `#ff6b6b` | `red` | Destructive actions, broken states, error messages |
---
## 6. Tactile Button System
Buttons are the core interactive elements. They reject flat modern trends in favor of a chunky, tangible 3D appearance inspired by physical familiar hardware and OS controls.
### Visual Architecture
- **Borders**: Darker semi-transparent bottom/side borders (`rgba(..., 0.32)`).
- **Gradients**: Linear vertical gradients that transition from a lighter top to a richer bottom.
- **Inset Highlights**: A subtle light line (`inset 0 1px 0 rgba(255,255,255,0.38)`) on the top edge to simulate light catching the button's crown.
- **Shadows**: Keep buttons grounded. Use subtle neutral depth plus inset highlights; avoid large colored glow shadows.
### Interactive Rules
- **Hover States**: Under current design guidelines, **avoid dramatic hover glows or float lifts**. Hovering should simply shift the gradient/background color slightly to maintain a grounded, crisp, and predictable interface.
- **Active Click State**: On press, the button scales down slightly to `0.96` to provide a satisfying physical click response.
- **Constraint**: Always use targeted transitions (`transition-[transform,background-color,border-color,box-shadow]`) instead of `transition-all` to prevent layout reflow stutter.
### Button Variants
1. **Primary** (`.btn-primary`):
- Gradient: `#3b96ff` to `#176df2`
- Shadow: `inset 0 1px 0 rgba(255,255,255,0.38), 0 2px 4px rgba(61,99,160,0.10)`
2. **Secondary** (`.btn-secondary`):
- Surface: `rgba(255,255,255,0.76)` with text `#176df2`
- Border: `rgba(37, 99, 235, 0.42)`
3. **Danger** (`.btn-danger`):
- Gradient: `#ff6b6b` to `#dc2626`
- Shadow: same subtle neutral depth as primary; do not add red glow
4. **Warning** (`.btn-warning`):
- Gradient: `#fbbf24` to `#d97706`
5. **Success** (`.btn-success`):
- Gradient: `#34d399` to `#059669`
6. **Compact Button** (`.btn-compact`):
- Designed for pagination (`.pager`) and secondary rows.
- Reduces size to `min-h-[30px]`, padding to `px-2.5 py-1`, and font size to `text-xs` with a tighter border-radius (`rounded-xl`).
---
## 7. Controls & Navigation Elements
### Filters (`.filter`)
- Instead of simple pill badges, filters are structured as miniature tactile buttons.
- Inactive filters use a soft white-to-slate gradient with a light blue-grey border.
- Active filters swap to semantic gradients with only subtle grounded depth:
- Brand blue for general filters (`All`, `Installed`, `Western`, `Asian`, `Codex`)
- Purple for `Featured`
- Amber/yellow-orange for `Originals`
- Match catalog v3/web gallery taxonomy where possible: `Featured` excludes originals, and category filters like `Western`/`Asian` exclude featured and originals.
### Familiar Cards & Badges
- Card grids need inner padding so selected rings and focus states are not clipped by the scroll container.
- Use badges to expose catalog identity, not just install state:
- `Original` for original/FamiliarOS familiars
- `Featured` for featured non-original catalog familiars
- `Western` / `Asian` for standard category familiars
- `Default`, `Installed`, and `Codex` for local state/source
- Avoid low-value detail badges such as `Available`; reserve detail badges for meaningful state or catalog identity.
### Search Inputs (`.search`)
- Rendered as soft, inset text boxes.
- Styled with `bg-white/80` and `shadow-inner` to look recessed into the panel.
- Focus states use a visible but restrained brand ring (`focus:ring-brand/15 focus:border-brand`) for accessibility.
### Pager (`.pager`)
- Placed cleanly at the **bottom** of list/grid containers.
- Merges compact secondary buttons with centered, bold, uppercase status text (`text-xs font-bold tracking-wider`).
---
## 8. Icons & Visual Assets
- **Coherency**: Use clean, outline-style vectors with a consistent stroke weight (`stroke-width="2.5"` or `3` for smaller shapes).
- **Style Alignment**: Align with the **Lucide / Iconify** icon libraries.
- **Implementation**: Embed icons as stateless, inline React SVG components or a localized icon catalog within the component file to avoid heavy runtime dependencies.
- **Sizing**:
- Action/Button Icons: `16px x 16px`
- Compact/Filter Icons: `12px x 12px` or `14px x 14px`
---
## 9. React & Tailwind Implementation Notes
### The Static Purge Constraint
Tailwind CSS extracts classes statically by analyzing source code strings. **Do not construct class names dynamically**.
```tsx
// ❌ BAD: Will be purged by Tailwind in production
const color = "blue";
return <span className={`pill-${color}`}>Label</span>;
// GOOD: Statically discoverable mapping
const statusPillToneClass = {
blue: "pill-blue",
green: "pill-green",
} as const;
return <span className={`pill ${statusPillToneClass[tone]}`}>Label</span>;
```
---
## 10. Migration Playbook for Future Pages
When refactoring other Control Center views, apply the following structural mapping:
### A. Settings Page
- **Old Layout**: Long scrolling list of form controls.
- **New Layout**: Split-pane layout. Left side lists settings categories (General, Hotkeys, Performance) using `.filter` tactile navigation. Right side contains the active form wrapped in a `.glass` card.
- **Inputs**: Swap default inputs to the recessed `.search` input style. Use `.btn-primary` for the final "Save" action.
### B. Plugins Page
- **Old Layout**: Flat list of available integrations.
- **New Layout**: Grid-based layout matching the `.familiars-grid` structure.
- **Cards**: Use the `.familiar-card` styling with a thumbnail on the left, author/description text on the right, and semantic status pills (e.g., `.pill-green` for "Active", `.pill-slate` for "Disabled").
### C. Onboarding
- **Old Layout**: Full screen wizard.
- **New Layout**: Centered, floating glass card (`.glass` with `max-w-xl shadow-glass`) layered over the atmospheric radial backdrop.
- **Interaction**: Use staggered CSS keyframes for a smooth entrance, and a prominent `.btn-primary` with active scaling for the "Get Started" call to action.