Files
jdescopingtool/docs/designs/configmanager-ui-design.md
T
Joseph Doherty d49330e697 docs: add XML documentation and ConfigManager implementation plans
Add comprehensive XML documentation (param/returns tags) across 132 source
files to improve IntelliSense and API discoverability. Include ConfigManager
design documents and implementation plans for phases 1-9.
2026-01-20 02:26:26 -05:00

34 KiB
Raw Blame History

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

/* 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.951) --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):

<Application.Resources>
    <ResourceDictionary>
        <!-- Colors -->
        <Color x:Key="BgBase">#0D0F12</Color>
        <Color x:Key="BgSurface">#151920</Color>
        <!-- ... all color tokens ... -->

        <!-- Brushes -->
        <SolidColorBrush x:Key="BgBaseBrush" Color="{StaticResource BgBase}"/>
        <!-- ... -->
    </ResourceDictionary>
</Application.Resources>

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:

<Application.Resources>
    <FontFamily x:Key="FontUI">avares://JdeScoping.ConfigManager/Assets/Fonts#IBM Plex Sans</FontFamily>
    <FontFamily x:Key="FontMono">avares://JdeScoping.ConfigManager/Assets/Fonts#JetBrains Mono</FontFamily>
</Application.Resources>

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