feat: East Africa + Southern Africa pills with regional sub-sections
- East Africa pill: merges Uganda + east-africa tags; Uganda pinned first via sub-sections - Southern Africa pill: covers SA, Namibia, Botswana, Zimbabwe, Zambia, Mozambique; SA/Namibia/Botswana prioritized - StoryStore.setPill now resets lastSyncedAt to bypass 30s rate-limit on filter switch - sectionSupplement background fetch populates sparse regional sections in All digest - SignalFeedView digestContent: flat hero+scroll path for pills without subSections (was showing max 5) - Theme: removed standalone Uganda pill, wired new sub-section layouts Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -22,8 +22,8 @@ struct StoryRowView: View {
|
||||
HStack(spacing: 0) {
|
||||
SignalStripe(score: story.signalScore, muted: true)
|
||||
Text(story.headline)
|
||||
.font(.system(size: 14, weight: .bold))
|
||||
.foregroundStyle(Color(hex: "6A6A6A"))
|
||||
.font(.system(size: 15, weight: .semibold, design: .default))
|
||||
.foregroundStyle(Palette.secondaryText)
|
||||
.lineLimit(1)
|
||||
.padding(.leading, 14)
|
||||
.padding(.vertical, 11)
|
||||
@@ -34,7 +34,7 @@ struct StoryRowView: View {
|
||||
.padding(.trailing, 16)
|
||||
}
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
.background(Color.black)
|
||||
.background(Palette.background)
|
||||
.overlay(alignment: .bottom) { Rectangle().fill(Palette.hairline).frame(height: 0.5) }
|
||||
.contentShape(Rectangle())
|
||||
}
|
||||
@@ -49,54 +49,48 @@ struct StoryRowView: View {
|
||||
}
|
||||
|
||||
VStack(alignment: .leading, spacing: 9) {
|
||||
// Title (+ cached dot)
|
||||
HStack(alignment: .top, spacing: 8) {
|
||||
Text(story.headline)
|
||||
.font(.system(size: 17, weight: .heavy))
|
||||
.foregroundStyle(Signal.titleColor(story.signalScore))
|
||||
.lineLimit(3)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
Text(story.headline)
|
||||
.font(.system(size: 19, weight: .bold, design: .default))
|
||||
.foregroundStyle(Signal.titleColor(story.signalScore))
|
||||
.lineLimit(3)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
|
||||
if isCached {
|
||||
CachedDot()
|
||||
.padding(.top, 6)
|
||||
}
|
||||
}
|
||||
|
||||
// Summary preview — the gist, without opening the story.
|
||||
if !story.summary.isEmpty {
|
||||
Text(story.summary)
|
||||
.font(.system(size: 13, weight: .regular))
|
||||
.foregroundStyle(Color(hex: "8A8A8A"))
|
||||
.lineLimit(6)
|
||||
.lineSpacing(2)
|
||||
.font(.system(size: 15, weight: .regular, design: .default))
|
||||
.foregroundStyle(Palette.bodyText)
|
||||
.lineLimit(5)
|
||||
.lineSpacing(3)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
}
|
||||
|
||||
// Source chips
|
||||
if !sourceNames.isEmpty {
|
||||
SourceChips(names: sourceNames, total: story.sourceCount)
|
||||
}
|
||||
|
||||
// Metadata
|
||||
Text(metaLine)
|
||||
.font(.system(size: 11, weight: .regular, design: .monospaced))
|
||||
.foregroundStyle(Color(hex: "666666"))
|
||||
.foregroundStyle(Palette.tertiaryText)
|
||||
}
|
||||
.padding(.leading, 14)
|
||||
.padding(.vertical, 16)
|
||||
|
||||
Spacer(minLength: 12)
|
||||
|
||||
// Signal score column
|
||||
Text("\(story.signalScore)")
|
||||
.font(.system(size: 22, weight: .heavy, design: .monospaced))
|
||||
.foregroundStyle(Signal.scoreColor(story.signalScore))
|
||||
.padding(.trailing, 16)
|
||||
.padding(.top, 16)
|
||||
// Signal cluster: score + offline dot, compact and aligned
|
||||
VStack(alignment: .trailing, spacing: 4) {
|
||||
Text("\(story.signalScore)")
|
||||
.font(.system(size: 14, weight: .semibold, design: .monospaced))
|
||||
.foregroundStyle(Signal.scoreColor(story.signalScore))
|
||||
if isCached {
|
||||
CachedDot(size: 6)
|
||||
}
|
||||
}
|
||||
.padding(.trailing, 16)
|
||||
.padding(.top, 18)
|
||||
}
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
.background(Color.black)
|
||||
.background(Palette.background)
|
||||
.overlay(alignment: .bottom) {
|
||||
Rectangle().fill(Palette.hairline).frame(height: 0.5)
|
||||
}
|
||||
@@ -128,5 +122,5 @@ struct StoryRowView: View {
|
||||
)
|
||||
}
|
||||
}
|
||||
.background(Color.black)
|
||||
.background(Palette.background)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user