Files

120 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Product Visual Design System
This document defines shared visual standards for the Flutter application. Platform-specific interaction, capability, packaging, and release requirements belong in [`platform-rules/README.md`](platform-rules/README.md).
## Design principles
- Prefer semantic design tokens over raw color, spacing, or dimension values.
- Keep the interface neutral, restrained, and consistent across platforms.
- Adapt layout and interaction to the available space without creating unrelated visual systems.
- Preserve accessibility, text scaling, keyboard access, and visible focus states.
- Use Forui components as the foundation and add product wrappers only when they provide stable application-wide behavior.
## Semantic color roles
Define light and dark values for these roles rather than using colors directly in feature widgets:
- `background`
- `surface`
- `surfaceElevated`
- `textPrimary`
- `textSecondary`
- `border`
- `primary`
- `primaryForeground`
- `success`
- `warning`
- `danger`
- `focus`
Starting palette values:
| Role | Value | Use |
| --- | --- | --- |
| Primary | `#2563EB` | Actions, links, and selection |
| Light background | `#F8FAFC` | Light-mode page canvas |
| Dark surface | `#111827` | Dark-mode panels |
| Light border | `#E2E8F0` | Light-mode separators |
These values are starting points. Forui theme colors and component styles remain the source of truth for Forui widgets.
## Spacing, dimensions, and shape
Use a 4 logical px base grid:
| Token | Value |
| --- | ---: |
| `space1` | 4 |
| `space2` | 8 |
| `space3` | 12 |
| `space4` | 16 |
| `space6` | 24 |
| `space8` | 32 |
| `space12` | 48 |
| Small radius | 6 |
| Standard radius | 10 |
| Large radius | 14 |
| Standard border | 1 |
| Standard icon | 20 |
| Compact control height | 36 |
| Standard control height | 40 |
| Comfortable control height | 44–48 |
| Minimum touch target | 48 |
| Maximum reading width | 800 |
Do not use fixed-height text containers that clip enlarged system text. Use content constraints and intrinsic sizing where text may wrap or scale.
## Typography
- Use a consistent system sans-serif font for UI text.
- Start body text at 14–16 logical px.
- Do not reduce secondary text below comfortable readability to fit more information.
- Use weight and spacing for hierarchy before adding more colors.
- Give editor text a separate configurable reading scale.
- Use monospace styling for code where appropriate.
- Test all important screens with enlarged system text and browser zoom.
## Responsive visual policy
Use centralized layout classes based on `LayoutBuilder` constraints:
| Layout class | Width | Visual policy |
| --- | --- | --- |
| Compact | `< 600` | One main pane and compact app bar or bottom navigation |
| Medium | `600–839` | Navigation rail or drawer with optional secondary pane |
| Expanded | `840–1199` | Persistent sidebar and main content |
| Wide | `1200+` | Sidebar, main content, and optional secondary panel |
These classes describe shared layout behavior. Navigation input, system gestures, URLs, file access, and window behavior are defined by each platform rule document.
## Component standards
| Component | Required behavior |
| --- | --- |
| `AppButton` | Primary, secondary, outline, ghost, and destructive variants |
| `AppIconButton` | Consistent sizing, tooltip, focus, and accessibility label |
| `AppTextField` | Label, helper text, validation, disabled, and error states |
| `AppSearchField` | Search input, clear action, loading, and empty states |
| `AppDialog` | Confirmation and form dialogs with keyboard dismissal rules |
| `AppSheet` | Mobile-friendly secondary actions and forms |
| `AppToast` | Brief success and non-blocking feedback |
| `AppEmptyState` | Human-readable message and optional next action |
| `AppErrorState` | Recoverable error message and retry action |
| `AppLoadingState` | Loading indicator and optional supporting text |
| `AppPageHeader` | Title, description, actions, and breadcrumbs when relevant |
| `AppSidebar` | Selected state, collapse behavior, and accessible navigation labels |
| `AppResponsiveContainer` | Content width and horizontal padding |
| `AppSplitView` | Main content and secondary panel on larger windows |
| `AppStatusBadge` | Semantic status labels, not decorative colors |
Every interactive component must define disabled, focus, hover where relevant, loading, and accessibility behavior. Every asynchronous feature must define loading, success, empty, and error states.
## Accessibility baseline
- Provide accessible names for all interactive controls.
- Maintain visible focus indicators for keyboard users.
- Ensure color is not the only way to communicate status.
- Support system text scaling without clipping or loss of actions.
- Keep touch targets at least 48 logical px where practical.
- Test contrast, keyboard navigation, screen-reader labels, and reduced-motion preferences where supported.