diff --git a/Catchlight/Intents/NewObieIntent.swift b/Catchlight/Intents/NewObieIntent.swift
index 2ce8c78..74bb8c6 100644
--- a/Catchlight/Intents/NewObieIntent.swift
+++ b/Catchlight/Intents/NewObieIntent.swift
@@ -8,8 +8,9 @@
// upsert demotes the previous Obie on save (owner 2026-06-23 — set it in process,
// remove the old, no confirmation).
//
-// App-target only (not shared into the widget extension) — there is no Obie
-// Control/widget yet; the routing supports one as a drop-in if wanted later.
+// Shared into the widget extension (see project.yml's CatchlightWidgets sources)
+// — the Obie Control, launcher widget, and split widget all fire it via
+// `Button(intent:)`.
//
import AppIntents
diff --git a/Catchlight/Resources/Assets.xcassets/launch-splash.imageset/Contents.json b/Catchlight/Resources/Assets.xcassets/launch-splash.imageset/Contents.json
deleted file mode 100644
index 621bd2b..0000000
--- a/Catchlight/Resources/Assets.xcassets/launch-splash.imageset/Contents.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "images" : [
- {
- "filename" : "Splash_Light.svg",
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "filename" : "Splash_Dark.svg",
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- },
- "properties" : {
- "preserves-vector-representation" : true,
- "template-rendering-intent" : "original"
- }
-}
diff --git a/Catchlight/Resources/Assets.xcassets/launch-splash.imageset/Splash_Dark.svg b/Catchlight/Resources/Assets.xcassets/launch-splash.imageset/Splash_Dark.svg
deleted file mode 100644
index 080ceae..0000000
--- a/Catchlight/Resources/Assets.xcassets/launch-splash.imageset/Splash_Dark.svg
+++ /dev/null
@@ -1,91 +0,0 @@
-
-
-
diff --git a/Catchlight/Resources/Assets.xcassets/launch-splash.imageset/Splash_Light.svg b/Catchlight/Resources/Assets.xcassets/launch-splash.imageset/Splash_Light.svg
deleted file mode 100644
index 454a7de..0000000
--- a/Catchlight/Resources/Assets.xcassets/launch-splash.imageset/Splash_Light.svg
+++ /dev/null
@@ -1,94 +0,0 @@
-
-
-
diff --git a/Catchlight/UI/Theme/CatchlightGlyphs.swift b/Catchlight/UI/Theme/CatchlightGlyphs.swift
index e1ee489..3932350 100644
--- a/Catchlight/UI/Theme/CatchlightGlyphs.swift
+++ b/Catchlight/UI/Theme/CatchlightGlyphs.swift
@@ -5,8 +5,6 @@
// Custom meaning-led glyphs from the icon refinement pass (HiFi v1.6 §-wide):
// • ImportantGlyph — an exclamation "!" (stem + dot): the app-wide Important mark
// (owner 2026-07-06; replaced the two-Iris glyph, matches the site).
-// • DailiesGlyph — two Irises joined by the spine (the timeline motif). Currently
-// unused — Important moved to ImportantGlyph — kept for reuse.
// • SequenceGlyph — three smaller beads chained on the spine: a SEQUENCE
// of Takes (sibling concept to Dailies).
// • ObieGlyph — the Obie brand logo (solid italic "O" + catch-dot), the
@@ -17,19 +15,6 @@
import SwiftUI
-/// Two Irises on the spine (Dailies). Stroke-only; colour via .foregroundStyle.
-struct DailiesGlyphShape: Shape {
- func path(in rect: CGRect) -> Path {
- let u = min(rect.width, rect.height) / 16
- var p = Path()
- p.addEllipse(in: CGRect(x: (8 - 2.3) * u, y: (4.3 - 2.3) * u, width: 4.6 * u, height: 4.6 * u))
- p.move(to: CGPoint(x: 8 * u, y: 6.9 * u))
- p.addLine(to: CGPoint(x: 8 * u, y: 9.1 * u))
- p.addEllipse(in: CGRect(x: (8 - 2.3) * u, y: (11.7 - 2.3) * u, width: 4.6 * u, height: 4.6 * u))
- return p
- }
-}
-
/// Three beads chained on the spine (Sequence).
struct SequenceGlyphShape: Shape {
func path(in rect: CGRect) -> Path {
@@ -47,15 +32,6 @@ struct SequenceGlyphShape: Shape {
}
/// Convenience views matching the dock's SF Symbol sizing (icon box ~20pt).
-struct DailiesGlyph: View {
- var size: CGFloat = 20
- var body: some View {
- DailiesGlyphShape()
- .stroke(style: StrokeStyle(lineWidth: size * 1.2 / 16, lineCap: .round))
- .frame(width: size, height: size)
- }
-}
-
struct SequenceGlyph: View {
var size: CGFloat = 20
var body: some View {
@@ -106,7 +82,7 @@ struct TaskCheckbox: View {
}
/// The Important mark — an exclamation "!" (owner 2026-07-06, outline form 2026-07-06).
-/// Replaces the two-Iris `DailiesGlyph` as the app-wide Important glyph, matching the
+/// Replaces the earlier two-Iris glyph as the app-wide Important glyph, matching the
/// redesigned marketing site where Important is a "!". Drawn as a STROKED OUTLINE — a
/// tapered stem (rounded top corners, narrowing to a rounded foot) above a ring dot — at
/// the house `1.2`-unit weight with round caps/joins, so it sits beside the other line
@@ -238,7 +214,6 @@ extension EnvironmentValues {
HStack(spacing: 24) {
ImportantGlyph().foregroundStyle(Color.ckEmber)
ImportantGlyphSlashed().foregroundStyle(Color.ckEmber)
- DailiesGlyph().foregroundStyle(Color.ckEmber)
SequenceGlyph().foregroundStyle(Color.ckEmber)
ObieGlyph().foregroundStyle(Color.ckTextObie)
}
diff --git a/Catchlight/UI/Theme/CatchlightTheme.swift b/Catchlight/UI/Theme/CatchlightTheme.swift
index e95407b..f00def3 100644
--- a/Catchlight/UI/Theme/CatchlightTheme.swift
+++ b/Catchlight/UI/Theme/CatchlightTheme.swift
@@ -316,7 +316,7 @@ enum Quadrant {
/// Important — the Iris North wedge (owner 2026-06-20, indicator only). Uses the
/// two previously-unused brand swatches, paired for legibility per mode: Shadow
- /// #0A0908 (near-black, ~20:1 on the white card) in Daylight, Stone #E7E1D5
+ /// #0A0908 (near-black, ~20:1 on the white card) in Daylight, Stone #E0D9CE
/// (light warm stone, light-on-dark) in Night. Shown on an Obie too (an Obie
/// auto-flags Important; owner wants the flag visible there alongside the ring).
static func important(_ scheme: ColorScheme) -> Color {
diff --git a/Catchlight/UI/Views/DailiesView.swift b/Catchlight/UI/Views/DailiesView.swift
index 0d2e4e9..6f245ae 100644
--- a/Catchlight/UI/Views/DailiesView.swift
+++ b/Catchlight/UI/Views/DailiesView.swift
@@ -141,10 +141,6 @@ struct DailiesView: View {
/// Delete on a recurring reminder asks "this occurrence" vs "the whole series"
/// rather than deleting outright; nil when no such prompt is up.
@State private var pendingRecurringDelete: Take?
- /// One-shot scroll target — set to bring a Take into view (e.g. a new Take that
- /// landed at the bottom under Oldest-first). The timeline's ScrollViewReader
- /// consumes and clears it.
- @State private var scrollToTakeID: UUID?
/// Bloom progress (0→1) for the in-place NEW Take's "appear". Driven explicitly
/// (scale+opacity on the row) rather than via a LazyVStack insertion transition,
/// which doesn't animate reliably. 1 at rest so existing rows are unaffected.
@@ -1232,11 +1228,6 @@ struct DailiesView: View {
editDraft = t
editFocusedBlockID = t.blocks.last?.id
ui.beginEditingInPlace(take)
- // Lift the Take above the keyboard via the same one-shot target the new-Take
- // and fan paths use (owner 2026-06-19). Previously an existing Take set no
- // target and leaned on iOS's native avoidance, which scrolled it up only a
- // little — "nowhere near enough" when it started below the keyboard line.
- scrollToTakeID = take.id
}
/// Create a NEW Take in place (Phase 2): seed the blank draft, inject it into the
@@ -1371,13 +1362,6 @@ struct DailiesView: View {
let refocus = newTaskEntryID ?? d.blocks.first?.id
editFocusedBlockID = nil
if let refocus {
- // Bring the Take above the rising keyboard (owner 2026-06-19): the ring
- // closed with the keyboard down, and re-focusing raises it again. Without
- // a scroll target the Take can sit under the keyboard — e.g. a new Take
- // just reshaped to a Task, sorted to the bottom under Oldest-first. Same
- // one-shot target the new-Take flow uses; the keyboardDidShow handler
- // settles it to the low anchor against the keyboard-reduced viewport.
- scrollToTakeID = d.id
DispatchQueue.main.async { editFocusedBlockID = refocus }
}
}
diff --git a/project.yml b/project.yml
index fced620..6756105 100644
--- a/project.yml
+++ b/project.yml
@@ -24,6 +24,10 @@ options:
settings:
base:
SWIFT_VERSION: "5.9"
+ # iPhone-only (owner 2026-07-23): iPad is not yet in scope — nothing has been
+ # designed or validated for it, and XcodeGen's default ("1,2") silently opted
+ # us into iPad App Review + iPad screenshot requirements.
+ TARGETED_DEVICE_FAMILY: "1"
DEVELOPMENT_TEAM: YTPP9HU9F9 # Mark Stradling (brief §3.1)
MARKETING_VERSION: "1.0.0"
CURRENT_PROJECT_VERSION: "1"
@@ -93,8 +97,8 @@ targets:
- "CormorantGaramond-Italic[wght].ttf"
- "DMSans[opsz,wght].ttf"
# Launch screen = LaunchScreen.storyboard (owner 2026-06-15), replacing the
- # earlier UILaunchScreen dict + centred composite (launch-splash.imageset,
- # now unused — retire once the storyboard is device-confirmed). A storyboard
+ # earlier UILaunchScreen dict + centred composite (its launch-splash.imageset
+ # retired 2026-07-23, storyboard device-confirmed). A storyboard
# also opts into modern full-screen scene sizing (the gotcha-#1 requirement)
# but, unlike the dict's single CENTRED image, it can pin the real
# catchlight-icon + catchlight-wordmark assets to the EXACT geometry of the