From 83f84601f052b06bbb3d0fb33b8ae3f3bea8951b Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Tue, 7 Jul 2026 00:47:41 -0700 Subject: [PATCH 01/10] =?UTF-8?q?nvrsion:=20Add:=20Apply=20channel=20color?= =?UTF-8?q?=20to=20=E2=80=9CEXPERIMENTAL=E2=80=9D=20pill=20and=20remove=20?= =?UTF-8?q?pre-release=20banner=20colors.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nucleic-Promote: 1 Co-authored-by: Nucleic --- .../NucleicRemote/Views/BuildBanner.swift | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift index 8e0372b..d570c27 100644 --- a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift +++ b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift @@ -84,10 +84,11 @@ struct BuildInfo { } /// Header strip warning that this is a non-release build — the same channel colors, icons, -/// and copy as the Mac's `BuildBanner`: red for local builds, canary-yellow for canary, blue -/// for beta, gold for a release candidate. The leading edge names the channel; the build -/// label and an all-caps "EXPERIMENTAL" badge sit on the trailing edge. Renders nothing for -/// a shipping App Store release. +/// and copy as the Mac's `BuildBanner`. The strip stays untinted; the channel color rides on +/// the all-caps "EXPERIMENTAL" pill instead: red for local builds, canary-yellow for canary, +/// blue for beta, gold for a release candidate. The leading edge names the channel; the build +/// label and the pill sit on the trailing edge. Renders nothing for a shipping App Store +/// release. struct BuildBanner: View { var info: BuildInfo = .current @@ -106,15 +107,15 @@ struct BuildBanner: View { Text("EXPERIMENTAL") .font(.caption2.weight(.heavy)) .tracking(0.9) + .foregroundStyle(.white) .padding(.horizontal, 6) .padding(.vertical, 2) - .background(.white.opacity(0.16), in: .capsule) + .background(style.tint, in: .capsule) } - .foregroundStyle(.white.opacity(0.92)) + .foregroundStyle(.primary) .padding(.horizontal, 12) .padding(.vertical, 5) .frame(maxWidth: .infinity) - .background(style.tint.opacity(0.5)) .accessibilityLabel(style.tooltip(version: info.version, build: info.buildLabel)) } } From 1f8cf6176bccb314d73a8a2659fdeb42ce56a52e Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Tue, 7 Jul 2026 00:54:54 -0700 Subject: [PATCH 02/10] nvrsion: Add stripe to EXPERIMENTAL Pill Colors in BuildBanner to apply only to the line with build type, hash, and experimental pill. Nucleic-Promote: 1 Co-authored-by: Nucleic --- .../NucleicRemote/Views/BuildBanner.swift | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift index d570c27..7cab639 100644 --- a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift +++ b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift @@ -83,12 +83,12 @@ struct BuildInfo { } } -/// Header strip warning that this is a non-release build — the same channel colors, icons, -/// and copy as the Mac's `BuildBanner`. The strip stays untinted; the channel color rides on -/// the all-caps "EXPERIMENTAL" pill instead: red for local builds, canary-yellow for canary, -/// blue for beta, gold for a release candidate. The leading edge names the channel; the build -/// label and the pill sit on the trailing edge. Renders nothing for a shipping App Store -/// release. +/// Header warning that this is a non-release build — the same channel colors, icons, and copy +/// as the Mac's `BuildBanner`. A channel-colored stripe — red for local builds, canary-yellow +/// for canary, blue for beta, gold for a release candidate — hugs just the one row it labels +/// (channel name, build label, and an all-caps "EXPERIMENTAL" pill), pinned to the leading +/// edge rather than bleeding across the full window header. Renders nothing for a shipping App +/// Store release. struct BuildBanner: View { var info: BuildInfo = .current @@ -100,22 +100,26 @@ struct BuildBanner: View { Text(style.label) .font(.footnote.weight(.semibold)) .lineLimit(1) - Spacer(minLength: 12) Text(info.buildLabel) .font(.caption.monospaced()) .opacity(0.85) Text("EXPERIMENTAL") .font(.caption2.weight(.heavy)) .tracking(0.9) - .foregroundStyle(.white) .padding(.horizontal, 6) .padding(.vertical, 2) - .background(style.tint, in: .capsule) + .background(.white.opacity(0.16), in: .capsule) } - .foregroundStyle(.primary) + .foregroundStyle(.white.opacity(0.92)) .padding(.horizontal, 12) .padding(.vertical, 5) - .frame(maxWidth: .infinity) + // The channel-colored stripe wraps only this row of content — channel name, build + // label, and the EXPERIMENTAL pill — instead of bleeding across the full window + // header, then sits at the leading edge with a little breathing room around it. + .background(style.tint.opacity(0.9), in: .rect(cornerRadius: 8)) + .padding(.horizontal, 12) + .padding(.vertical, 4) + .frame(maxWidth: .infinity, alignment: .leading) .accessibilityLabel(style.tooltip(version: info.version, build: info.buildLabel)) } } From 6fba5b85c5dc676691550a721ec208e8b6c6c0bc Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Tue, 7 Jul 2026 01:04:58 -0700 Subject: [PATCH 03/10] nvrsion: Add updated BuildBanner: shorten stripe and reduce symbol size in EXPERIMENTAL Pill Colors. Nucleic-Promote: 1 Co-authored-by: Nucleic --- NucleicRemote/NucleicRemote/Views/BuildBanner.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift index 7cab639..2e9bd79 100644 --- a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift +++ b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift @@ -96,7 +96,7 @@ struct BuildBanner: View { if let style = Style(channel: info.channel) { HStack(spacing: 8) { Image(systemName: style.icon) - .font(.system(size: 15, weight: .heavy)) + .font(.system(size: 12, weight: .heavy)) Text(style.label) .font(.footnote.weight(.semibold)) .lineLimit(1) @@ -112,7 +112,7 @@ struct BuildBanner: View { } .foregroundStyle(.white.opacity(0.92)) .padding(.horizontal, 12) - .padding(.vertical, 5) + .padding(.vertical, 3) // The channel-colored stripe wraps only this row of content — channel name, build // label, and the EXPERIMENTAL pill — instead of bleeding across the full window // header, then sits at the leading edge with a little breathing room around it. From b106169de1731a0062e201caf9be8d6f6db50e4b Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Tue, 7 Jul 2026 01:10:34 -0700 Subject: [PATCH 04/10] nvrsion: Add: Move the stripe horizontally and vertically align it with the app/project title in BuildBanner.swift, RootView.swift, and ios/NucleicRemote/NucleicRemote/Views/BuildBanner.swift. Nucleic-Promote: 1 Co-authored-by: Nucleic --- NucleicRemote/NucleicRemote/Views/BuildBanner.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift index 2e9bd79..2052bf3 100644 --- a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift +++ b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift @@ -114,12 +114,12 @@ struct BuildBanner: View { .padding(.horizontal, 12) .padding(.vertical, 3) // The channel-colored stripe wraps only this row of content — channel name, build - // label, and the EXPERIMENTAL pill — instead of bleeding across the full window - // header, then sits at the leading edge with a little breathing room around it. + // label, and the EXPERIMENTAL pill — instead of bleeding across the full header, + // then sits horizontally centered with a little breathing room around it. .background(style.tint.opacity(0.9), in: .rect(cornerRadius: 8)) .padding(.horizontal, 12) .padding(.vertical, 4) - .frame(maxWidth: .infinity, alignment: .leading) + .frame(maxWidth: .infinity, alignment: .center) .accessibilityLabel(style.tooltip(version: info.version, build: info.buildLabel)) } } From 3a00873d237bd344b2c4f5472d00bfc3579c4a77 Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Tue, 7 Jul 2026 01:14:20 -0700 Subject: [PATCH 05/10] nvrsion: Remove EXPERIMENTAL Pill Colors from Chat and revert BuildBanner.swift updates in Sources/NucleicApp and ios/NucleicRemote/NucleicRemote/Views. Nucleic-Promote: 1 Co-authored-by: Nucleic --- NucleicRemote/NucleicRemote/Views/BuildBanner.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift index 2052bf3..2e9bd79 100644 --- a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift +++ b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift @@ -114,12 +114,12 @@ struct BuildBanner: View { .padding(.horizontal, 12) .padding(.vertical, 3) // The channel-colored stripe wraps only this row of content — channel name, build - // label, and the EXPERIMENTAL pill — instead of bleeding across the full header, - // then sits horizontally centered with a little breathing room around it. + // label, and the EXPERIMENTAL pill — instead of bleeding across the full window + // header, then sits at the leading edge with a little breathing room around it. .background(style.tint.opacity(0.9), in: .rect(cornerRadius: 8)) .padding(.horizontal, 12) .padding(.vertical, 4) - .frame(maxWidth: .infinity, alignment: .center) + .frame(maxWidth: .infinity, alignment: .leading) .accessibilityLabel(style.tooltip(version: info.version, build: info.buildLabel)) } } From 4a262bf76e27a5c0c8c8df449c951ea2c6c15a28 Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Tue, 7 Jul 2026 01:17:09 -0700 Subject: [PATCH 06/10] nvrsion: Add: Update EXPERIMENTAL Pill Colors to span full width on BuildBanner. Nucleic-Promote: 1 Co-authored-by: Nucleic --- .../NucleicRemote/Views/BuildBanner.swift | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift index 2e9bd79..bbdee47 100644 --- a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift +++ b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift @@ -85,10 +85,9 @@ struct BuildInfo { /// Header warning that this is a non-release build — the same channel colors, icons, and copy /// as the Mac's `BuildBanner`. A channel-colored stripe — red for local builds, canary-yellow -/// for canary, blue for beta, gold for a release candidate — hugs just the one row it labels -/// (channel name, build label, and an all-caps "EXPERIMENTAL" pill), pinned to the leading -/// edge rather than bleeding across the full window header. Renders nothing for a shipping App -/// Store release. +/// for canary, blue for beta, gold for a release candidate — spans the full width, with its +/// content (channel name, build label, and an all-caps "EXPERIMENTAL" pill) held at the +/// leading edge. Renders nothing for a shipping App Store release. struct BuildBanner: View { var info: BuildInfo = .current @@ -113,13 +112,10 @@ struct BuildBanner: View { .foregroundStyle(.white.opacity(0.92)) .padding(.horizontal, 12) .padding(.vertical, 3) - // The channel-colored stripe wraps only this row of content — channel name, build - // label, and the EXPERIMENTAL pill — instead of bleeding across the full window - // header, then sits at the leading edge with a little breathing room around it. - .background(style.tint.opacity(0.9), in: .rect(cornerRadius: 8)) - .padding(.horizontal, 12) - .padding(.vertical, 4) .frame(maxWidth: .infinity, alignment: .leading) + // The channel-colored stripe spans the full width, with the content (channel name, + // build label, and the EXPERIMENTAL pill) held at the leading edge. + .background(style.tint.opacity(0.9)) .accessibilityLabel(style.tooltip(version: info.version, build: info.buildLabel)) } } From ff97148c2b3640be11d7577645a73a095615edc8 Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Tue, 7 Jul 2026 01:21:15 -0700 Subject: [PATCH 07/10] nvrsion: Add: Fix height calculation in BuildBanner to use full header height with stripe height based on build type/hash/pill text + padding. Nucleic-Promote: 1 Co-authored-by: Nucleic --- NucleicRemote/NucleicRemote/Views/BuildBanner.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift index bbdee47..b5252c7 100644 --- a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift +++ b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift @@ -114,8 +114,11 @@ struct BuildBanner: View { .padding(.vertical, 3) .frame(maxWidth: .infinity, alignment: .leading) // The channel-colored stripe spans the full width, with the content (channel name, - // build label, and the EXPERIMENTAL pill) held at the leading edge. + // build label, and the EXPERIMENTAL pill) held at the leading edge. Its height is + // just the row of text plus padding; the trailing vertical padding is transparent + // margin that keeps the stripe from filling the header's full height. .background(style.tint.opacity(0.9)) + .padding(.vertical, 4) .accessibilityLabel(style.tooltip(version: info.version, build: info.buildLabel)) } } From df299e1189d7e321fd1445d7ac354bdea87b3d43 Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Tue, 7 Jul 2026 01:24:27 -0700 Subject: [PATCH 08/10] =?UTF-8?q?nvrsion:=20Add:=20Move=20hash=20and=20?= =?UTF-8?q?=E2=80=9CExperimental=E2=80=9D=20pill=20to=20the=20right=20side?= =?UTF-8?q?=20of=20the=20stripe=20in=20BuildBanner.swift.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nucleic-Promote: 1 Co-authored-by: Nucleic --- NucleicRemote/NucleicRemote/Views/BuildBanner.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift index b5252c7..59f37b3 100644 --- a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift +++ b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift @@ -99,6 +99,7 @@ struct BuildBanner: View { Text(style.label) .font(.footnote.weight(.semibold)) .lineLimit(1) + Spacer(minLength: 12) Text(info.buildLabel) .font(.caption.monospaced()) .opacity(0.85) From 01ef87024af92c64fb8dcacdae1183acdc84a003 Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Tue, 7 Jul 2026 01:25:52 -0700 Subject: [PATCH 09/10] nvrsion: Add: Full-height top area color for EXPERIMENTAL Pill Colors in BuildBanner.swift. Nucleic-Promote: 1 Co-authored-by: Nucleic --- NucleicRemote/NucleicRemote/Views/BuildBanner.swift | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift index 59f37b3..426cc4f 100644 --- a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift +++ b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift @@ -114,12 +114,10 @@ struct BuildBanner: View { .padding(.horizontal, 12) .padding(.vertical, 3) .frame(maxWidth: .infinity, alignment: .leading) - // The channel-colored stripe spans the full width, with the content (channel name, - // build label, and the EXPERIMENTAL pill) held at the leading edge. Its height is - // just the row of text plus padding; the trailing vertical padding is transparent - // margin that keeps the stripe from filling the header's full height. + // The channel-colored stripe fills the full width and height of the top area, with + // the content (channel name, build label, and the EXPERIMENTAL pill) laid across it + // — the channel name at the leading edge, the build label and pill at the trailing. .background(style.tint.opacity(0.9)) - .padding(.vertical, 4) .accessibilityLabel(style.tooltip(version: info.version, build: info.buildLabel)) } } From 6025fe6d4128df6a2005c5808c64fb0de5d3eecd Mon Sep 17 00:00:00 2001 From: Andrew Blakeslee Moore Date: Tue, 7 Jul 2026 01:53:08 -0700 Subject: [PATCH 10/10] nvrsion: Add revert logic to Sources/NucleicApp/BuildBanner.swift, Sources/NucleicApp/ToolbarGlassKeeper.swift, and ios/NucleicRemote/NucleicRemote/Views/BuildBanner.swift to restore prior state, and fix sidebar color distortion in Sources/NucleicApp/RootView.swift. Nucleic-Promote: 1 Co-authored-by: Nucleic --- .../NucleicRemote/Views/BuildBanner.swift | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift index 426cc4f..8e0372b 100644 --- a/NucleicRemote/NucleicRemote/Views/BuildBanner.swift +++ b/NucleicRemote/NucleicRemote/Views/BuildBanner.swift @@ -83,11 +83,11 @@ struct BuildInfo { } } -/// Header warning that this is a non-release build — the same channel colors, icons, and copy -/// as the Mac's `BuildBanner`. A channel-colored stripe — red for local builds, canary-yellow -/// for canary, blue for beta, gold for a release candidate — spans the full width, with its -/// content (channel name, build label, and an all-caps "EXPERIMENTAL" pill) held at the -/// leading edge. Renders nothing for a shipping App Store release. +/// Header strip warning that this is a non-release build — the same channel colors, icons, +/// and copy as the Mac's `BuildBanner`: red for local builds, canary-yellow for canary, blue +/// for beta, gold for a release candidate. The leading edge names the channel; the build +/// label and an all-caps "EXPERIMENTAL" badge sit on the trailing edge. Renders nothing for +/// a shipping App Store release. struct BuildBanner: View { var info: BuildInfo = .current @@ -95,7 +95,7 @@ struct BuildBanner: View { if let style = Style(channel: info.channel) { HStack(spacing: 8) { Image(systemName: style.icon) - .font(.system(size: 12, weight: .heavy)) + .font(.system(size: 15, weight: .heavy)) Text(style.label) .font(.footnote.weight(.semibold)) .lineLimit(1) @@ -112,12 +112,9 @@ struct BuildBanner: View { } .foregroundStyle(.white.opacity(0.92)) .padding(.horizontal, 12) - .padding(.vertical, 3) - .frame(maxWidth: .infinity, alignment: .leading) - // The channel-colored stripe fills the full width and height of the top area, with - // the content (channel name, build label, and the EXPERIMENTAL pill) laid across it - // — the channel name at the leading edge, the build label and pill at the trailing. - .background(style.tint.opacity(0.9)) + .padding(.vertical, 5) + .frame(maxWidth: .infinity) + .background(style.tint.opacity(0.5)) .accessibilityLabel(style.tooltip(version: info.version, build: info.buildLabel)) } }