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:
@@ -21,12 +21,12 @@ struct AddFeedSheet: View {
|
||||
|
||||
var body: some View {
|
||||
ZStack {
|
||||
Color.black.ignoresSafeArea()
|
||||
Palette.background.ignoresSafeArea()
|
||||
VStack(alignment: .leading, spacing: 0) {
|
||||
HStack {
|
||||
Text("Add feed")
|
||||
.font(.system(size: 22, weight: .heavy))
|
||||
.foregroundStyle(.white)
|
||||
.foregroundStyle(Palette.primaryText)
|
||||
Spacer()
|
||||
Button { dismiss() } label: {
|
||||
Image(systemName: "xmark")
|
||||
@@ -87,9 +87,9 @@ struct AddFeedSheet: View {
|
||||
Text(label)
|
||||
.font(.system(size: 10, weight: .bold, design: .monospaced))
|
||||
.kerning(0.8)
|
||||
.foregroundStyle(Color(hex: "666666"))
|
||||
.foregroundStyle(Palette.tertiaryText)
|
||||
TextField("", text: text,
|
||||
prompt: Text(placeholder).foregroundColor(Color(hex: "444444")))
|
||||
prompt: Text(placeholder).foregroundColor(Palette.mutedText))
|
||||
.font(.system(size: 15, weight: .regular, design: mono ? .monospaced : .default))
|
||||
.foregroundStyle(mono ? Palette.orange : .white)
|
||||
.autocorrectionDisabled()
|
||||
|
||||
@@ -86,7 +86,7 @@ struct FeedManagerView: View {
|
||||
|
||||
var body: some View {
|
||||
ZStack {
|
||||
Color.black.ignoresSafeArea()
|
||||
Palette.background.ignoresSafeArea()
|
||||
VStack(spacing: 0) {
|
||||
header
|
||||
serverCard
|
||||
@@ -141,7 +141,7 @@ struct FeedManagerView: View {
|
||||
Text("PLATFORM")
|
||||
.font(.system(size: 9, weight: .bold, design: .monospaced))
|
||||
.kerning(0.8)
|
||||
.foregroundStyle(Color(hex: "555555"))
|
||||
.foregroundStyle(Palette.tertiaryText)
|
||||
Text(settings.host ?? "not configured")
|
||||
.font(.system(size: 14, weight: .bold, design: .monospaced))
|
||||
.foregroundStyle(Palette.orange)
|
||||
@@ -156,7 +156,7 @@ struct FeedManagerView: View {
|
||||
}
|
||||
Image(systemName: "chevron.right")
|
||||
.font(.system(size: 12, weight: .bold))
|
||||
.foregroundStyle(Color(hex: "555555"))
|
||||
.foregroundStyle(Palette.tertiaryText)
|
||||
}
|
||||
.padding(14)
|
||||
.background(Palette.surface)
|
||||
@@ -173,10 +173,10 @@ struct FeedManagerView: View {
|
||||
HStack(spacing: 10) {
|
||||
Image(systemName: "magnifyingglass")
|
||||
.font(.system(size: 14))
|
||||
.foregroundStyle(Color(hex: "555555"))
|
||||
TextField("", text: $query, prompt: Text("Search feeds").foregroundColor(Color(hex: "555555")))
|
||||
.foregroundStyle(Palette.tertiaryText)
|
||||
TextField("", text: $query, prompt: Text("Search feeds").foregroundColor(Palette.tertiaryText))
|
||||
.font(.system(size: 15, weight: .regular))
|
||||
.foregroundStyle(.white)
|
||||
.foregroundStyle(Palette.primaryText)
|
||||
.autocorrectionDisabled()
|
||||
.textInputAutocapitalization(.never)
|
||||
}
|
||||
@@ -207,7 +207,7 @@ struct FeedManagerView: View {
|
||||
}
|
||||
.listStyle(.plain)
|
||||
.scrollContentBackground(.hidden)
|
||||
.background(Color.black)
|
||||
.background(Palette.background)
|
||||
.refreshable { await vm.load() }
|
||||
}
|
||||
|
||||
@@ -215,7 +215,7 @@ struct FeedManagerView: View {
|
||||
Section {
|
||||
ForEach(feeds) { feed in
|
||||
FeedRowView(feed: feed)
|
||||
.listRowBackground(Color.black)
|
||||
.listRowBackground(Palette.background)
|
||||
.listRowInsets(EdgeInsets(top: 6, leading: 16, bottom: 6, trailing: 16))
|
||||
.listRowSeparatorTint(Palette.hairline)
|
||||
.swipeActions(edge: .trailing) {
|
||||
@@ -230,7 +230,7 @@ struct FeedManagerView: View {
|
||||
Text(title)
|
||||
.font(.system(size: 10, weight: .bold, design: .monospaced))
|
||||
.kerning(0.8)
|
||||
.foregroundStyle(Color(hex: "555555"))
|
||||
.foregroundStyle(Palette.tertiaryText)
|
||||
.listRowInsets(EdgeInsets(top: 12, leading: 16, bottom: 6, trailing: 16))
|
||||
}
|
||||
}
|
||||
@@ -238,16 +238,16 @@ struct FeedManagerView: View {
|
||||
private var loadingRow: some View {
|
||||
ProgressView().tint(Palette.orange)
|
||||
.frame(maxWidth: .infinity)
|
||||
.listRowBackground(Color.black)
|
||||
.listRowBackground(Palette.background)
|
||||
.listRowSeparator(.hidden)
|
||||
}
|
||||
|
||||
private var emptyRow: some View {
|
||||
Text(query.isEmpty ? (vm.error ?? "No feeds configured.") : "No feeds match “\(query)”.")
|
||||
.font(.system(size: 13))
|
||||
.foregroundStyle(Color(hex: "555555"))
|
||||
.foregroundStyle(Palette.tertiaryText)
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
.listRowBackground(Color.black)
|
||||
.listRowBackground(Palette.background)
|
||||
.listRowSeparator(.hidden)
|
||||
}
|
||||
}
|
||||
@@ -267,11 +267,11 @@ struct FeedRowView: View {
|
||||
VStack(alignment: .leading, spacing: 4) {
|
||||
Text(feed.name)
|
||||
.font(.system(size: 15, weight: .bold))
|
||||
.foregroundStyle(.white)
|
||||
.foregroundStyle(Palette.primaryText)
|
||||
.lineLimit(1)
|
||||
Text(metaLine)
|
||||
.font(.system(size: 11, weight: .regular, design: .monospaced))
|
||||
.foregroundStyle(Color(hex: "666666"))
|
||||
.foregroundStyle(Palette.tertiaryText)
|
||||
.lineLimit(1)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user