From 5e6a6f04888520066c72263c5963a5d186ea7e95 Mon Sep 17 00:00:00 2001 From: Ryan Mello Date: Wed, 2 Sep 2026 08:48:09 -0700 Subject: [PATCH 1/2] fix: emit SF Symbols 6 templates so the widget catalog builds on Xcode 16.4 CI has been red since 315d6bb2 added the widgets target: Assets.xcassets: error: Template format 7.0 is newer than the version that this software supports (6.0) at CompileAssetCatalogVariant in URnetworkWidgets. Nothing outside the repo changed -- the runner image and the Xcode pin (16.4) are the same as the last green run. 315d6bb2 simply never ran CI: it was pushed together with its child d826f34b, and Actions builds only a push's HEAD, so the docs-only commit was the first run that compiled the new catalog. gen_connector_symbols.py hardcodes a Template v.7.0 banner and emits SF Symbols 7 style metadata, because it was written on Xcode 26. Fix the generator rather than the SVGs, so the next regeneration does not reintroduce it, and re-run it. The banner drops to v.6.0 ("Requires Xcode 16 or greater"), and all four -sfsymbols-* properties go, none of which a 6.0 parser knows and none of which this symbol uses -- it is a single static layer with no variable value and no Draw animation: -sfsymbols-motion-group SF Symbols 7 Draw animation -sfsymbols-draw-reverses-motion-groups SF Symbols 7 Draw animation -sfsymbols-layer-tags v7 per-layer identity token -sfsymbols-variable-value-mode picks color vs. draw; only a choice in v7 The three layer classes stay (with empty bodies) so each path's class attribute still binds the monochrome / hierarchical / multicolor layers; .defaults goes, having carried nothing but two of the properties above. No geometry changes: every path's d= is byte-identical to the previous export, and the compiled Assets.car keeps the same rendition names and counts (four Vector Glyphs per symbol, the four interpolation sources), each glyph just ~123 bytes smaller where the v7 metadata was. Not verified by building: this machine has no Xcode 16.4, only Xcode-beta 27.0, whose actool accepts both 6.0 and 7.0 -- so a local compile proves nothing about CI. The argument here is structural. The CI Xcode pin is untouched, and both symbols are kept (the outline variant is currently unreferenced but stays, per QUICKCONNECT.md). Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_014vN7zh8WeQYCtirhcA3aWw --- QUICKCONNECT.md | 6 ++- .../Assets.xcassets/gen_connector_symbols.py | 45 +++++++++++++------ .../ur.symbols.connector.fill.svg | 12 +++-- .../ur.symbols.connector.svg | 12 +++-- 4 files changed, 46 insertions(+), 29 deletions(-) diff --git a/QUICKCONNECT.md b/QUICKCONNECT.md index 9f961766..3e2687fd 100644 --- a/QUICKCONNECT.md +++ b/QUICKCONNECT.md @@ -176,8 +176,10 @@ reconciler (the shared tunnel intent, section 3). The July draft in else, so `widgets/Assets.xcassets/gen_connector_symbols.py` rebuilds the connector mark analytically (a 128-unit square whose corners are five quarter-circle arcs of radius 8, alternating convex/concave) and emits two - Template v7 symbol SVGs with the interpolation sources Ultralight-S, - Regular-S, Black-S and Regular-M. The outline variant is a true filled ring + Template v6 symbol SVGs (SF Symbols 6 / Xcode 16 -- CI pins Xcode 16.4 and + its actool rejects a newer template outright) with the interpolation + sources Ultralight-S, Regular-S, Black-S and Regular-M. The outline + variant is a true filled ring (lines inset by w, convex arcs shrunk to 8−w, concave arcs grown to 8+w), because symbols must be path-based, not stroked. `actool` validates both. - **State** (`ControlValueProvider.currentValue`): the app's configuration is diff --git a/app/widgets/Assets.xcassets/gen_connector_symbols.py b/app/widgets/Assets.xcassets/gen_connector_symbols.py index d8e771f4..684d0f11 100644 --- a/app/widgets/Assets.xcassets/gen_connector_symbols.py +++ b/app/widgets/Assets.xcassets/gen_connector_symbols.py @@ -10,9 +10,15 @@ produce true outline rings per weight (lines shift by w, convex arcs shrink to 8-w, concave arcs grow to 8+w; tangency is preserved). -Output: two symbol template SVGs (Template v.7.0 layout, as exported by the -SF Symbols app) with the interpolation sources Ultralight-S, Regular-S, -Black-S plus Regular-M. +Output: two symbol template SVGs (Template v.6.0, i.e. SF Symbols 6 / Xcode +16) with the interpolation sources Ultralight-S, Regular-S, Black-S plus +Regular-M. + +The version has to stay at 6.0: CI pins Xcode 16.4, and its actool rejects a +newer template outright -- "Template format 7.0 is newer than the version that +this software supports (6.0)" -- before it reads any of the artwork. The SF +Symbols app on a current machine exports 7.0, so if you re-export from it, +re-apply the 6.0 changes here rather than committing its output. """ import math import os @@ -133,7 +139,9 @@ def glyph(size, inset, y_center): return d -# Template geometry copied from an SF Symbols app v7 export (viewBox 3300x2200). +# Artboard geometry as exported by the SF Symbols app (viewBox 3300x2200). +# Only the version banner and the v7-only style metadata (see STYLE below) +# were changed to target 6.0; these coordinates are left exactly as exported. BASELINE = {"S": 696.0, "M": 1126.0, "L": 1556.0} CAPLINE = {"S": 625.541, "M": 1055.54, "L": 1485.54} CAP_HEIGHT = BASELINE["M"] - CAPLINE["M"] # 70.46 @@ -150,13 +158,24 @@ def glyph(size, inset, y_center): H_REFERENCE = ("M0.7 0L0.7-70.5L11.4-70.5L11.4-40.7L44.8-40.7L44.8-70.5L55.5-70.5L55.5 0" "L44.8 0L44.8-31.8L11.4-31.8L11.4 0Z") -STYLE = """.defaults {-sfsymbols-variable-value-mode:color;-sfsymbols-draw-reverses-motion-groups:true} - -.monochrome-0 {-sfsymbols-motion-group:0;-sfsymbols-layer-tags:564789760d3a318d} - -.multicolor-0:tintColor {-sfsymbols-motion-group:0;-sfsymbols-layer-tags:564789760d3a318d} - -.hierarchical-0:primary {-sfsymbols-motion-group:0;-sfsymbols-layer-tags:564789760d3a318d} +# Style block for a 6.0 template. The four -sfsymbols-* properties a v7 export +# writes here are all v7 vocabulary and are omitted: -sfsymbols-motion-group and +# -sfsymbols-draw-reverses-motion-groups configure the SF Symbols 7 Draw +# animation, -sfsymbols-layer-tags is v7's per-layer identity token, and +# -sfsymbols-variable-value-mode selects between color and draw as the thing +# variable value drives, which is only a choice once draw exists. None of the +# four does anything for this symbol -- it is a single static layer with no +# variable value and no Draw animation -- so dropping them costs nothing. +# +# The three layer classes stay, with empty bodies: they are what each path's +# class attribute binds to, naming the monochrome / hierarchical / multicolor +# layers. .defaults goes entirely -- it carried nothing but the two v7 +# document-level properties. +STYLE = """.monochrome-0 {} + +.multicolor-0:tintColor {} + +.hierarchical-0:primary {} .SFSymbolsPreviewWireframe {fill:none;opacity:1.0;stroke:black;stroke-width:0.5} """ @@ -210,8 +229,8 @@ def template(name, outline): Ultralight Regular Black - Template v.7.0 - Requires Xcode 26 or greater + Template v.6.0 + Requires Xcode 16 or greater Generated from %s Typeset at 100.0 points Small diff --git a/app/widgets/Assets.xcassets/ur.symbols.connector.fill.symbolset/ur.symbols.connector.fill.svg b/app/widgets/Assets.xcassets/ur.symbols.connector.fill.symbolset/ur.symbols.connector.fill.svg index 4bd634fc..27d74b76 100644 --- a/app/widgets/Assets.xcassets/ur.symbols.connector.fill.symbolset/ur.symbols.connector.fill.svg +++ b/app/widgets/Assets.xcassets/ur.symbols.connector.fill.symbolset/ur.symbols.connector.fill.svg @@ -4,13 +4,11 @@ PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -