From d7003773d58973a315fdb5b84bf5d86cfa40be59 Mon Sep 17 00:00:00 2001 From: masarray Date: Wed, 15 Jul 2026 15:24:28 +0700 Subject: [PATCH 1/8] chore: stage premium P1 source transform --- .staging/p1/apply.zlib.b64 | 1 + 1 file changed, 1 insertion(+) create mode 100644 .staging/p1/apply.zlib.b64 diff --git a/.staging/p1/apply.zlib.b64 b/.staging/p1/apply.zlib.b64 new file mode 100644 index 00000000..12b73b84 --- /dev/null +++ b/.staging/p1/apply.zlib.b64 @@ -0,0 +1 @@ +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 \ No newline at end of file From a292d7406089185d373b350edd9151ffcc6a9227 Mon Sep 17 00:00:00 2001 From: masarray Date: Wed, 15 Jul 2026 15:25:08 +0700 Subject: [PATCH 2/8] ci: apply premium P1 UI source --- .github/workflows/apply-premium-p1.yml | 87 ++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 .github/workflows/apply-premium-p1.yml diff --git a/.github/workflows/apply-premium-p1.yml b/.github/workflows/apply-premium-p1.yml new file mode 100644 index 00000000..89d698a2 --- /dev/null +++ b/.github/workflows/apply-premium-p1.yml @@ -0,0 +1,87 @@ +name: Apply premium P1 UI + +on: + pull_request: + branches: [ main ] + +permissions: + contents: write + +jobs: + apply: + if: ${{ github.event.pull_request.head.ref == 'fix/premium-p1-ui' }} + runs-on: ubuntu-latest + steps: + - name: Checkout feature branch + uses: actions/checkout@v4 + with: + ref: fix/premium-p1-ui + fetch-depth: 0 + + - name: Decode and validate P1 source + shell: bash + run: | + set -euo pipefail + python3 - <<'PY' + from pathlib import Path + import base64, hashlib, zlib + payload = Path('.staging/p1/apply.zlib.b64').read_text(encoding='utf-8').strip() + compressed = base64.b64decode(payload, validate=True) + digest = hashlib.sha256(compressed).hexdigest() + expected = 'e0f3e4b26394a8e9dea66c14294019ce2ecad02a28c1d13d5677ad128f69fa48' + if digest != expected: + raise SystemExit(f'P1 transform digest mismatch: {digest}') + Path('/tmp/apply_p1.py').write_bytes(zlib.decompress(compressed)) + PY + python3 /tmp/apply_p1.py + python3 - <<'PY' + from pathlib import Path + import xml.etree.ElementTree as ET + for path in ('App.xaml', 'MainWindow.xaml'): + ET.parse(path) + app = Path('App.xaml').read_text(encoding='utf-8') + main = Path('MainWindow.xaml').read_text(encoding='utf-8') + item_style = main.split('', 1)[1].split('', 1)[0] + if 'ScaleTransform ScaleX="1.012"' in item_style or 'Property="RenderTransform"' in item_style: + raise SystemExit('IED card hover still changes layout scale') + required_main = [ + 'x:Name="ConnectedBadge"', + 'Style="{StaticResource CommandDataGrid}"', + 'RowStyle="{StaticResource CommandDataGridRow}"', + 'ScrollViewer.HorizontalScrollBarVisibility="Disabled"', + 'Content="{Binding ControlPendingConfirmationLabel}"' + ] + required_app = ['IedCardConnected', 'LucideSlidersHorizontal', 'CommandDataGridRow'] + for token in required_main: + if token not in main: + raise SystemExit(f'Missing MainWindow P1 invariant: {token}') + for token in required_app: + if token not in app: + raise SystemExit(f'Missing App P1 invariant: {token}') + if 'Content="Confirm Open"' in main or 'Content="Confirm Close"' in main: + raise SystemExit('Atomic single Confirm regressed') + PY + + - name: Create atomic production commit + env: + GH_TOKEN: ${{ github.token }} + TARGET_BRANCH: fix/premium-p1-ui + shell: bash + run: | + set -euo pipefail + repo="repos/$GITHUB_REPOSITORY" + base_commit=$(git rev-parse HEAD) + base_tree=$(gh api "$repo/git/commits/$base_commit" --jq .tree.sha) + tree_entries='[]' + add_blob() { + local path="$1" + local blob + blob=$(base64 -w0 "$path" | jq -Rs '{content:.,encoding:"base64"}' | gh api --method POST "$repo/git/blobs" --input - --jq .sha) + tree_entries=$(jq --arg path "$path" --arg sha "$blob" '. + [{path:$path,mode:"100644",type:"blob",sha:$sha}]' <<<"$tree_entries") + } + add_blob App.xaml + add_blob MainWindow.xaml + tree_sha=$(jq -n --arg base_tree "$base_tree" --argjson tree "$tree_entries" '{base_tree:$base_tree,tree:$tree}' | gh api --method POST "$repo/git/trees" --input - --jq .sha) + commit_sha=$(jq -n --arg tree "$tree_sha" --arg parent "$base_commit" '{message:"style: deliver premium P1 card and command UX",tree:$tree,parents:[$parent]}' | gh api --method POST "$repo/git/commits" --input - --jq .sha) + jq -n --arg sha "$commit_sha" '{sha:$sha,force:false}' | gh api --method PATCH "$repo/git/refs/heads/$TARGET_BRANCH" --input - >/dev/null + echo "Published $commit_sha" From 09824cbaa7e3556231fdef7da6bff796b3008b0a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2026 08:25:49 +0000 Subject: [PATCH 3/8] style: deliver premium P1 card and command UX --- App.xaml | 62 +++++++++++++++++++++++ MainWindow.xaml | 127 +++++++++++++++++++++++++++++++++--------------- 2 files changed, 149 insertions(+), 40 deletions(-) diff --git a/App.xaml b/App.xaml index 96b3c619..79e31ecd 100644 --- a/App.xaml +++ b/App.xaml @@ -62,6 +62,24 @@ + + + + + + + + + + + + + + + + + + M8,5 L19,12 L8,19 Z @@ -74,6 +92,7 @@ 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 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 M12,5 V19 M5,12 H19 + M21,4 H14 M10,4 H3 M21,12 H12 M8,12 H3 M21,20 H16 M12,20 H3 M14,2 V6 M10,10 V14 M16,18 V22 + + + + + + + +