Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
56bdc42
ci: apply premium P0 UI safely
masarray Jul 15, 2026
848fdc0
ci: validate premium bundle by structure
masarray Jul 15, 2026
b7b1dfd
ci: capture premium P0 validation evidence
masarray Jul 15, 2026
d717a13
feat: deliver premium P0 control and SCL UX
github-actions[bot] Jul 15, 2026
b212a7a
chore: stage premium P0 bundle chunk 00
masarray Jul 15, 2026
d0b290a
feat: deliver premium P0 control and SCL UX
github-actions[bot] Jul 15, 2026
3f2e567
chore: stage premium P0 bundle chunk 01
masarray Jul 15, 2026
cccdc00
feat: deliver premium P0 control and SCL UX
github-actions[bot] Jul 15, 2026
ecb5dae
chore: stage premium P0 bundle chunk 02
masarray Jul 15, 2026
ebfdd4e
feat: deliver premium P0 control and SCL UX
github-actions[bot] Jul 15, 2026
c496b79
chore: stage premium P0 bundle chunk 03
masarray Jul 15, 2026
cb4e579
feat: deliver premium P0 control and SCL UX
github-actions[bot] Jul 15, 2026
1349021
chore: stage premium P0 bundle chunk 04
masarray Jul 15, 2026
145572e
feat: deliver premium P0 control and SCL UX
github-actions[bot] Jul 15, 2026
cadd3b8
chore: stage premium P0 bundle chunk 05
masarray Jul 15, 2026
7cf8017
feat: deliver premium P0 control and SCL UX
github-actions[bot] Jul 15, 2026
43b6f05
chore: stage premium P0 bundle chunk 06
masarray Jul 15, 2026
1bd22c3
feat: deliver premium P0 control and SCL UX
github-actions[bot] Jul 15, 2026
75ee3a2
chore: stage premium P0 bundle chunk 07
masarray Jul 15, 2026
7cf2979
feat: deliver premium P0 control and SCL UX
github-actions[bot] Jul 15, 2026
5502413
ci: apply exact premium P0 source bundle
masarray Jul 15, 2026
b61bf96
ci: validate premium P0 semantics
masarray Jul 15, 2026
31ae5e1
chore: correct premium P0 bundle chunk 05
masarray Jul 15, 2026
23ec875
ci: upload exact premium P0 bundle evidence
masarray Jul 15, 2026
babbe62
ci: normalize exact premium P0 payload bytes
masarray Jul 15, 2026
3b85e6d
feat: deliver premium P0 control and SCL UX
github-actions[bot] Jul 15, 2026
351ba44
chore: remove premium P0 apply workflow
masarray Jul 15, 2026
a9054c9
chore: remove premium P0 staging chunk 00
masarray Jul 15, 2026
5f5d8fb
chore: remove premium P0 staging chunk 01
masarray Jul 15, 2026
56d078f
chore: remove premium P0 staging chunk 02
masarray Jul 15, 2026
69b838b
chore: remove premium P0 staging chunk 03
masarray Jul 15, 2026
53957a5
chore: remove premium P0 staging chunk 04
masarray Jul 15, 2026
a6aa364
chore: remove premium P0 staging chunk 05
masarray Jul 15, 2026
8a68fd3
chore: remove premium P0 staging chunk 06
masarray Jul 15, 2026
d1e902f
chore: remove premium P0 staging chunk 07
masarray Jul 15, 2026
d334729
release: bump premium P0 UX to 1.6.11
masarray Jul 15, 2026
45d8711
release: align portable package at 1.6.11
masarray Jul 15, 2026
45bf097
ci: validate and publish premium P0 UX 1.6.11
masarray Jul 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 27 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,32 @@ jobs:
shell: powershell
run: .\ArIED61850Tester\scripts\verify-source-clean.ps1

