feat(WhereUI): add tilt-reactive spectral card edges - #236
Conversation
Give regular Locations cards an inset spectral rim and raised region-name relief driven by the existing motion provider. Keep compact and privacy cards neutral, expose the new tokens through Card Designer schema 2, and refresh the affected references.
| x: 0.5 + direction.width * 0.24, | ||
| y: 0.5 + direction.height * 0.24, | ||
| ) | ||
| let angle = Angle.degrees(direction.width * 48 + direction.height * 32) |
There was a problem hiding this comment.
Posted by an AI agent on kve’s behalf.
Review focus: this is the load-bearing coupling between the authored Tilt Travel value and both spectral translation and rotation. Please pay particular attention to whether these multipliers feel responsive without making the foil dominate the region color on physical hardware.
…ocation-cards # Conflicts: # Where/WhereUI/SnapshotTests/__Snapshots__/LocationsViewSnapshotTests/locations.Loaded_iPad_accessibility.png # Where/WhereUI/SnapshotTests/__Snapshots__/LocationsViewSnapshotTests/locations.Loaded_iPhone_accessibility.png
Combine the tilt-reactive card finish with main's SwiftUI accessibility snapshot renderer across the Locations reference matrix.
Add paired inner shadows to the place name and a concentrated light-facing highlight to the spectral rim. Increase the rim travel and preserve both device-pose extremes in Locations snapshots.
| } | ||
| } | ||
|
|
||
| private static func highlightPoints(direction: CGSize) -> (start: UnitPoint, end: UnitPoint) { |
There was a problem hiding this comment.
Posted by an AI agent on kve’s behalf.
Review note: this normalizes the light vector only for the directional rim hot spot, so even modest physical tilt moves a full-strength highlight around the perimeter. The spectral gradient and title relief still use the clamped magnitude, and the vertical fallback prevents a degenerate gradient at an exactly neutral pose. The new LoadedReverseTilt references pin the opposite direction.
Invert the tilt-driven inset and exterior lighting so region names read pressed into the card, reduce the exterior edge through a dedicated style token, and apply the same alpha-masked treatment to the complete entry stamp.
| } symbols: { | ||
| subject.tag(SymbolID.subject) | ||
| } | ||
| .mask(subject) |
There was a problem hiding this comment.
Posted by an AI agent on kve’s behalf.
Review note: the shadow filters deliberately render shadow-only layers, and this final alpha mask turns those exterior shadows into inset edges. Rendering the complete subject as a Canvas symbol preserves the stamp’s independently authored ring, artwork, arc-text, and year opacities instead of replacing them with one foreground style.
Reduce the pressed-ink offset and blur so region names and entry stamps retain directional relief without reading as deeply cut into the card.
Summary
Why
The original full-spectrum angular rim changed too subtly because every hue remained visible around the perimeter. A stronger moving light-facing peak makes pose changes legible without repainting the card face. Keeping the title and stamp flat avoids competing lighting cues and gives the card a cleaner hierarchy: printed content inside, reactive spectral material at the edge.
Review focus
Testing
./test --only 'WhereUITests/WhereStylesheetTests' --only 'WhereUITests/CardDesignerConfigurationTests' --only 'WhereUITests/CardDesignerExportTests' --only 'WhereUITests/CardDesignerJSONExporterTests' --only 'WhereUITests/CardDesignerModelTests'— 44 tests passed./test --only 'WhereUISnapshotTests/LocationsViewSnapshotTests' --record never --no-build --no-generate— focused suite passed across its 20-scenario matrix./test --snapshots— 41 snapshot tests passed after merging latest main, before the focused finish follow-upsswift run bumper lint . --timings— no architecture violations./swiftformat --lint./xcstrings --lint