Skip to content

feat(WhereUI): unify JSON themes and add illustrated Halloween - #462

Open
kyleve wants to merge 8 commits into
feat/broadway-view-documentfrom
feat/where-theme-documents
Open

kyleve wants to merge 8 commits into
feat/broadway-view-documentfrom
feat/where-theme-documents

Conversation

@kyleve

@kyleve kyleve commented Oct 30, 2026 •

Copy link
Copy Markdown
Owner

Posted by an AI agent on Kyle's behalf.

Summary

Standard, Flat, and Halloween now use the same prepared JSON theme pipeline. Standard defines the complete appearance. Flat inherits Standard, and Halloween inherits Flat. The separate native Flat override implementation is removed.

Halloween adds coordinated cream, lavender, and plum surfaces, rounded typography, illustrated card edges, pumpkins in reserved gaps, and moon/vine backgrounds. It covers Locations, Elsewhere, Your Year, Settings, and shared forecast, welcome, privacy, and planning surfaces.

Standard, Flat, and Halloween are ordinary saved choices in Settings → Appearance and onboarding in every app audience. The adaptive picker keeps each card specimen readable on iPhone and reserves its illustration bounds above the caption. Launch and ready content use the same root. Existing widget and App Intents handoffs carry the selected identity to their lightweight native views.

Install this PR on a registered device. The installable label publishes the latest successful branch build. The page identifies its source commit.

Product behavior

Situation Before After
Standard or Flat Native defaults followed by native overrides Prepared bundled documents through one rendering path; saved identities stay unchanged
Derived theme Sparse overrides of a native fallback Explicit parent documents, typed named values, and component surfaces
Seasonal artwork Symbols over existing cards Illustrated surfaces with bounded interior/exterior artwork and reserved layout space
Theme selection Saved Standard/Flat preference Standard, Flat, and Halloween share one saved selection, onboarding, and root in every audience
Invalid import Validation rejected the new payload Catalog resolution and resource preparation throw before acceptance; callers retain their prior prepared document
Same-ID import Full-content cache identity Changed content replaces the prior prepared definition without stale stylesheet slices
Accessibility settings Native constraints and decoration suppression Native constraints remain authoritative; essential surfaces survive ornament suppression

Architecture

WhereThemeDocument v2 → WhereThemeCatalog → ResolvedWhereTheme → PreparedWhereThemeDocument → whereBroadwayRoot(themeDocument:).

// The host supplies the complete catalog, approved assets, selected ID, and content.
let catalog = try WhereThemeCatalog(documents: documents)
let prepared = try catalog.prepare(themeID, assets: assets)
content.whereBroadwayRoot(themeDocument: prepared)
  • Documents: typed appearance patches cover the stylesheet. Named palette, font, and surface values have distinct identities. Omission inherits, explicit values replace, artwork arrays replace as a unit, and .clear removes optional visuals. Literal overrides take ownership from inherited references.
  • Validation: incomplete roots, missing parents, cycles, invalid references, unsupported component capabilities, resource failures, and excessive work fail before injection. Parent traversal is iterative; composite patches use copy-on-write storage so worker-thread decoding fits the stack.
  • Surfaces: shared Broadway composition orders base paint, interior artwork, native content, highlights, and exterior artwork. Native rosettes, stamps, microprint, and watermarks are selectable. Exterior paint has finite outsets and cannot cover the protected content center. Parents reserve gutters and gaps; scroll viewports still clip.
  • Native ownership: names, counts, regional colors, geographic data, progress, controls, localization, and accessibility stay in SwiftUI. Ranking moves the complete card. Only its inner surface is the zoom source.
  • Appearance: native palette references retain system contrast behavior. Background providers retain host elevation. Scoped privacy, icon, and Lock Screen previews resolve their styles within the correct mode.
  • Motion: visibility, selected tab, active scene, and covering presentations gate playback. Reduce Motion and snapshots use intentional static poses.
  • Selection: WhereModel owns the normal device-local preference. Every bundled theme uses whereBroadwayRoot(theme:); supplied documents use the same root modifier. There is no additional preview model or ready-subtree theme override.
  • Snapshot discovery: shared helper files are excluded from shard inventory. Test declarations still require a matching top-level suite, including when a file has a helper name.