- name: Verify premium P0 UX invariants
shell: powershell
run: |
$main = Get-Content .\ArIED61850Tester\MainWindow.xaml -Raw
$save = Get-Content .\ArIED61850Tester\SaveSclWindow.xaml -Raw
if ($save -notmatch 'x:Name="EditionIndicator"' -or
$save -notmatch 'Content="Edition 2"' -or
$save -notmatch 'Content="Edition 1"') {
throw "Save SCL segmented Edition 2 / Edition 1 selector was not found."
}
if ($save -match '<ComboBox' -or $save -match 'Schema V3\.1' -or $save -match 'Schema V1\.6') {
throw "Save SCL still exposes the legacy schema ComboBox or technical schema revision labels."
}
if ($main -notmatch 'ScrollViewer.HorizontalScrollBarVisibility="Disabled"' -or
$main -notmatch 'CanUserResizeColumns="False"') {
throw "IED Command Panel horizontal overflow protection was not found."
}
if ($main -notmatch 'Content="\{Binding ControlPendingConfirmationLabel\}"' -or
$main -match 'Content="Confirm Open"' -or
$main -match 'Content="Confirm Close"') {
throw "Atomic single-button control confirmation regressed."
}
if ($main -notmatch 'LucideRefreshCw' -or $main -notmatch 'HorizontalAlignment="Center"') {
throw "Premium Lucide icon or centered IED card layout invariant was not found."
}

- name: Upload source snapshot
uses: actions/upload-artifact@v4
with:
Expand Down Expand Up @@ -100,7 +126,7 @@ jobs:

- name: Publish portable x64
shell: powershell
run: .\ArIED61850Tester\scripts\publish-windows-portable.ps1 -Version 1.6.10 -EngineProject "$env:GITHUB_WORKSPACE\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj"
run: .\ArIED61850Tester\scripts\publish-windows-portable.ps1 -Version 1.6.11 -EngineProject "$env:GITHUB_WORKSPACE\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj"

- name: Upload portable package
uses: actions/upload-artifact@v4
Expand Down
95 changes: 79 additions & 16 deletions App.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<Color x:Key="AccentColor">#2563EB</Color>
<Color x:Key="AccentDeepColor">#1D4ED8</Color>
<Color x:Key="SoftBlueColor">#EAF1FF</Color>
<Color x:Key="BgColor">#F5F7FB</Color>
<Color x:Key="BgColor">#EEF3F9</Color>
<Color x:Key="LineColor">#E5EAF3</Color>

<SolidColorBrush x:Key="Ink" Color="{StaticResource InkColor}"/>
Expand All @@ -23,15 +23,77 @@
<SolidColorBrush x:Key="RowSelected" Color="#EAF2FF"/>
<SolidColorBrush x:Key="RowSelectedBorder" Color="#C7DAFF"/>

<!-- Premium surface hierarchy. Gradients remain subtle so dense engineering data stays readable. -->
<LinearGradientBrush x:Key="AppBackgroundGradient" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#EAF0F8" Offset="0"/>
<GradientStop Color="#F5F8FC" Offset="0.55"/>
<GradientStop Color="#EDF3FA" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="PremiumSurface" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#FFFFFF" Offset="0"/>
<GradientStop Color="#F7FAFF" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="PremiumSurfaceHover" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#FFFFFF" Offset="0"/>
<GradientStop Color="#EEF5FF" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="PremiumSurfaceSelected" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#F8FBFF" Offset="0"/>
<GradientStop Color="#E6F0FF" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="AccentGradient" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#3B82F6" Offset="0"/>
<GradientStop Color="#4F46E5" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="SoftButtonGradient" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#F8FAFF" Offset="0"/>
<GradientStop Color="#EAF1FF" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="IedCardSurface" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#FFFFFF" Offset="0"/>
<GradientStop Color="#F5F9FF" Offset="0.68"/>
<GradientStop Color="#EEF4FF" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="IedCardHover" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#FFFFFF" Offset="0"/>
<GradientStop Color="#EAF3FF" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="IedCardSelected" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#F7FBFF" Offset="0"/>
<GradientStop Color="#DCEAFF" Offset="1"/>
</LinearGradientBrush>

