Redesign JarvisWordmark: typewriter font, lowercase j, orange i-dot
Some checks failed
CI / Build · macos-14 · Debug (push) Has been cancelled
CI / Build · macos-15 · Debug (push) Has been cancelled
CI / Build · macos-14 · Release (push) Has been cancelled
CI / Build · macos-15 · Release (push) Has been cancelled

- 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 <noreply@anthropic.com>
This commit is contained in:
Robin Kutesa
2026-06-20 21:31:12 +03:00
parent 053e6341ce
commit 9129315594

View File

@@ -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))
}