Compatibility and scope

The existing WhereTheme identities remain standard and alternate. Halloween adds the saved identity halloween. Unknown identities still fall back to Standard on older builds. Version 1 documents convert on import. The old decoration payloads remain fixtures. New exports use schema version 2. No stored user-data migration is required. Swift’s synthesized Codable enum payloads (including _0) remain the wire representation. Typed named values and host-relative placement carry styling semantics; authored numeric values stay bounded document inputs.

Christmas is removed from the demonstration UI. Remote downloading, new widget/extension artwork, and cross-component artwork overlap remain outside this iteration.

Visual review

Production Locations in light and dark appearance, verified with the iPhone 17 fixture at e5e23d886480. Inspect the opaque card surfaces, native regional information, pumpkins in reserved gaps, and coordinated page artwork.

Light Dark
Halloween Locations in light appearance Halloween Locations in dark appearance

Appearance Settings shows all three saved themes in one adaptive picker. The Halloween specimen reserves space for exterior artwork above its caption. Full-content iPhone 17 light fixture at e5e23d886480:

Appearance Settings with Standard, Flat, and Halloween in one saved theme picker

File-level review comments include the remaining tabs, shared surfaces, and comparable before/after captures.

The images use production views with deterministic fixture data and static motion. They establish rendering, not physical-device gesture or spoken VoiceOver behavior.

Review focus

Document and compatibility → Catalog resolution → Component capabilities → Shared root injection → Navigation and focus regressions.

Independent reviews covered the catalog, all typed patch mappings, component capabilities, app composition, and motion ownership. Fixes preserve named-reference replacement, constrain unsupported host artwork, retain native semantic colors, restore canonical opaque paper under Reduce Transparency, and resolve scoped previews below their mode override. Large-text forecast rows and controls grow vertically. Increased Contrast preserves Flat’s explicitly removed surface wash. A further review covered normal selection and corrected artwork bounds in picker specimens and card comparison fixtures. These fixtures reserve paint bounds without clipping native finishes. Picker captions reserve three lines and grow at larger text sizes. No actionable review findings remain. Device-only limits appear below.

The important boundaries are complete-root validation, sparse inheritance and explicit removal, full-content cache identity, native accessibility precedence, preserved Standard/Flat rendering, and the separation of content, interaction, and paint bounds.

Testing

Validation uses iPhone light/dark first, then broader traits. The full integration results below are from the document migration at 9c2d68f63c5a.

The normal-selection update passed 52 focused tests for preferences, publication, intents, model state, prepared resources, catalog replacement, and root equivalence. A subsequent WhereModelTests run passed all five tests, including parameterized Halloween onboarding, launch publication, and reset.

The normal-selection update passed all 12 affected light/dark entry points with --record never. This scope covers the picker, onboarding, shared cards, calendar comparisons, Locations, Elsewhere, Year, and Settings. The 12 existing normal Standard/Flat card panels are pixel-identical. Some older contrast references predated the border and ink floors added in 9c2d68f63c5a. Their refreshed panels match those existing accessibility rules.

All eight affected extended entry points passed with ./test --no-generate --no-build --only … --record never --review. This scope covers the picker, onboarding, and shared card comparisons across large text, Increased Contrast, Reduce Transparency, accessibility annotations, and iPad layouts. The final picker change also passed its three light/dark guards after rebuilding.

Current revision e5e23d886480 also passed serial Where Beta and Where App Store simulator builds:

mise exec -- tuist xcodebuild build -workspace Stuff.xcworkspace \
  -scheme 'Where Beta' -destination 'generic/platform=iOS Simulator'
mise exec -- tuist xcodebuild build -workspace Stuff.xcworkspace \
  -scheme 'Where App Store' -destination 'generic/platform=iOS Simulator'

