Redesign JarvisWordmark: typewriter font, lowercase j, orange i-dot
- 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:
@@ -5,13 +5,28 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
import SwiftData
|
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 {
|
struct JarvisWordmark: View {
|
||||||
var size: CGFloat = 30
|
var size: CGFloat = 30
|
||||||
|
|
||||||
|
private var font: Font { .custom("Courier New", size: size).bold() }
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
(Text("J").foregroundColor(Palette.orange) + Text("arvis").foregroundColor(.white))
|
HStack(spacing: 0) {
|
||||||
.font(.system(size: size, weight: .heavy))
|
Text("j").font(font).foregroundStyle(Palette.orange)
|
||||||
.kerning(-2)
|
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 { CacheMaintenance.prune(modelContext) } // bound the caches on launch
|
||||||
.task(id: selectedPill) {
|
.task(id: selectedPill) {
|
||||||
|
await store.setPill(selectedPill)
|
||||||
var pages = 0
|
var pages = 0
|
||||||
if selectedPill == .all {
|
if selectedPill == .all {
|
||||||
// Front page: pull enough stories to fill the sections.
|
// Front page: pull enough stories to fill the sections.
|
||||||
while store.stories.count < 100 && store.hasMore && pages < 5 {
|
while store.stories.count < 100 && store.hasMore && pages < 5 {
|
||||||
await store.loadMore(); pages += 1
|
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) {
|
ScrollView(.horizontal, showsIndicators: false) {
|
||||||
HStack(spacing: 8) {
|
HStack(spacing: 8) {
|
||||||
ForEach(StoryPill.allCases) { p in
|
ForEach(StoryPill.allCases) { p in
|
||||||
pill(p.label, selected: selectedPill == p) { selectedPill = p }
|
pill(p.label, selected: selectedPill == p) {
|
||||||
|
selectedPill = p
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding(.horizontal, 16)
|
.padding(.horizontal, 16)
|
||||||
@@ -312,7 +325,9 @@ struct SignalFeedView: View {
|
|||||||
Rectangle().fill(Palette.orange).frame(width: 18, height: 2)
|
Rectangle().fill(Palette.orange).frame(width: 18, height: 2)
|
||||||
Spacer()
|
Spacer()
|
||||||
if let pill {
|
if let pill {
|
||||||
Button { selectedPill = pill } label: {
|
Button {
|
||||||
|
selectedPill = pill
|
||||||
|
} label: {
|
||||||
HStack(spacing: 2) {
|
HStack(spacing: 2) {
|
||||||
Text("See all"); Image(systemName: "chevron.right").font(.system(size: 10, weight: .bold))
|
Text("See all"); Image(systemName: "chevron.right").font(.system(size: 10, weight: .bold))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user