Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 8 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
shell: powershell
run: .\ArIED61850Tester\scripts\verify-source-clean.ps1

- name: Verify premium P0 and P1 UX invariants
- name: Verify premium P0, P1 and P2 UX invariants
shell: powershell
run: |
$app = Get-Content .\ArIED61850Tester\App.xaml -Raw
Expand Down Expand Up @@ -76,6 +76,12 @@ jobs:
if ($main -notmatch 'LucideRefreshCw' -or $main -notmatch 'HorizontalAlignment="Center"') {
throw "Premium Lucide icon or centered IED card layout invariant was not found."
}
if ($app -notmatch 'x:Key="SurfaceColor"' -or
$app -notmatch 'x:Key="BorderStrongColor"' -or
$app -notmatch 'x:Key="BodyText"' -or
$app -notmatch 'x:Key="MicroLabel"') {
throw "P2 semantic theme tokens or compact typography scale were not found."
}

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

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

- name: Upload portable package
uses: actions/upload-artifact@v4
Expand Down
109 changes: 48 additions & 61 deletions App.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,15 @@
<Color x:Key="AccentDeepColor">#1D4ED8</Color>
<Color x:Key="SoftBlueColor">#EAF1FF</Color>
<Color x:Key="BgColor">#EEF3F9</Color>
<Color x:Key="LineColor">#E5EAF3</Color>
<Color x:Key="LineColor">#DDE5F0</Color>
<!-- P2 semantic theme tokens: one source of truth for compact engineering surfaces and states. -->
<Color x:Key="SurfaceColor">#F8FAFD</Color>
<Color x:Key="SurfaceElevatedColor">#FFFFFF</Color>
<Color x:Key="BorderSubtleColor">#DDE5F0</Color>
<Color x:Key="BorderStrongColor">#B9C8DC</Color>
<Color x:Key="SuccessColor">#15803D</Color>
<Color x:Key="DangerColor">#DC2626</Color>
<Color x:Key="WarningColor">#D97706</Color>

<SolidColorBrush x:Key="Ink" Color="{StaticResource InkColor}"/>
<SolidColorBrush x:Key="Muted" Color="{StaticResource MutedColor}"/>
Expand All @@ -18,16 +26,23 @@
<SolidColorBrush x:Key="SoftBlue" Color="{StaticResource SoftBlueColor}"/>
<SolidColorBrush x:Key="Bg" Color="{StaticResource BgColor}"/>
<SolidColorBrush x:Key="Line" Color="{StaticResource LineColor}"/>
<SolidColorBrush x:Key="Panel" Color="#FFFFFF"/>
<SolidColorBrush x:Key="Surface" Color="{StaticResource SurfaceColor}"/>
<SolidColorBrush x:Key="SurfaceElevated" Color="{StaticResource SurfaceElevatedColor}"/>
<SolidColorBrush x:Key="BorderSubtle" Color="{StaticResource BorderSubtleColor}"/>
<SolidColorBrush x:Key="BorderStrong" Color="{StaticResource BorderStrongColor}"/>
<SolidColorBrush x:Key="Success" Color="{StaticResource SuccessColor}"/>
<SolidColorBrush x:Key="Danger" Color="{StaticResource DangerColor}"/>
<SolidColorBrush x:Key="Warning" Color="{StaticResource WarningColor}"/>
<SolidColorBrush x:Key="Panel" Color="{StaticResource SurfaceElevatedColor}"/>
<SolidColorBrush x:Key="RowHover" Color="#F4F8FF"/>
<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"/>
<GradientStop Color="#E8EEF7" Offset="0"/>
<GradientStop Color="#F3F7FC" Offset="0.52"/>
<GradientStop Color="#EAF1F9" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="PremiumSurface" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#FFFFFF" Offset="0"/>
Expand Down Expand Up @@ -56,16 +71,16 @@
</LinearGradientBrush>
<LinearGradientBrush x:Key="IedCardHover" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#FFFFFF" Offset="0"/>
<GradientStop Color="#EAF3FF" Offset="1"/>
<GradientStop Color="#E5F0FF" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="IedCardSelected" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#F7FBFF" Offset="0"/>
<GradientStop Color="#DCEAFF" Offset="1"/>
<GradientStop Color="#D5E6FF" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="IedCardConnected" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#FFFFFF" Offset="0"/>
<GradientStop Color="#F0FBF5" Offset="0.68"/>
<GradientStop Color="#E4F7ED" Offset="1"/>
<GradientStop Color="#DDF5E8" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="IedCardConnectedSelected" StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#F8FFFB" Offset="0"/>
Expand Down Expand Up @@ -146,15 +161,31 @@
</Setter>
</Style>