<!-- Lucide-compatible 24 px outline geometries used by every visible application action. -->
<Geometry x:Key="LucidePlay">M8,5 L19,12 L8,19 Z</Geometry>
<Geometry x:Key="LucideSquare">M6,6 H18 V18 H6 Z</Geometry>
<Geometry x:Key="LucidePencilLine">M12,20 H21 M16.5,3.5 A2.12,2.12 0 0 1 19.5,6.5 L7,19 L3,20 L4,16 Z</Geometry>
<Geometry x:Key="LucideSave">M19,21 H5 A2,2 0 0 1 3,19 V5 A2,2 0 0 1 5,3 H16 L21,8 V19 A2,2 0 0 1 19,21 Z M17,21 V13 H7 V21 M7,3 V8 H15</Geometry>
<Geometry x:Key="LucideX">M18,6 L6,18 M6,6 L18,18</Geometry>
<Geometry x:Key="LucideRefreshCw">M20,11 A8,8 0 1 0 18.3,16 M20,4 V11 H13</Geometry>
<Geometry x:Key="LucideFolderOpen">M3,7 H9 L11,9 H21 L19,20 H3 Z M3,7 V5 H9 L11,7</Geometry>
<Geometry x:Key="LucideFileInput">M14,2 V8 H20 M14,2 H6 A2,2 0 0 0 4,4 V20 A2,2 0 0 0 6,22 H18 A2,2 0 0 0 20,20 V8 Z M9,15 H15 M12,12 L15,15 L12,18</Geometry>
<Geometry x:Key="LucideFileOutput">M14,2 V8 H20 M14,2 H6 A2,2 0 0 0 4,4 V20 A2,2 0 0 0 6,22 H18 A2,2 0 0 0 20,20 V8 Z M10,15 H16 M13,12 L16,15 L13,18</Geometry>
<Geometry x:Key="LucidePlus">M12,5 V19 M5,12 H19</Geometry>

<Style x:Key="LucideIcon" TargetType="Path">
<Setter Property="Fill" Value="Transparent"/>
<Setter Property="Stroke" Value="{StaticResource Accent}"/>
<Setter Property="StrokeThickness" Value="2"/>
<Setter Property="StrokeLineJoin" Value="Round"/>
<Setter Property="StrokeStartLineCap" Value="Round"/>
<Setter Property="StrokeEndLineCap" Value="Round"/>
<Setter Property="Stretch" Value="Uniform"/>
</Style>

<DropShadowEffect x:Key="CardShadow" BlurRadius="22" ShadowDepth="8" Opacity="0.075" Color="#172033"/>
<DropShadowEffect x:Key="ButtonShadow" BlurRadius="18" ShadowDepth="5" Opacity="0.16" Color="#2563EB"/>
<DropShadowEffect x:Key="SoftShadow" BlurRadius="16" ShadowDepth="4" Opacity="0.07" Color="#172033"/>

<Style x:Key="Card" TargetType="Border">
<Setter Property="Background" Value="White"/>
<Setter Property="Background" Value="{StaticResource PremiumSurface}"/>
<Setter Property="CornerRadius" Value="18"/>
<Setter Property="Padding" Value="14"/>
<Setter Property="BorderBrush" Value="{StaticResource Line}"/>
<Setter Property="BorderBrush" Value="#D6E1F0"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Effect" Value="{StaticResource CardShadow}"/>
</Style>
Expand Down Expand Up @@ -78,7 +140,7 @@

<Style x:Key="PrimaryButton" TargetType="Button">
<Setter Property="Foreground" Value="White"/>
<Setter Property="Background" Value="{StaticResource Accent}"/>
<Setter Property="Background" Value="{StaticResource AccentGradient}"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="14,8"/>
Expand All @@ -91,7 +153,7 @@
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid SnapsToDevicePixels="True">
<Border x:Name="Chrome" Background="{TemplateBinding Background}" CornerRadius="14" RenderTransformOrigin="0.5,0.5">
<Border x:Name="Chrome" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="14" RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<ScaleTransform ScaleX="1" ScaleY="1"/>
</Border.RenderTransform>
Expand Down Expand Up @@ -143,9 +205,9 @@