The Development distribution run retrieved and validated the signed archive for the same source SHA. Its IPA release and install-site deployment succeeded. The live install page and manifest match e5e23d88648089d12359b07b8b78e60506be261d. All five GitHub CI jobs passed. Current formatting, string-catalog lint, architecture rules/lint, and whitespace checks passed.

The snapshot inventory fix passed all 36 tests in test_snapshot_shards.py. ./snapshot-shards check accepts 72 suites and retains strict validation for misplaced test declarations.

The migration validation at 9c2d68f63c5a established these results:

  • Fast visual gate: 17 changed entry points passed with --record never, covering cards, Locations, remaining tabs, and shared surfaces. Existing normal Standard/Flat references were retained.
  • Broader visual gate: ./test --skip-host-tests --no-generate --only WhereUISnapshotTests --only ViewDocumentUISnapshotTests --record never --review exercised 86 entry points. After fixing the reported rendering issues and inspecting new captures, all ten affected extended entry points passed in a focused --record never rerun. Coverage includes accessibility annotations, largest Dynamic Type, Increased Contrast, Reduce Transparency, Reduce Motion, and representative iPad layouts.
  • Migration references: 50 new Halloween captures and six replacement Halloween captures. Six obsolete Christmas captures were removed. Seven contrast references travel with feat(Broadway): compose surfaces from theme documents #461. Two Elsewhere contrast references belong to this slice. The normal-selection update adds Halloween to the shared comparison sheets and updates picker captures.
  • Integration: ./test --all --review --no-generate executed 3,040 iOS tests across 23 bundles. It found two failing tests: foreground fixture synchronization and Flat restoring a removed wash under Increased Contrast. Both were corrected. MainTabsTests (3 tests) and the focused stylesheet contrast/surface scope (5 tests, including 10 Flat trait combinations) then passed. The full run also passed host macro tests (28), host helper checks, attribution, architecture rule tests (29), and architecture lint. SnapshotKitTesting reported four expected known issues.
  • ./test --skip-host-tests --no-generate --only WhereUITests/LocationsViewTests --review: all 4 tests passed, including actual programmatic scrolling with clipping enabled, repeated navigation, focus bounds, and the empty state.
  • Audience builds: mise exec -- tuist xcodebuild build -workspace Stuff.xcworkspace -scheme <scheme> -destination "generic/platform=iOS Simulator" passed serially for Where Development, Where Beta, and Where App Store.
  • ./swiftformat --lint, ./sf-symbols --lint, ./xcstrings --lint, and git diff --check passed.

Hosted checks exercise two card push/pop cycles, planning-sheet presentation/dismissal, two ranking overtakes with normal/reduced motion, settled focus order, tab/foreground transitions, empty Locations, and theme import/replacement failures. Model and hosted-root guards cover saved Halloween selection, onboarding commit/reset, widget publication, intent handoff, and equality between saved-theme and prepared-document rendering.

Remaining device checks: physical-device drag/deceleration, interactive edge gestures, and audible VoiceOver were not exercised. The hosted scroll test checks the native viewport and focus geometry; screenshots establish the visible artwork composition. They do not prove every moving artwork frame.

The migration’s final extended comparison used these separately selectable entry points:

./test --skip-host-tests --no-generate --no-build --record never --review \
  --only 'WhereUISnapshotTests/CalendarContentViewSnapshotTests/calendarContentExtended()' \
  --only 'WhereUISnapshotTests/LocationForecastPanelSnapshotTests/componentThemesExtended()' \
  --only 'WhereUISnapshotTests/LocationForecastSummarySnapshotTests/componentThemesExtended()' \
  --only 'WhereUISnapshotTests/MainTabsSnapshotTests/mainTabs()' \
  --only 'WhereUISnapshotTests/MainTabsSnapshotTests/halloweenLocationsExtended()' \
  --only 'WhereUISnapshotTests/MainTabsSnapshotTests/halloweenOtherTabsExtended()' \
  --only 'WhereUISnapshotTests/WhereThemePreviewSnapshotTests/sharedSurfacesExtended()' \
  --only 'WhereUISnapshotTests/WhereThemePreviewSnapshotTests/accessibilityPolicyExtended()' \
  --only 'WhereUISnapshotTests/WhereThemePreviewSnapshotTests/seasonalDocumentsExtended()' \
  --only 'WhereUISnapshotTests/LocationsViewSnapshotTests/seasonalDocuments()'