<!-- Compact P2 typography scale: restrained sizes for dense engineering workstations. -->
<Style x:Key="SectionTitle" TargetType="TextBlock">
<Setter Property="FontSize" Value="16"/>
<Setter Property="FontSize" Value="15"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Foreground" Value="{StaticResource Ink}"/>
<Setter Property="TextOptions.TextFormattingMode" Value="Display"/>
</Style>

<Style x:Key="BodyText" TargetType="TextBlock">
<Setter Property="FontSize" Value="12.2"/>
<Setter Property="Foreground" Value="{StaticResource Ink}"/>
<Setter Property="TextOptions.TextFormattingMode" Value="Display"/>
</Style>

<Style x:Key="Caption" TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource Muted}"/>
<Setter Property="FontSize" Value="12.5"/>
<Setter Property="FontSize" Value="11.8"/>
<Setter Property="TextOptions.TextFormattingMode" Value="Display"/>
</Style>

<Style x:Key="MicroLabel" TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource Muted}"/>
<Setter Property="FontSize" Value="10.6"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="TextOptions.TextFormattingMode" Value="Display"/>
</Style>

<Style x:Key="PrimaryButton" TargetType="Button">
Expand Down Expand Up @@ -185,32 +216,10 @@
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Chrome" Property="Background" Value="{StaticResource AccentDeep}"/>
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Chrome" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" To="1.018" Duration="0:0:0.14">
<DoubleAnimation.EasingFunction><CubicEase EasingMode="EaseOut"/></DoubleAnimation.EasingFunction>
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="Chrome" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="1.018" Duration="0:0:0.14">
<DoubleAnimation.EasingFunction><CubicEase EasingMode="EaseOut"/></DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Chrome" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" To="1" Duration="0:0:0.17"/>
<DoubleAnimation Storyboard.TargetName="Chrome" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:0.17"/>
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
<Setter TargetName="Chrome" Property="Opacity" Value="0.96"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Chrome" Property="Opacity" Value="0.94"/>
<Setter TargetName="Chrome" Property="RenderTransform">
<Setter.Value><ScaleTransform ScaleX="0.982" ScaleY="0.982"/></Setter.Value>
</Setter>
<Setter TargetName="Chrome" Property="Opacity" Value="0.84"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="Chrome" Property="Opacity" Value="0.55"/>
Expand Down Expand Up @@ -250,28 +259,10 @@
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Chrome" Property="Background" Value="#E1EAFE"/>
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Chrome" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" To="1.012" Duration="0:0:0.14"/>
<DoubleAnimation Storyboard.TargetName="Chrome" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="1.012" Duration="0:0:0.14"/>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Chrome" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" To="1" Duration="0:0:0.17"/>
<DoubleAnimation Storyboard.TargetName="Chrome" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:0.17"/>
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
<Setter TargetName="Chrome" Property="BorderBrush" Value="{StaticResource BorderStrong}"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Chrome" Property="Opacity" Value="0.94"/>
<Setter TargetName="Chrome" Property="RenderTransform">
<Setter.Value><ScaleTransform ScaleX="0.984" ScaleY="0.984"/></Setter.Value>
</Setter>
<Setter TargetName="Chrome" Property="Opacity" Value="0.82"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="Chrome" Property="Opacity" Value="0.55"/>
Expand Down Expand Up @@ -394,15 +385,11 @@
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Chrome" Property="Background" Value="#FFFFFF"/>
<Setter TargetName="Chrome" Property="BorderBrush" Value="#9CB8E8"/>
<Setter TargetName="Chrome" Property="RenderTransform">
<Setter.Value><ScaleTransform ScaleX="1.06" ScaleY="1.06"/></Setter.Value>
</Setter>
<Setter TargetName="Chrome" Property="BorderBrush" Value="#8EAFE3"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Chrome" Property="RenderTransform">
<Setter.Value><ScaleTransform ScaleX="0.94" ScaleY="0.94"/></Setter.Value>
</Setter>
<Setter TargetName="Chrome" Property="Background" Value="#E7F0FF"/>
<Setter TargetName="Chrome" Property="Opacity" Value="0.82"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="Chrome" Property="Opacity" Value="0.32"/>
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.12</Version>
<AssemblyVersion>1.6.12.0</AssemblyVersion>
<FileVersion>1.6.12.0</FileVersion>
<Version>1.6.13</Version>
<AssemblyVersion>1.6.13.0</AssemblyVersion>
<FileVersion>1.6.13.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