# Dark-theme empty state PNG — true alpha, colors visible on #363d45 panels. $ErrorActionPreference = 'Stop' Add-Type -AssemblyName System.Drawing $out = Join-Path $PSScriptRoot '..\frontend-web\assets\images\web\empty-state.png' $size = 320 $pf = [System.Drawing.Imaging.PixelFormat]::Format32bppArgb $bmp = New-Object System.Drawing.Bitmap($size, $size, $pf) $g = [System.Drawing.Graphics]::FromImage($bmp) $g.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::AntiAlias $g.Clear([System.Drawing.Color]::FromArgb(0, 0, 0, 0)) function C($hex, $a = 255) { $h = $hex.TrimStart('#') return [System.Drawing.Color]::FromArgb($a, [Convert]::ToInt32($h.Substring(0,2),16), [Convert]::ToInt32($h.Substring(2,2),16), [Convert]::ToInt32($h.Substring(4,2),16)) } # Lighter tones for visibility on dark UI (--soon-text / --soon-border range) $cFace = C '#9aa3ad' $cFaceD = C '#7a8794' $cFaceDD = C '#6b7580' $cStroke = C '#b8c0c8' $cAccent = C '#009688' $cAccentH= C '#26a69a' $cShadow = C '#000000' 55 function Pt($x, $y) { New-Object System.Drawing.PointF $x, $y } function FillPoly($pts, $fill, $stroke, $sw = 1.4) { $path = New-Object System.Drawing.Drawing2D.GraphicsPath $path.AddPolygon($pts) $g.FillPath((New-Object System.Drawing.SolidBrush $fill), $path) if ($stroke) { $pen = New-Object System.Drawing.Pen $stroke, $sw $pen.LineJoin = [System.Drawing.Drawing2D.LineJoin]::Round $g.DrawPath($pen, $path) $pen.Dispose() } $path.Dispose() } # Ground shadow $sh = New-Object System.Drawing.Drawing2D.GraphicsPath $sh.AddEllipse(68, 252, 184, 26) $g.FillPath((New-Object System.Drawing.SolidBrush $cShadow), $sh) $sh.Dispose() # Isometric open inbox FillPoly @((Pt 86 130),(Pt 160 88),(Pt 234 130),(Pt 160 172)) $cFaceD $cStroke FillPoly @((Pt 86 130),(Pt 160 172),(Pt 160 232),(Pt 86 192)) $cFace $cStroke FillPoly @((Pt 160 172),(Pt 234 130),(Pt 234 192),(Pt 160 232)) $cFaceDD $cStroke FillPoly @((Pt 86 192),(Pt 160 232),(Pt 234 192),(Pt 160 152)) (C '#5c6770') $cStroke # Open flaps (lighter) FillPoly @((Pt 86 130),(Pt 52 148),(Pt 86 192),(Pt 120 176)) (C '#8a939c') $cStroke 1.1 FillPoly @((Pt 234 130),(Pt 268 148),(Pt 234 192),(Pt 200 176)) (C '#8a939c') $cStroke 1.1 FillPoly @((Pt 160 88),(Pt 124 70),(Pt 196 70)) (C '#8a939c') $cStroke 1.1 # Accent front edge $lip = New-Object System.Drawing.Drawing2D.GraphicsPath $lip.AddLines(@((Pt 86 192),(Pt 160 232),(Pt 234 192))) $pa = New-Object System.Drawing.Pen $cAccent, 3 $pa.StartCap = [System.Drawing.Drawing2D.LineCap]::Round $pa.EndCap = [System.Drawing.Drawing2D.LineCap]::Round $g.DrawPath($pa, $lip) $pa.Dispose(); $lip.Dispose() # Inner dashed lines (empty hint) $pd = New-Object System.Drawing.Pen (C '#b8c0c8' 100), 1.6 $pd.DashStyle = [System.Drawing.Drawing2D.DashStyle]::Dash $g.DrawLine($pd, 114, 166, 206, 166) $g.DrawLine($pd, 124, 182, 196, 182) $pd.Dispose() # Accent center mark $g.FillEllipse((New-Object System.Drawing.SolidBrush $cAccentH), 152, 200, 16, 16) $g.DrawEllipse((New-Object System.Drawing.Pen (C '#ffffff' 80), 1.2), 152, 200, 16, 16) # Floating doc sheet FillPoly @((Pt 208 104),(Pt 254 82),(Pt 258 114),(Pt 212 136)) (C '#7a8794') $cStroke 1.1 $pl = New-Object System.Drawing.Pen (C '#b8c0c8' 140), 1.2 $g.DrawLine($pl, 216, 108, 246, 92) $g.DrawLine($pl, 216, 116, 240, 102) $g.DrawLine($pl, 216, 124, 234, 112) $pl.Dispose() $g.Dispose() $dir = Split-Path $out -Parent if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir -Force | Out-Null } $bmp.Save($out, [System.Drawing.Imaging.ImageFormat]::Png) $bmp.Dispose() Write-Host "OK $((Get-Item $out).FullName) $((Get-Item $out).Length) bytes"