Omit --no-build after any source/resource change and --no-generate after project input changes.

Stack

3/3, based on Broadway integration #461, which consumes ViewDocument #460. This slice activates the shared pipeline in Where and makes Halloween selectable in every app audience.

@kyleve
kyleve added this pull request to stack #463 October 30, 2026 00:10
@kyleve kyleve changed the title feat(WhereUI): resolve sparse theme documents and seasonal decoration layers feat(WhereUI): add sparse Codable themes and seasonal layers Oct 30, 2026
@kyleve
kyleve force-pushed the feat/where-theme-documents branch from daa0c01 to 89b9ccb Compare October 30, 2026 00:25

@kyleve kyleve Oct 30, 2026 •

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Locations — Halloween redesign

The same production Locations fixture now uses coordinated paper, ink, typography, and illustrations, with pumpkins placed in reserved card gaps. Region colors, counts, navigation, and controls remain native.

Both are iPhone 17 light, normal Dynamic Type, static-motion captures of the same fixture. Before: 8933889f7165. After: 9c2d68f63c5a. The new layout reserves space for exterior artwork.

Before After
Locations before: icon decoration over the existing UI Locations after: illustrated Halloween surfaces and reserved gaps

The PR body also shows the complete production tab in both appearances. These captures do not establish live motion or spoken VoiceOver behavior.

@kyleve kyleve Oct 30, 2026 •

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Regular and compact cards — Halloween redesign

The shared production cards now compose opaque surfaces, document-selected passport marks, native regional information, borders, and bounded exterior illustration. Card layout reserves the artwork gap; the inner card remains the zoom source.

Same iPhone 17 light fixture data and normal Dynamic Type, with static motion. Before: 8933889f7165. After: 9c2d68f63c5a. The new paint bounds and reserved spacing change the fixture's content height.

Before After
Halloween cards before the surface redesign Halloween cards with illustrated surfaces and bounded overflow

Hosted tests separately verify focus bounds, two push/pop cycles, sheet presentation, and two ranking overtakes. Physical-device drag/deceleration and audible VoiceOver remain unverified.

category: traits.contentSizeCategory,
)
}
enforceThemeAccessibility(traits: traits, baseline: accessibleBase)

@kyleve kyleve Oct 30, 2026 •

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Review focus at 9c2d68f63c5a: bundled Standard is complete, Flat inherits Standard, and Halloween inherits Flat. Both root overloads select prepared documents through the same path. Native accessibility constraints apply after resolution and cannot restore explicitly removed ornament.

Please inspect catalog resolution, component capabilities, and the stylesheet boundary. Tests cover complete roots, sparse inheritance, explicit removal, failed resources, cycles, version-1 conversion, and same-ID replacement.

