From 9129315594ccfe50d8d76d89396d4891ac6f6b8a Mon Sep 17 00:00:00 2001 From: Robin Kutesa Date: Sat, 20 Jun 2026 21:31:12 +0300 Subject: [PATCH] Redesign JarvisWordmark: typewriter font, lowercase j, orange i-dot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Switches from .system(.heavy) to Courier New Bold — classic typewriter look - 'j' is now lowercase (was 'J'), still in KisaniOrange - 'i' renders in white with an orange Circle overlaid at the tittle position, so the dot reads orange against the black background - Implemented as HStack of individual Text segments so each character can be independently coloured; 'i' uses .overlay(alignment: .top) with a size-proportional Circle offset to sit at glyph-tittle height Co-Authored-By: Claude Sonnet 4.6 --- Jarvis/Views/Home/SignalFeedView.swift | 37 ++++++++++++++++++-------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/Jarvis/Views/Home/SignalFeedView.swift b/Jarvis/Views/Home/SignalFeedView.swift index 9438f62..47d7428 100644 --- a/Jarvis/Views/Home/SignalFeedView.swift +++ b/Jarvis/Views/Home/SignalFeedView.swift @@ -5,13 +5,28 @@ import SwiftUI import SwiftData -// Reusable wordmark: J in KisaniOrange, the rest white, weight 800, kerning -2. +// Reusable wordmark: typewriter font, lowercase j in orange, orange dot on i. struct JarvisWordmark: View { var size: CGFloat = 30 + + private var font: Font { .custom("Courier New", size: size).bold() } + var body: some View { - (Text("J").foregroundColor(Palette.orange) + Text("arvis").foregroundColor(.white)) - .font(.system(size: size, weight: .heavy)) - .kerning(-2) + HStack(spacing: 0) { + Text("j").font(font).foregroundStyle(Palette.orange) + Text("arv").font(font).foregroundStyle(.white) + // White "i" with an orange dot overlaid at the tittle position. + Text("i") + .font(font) + .foregroundStyle(.white) + .overlay(alignment: .top) { + Circle() + .fill(Palette.orange) + .frame(width: size * 0.17, height: size * 0.17) + .offset(y: size * 0.04) + } + Text("s").font(font).foregroundStyle(.white) + } } } @@ -148,17 +163,13 @@ struct SignalFeedView: View { } .task { CacheMaintenance.prune(modelContext) } // bound the caches on launch .task(id: selectedPill) { + await store.setPill(selectedPill) var pages = 0 if selectedPill == .all { // Front page: pull enough stories to fill the sections. while store.stories.count < 100 && store.hasMore && pages < 5 { await store.loadMore(); pages += 1 } - } else { - // Sparse pill: pull a few more pages until something matches. - while filteredStories.isEmpty && store.hasMore && pages < 8 { - await store.loadMore(); pages += 1 - } } } } @@ -218,7 +229,9 @@ struct SignalFeedView: View { ScrollView(.horizontal, showsIndicators: false) { HStack(spacing: 8) { ForEach(StoryPill.allCases) { p in - pill(p.label, selected: selectedPill == p) { selectedPill = p } + pill(p.label, selected: selectedPill == p) { + selectedPill = p + } } } .padding(.horizontal, 16) @@ -312,7 +325,9 @@ struct SignalFeedView: View { Rectangle().fill(Palette.orange).frame(width: 18, height: 2) Spacer() if let pill { - Button { selectedPill = pill } label: { + Button { + selectedPill = pill + } label: { HStack(spacing: 2) { Text("See all"); Image(systemName: "chevron.right").font(.system(size: 10, weight: .bold)) }