<Style x:Key="SoftButton" TargetType="Button">
<Setter Property="Foreground" Value="{StaticResource Ink}"/>
<Setter Property="Background" Value="#EEF3FF"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Background" Value="{StaticResource SoftButtonGradient}"/>
<Setter Property="BorderBrush" Value="#CBD9EE"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Padding" Value="14,8"/>
<Setter Property="MinHeight" Value="34"/>
<Setter Property="FontWeight" Value="SemiBold"/>
Expand All @@ -156,7 +218,7 @@
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid SnapsToDevicePixels="True">
<Border x:Name="Chrome" Background="{TemplateBinding Background}" CornerRadius="14" RenderTransformOrigin="0.5,0.5">
<Border x:Name="Chrome" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="14" RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<ScaleTransform ScaleX="1" ScaleY="1"/>
</Border.RenderTransform>
Expand Down Expand Up @@ -297,22 +359,23 @@
<Setter Property="Height" Value="31"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="1"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Background" Value="#F6F9FF"/>
<Setter Property="BorderBrush" Value="#D6E1F0"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="Chrome" Background="{TemplateBinding Background}" CornerRadius="9"
BorderBrush="#DCE5F3" BorderThickness="0" RenderTransformOrigin="0.5,0.5">
BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform><ScaleTransform ScaleX="1" ScaleY="1"/></Border.RenderTransform>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Chrome" Property="Background" Value="#FFFFFF"/>
<Setter TargetName="Chrome" Property="BorderThickness" Value="1"/>
<Setter TargetName="Chrome" Property="BorderBrush" Value="#9CB8E8"/>
<Setter TargetName="Chrome" Property="RenderTransform">
<Setter.Value><ScaleTransform ScaleX="1.06" ScaleY="1.06"/></Setter.Value>
</Setter>
Expand Down Expand Up @@ -550,8 +613,8 @@
<Setter Property="HeadersVisibility" Value="Column"/>
<Setter Property="GridLinesVisibility" Value="None"/>
<Setter Property="RowHeaderWidth" Value="0"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="{StaticResource Line}"/>
<Setter Property="Background" Value="#FBFDFF"/>
<Setter Property="BorderBrush" Value="#D4DFEE"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="HorizontalGridLinesBrush" Value="Transparent"/>
<Setter Property="VerticalGridLinesBrush" Value="Transparent"/>
Expand All @@ -564,7 +627,7 @@
<Setter Property="CanUserDeleteRows" Value="False"/>
<Setter Property="RowHeight" Value="34"/>
<Setter Property="ColumnHeaderHeight" Value="34"/>
<Setter Property="AlternatingRowBackground" Value="#FBFCFF"/>
<Setter Property="AlternatingRowBackground" Value="#F5F8FD"/>
<Setter Property="FontSize" Value="12.5"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
Expand Down
6 changes: 3 additions & 3 deletions ArIED61850Tester.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
<Product>ArIED 61850</Product>
<AssemblyTitle>ArIED 61850 — IEC 61850 Engineering Workstation</AssemblyTitle>
<Description>Windows IEC 61850 engineering workstation for SCL-assisted project setup, interoperable Edition 1/2 SCL export, live MMS model discovery, independent multi-IED monitoring, reporting diagnostics, sequence of events, and guarded Smart Control.</Description>
<Version>1.6.10</Version>
<AssemblyVersion>1.6.10.0</AssemblyVersion>
<FileVersion>1.6.10.0</FileVersion>
<Version>1.6.11</Version>
<AssemblyVersion>1.6.11.0</AssemblyVersion>
<FileVersion>1.6.11.0</FileVersion>
<PackageTags>iec61850;iec-61850;mms;scl;ied-explorer;multi-ied-monitoring;relay-testing;substation-automation;digital-substation;report-control-block;sequence-of-events;smart-control;wpf;dotnet</PackageTags>
<PackageLicenseExpression>GPL-3.0-or-later</PackageLicenseExpression>
<ArIec61850Project Condition="'$(ArIec61850Project)' == '' and '$(ARIEC61850_PROJECT)' != ''">$(ARIEC61850_PROJECT)</ArIec61850Project>
Expand Down
Loading
Loading