# ConfigManager UI Design Specification ## Design Philosophy **Aesthetic Direction:** Industrial Precision A professional configuration tool demands clarity, efficiency, and trust. This design embraces an **industrial utilitarian** aesthetic with refined execution: - **Dark theme** reduces eye strain during extended editing sessions - **Monospace typography** for data values ensures alignment and scanability - **Geometric precision** conveys reliability and control - **Purposeful color** limited to validation states and actionable elements - **Generous spacing** prevents cognitive overload when managing complex configs ## Color System ### Core Palette ``` /* Background Layers (darkest to lightest) */ --bg-base: #0D0F12 /* App background */ --bg-surface: #151920 /* Panels, cards */ --bg-elevated: #1C2128 /* Hover states, popups */ --bg-input: #232A35 /* Form inputs */ /* Border & Dividers */ --border-subtle: #2D3540 /* Panel dividers */ --border-default: #3D4550 /* Input borders */ --border-focus: #5C9AFF /* Focus rings */ /* Text Hierarchy */ --text-primary: #E6EDF5 /* Headings, labels */ --text-secondary: #9BA8B8 /* Descriptions, hints */ --text-muted: #5C6A7A /* Disabled, placeholders */ --text-inverse: #0D0F12 /* Text on light backgrounds */ /* Accent Colors */ --accent-primary: #5C9AFF /* Primary actions, links */ --accent-hover: #7DB0FF /* Hover state */ /* Status Colors */ --status-success: #3DD68C /* Valid, connected */ --status-warning: #FFB84D /* Warnings */ --status-error: #FF6B6B /* Errors, invalid */ --status-info: #5C9AFF /* Info, neutral */ /* Status Backgrounds (10% opacity variants) */ --status-success-bg: rgba(61, 214, 140, 0.1) --status-warning-bg: rgba(255, 184, 77, 0.1) --status-error-bg: rgba(255, 107, 107, 0.1) ``` ### Semantic Usage | Element | Color Token | Usage | |---------|-------------|-------| | Tree node - valid | `--status-success` | Checkmark icon | | Tree node - warning | `--status-warning` | Warning icon | | Tree node - error | `--status-error` | X icon | | Tree node - modified | `--accent-primary` | Asterisk indicator | | Input validation error | `--status-error` | Border + message | | Save button (enabled) | `--accent-primary` | Background | | Save button (disabled) | `--text-muted` | Background | ## Typography ### Font Stack ``` /* UI Chrome - Clean, professional */ --font-ui: "IBM Plex Sans", -apple-system, sans-serif; /* Data Values - Monospace for alignment */ --font-mono: "JetBrains Mono", "Fira Code", monospace; /* Section Headers - Slightly condensed */ --font-heading: "IBM Plex Sans Condensed", sans-serif; ``` ### Type Scale ``` /* Headings */ --text-xl: 18px / 1.3 /* Panel titles */ --text-lg: 15px / 1.4 /* Section headers */ --text-base: 13px / 1.5 /* Body text, labels */ --text-sm: 12px / 1.4 /* Hints, captions */ --text-xs: 11px / 1.3 /* Status bar, badges */ /* Weights */ --weight-normal: 400 --weight-medium: 500 --weight-semibold: 600 ``` ### Typography Rules 1. **Labels** use `--font-ui` at `--text-base`, `--weight-medium` 2. **Input values** use `--font-mono` at `--text-base` 3. **Tree node names** use `--font-ui` at `--text-base` 4. **Tooltips** use `--font-ui` at `--text-sm` 5. **Status bar** uses `--font-mono` at `--text-xs` ## Spacing System ``` --space-xs: 4px --space-sm: 8px --space-md: 12px --space-lg: 16px --space-xl: 24px --space-2xl: 32px ``` ### Application | Element | Spacing | |---------|---------| | Panel padding | `--space-lg` | | Form field gap | `--space-md` | | Tree item indent | `--space-lg` | | Button padding | `--space-sm` horizontal, `--space-xs` vertical | | Section divider margin | `--space-xl` | ## Component Specifications ### 1. Menu Bar ``` Height: 28px Background: --bg-surface Border-bottom: 1px solid --border-subtle Menu Items: Padding: 0 12px Font: --font-ui, --text-sm, --weight-medium Color: --text-secondary Hover: --text-primary, background --bg-elevated Keyboard shortcut hints: Color: --text-muted Font: --font-mono, --text-xs ``` **Menu Structure:** ``` File ├─ Open Folder... Ctrl+O ├─ Save Ctrl+S ├─ Save As... Ctrl+Shift+S ├─ ───────────────────── ├─ Recent Folders → └─ Exit Alt+F4 Edit ├─ Undo Ctrl+Z ├─ Redo Ctrl+Y ├─ ───────────────────── ├─ Cut Ctrl+X ├─ Copy Ctrl+C └─ Paste Ctrl+V Tools ├─ Validate All F5 ├─ Test Connection F6 ├─ ───────────────────── ├─ View Backups... └─ Options... Help ├─ Documentation F1 ├─ Keyboard Shortcuts ├─ ───────────────────── └─ About ConfigManager ``` ### 2. Toolbar ``` Height: 40px Background: --bg-surface Border-bottom: 1px solid --border-subtle Padding: 0 --space-md Button Style: Height: 28px Padding: 0 --space-md Border-radius: 4px Gap between icon and text: --space-sm Default: Background: transparent Color: --text-secondary Hover: Background: --bg-elevated Color: --text-primary Active/Pressed: Background: --bg-input Disabled: Color: --text-muted Opacity: 0.6 Separator: Width: 1px Height: 20px Background: --border-subtle Margin: 0 --space-sm ``` **Toolbar Layout:** ``` [📁 Open] [💾 Save] | [↩ Undo] [↪ Redo] | [🔌 Test Connection] [✓ Validate] [stretch] ``` ### 3. Tree View Panel ``` Width: 280px (resizable, min 200px, max 400px) Background: --bg-base Border-right: 1px solid --border-subtle Header: Height: 36px Padding: 0 --space-lg Background: --bg-surface Font: --font-heading, --text-base, --weight-semibold Text: "CONFIGURATION" Letter-spacing: 0.5px Color: --text-muted ``` **Tree Node Design:** ``` Standard Node: Height: 32px Padding-left: (depth * 16px) + 8px Layout: [Expand] [Icon] [Name] [Status] [Modified] Expand Arrow: Size: 16x16 Color: --text-muted Rotation: 0° collapsed, 90° expanded Transition: transform 150ms ease Icon: Size: 16x16 Margin-right: --space-sm Name: Font: --font-ui, --text-base Color: --text-primary Flex: 1 Status Icon: Size: 14x14 Margin-left: --space-sm ✓ = --status-success ⚠ = --status-warning ✗ = --status-error Modified Indicator: Character: "*" Color: --accent-primary Font: --font-ui, --weight-semibold Margin-left: --space-xs Hover State: Background: --bg-elevated Selected State: Background: rgba(92, 154, 255, 0.15) Border-left: 2px solid --accent-primary Folder Node (Settings, Pipelines): Font-weight: --weight-semibold Icon: 📁 (closed) / 📂 (open) ``` **Tree Icons:** ``` Settings Section Icons: DataSync → ⟳ (sync arrows) DataAccess → ⛁ (database) Auth → 🔐 (lock) Ldap → 👥 (users) Connections → 🔌 (plug) Pipeline Icons: Default → ⚡ (lightning bolt) With errors → ⚡ with red dot overlay ``` ### 4. Form Panel ``` Background: --bg-surface Padding: --space-xl Header: Font: --font-heading, --text-xl, --weight-semibold Color: --text-primary Margin-bottom: --space-lg Padding-bottom: --space-md Border-bottom: 1px solid --border-subtle ``` **Form Field Components:** ``` Text Input: Height: 36px Background: --bg-input Border: 1px solid --border-default Border-radius: 4px Padding: 0 --space-md Font: --font-mono, --text-base Color: --text-primary Placeholder: Color: --text-muted Focus: Border-color: --border-focus Box-shadow: 0 0 0 2px rgba(92, 154, 255, 0.2) Error: Border-color: --status-error Box-shadow: 0 0 0 2px rgba(255, 107, 107, 0.2) Disabled/ReadOnly: Background: --bg-elevated Color: --text-muted Cursor: not-allowed Numeric Input: Same as text input Text-align: right Spin Buttons: Width: 24px Background: --bg-elevated Border-left: 1px solid --border-default Checkbox: Size: 18x18 Border: 2px solid --border-default Border-radius: 3px Checked: Background: --accent-primary Border-color: --accent-primary Checkmark: --text-inverse Toggle Switch: Width: 40px Height: 22px Background: --bg-input Border-radius: 11px Thumb: Size: 18x18 Background: --text-secondary On State: Background: --accent-primary Thumb: --bg-base Dropdown/Select: Same as text input Padding-right: 36px (for arrow) Arrow: Color: --text-muted Dropdown Menu: Background: --bg-elevated Border: 1px solid --border-default Border-radius: 4px Box-shadow: 0 4px 12px rgba(0,0,0,0.3) Menu Item: Height: 32px Padding: 0 --space-md Hover: --bg-input TextArea (Query Editor): Min-height: 120px Font: --font-mono, --text-base Line-height: 1.6 Padding: --space-md Resize: vertical Field Label: Font: --font-ui, --text-sm, --weight-medium Color: --text-secondary Margin-bottom: --space-xs Required Indicator: Character: "*" Color: --status-error Margin-left: 2px Field Hint: Font: --font-ui, --text-xs Color: --text-muted Margin-top: --space-xs Validation Message: Font: --font-ui, --text-xs Color: --status-error Margin-top: --space-xs Icon: ⚠ inline before text ``` **Form Layouts:** ``` Single Column (default): Max-width: 600px Field margin-bottom: --space-lg Two Column: Gap: --space-xl Used for related pairs (e.g., Min/Max values) Section Grouping: Background: --bg-base Border: 1px solid --border-subtle Border-radius: 6px Padding: --space-lg Margin-bottom: --space-xl Section Title: Font: --font-ui, --text-base, --weight-semibold Color: --text-primary Margin-bottom: --space-md ``` ### 5. Collapsible Sections (Pipeline Forms) ``` Container: Background: --bg-base Border: 1px solid --border-subtle Border-radius: 6px Margin-bottom: --space-md Header (clickable): Height: 44px Padding: 0 --space-lg Cursor: pointer Display: flex Align-items: center Chevron: Size: 16x16 Color: --text-muted Margin-right: --space-sm Rotation: 0° collapsed, 90° expanded Transition: transform 200ms ease Title: Font: --font-ui, --text-base, --weight-semibold Color: --text-primary Flex: 1 Badge (item count): Background: --bg-elevated Color: --text-secondary Font: --font-mono, --text-xs Padding: 2px 8px Border-radius: 10px Status: Same as tree node status icons Content: Padding: --space-lg Border-top: 1px solid --border-subtle Animation: Height transition: 200ms ease Opacity: 0 → 1 over 150ms ``` ### 6. Data Grid (Parameters, Columns Lists) ``` Container: Border: 1px solid --border-subtle Border-radius: 4px Overflow: hidden Header Row: Height: 32px Background: --bg-elevated Border-bottom: 1px solid --border-subtle Cell: Padding: 0 --space-md Font: --font-ui, --text-xs, --weight-semibold Color: --text-muted Text-transform: uppercase Letter-spacing: 0.5px Data Row: Height: 36px Border-bottom: 1px solid --border-subtle Cell: Padding: 0 --space-md Font: --font-mono, --text-sm Color: --text-primary Hover: Background: --bg-elevated Selected: Background: rgba(92, 154, 255, 0.1) Inline Edit: Cell becomes editable input on double-click Same styling as text input Add Row Button: Height: 32px Background: transparent Border: 1px dashed --border-default Color: --text-muted Font: --font-ui, --text-sm Hover: Border-color: --accent-primary Color: --accent-primary Delete Button (per row): Size: 24x24 Color: --text-muted Opacity on row hover only Hover: Color: --status-error ``` ### 7. Status Bar ``` Height: 24px Background: --bg-surface Border-top: 1px solid --border-subtle Padding: 0 --space-md Font: --font-mono, --text-xs Layout: [File Path] | [Modified] | [Validation] ───────── [Connection Status] File Path: Color: --text-muted Max-width: 400px Overflow: ellipsis from start Modified Indicator: Color: --accent-primary Text: "Modified" (or hidden if clean) Validation Summary: Clickable (opens validation panel) No issues: Color: --status-success Text: "✓ Valid" Warnings only: Color: --status-warning Text: "⚠ 3 warnings" Errors: Color: --status-error Text: "✗ 2 errors, 1 warning" Connection Status: Color: --text-muted Shows last test result: "● Connected" (green dot) "○ Not tested" (gray dot) "● Failed" (red dot) ``` ### 8. Dialogs ``` Overlay: Background: rgba(0, 0, 0, 0.6) Backdrop-filter: blur(2px) Dialog Container: Background: --bg-surface Border: 1px solid --border-subtle Border-radius: 8px Box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4) Min-width: 400px Max-width: 600px Header: Padding: --space-lg Border-bottom: 1px solid --border-subtle Font: --font-heading, --text-lg, --weight-semibold Content: Padding: --space-xl Footer: Padding: --space-lg Border-top: 1px solid --border-subtle Display: flex Justify-content: flex-end Gap: --space-sm ``` **Dialog Types:** ``` Diff Preview Dialog: Width: 800px Diff View: Font: --font-mono, --text-sm Line-height: 1.5 Added line: Background: rgba(61, 214, 140, 0.15) Border-left: 3px solid --status-success Removed line: Background: rgba(255, 107, 107, 0.15) Border-left: 3px solid --status-error Context line: Color: --text-muted Line numbers: Color: --text-muted Width: 50px Text-align: right Padding-right: --space-md Border-right: 1px solid --border-subtle Validation Results Dialog: Width: 600px Issue List: Error item: Border-left: 3px solid --status-error Background: --status-error-bg Warning item: Border-left: 3px solid --status-warning Background: --status-warning-bg Item content: Padding: --space-md Location link: Color: --accent-primary Cursor: pointer Underline on hover ``` ### 9. Buttons ``` Primary Button: Height: 36px Padding: 0 --space-lg Background: --accent-primary Color: --text-inverse Border: none Border-radius: 4px Font: --font-ui, --text-base, --weight-medium Hover: Background: --accent-hover Active: Transform: scale(0.98) Disabled: Background: --text-muted Cursor: not-allowed Secondary Button: Same dimensions Background: transparent Border: 1px solid --border-default Color: --text-secondary Hover: Background: --bg-elevated Border-color: --text-muted Color: --text-primary Danger Button: Same as Primary Background: --status-error Hover: Background: #ff8585 Icon Button: Size: 32x32 Background: transparent Border-radius: 4px Hover: Background: --bg-elevated ``` ### 10. Tooltips ``` Container: Background: --bg-elevated Border: 1px solid --border-default Border-radius: 4px Padding: --space-sm --space-md Box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3) Max-width: 300px Text: Font: --font-ui, --text-sm Color: --text-primary Keyboard Shortcut: Font: --font-mono, --text-xs Color: --text-muted Background: --bg-input Padding: 2px 6px Border-radius: 3px Margin-left: --space-sm Delay: 500ms Animation: Fade in 150ms Position: Below element with 8px gap (flip if near edge) ``` ## Screen Layouts ### Main Window ``` ┌─────────────────────────────────────────────────────────────────────────┐ │ File Edit Tools Help [—][□][×] │ ├─────────────────────────────────────────────────────────────────────────┤ │ [📁 Open] [💾 Save] │ [↩] [↪] │ [🔌 Test] [✓ Validate] │ ├────────────────────┬────────────────────────────────────────────────────┤ │ CONFIGURATION │ │ │ ────────────────── │ DataSync Options │ │ │ ═══════════════════════════════════════════ │ │ ▼ 📂 Settings │ │ │ ├─ ⟳ DataSync ✓ │ ┌─ Sync Intervals ─────────────────────────────┐ │ │ ├─ ⛁ DataAccess │ │ │ │ │ ├─ 🔐 Auth │ │ Mass Sync Interval (minutes) │ │ │ ├─ 👥 Ldap │ │ ┌──────────────────────────────────────┐ │ │ │ └─ 🔌 Connections│ │ │ 1440 │ │ │ │ │ │ └──────────────────────────────────────┘ │ │ │ ▼ 📂 Pipelines │ │ ℹ Default: 1440 (24 hours) │ │ │ ├─ ⚡ WorkOrder ✓│ │ │ │ │ ├─ ⚡ Lot ✓ │ │ Daily Sync Interval (minutes) │ │ │ ├─ ⚡ Item ⚠ │ │ ┌──────────────────────────────────────┐ │ │ │ └─ ⚡ Operator * │ │ │ 60 │ │ │ │ │ │ └──────────────────────────────────────┘ │ │ │ │ │ │ │ │ │ │ Hourly Sync Interval (minutes) │ │ │ │ │ ┌──────────────────────────────────────┐ │ │ │ │ │ │ 15 │ │ │ │ │ │ └──────────────────────────────────────┘ │ │ │ │ │ ⚠ Minimum: 15 minutes │ │ │ │ └───────────────────────────────────────────────┘ │ │ │ │ │ │ ┌─ Data Retention ──────────────────────────────┐ │ │ │ │ │ │ │ │ │ Lookback Multiplier Retention Days │ │ │ │ │ ┌─────────────────┐ ┌─────────────────┐│ │ │ │ │ │ 1.5 │ │ 90 ││ │ │ │ │ └─────────────────┘ └─────────────────┘│ │ │ │ │ │ │ │ │ └───────────────────────────────────────────────┘ │ │ │ │ │ │ [Reset] [Apply Changes] │ ├────────────────────┴────────────────────────────────────────────────────┤ │ ~/projects/jdescoping/appsettings.json │ Modified │ ✓ Valid ● Connected │ └─────────────────────────────────────────────────────────────────────────┘ ``` ### Pipeline Form ``` ┌────────────────────────────────────────────────────────────────────────┐ │ WorkOrder Pipeline │ │ ═══════════════════════════════════════════════════════════════════ │ │ │ │ ▼ Source ✓ Valid │ │ ├──────────────────────────────────────────────────────────────────┤ │ │ │ │ │ │ │ Connection * │ │ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ │ │ JdeOracle ▼ │ │ │ │ │ └────────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ Query │ │ │ │ ┌────────────────────────────────────────────────────────┐ │ │ │ │ │ SELECT │ │ │ │ │ │ WLDOCO as OrderNumber, │ │ │ │ │ │ WLDCTO as OrderType, │ │ │ │ │ │ ... │ │ │ │ │ └────────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ Parameters [+ Add] │ │ │ │ ┌──────────────┬───────────────────────────────┬──────────┐ │ │ │ │ │ NAME │ VALUE │ │ │ │ │ │ ├──────────────┼───────────────────────────────┼──────────┤ │ │ │ │ │ @StartDate │ {LastSync} │ 🗑 │ │ │ │ │ │ @Company │ 00200 │ 🗑 │ │ │ │ │ └──────────────┴───────────────────────────────┴──────────┘ │ │ │ │ │ │ │ └──────────────────────────────────────────────────────────────────┘ │ │ │ │ ▶ Schedules ⚠ 1 warning │ │ ├──────────────────────────────────────────────────────────────────┤ │ │ │ (collapsed) │ │ │ └──────────────────────────────────────────────────────────────────┘ │ │ │ │ ▶ Destination ✓ Valid │ │ ├──────────────────────────────────────────────────────────────────┤ │ │ │ (collapsed) │ │ │ └──────────────────────────────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────────────────┘ ``` ### Diff Preview Dialog ``` ┌─────────────────────────────────────────────────────────────────────────┐ │ Preview Changes [×] │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ appsettings.json │ │ ─────────────────────────────────────────────────────────────────── │ │ │ │ 15 │ "MassSyncIntervalMinutes": 1440, │ │ 16 │ "DailySyncIntervalMinutes": 60, │ │ ▬ 17 │ - "HourlySyncIntervalMinutes": 30, │ │ ▬ 17 │ + "HourlySyncIntervalMinutes": 15, │ │ 18 │ "LookbackMultiplier": 1.5, │ │ 19 │ "RetentionDays": 90 │ │ │ │ ─────────────────────────────────────────────────────────────────── │ │ 1 file changed, 1 insertion, 1 deletion │ │ │ ├─────────────────────────────────────────────────────────────────────────┤ │ [Cancel] [💾 Save Changes] │ └─────────────────────────────────────────────────────────────────────────┘ ``` ## Interaction Patterns ### Keyboard Navigation | Shortcut | Action | |----------|--------| | `Ctrl+O` | Open folder | | `Ctrl+S` | Save | | `Ctrl+Z` | Undo | | `Ctrl+Y` | Redo | | `F5` | Validate all | | `F6` | Test connection | | `Tab` | Next field | | `Shift+Tab` | Previous field | | `↑/↓` | Navigate tree | | `←/→` | Collapse/expand tree node | | `Enter` | Select tree node / submit form | | `Esc` | Cancel dialog / clear focus | ### Drag & Drop - Tree nodes (Pipelines only) can be reordered via drag - Visual indicator: Blue line showing drop position - Constraint: Cannot drag into Settings node ### Context Menus **Pipeline Node Context Menu:** ``` ┌─────────────────────┐ │ ⚡ New Pipeline │ │ 📋 Duplicate │ │ ────────────────── │ │ 🗑 Delete │ └─────────────────────┘ ``` **Text Input Context Menu:** ``` ┌─────────────────────┐ │ ✂ Cut Ctrl+X│ │ 📋 Copy Ctrl+C│ │ 📋 Paste Ctrl+V│ │ ────────────────── │ │ ⟲ Reset to default │ └─────────────────────┘ ``` ## Animation Specifications ```css /* Standard easing */ --ease-out: cubic-bezier(0.0, 0.0, 0.2, 1); --ease-in-out: cubic-bezier(0.4, 0.0, 0.2, 1); /* Durations */ --duration-fast: 150ms; --duration-normal: 200ms; --duration-slow: 300ms; /* Specific animations */ Tree expand/collapse: height --duration-normal --ease-out Section expand/collapse: height --duration-normal --ease-out Button hover: background --duration-fast --ease-out Focus ring: box-shadow --duration-fast --ease-out Dialog appear: opacity + scale(0.95→1) --duration-normal --ease-out Tooltip appear: opacity --duration-fast --ease-out Status icon change: color --duration-fast --ease-out ``` ## Responsive Behavior **Minimum Window Size:** 900×600px **Panel Resizing:** - Tree panel: min 200px, max 400px, default 280px - Form panel: fills remaining space - Resize handle: 4px wide, cursor: col-resize **Small Window Adaptations (< 1100px):** - Toolbar labels hidden, icons only - Form sections stack vertically - Two-column form fields become single column ## Accessibility ### Focus Indicators - All interactive elements have visible focus ring - Focus ring: `0 0 0 2px var(--border-focus)` - Tab order follows logical reading order ### Screen Reader Support - Tree nodes announce: name, type, validation state, expanded/collapsed - Form fields have associated labels via `aria-labelledby` - Validation errors announced via `aria-live="polite"` - Status bar updates announced via `aria-live="polite"` ### Color Contrast - All text meets WCAG AA (4.5:1 for normal text) - Status colors have accompanying icons, not color alone - Focus indicators visible against all backgrounds ## Implementation Notes ### Avalonia-Specific Guidance **Theme Resources (App.axaml):** ```xml #0D0F12 #151920 ``` **Custom Control Templates:** - Override default Fluent theme styles for matching dark theme - Create custom `TreeViewItem` template for validation icons - Create `CollapsibleSection` user control for pipeline forms **Font Loading:** ```xml avares://JdeScoping.ConfigManager/Assets/Fonts#IBM Plex Sans avares://JdeScoping.ConfigManager/Assets/Fonts#JetBrains Mono ``` ### File References This design specification is referenced by: - `docs/plans/2026-01-19-config-manager-design.md` - Implementation plan Related files: - `NEW/src/Utils/JdeScoping.ConfigManager/` - Implementation location - `NEW/src/JdeScoping.Core/Options/` - Options classes for form models