@kyleve
kyleve force-pushed the feat/where-theme-documents branch from 89b9ccb to 0944ce1 Compare October 30, 2026 01:08
"modifiers": [
{
"padding": {
"_0": {

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"_0" seems like uh, not well abstracted? Neither does the value hardcoding 24.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

The fixed-padding decoration is gone in 9c2d68f63c5a. Artwork now has typed host-relative placement, finite per-edge paint bounds, and parent-reserved gaps/gutters. Component styles can reference named palette, typography, and surface values. Numeric dimensions are authored theme inputs and pass validation before rendering.

This pass keeps _0 as Swift’s synthesized Codable representation for an unlabeled enum payload. That wire syntax remains verbose; the typed model carries its meaning. The revised Where schema is version 2, while ViewDocument keeps its version-1 vocabulary compatible. The old decoration payloads remain conversion fixtures. This encoding choice is called out in the PR compatibility notes.

}

// Resolve theme finishes after shared traits so they retain their depth cues.
let overrides = WhereThemeOverrides.resolve(theme: theme, traits: traits, base: self)

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, not sure at this point "overrides" are the right framing. When using a traditional design tokens framework, all these values come from the theme themselves (which can compose). Thoughts?

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Implemented in 9c2d68f63c5a. Bundled Standard is now a complete theme document; Flat inherits Standard and Halloween inherits Flat. WhereThemeCatalog resolves that chain before root injection, and both root overloads use the same prepared-document path. The separate native Flat/JSON override sequence is removed. Native accessibility constraints still apply after document resolution, and rootless defaults come from canonical Standard.

Complete-root, sparse-inheritance, explicit-removal, same-ID-update, and failed-import tests cover the new boundary. Normal Standard/Flat light/dark references were retained.

@kyleve
kyleve force-pushed the feat/where-theme-documents branch from 4443850 to 8933889 Compare October 30, 2026 01:58
Prevent invalid icon-grid divisors, geographic coordinates and spans,
unbounded fractions, negative dash spacing, and excessive menu stagger.
Require opaque matte base colors and preserve solid native paper under
Reduce Transparency when an authored color can be translucent.

Regressions cover invalid JSON plus valid native zero values, signed map
coordinates, meter spans, and opaque custom paper. Update mapping guidance.

Validation: ./test --all --review passed all 2,984 iOS tests, including
748 WhereUI tests, with architecture and host checks.
Stop gating decorative background activity on card visibility. Layers own
their visibility and scene lifecycle; Locations pauses them for covering
sheets. Empty and loading content can now animate its visible background.

Hosted regressions distinguish active and static poses on an empty Locations
screen and verify host and scene activity stop and restart playback.

Validation: ./test --all --review passed, including both hosted regressions.
Resolve complete Standard, derived Flat, and illustrated Halloween through
one schema-v2 catalog and prepared rendering path. Preserve saved built-in
identities and convert version-1 documents on import. Validate inheritance,
named values, component capabilities, resources, and bounded artwork before
injection; failed imports keep the accepted theme.

Compose document-owned surface treatments and native geographic artwork
around native controls and information. Reserve artwork gaps, preserve zoom
and focus bounds, and gate motion by visibility, scene, tab, and presentation.
Inject a session-only Development selector into the ready app. Remove the
Christmas demonstration and retain its compatibility fixture.

Validation: the light/dark gate and focused extended comparisons passed;
50 new Halloween captures were inspected. The 3,040-test integration run
identified two failures, both corrected and verified by focused reruns.
Locations interaction tests cover programmatic scrolling, repeated card
navigation, planning sheets, focus bounds, and empty content. Formatting,
architecture, symbol, string-catalog, and host checks passed. Development,
Beta, and App Store simulator builds passed. Physical-device
drag/deceleration, edge gestures, and audible VoiceOver remain unverified.
@kyleve
kyleve force-pushed the feat/where-theme-documents branch from 8933889 to 9c2d68f Compare October 30, 2026 05:36
@kyleve kyleve changed the title feat(WhereUI): add sparse Codable themes and seasonal layers feat(WhereUI): unify JSON themes and add illustrated Halloween preview Oct 30, 2026

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Elsewhere

Halloween paper, regional colors, restrained edge illustrations, and production tab/navigation chrome.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Elsewhere in light appearance Elsewhere in dark appearance

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Your Year

Halloween month surfaces and native calendar meaning. This full-content capture includes the complete year.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Your Year in light appearance Your Year in dark appearance

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Settings

Halloween page and section surfaces with restrained illustration around controls.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Settings in light appearance Settings in dark appearance

@kyleve kyleve Oct 30, 2026 •

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Appearance Settings

Halloween now uses the same saved preference as Standard and Flat in every audience. The separate Development preview section is removed. The picker stacks on narrow layouts and reserves each specimen's artwork bounds above its caption. Captions grow with Dynamic Type.

Comparable Appearance fixtures with Halloween applied: iPhone 17, light appearance, normal Dynamic Type, static motion, and full-content sizing. Before: 9c2d68f63c5a; after: e5e23d886480. The old fixture used the session-only override; the current fixture uses the saved theme root.

Before After
Appearance Settings before, with a separate Development theme preview Appearance Settings after, with Halloween in the normal saved theme picker

Current dark appearance.

These snapshots establish rendering. They do not establish live gestures or spoken VoiceOver behavior.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Planned Stays

Halloween shared sheet surfaces; dates, controls, and planning state remain native.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Planned Stays in light appearance Planned Stays in dark appearance

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Timeline

Related Halloween paper and ink with native chronological stays and forecast information.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Timeline in light appearance Timeline in dark appearance

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Region Days

Standard migration guard for the themed day-list screen. Existing references remain unchanged.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Region Days in light appearance Region Days in dark appearance

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Region Appearance

Standard migration guard for user-selected region color and symbol controls. Existing references remain unchanged.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Region Appearance in light appearance Region Appearance in dark appearance

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

App Icon

The embedded icon preview resolves its intended appearance below the paired SwiftUI/Broadway override. Existing references remain unchanged.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
App Icon in light appearance App Icon in dark appearance

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Data Settings

Standard migration guard for themed form sections. Existing references remain unchanged.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Data Settings in light appearance Data Settings in dark appearance

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Estimated Time gallery

The gallery reuses production forecast surfaces from the selected document. Standard references remain unchanged.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Estimated Time gallery in light appearance Estimated Time gallery in dark appearance

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Insights and Accuracy gallery

Standard migration guard for document-driven gallery styling and native review controls.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Insights and Accuracy gallery in light appearance Insights and Accuracy gallery in dark appearance

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Personalization gallery

Standard migration guard for the shared personalization specimens.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Personalization gallery in light appearance Personalization gallery in dark appearance

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Places and Year gallery

Standard migration guard for calendar, timeline, and card specimens.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Places and Year gallery in light appearance Places and Year gallery in dark appearance

@kyleve kyleve Oct 30, 2026 •

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Widgets gallery

The Lock Screen specimen keeps its dark scoped appearance inside a light or dark gallery. The normal publication handoff now carries the saved Halloween identity. Widgets retain their lightweight native views; this change adds no widget artwork. These unchanged captures show the Standard gallery.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Widgets gallery in light appearance Widgets gallery in dark appearance

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Planning Region Picker

Standard migration guard for the native region picker on shared theme surfaces.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Planning Region Picker in light appearance Planning Region Picker in dark appearance

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Planned Stay Editor

Standard migration guard for native planning inputs and flexible dates on shared theme surfaces.

Production-view snapshot fixtures at 9c2d68f63c5a, iPhone 17, normal Dynamic Type, static motion. Light and dark captures are shown below; scrolling screens use full-content sizing. These images establish rendering, not live gestures or spoken VoiceOver behavior.

Light Dark
Planned Stay Editor in light appearance Planned Stay Editor in dark appearance

@kyleve kyleve added the installable Maintain a Where Dev install page for this PR label Oct 30, 2026
@kyleve kyleve changed the title feat(WhereUI): unify JSON themes and add illustrated Halloween preview feat(WhereUI): unify JSON themes and add illustrated Halloween Oct 30, 2026

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posted by an AI agent on Kyle's behalf.

Onboarding theme selection

The shared picker includes Standard, Flat, and Halloween. A selection previews through WhereModel and commits when onboarding completes. It uses the same rendering path as saved Appearance Settings choices.

Comparable Standard fixtures: iPhone 17, light appearance, normal Dynamic Type, static motion, and full-content sizing. Before: 9c2d68f63c5a; after: e5e23d886480.

Before After
Onboarding theme selection before, with Standard and Flat Onboarding theme selection after, with Standard, Flat, and Halloween

Halloween selected, light · Halloween selected, dark · iPad layout.

The snapshots establish rendering. Preference tests cover preview, commit, relaunch publication, and reset.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

installable Maintain a Where Dev install page for this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant