d49330e697
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.
1014 lines
34 KiB
Markdown
1014 lines
34 KiB
Markdown
# 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
|
||
<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:**
|
||
```xml
|
||
<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
|