bb6ee33254
Stations: move price-rating Key (legend) into a modal sheet opened by an info button in the nav header; list stays focused on stations. Sheet = medium detent, inline nav title 'Key', Done button; legend rows unchanged. Adds -showKeySheet launch arg (QA hook for sim).
FuelBoard Contributor2026-08-14 23:53:02 +01:00
75506b48b7
Telemetry: tag relay fetches with X-Client (app/widget) — app via RelayFuelProvider, widget focused/fuel-only fetches + diag beacon; Siri untouched (cached-only). Purely observational for relay admin /stats.
FuelBoard Contributor2026-08-14 23:23:06 +01:00
d91652aedc
Onboarding: space the welcome feature rows out vertically (per-row padding 5pt → 10pt)
FuelBoard Contributor2026-08-14 22:47:48 +01:00
bfb59d498a
Live Activity: price now respects the Price display style — style carried in ContentState (captured at push time, extension renders deterministically instead of re-reading storage), setting change pushes an in-place content update via explicit override (no save-ordering race)
FuelBoard Contributor2026-08-14 21:06:04 +01:00
8a589a35c1
Settings: drop parenthesized example figures from Price display segmented buttons — 'Station sign' / 'Pounds & pence' (cleaner, roomier labels)
FuelBoard Contributor2026-08-14 20:56:01 +01:00
e317a1e451
Settings: rename 'Show introduction' row to 'Replay onboarding' with round-arrow icon (arrow.clockwise.circle); key stays the address, value changed in Localizable.strings
FuelBoard Contributor2026-08-14 19:34:11 +01:00
80113456ae
Price display: station sign drops the £ (134.9) — matches roadside signs; pounds & pence uses forecourt superscript style £1.29⁹/L (small superscript third digit, small /L); attributed Text on list/widgets/Live Activity, Unicode superscript in Siri cards
FuelBoard Contributor2026-08-14 18:14:10 +01:00
fd7fa5f9c9
Settings: price display toggle — station sign (£129.9) vs pounds & pence (£1.299); display-only, all surfaces (list, widgets, Live Activity, Siri cards); Siri dialog stays speech-safe pounds
FuelBoard Contributor2026-08-14 15:33:26 +01:00
b46c09109e
Siri: full-width Directions row on price card — fixes squashed 2-line button in narrow snippet
FuelBoard Contributor2026-08-14 14:45:51 +01:00
6d7254ebba
Siri: interactive price-card snippet (iOS 26 SnippetIntent) with Directions button → Apple Maps; zero AppShortcut slots
FuelBoard Contributor2026-08-14 14:38:14 +01:00
b458d92972
Siri: favourite price + favourite directions (top favourite per fuel); trim to 10 AppShortcuts (Apple cap)
FuelBoard Contributor2026-08-14 14:24:20 +01:00
aed99e3f32
Siri directions: speak the station before Maps hand-off (.result(opensIntent:dialog:))
FuelBoard Contributor2026-08-14 14:05:42 +01:00
caadf184f2
Siri: Directions to Cheapest [fuel] AppShortcuts — OpenURLIntent hands off to Apple Maps (universal link)
FuelBoard Contributor2026-08-14 13:55:03 +01:00
a3b6f37843
Siri: shortcut names match app (Unleaded/Premium/Diesel); phrases cover UK speech variants
FuelBoard Contributor2026-08-14 13:23:52 +01:00
e55078c5e2
Siri: per-fuel App Shortcuts with literal fuel words (unleaded/petrol/premium/diesel) + UK case labels
FuelBoard Contributor2026-08-14 13:06:26 +01:00
037c2418af
Siri: scope cheapest-near-me to the saved search radius (5/10/15 mi)
FuelBoard Contributor2026-08-14 12:49:30 +01:00
4d35b08533
Widget: keychain-free fresh defaults — drop defaultResult(), auto-populate at entry time
FuelBoard Contributor2026-08-13 19:35:46 +01:00
8646521176
Small widget: fuel-only relay fetch when no location, so default/Cheapest/Closest faces populate with real stations instead of sample data. Root cause of the persistent skeleton: favourites mode reads keychain (works on free accounts), but the non-favourites path needs stations — the app-group cache can be absent on free accounts and keychain can't hold the station dump, so with no location fix the widget fell through to SampleFuelProvider and never populated. Now when location is nil the widget fetches /api/v1/stations?fuel=X&limit=500 (fuel-only, cheapest-first, verified against the relay).
FuelBoard Contributor2026-08-13 18:51:41 +01:00
38b47eea38
Widget gallery order + default-widget skeleton fix. (1) Register FuelPriceSmallWidget BEFORE FuelPriceWidget so the gallery lists small, then medium (bundle order = gallery order). (2) Revert entity resolution to LENIENT: the timeline request resolves the full configuration through the entity queries, and the b1765b5 strict entities(for:) (nil for the empty default favourite 'fuel|') failed resolution for default-config small widgets, stranding them on the iOS skeleton placeholder. entities(for:) now always returns a value; defaultResult() still auto-populates fresh widgets to the first fuel with a favourite / first favourite of that fuel.
FuelBoard Contributor2026-08-13 18:39:30 +01:00
b1765b5611
Widget favourites defaults: auto-populate Fuel and Favourite rows when Sort = Favourites. FavouriteFuelQuery gains defaultResult() (first fuel with a favourite, Unleaded→Diesel order) and strict entities(for:) — a stored fuel that no longer has favourites fails resolution and falls back to the default. WidgetFavouriteQuery gains defaultResult() (first favourite of the Fuel row's fuel, else first favourite overall) and strict entities(for:) — the empty static default ('fuel|') and removed favourites now resolve to nil so the sheet pre-selects a real favourite instead of showing a placeholder. Provider fallback (cheapest favourite of the fuel) unchanged.
FuelBoard Contributor2026-08-13 18:28:23 +01:00
906f8a8429
Small widget: declare config params in display order for every summary branch. If iOS falls back to declaration order when re-rendering the sheet after a parameter change, the favourites branch previously re-ordered to Sort by first (sort was declared before favouriteFuel). Now favouriteFuel, fuel, sort, favourite, distance — Favourites mode reads Fuel · Sort by · Favourite under either ordering mechanism. No encoding change (config keys are identifiers, order-independent).
FuelBoard Contributor2026-08-13 18:21:03 +01:00
926317236a
Widget config sheets: unify row layout across both widgets — Fuel type first, then Sort by, then Favourite (Favourites sort only). Small widget's Favourites branch reordered from Sort/Fuel/Favourite to Fuel/Sort/Favourite, and the favourites-scoped fuel param retitled 'Fuel' so the row reads identically in every mode. Medium widget was already Fuel-first. No parameter type changes, so no stored-config reset beyond the normal reinstall.
FuelBoard Contributor2026-08-13 18:02:53 +01:00
3e2d3775f2
Widget config sheet: revert WidgetSort to String-backed AppEnum. parameterSummary When(\.$sort, .equalTo, …) silently falls back to the otherwise branch for AppEntity parameters (iOS 17+ bug FB13263902), which hid the Favourite/Favourite Fuel rows on the small widget — the metadata compared against a literal 'WidgetSort.favourites' string instead of the enum case. String AppEnums match reliably (the d8506a0 form). Tradeoff: the Sort picker always offers Favourites; picking it with no favourites shows the empty state. FavouriteFuel entity + IntentParameterDependency filtering unchanged.
FuelBoard Contributor2026-08-13 17:48:33 +01:00
d0bd4e7a8e
Small widget favourites config: fuel dictates the favourite list (@IntentParameterDependency filters picker options by the chosen fuel), fuel picker shows only fuels with favourites (FavouriteFuel entity), Favourites sort hidden when no favourites exist (WidgetSort → dynamic AppEntity), fuel tags removed from favourite rows
FuelBoard Contributor2026-08-13 17:14:14 +01:00
d8506a035f
Small widget favourite picker: embed station name + multi-fuel flag in the WidgetFavourite entity so picker rows render with no storage read (config-sheet resolution can run without keychain/app-group access, which made every row show the 'Favourite' placeholder)
FuelBoard Contributor2026-08-13 17:00:17 +01:00
7357eb98c3
Small widget favourites: fuel row returns to the config sheet (picks the default favourite); pinned favourite wins, fuel-tagged picker rows when favourites span >1 fuel; fallback = selected fuel's cheapest favourite
FuelBoard Contributor2026-08-13 16:51:21 +01:00
1bdef59d78
Small widget: Favourites gains a picker to pin which favourite to show (separate FuelPriceWidgetSmall kind + AppEntity picker; medium keeps the list, no picker). Backlog: dual-unit widget picker labels
FuelBoard Contributor2026-08-13 15:49:18 +01:00
26e724f48a
Widget config: Distance picker as AppEntity so labels resolve dynamically from the app's units (AppEnum labels are static)
FuelBoard Contributor2026-08-13 15:33:24 +01:00
64330f96a8
Widget config: Distance picker mirrors the app's units setting (5 mi = 8 km) via dynamic AppEnum displayRepresentation
FuelBoard Contributor2026-08-13 15:25:20 +01:00
2409b71f2f
Labels: pluralize miles (1 mile) and show true distances in the chosen unit (5 mi = 8 km) across Alerts/Stations pickers + captions
FuelBoard Contributor2026-08-13 15:10:23 +01:00