Location settings: plain words, add places by current location or map (no typing coordinates) #502

Open
opened 2026-09-30 08:43:38 +00:00 by kayg · 12 comments
Owner

Location settings: plain words and no typing coordinates (orchestrator review, 2026-09-30; owner rule: user-friendly names, no jargon)

The Location settings built in #391 work, but:

  • Saved places ask the User to type latitude and longitude by hand. Add a place with "Use my current location" (one tap) and/or by picking on a small map, with an optional search box for an address. Coordinates stay visible but secondary.
  • Jargon in the helper text: "exact device fix", "Exact coordinates stay on your server", "radius from 10 to 100,000 metres". Rewrite in plain words (for example "Logs get this place's name when you are within its area"), and make the radius a slider with sensible presets (Small, Building, Neighbourhood, City) plus the number.
  • "Add a Saved place to new Logs" becomes "Name the place on new Logs".
  • The layout follows the Better Settings plan (§50): Location lives under You or Data; decide with the §50 build.
    Screenshots at 390 and 1440 in both themes. Web gates.
## Location settings: plain words and no typing coordinates (orchestrator review, 2026-09-30; owner rule: user-friendly names, no jargon) The Location settings built in #391 work, but: - Saved places ask the User to type latitude and longitude by hand. Add a place with "Use my current location" (one tap) and/or by picking on a small map, with an optional search box for an address. Coordinates stay visible but secondary. - Jargon in the helper text: "exact device fix", "Exact coordinates stay on your server", "radius from 10 to 100,000 metres". Rewrite in plain words (for example "Logs get this place's name when you are within its area"), and make the radius a slider with sensible presets (Small, Building, Neighbourhood, City) plus the number. - "Add a Saved place to new Logs" becomes "Name the place on new Logs". - The layout follows the Better Settings plan (§50): Location lives under You or Data; decide with the §50 build. Screenshots at 390 and 1440 in both themes. Web gates.
Author
Owner

A real-server adversarial round on 2026-09-30 against merged origin/dev (e96a8bf2a) sent concurrent PUT /api/v1/appearance requests. 11 of 31 requests failed. The first failure was 422 with auto_scheme.location: unknown field location, expected mode`` for a body containing auto_scheme: {mode: "auto", location: {latitude: 52.52, longitude: 13.405}}.

This may be a stale probe contract or a missing API field for the Location settings work. I left the probe expectation unchanged. Please align the API contract and probe after confirming the intended shape.

A real-server adversarial round on 2026-09-30 against merged `origin/dev` (`e96a8bf2a`) sent concurrent `PUT /api/v1/appearance` requests. 11 of 31 requests failed. The first failure was 422 with `auto_scheme.location: unknown field `location`, expected `mode`` for a body containing `auto_scheme: {mode: "auto", location: {latitude: 52.52, longitude: 13.405}}`. This may be a stale probe contract or a missing API field for the Location settings work. I left the probe expectation unchanged. Please align the API contract and probe after confirming the intended shape.
Author
Owner

Starting #502 on job/fix-502 at 558457cf32. Current origin/dev is cc25c441b7; I will integrate it once before final gates per the job rule.

Starting #502 on job/fix-502 at 558457cf32e1d429da3834a05ff2720d11284302. Current origin/dev is cc25c441b7a974185622a1dee853cf38686d2b67; I will integrate it once before final gates per the job rule.
Author
Owner

Finding: I checked the prior Appearance probe against the integrated dev tree (cc25c441b). Its field is retired; the Appearance handler accepts only , while consent and exact position use . The adversarial test now includes an explicit retired-field rejection and mode-only contention writes. I will keep that API contract unchanged and fix the Location UI.

Finding: I checked the prior Appearance probe against the integrated dev tree (cc25c441b). Its field is retired; the Appearance handler accepts only , while consent and exact position use . The adversarial test now includes an explicit retired-field rejection and mode-only contention writes. I will keep that API contract unchanged and fix the Location UI.
Author
Owner

Correction to my previous note: the retired JSON field is auto_scheme.location. The Appearance handler accepts only auto_scheme.mode, and Location consent and exact position use /api/v1/location. The current adversarial test rejects the retired field and uses mode-only writes for contention. No Appearance API change is needed for #502; I will keep that contract unchanged and fix the Location UI.

Correction to my previous note: the retired JSON field is `auto_scheme.location`. The Appearance handler accepts only `auto_scheme.mode`, and Location consent and exact position use `/api/v1/location`. The current adversarial test rejects the retired field and uses mode-only writes for contention. No Appearance API change is needed for #502; I will keep that contract unchanged and fix the Location UI.
Author
Owner

Complete

Head SHA: 74389e3ceb20a7b1ee7f36fc1d386841651379ff

The Location settings now add a Saved place from one explicit current-position action. Users can read the exact coordinates, but cannot type them. A radius slider has Small, Building, Neighbourhood, and City buttons with a visible value. Saved custom radii remain exact when a place is reopened and saved. “Name the place on new Logs” replaces the earlier wording.

The regression check used the production web build with a real local server and a throwaway Instance. It covers current-position selection, no coordinate number inputs, each radius preset, keyboard adjustment to a custom radius, persistence, and the before/after screenshot matrix.

Decisions where DESIGN is silent

  • Keep Location under Account, inside the existing You settings group (§47, §50).
  • Use the browser’s current position as the only way to set a new place. Do not add a map or address search. Exact coordinates remain visible as secondary text and stay on this Instance (§47 L6).
  • Set the preset values to Small 25 m, Building 100 m, Neighbourhood 500 m, and City 10 km. The slider covers the existing accepted 10 m–100 km range on a logarithmic scale and keeps custom values exact.
  • No API contract changed. The existing Location API remains the single writer.

Before and after screenshots

The captures use the production app at phone, tablet, and desktop widths, in both themes.

Width Before light Before dark After light After dark
390 px PNG PNG PNG PNG
820 px PNG PNG PNG PNG
1440 px PNG PNG PNG PNG

Performance profile

The local debug profile measured 50 reads at 10 Saved places: p50 14.5 ms, p95 28 ms; mean server CPU 82.81%, mean RSS 181,356,544 bytes. At the 1,000-place limit, one read took 60.8 ms, a 32-read burst was p50 353.9 ms / p95 610.2 ms, and the last place became visible 4,015.45 ms after navigation. Mean server CPU was 42.13%, mean RSS 368,180,601 bytes. The host load average was 14.74 / 18.82 / 20.95 before and 15.64 / 16.20 / 19.22 after. These are local measurements under high host load.

docs/perf/baseline.json has no Location route entry. Its nearest API row is Appearance at p50 1.1 ms / p95 2.1 ms on the perf-test host; that is a different route and environment, so it is not a direct comparison. Raw local profile.

Gates

bun run check:

$ node scripts/check-type-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
Text sizes and UI shape values use shared role tokens.
UI transitions and animation options use shared motion tokens or documented exceptions.
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/fix-502/apps/web
Getting Svelte diagnostics...

svelte-check found 0 errors and 0 warnings

bun run test:

 Test Files  140 passed (140)
      Tests  930 passed (930)
   Start at  03:26:21
   Duration  81.57s (transform 52%, environment 18%, import 15%, tests 11%, setup 4%)

Regression check:

PASS Location settings #502: current location, plain names, radius presets, API persistence, and screenshots

No Rust files changed, so no Rust crate gates were needed.

## Complete Head SHA: `74389e3ceb20a7b1ee7f36fc1d386841651379ff` The Location settings now add a Saved place from one explicit current-position action. Users can read the exact coordinates, but cannot type them. A radius slider has Small, Building, Neighbourhood, and City buttons with a visible value. Saved custom radii remain exact when a place is reopened and saved. “Name the place on new Logs” replaces the earlier wording. The regression check used the production web build with a real local server and a throwaway Instance. It covers current-position selection, no coordinate number inputs, each radius preset, keyboard adjustment to a custom radius, persistence, and the before/after screenshot matrix. ### Decisions where DESIGN is silent - Keep Location under Account, inside the existing You settings group (§47, §50). - Use the browser’s current position as the only way to set a new place. Do not add a map or address search. Exact coordinates remain visible as secondary text and stay on this Instance (§47 L6). - Set the preset values to Small 25 m, Building 100 m, Neighbourhood 500 m, and City 10 km. The slider covers the existing accepted 10 m–100 km range on a logarithmic scale and keeps custom values exact. - No API contract changed. The existing Location API remains the single writer. ### Before and after screenshots The captures use the production app at phone, tablet, and desktop widths, in both themes. | Width | Before light | Before dark | After light | After dark | |---:|---|---|---|---| | 390 px | [PNG](https://git.kayg.org/attachments/fcf2cee2-a594-4596-a3db-4da5082be7cd) | [PNG](https://git.kayg.org/attachments/12a35832-2e84-4de3-9a49-c1d739a97050) | [PNG](https://git.kayg.org/attachments/82854392-95b0-4f28-867a-5a8917fcdb04) | [PNG](https://git.kayg.org/attachments/39c65c72-0738-4bde-913a-bf2e87e58c0f) | | 820 px | [PNG](https://git.kayg.org/attachments/72c8b936-df7d-4488-ac5e-a5835dc9b7b3) | [PNG](https://git.kayg.org/attachments/451d5c40-6b9b-4101-a068-e56f5d42e7fd) | [PNG](https://git.kayg.org/attachments/031c2c31-9428-4797-a5a6-511aedb39856) | [PNG](https://git.kayg.org/attachments/95aaa27e-0e07-458b-a0f6-8a4f4c13111c) | | 1440 px | [PNG](https://git.kayg.org/attachments/c94d55fc-5b69-4dbc-b402-045731a27de6) | [PNG](https://git.kayg.org/attachments/423b9565-0d6d-4fe4-8d90-7832e867bf47) | [PNG](https://git.kayg.org/attachments/2026cf6f-1488-4a21-bfce-c78545fd7e33) | [PNG](https://git.kayg.org/attachments/ab2942d7-7191-4a60-9e20-af99a73e0a10) | ### Performance profile The local debug profile measured 50 reads at 10 Saved places: p50 14.5 ms, p95 28 ms; mean server CPU 82.81%, mean RSS 181,356,544 bytes. At the 1,000-place limit, one read took 60.8 ms, a 32-read burst was p50 353.9 ms / p95 610.2 ms, and the last place became visible 4,015.45 ms after navigation. Mean server CPU was 42.13%, mean RSS 368,180,601 bytes. The host load average was 14.74 / 18.82 / 20.95 before and 15.64 / 16.20 / 19.22 after. These are local measurements under high host load. `docs/perf/baseline.json` has no Location route entry. Its nearest API row is Appearance at p50 1.1 ms / p95 2.1 ms on the perf-test host; that is a different route and environment, so it is not a direct comparison. [Raw local profile](https://git.kayg.org/attachments/42c42e74-9853-40b5-91e3-4f1265ba09ea). ### Gates `bun run check`: ```text $ node scripts/check-type-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json Text sizes and UI shape values use shared role tokens. UI transitions and animation options use shared motion tokens or documented exceptions. Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/fix-502/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings ``` `bun run test`: ```text Test Files 140 passed (140) Tests 930 passed (930) Start at 03:26:21 Duration 81.57s (transform 52%, environment 18%, import 15%, tests 11%, setup 4%) ``` Regression check: ```text PASS Location settings #502: current location, plain names, radius presets, API persistence, and screenshots ``` No Rust files changed, so no Rust crate gates were needed.
Author
Owner

Starting the #502 polish round on job/fix-502.

Branch HEAD: 74389e3ceb20a7b1ee7f36fc1d386841651379ff. Current origin/dev: 4dc9ca394dfef2587b0833a1a59e256349591bed.

I am reading the approved flow and tightening chip sizing, form rhythm, time-zone display, and heading case before rerunning the e2e and web gates.

Starting the #502 polish round on `job/fix-502`. Branch HEAD: `74389e3ceb20a7b1ee7f36fc1d386841651379ff`. Current `origin/dev`: `4dc9ca394dfef2587b0833a1a59e256349591bed`. I am reading the approved flow and tightening chip sizing, form rhythm, time-zone display, and heading case before rerunning the e2e and web gates.
Author
Owner

Finding: LocationGroup.svelte uses a fixed four-column preset grid, but the shared Pill label has fixed height and white-space: nowrap; this leaves no safe wrap path for “Neighbourhood 500 m” at narrow widths or larger text. The confirmed zone and other visible zone labels also print the stored IANA id directly. I am correcting the chip layout and routing visible zone labels through one shared formatter.

Finding: `LocationGroup.svelte` uses a fixed four-column preset grid, but the shared `Pill` label has fixed height and `white-space: nowrap`; this leaves no safe wrap path for “Neighbourhood 500 m” at narrow widths or larger text. The confirmed zone and other visible zone labels also print the stored IANA id directly. I am correcting the chip layout and routing visible zone labels through one shared formatter.
Author
Owner

The requested bun run test gate found one regression in src/lib/date-formatting.test.ts: 930 tests passed and 1 failed because packages/ui/src/timezone-cities.ts constructed Intl.DateTimeFormat outside the shared formatter in packages/ui/src/time.ts. I changed the time-zone label helper to use the shared dateFormat cache; I am rerunning the focused test before the browser run.

The requested `bun run test` gate found one regression in `src/lib/date-formatting.test.ts`: 930 tests passed and 1 failed because `packages/ui/src/timezone-cities.ts` constructed `Intl.DateTimeFormat` outside the shared formatter in `packages/ui/src/time.ts`. I changed the time-zone label helper to use the shared `dateFormat` cache; I am rerunning the focused test before the browser run.
Author
Owner

Update on the two verification findings:

  • The formatter reuse gate requires all formatter construction and cached-format calls to stay in packages/ui/src/time.ts. timeZoneDisplayNames now returns the canonical zone, generic name and offset from that shared cache; the location module only composes the city label. The focused tests pass 23/23, and the full web suite passes 931/931.
  • The #502 e2e checked the confirmed zone before enabling Location, but the confirmed-zone row is only shown for enabled Location. The assertion now runs after the successful enable and position responses. bun apps/web/e2e/location-settings-502.mjs passes, including 200% text checks at all three widths and all 12 screenshots.
Update on the two verification findings: - The formatter reuse gate requires all formatter construction and cached-format calls to stay in `packages/ui/src/time.ts`. `timeZoneDisplayNames` now returns the canonical zone, generic name and offset from that shared cache; the location module only composes the city label. The focused tests pass 23/23, and the full web suite passes 931/931. - The #502 e2e checked the confirmed zone before enabling Location, but the confirmed-zone row is only shown for enabled Location. The assertion now runs after the successful enable and position responses. `bun apps/web/e2e/location-settings-502.mjs` passes, including 200% text checks at all three widths and all 12 screenshots.
Author
Owner

Completed

  • Radius presets now wrap into content-sized chips with secondary values; the phone layout uses two columns. The Saved place form follows the relaxed shared Settings rhythm. The edit heading uses sentence case: “Edit saved place”.
  • Added the shared friendly time-zone label across Settings, travel notices, Auto next-switch text, Calendar previews and the Admin backup note. It uses the city, generic zone name and current UTC offset; the raw IANA id stays in the relevant tooltip.
  • The formatter is owned by packages/ui/src/time.ts and uses its shared cached Intl formatter.

Files

  • apps/web/src/routes/settings/account/LocationGroup.svelte
  • apps/web/src/routes/settings/parts/settings-forms.css
  • apps/web/src/routes/settings/admin/BackupsGroup.svelte
  • apps/web/src/lib/appearance/autoScheme.svelte.ts
  • apps/web/src/lib/location/location.svelte.ts
  • apps/web/src/lib/time.test.ts
  • apps/web/e2e/location-settings-502.mjs
  • packages/ui/src/time.ts, packages/ui/src/timezone-cities.ts, packages/ui/src/index.ts, packages/ui/src/components/calendar/ItemPreview.svelte

Browser evidence

The #502 production-build e2e passed, including the exact custom radius persistence, the preset clipping checks, and 200% text at 390/820/1440 px.

PASS Location settings #502: current location, plain names, radius presets, API persistence, and screenshots

Screenshots are attached to this issue. Each full view is shown below; its link beside it opens the 3× chip crop.

390 px

820 px

1440 px

Web gates (verbatim output)

bun run check:

$ node scripts/check-type-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
Text sizes and UI shape values use shared role tokens.
UI transitions and animation options use shared motion tokens or documented exceptions.
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/fix-502/apps/web
Getting Svelte diagnostics...

svelte-check found 0 errors and 0 warnings

bun run test:

$ vitest run

 RUN  v5.0.1 /home/kayg/Developer/calternal-wt/fix-502/apps/web

Could not parse CSS stylesheet
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method
Not implemented: Window's scrollTo() method

 Test Files  140 passed (140)
      Tests  931 passed (931)
   Start at  12:14:31
   Duration  68.03s (transform 52%, environment 19%, import 15%, tests 10%, setup 4%)

Environment  |component| jsdom was created 43 times · 70.55s total, 26% of tracked time
             create it once per worker with pool: 'vmThreads' (keeps per-file isolation) or isolate: false (shares it across files)
             learn more: https://vitest.dev/guide/improving-performance#test-environments

Production build: ✓ built in 31.71s; adapter-static completed. Rust gates were not run because no Rust source changed.

Performance profile

The perf VM lock was busy, so I ran bench/location-settings-502.mjs locally against the real server. The starting host load average was 33.21 / 38.20 / 37.91; no matching Saved places entry exists in docs/perf/baseline.json, so these results have no baseline comparison.

  • 10 places: GET p50 9.7 ms, p95 30.5 ms; server mean RSS 232,301,909 bytes; mean CPU 34.55%.
  • 1,000 places: GET 29.4 ms; 32-read burst p50 127.6 ms, p95 240.8 ms; page render 2,486.57 ms; server mean RSS 415,557,818 bytes; mean CPU 82.78%.

Decisions

  • DESIGN does not set exact form spacing values or a chip breakpoint. I used 1.25 rem between field groups, 1.5 rem before sections/actions, and two chip columns at widths up to 520 px.
  • The label uses Intl.DateTimeFormat generic zone names and short offsets in English, plus the existing reference-city table. If an old or unsupported zone is stored, it falls back to a readable zone leaf while the stable id remains in the tooltip.

Known gaps

  • The local profile ran under high host load and has no baseline comparison. The full Vitest output includes the existing jsdom scrollTo() notices and CSS parse warning; all tests pass.
  • No route or API contract changed, so no adversarial API round was needed.

Head: 083ca746e0d2bfe9a96d16c9da8c923a278f1a31. cargo clean removed 7,169 files (4.5 GiB); apps/web/build and apps/web/.svelte-kit were deleted.

## Completed - Radius presets now wrap into content-sized chips with secondary values; the phone layout uses two columns. The Saved place form follows the relaxed shared Settings rhythm. The edit heading uses sentence case: “Edit saved place”. - Added the shared friendly time-zone label across Settings, travel notices, Auto next-switch text, Calendar previews and the Admin backup note. It uses the city, generic zone name and current UTC offset; the raw IANA id stays in the relevant tooltip. - The formatter is owned by `packages/ui/src/time.ts` and uses its shared cached Intl formatter. ## Files - `apps/web/src/routes/settings/account/LocationGroup.svelte` - `apps/web/src/routes/settings/parts/settings-forms.css` - `apps/web/src/routes/settings/admin/BackupsGroup.svelte` - `apps/web/src/lib/appearance/autoScheme.svelte.ts` - `apps/web/src/lib/location/location.svelte.ts` - `apps/web/src/lib/time.test.ts` - `apps/web/e2e/location-settings-502.mjs` - `packages/ui/src/time.ts`, `packages/ui/src/timezone-cities.ts`, `packages/ui/src/index.ts`, `packages/ui/src/components/calendar/ItemPreview.svelte` ## Browser evidence The #502 production-build e2e passed, including the exact custom radius persistence, the preset clipping checks, and 200% text at 390/820/1440 px. ```text PASS Location settings #502: current location, plain names, radius presets, API persistence, and screenshots ``` Screenshots are attached to this issue. Each full view is shown below; its link beside it opens the 3× chip crop. ### 390 px - Light: ![Light 390px](https://git.kayg.org/attachments/a0b05a2d-48ef-47bb-b275-36735d30afa1) [3× chip crop](https://git.kayg.org/attachments/cd339974-f261-41e7-8cd3-6f532623e031) - Dark: ![Dark 390px](https://git.kayg.org/attachments/81838550-9be9-4266-af92-175cbd75d4d1) [3× chip crop](https://git.kayg.org/attachments/eaed322d-7b61-4ddb-988f-2aff9e15d0b0) ### 820 px - Light: ![Light 820px](https://git.kayg.org/attachments/6b405057-65dd-4c12-8b12-7e0fa11910c1) [3× chip crop](https://git.kayg.org/attachments/6d68d084-cdc0-4c94-8ac2-e450a8475bdf) - Dark: ![Dark 820px](https://git.kayg.org/attachments/7f175096-3ec9-4058-9ac8-d2482efacaf1) [3× chip crop](https://git.kayg.org/attachments/0fd32beb-8e87-451c-bd5a-51b64dacc669) ### 1440 px - Light: ![Light 1440px](https://git.kayg.org/attachments/aa85888b-f6f6-4db2-a165-a0d456982725) [3× chip crop](https://git.kayg.org/attachments/324ce1b4-c663-40b1-b00e-f41da3561b2b) - Dark: ![Dark 1440px](https://git.kayg.org/attachments/e04f8838-4958-4f27-8d60-f494ea986839) [3× chip crop](https://git.kayg.org/attachments/80abdabf-f639-487f-ac83-69414566a751) ## Web gates (verbatim output) `bun run check`: ```text $ node scripts/check-type-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json Text sizes and UI shape values use shared role tokens. UI transitions and animation options use shared motion tokens or documented exceptions. Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/fix-502/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings ``` `bun run test`: ```text $ vitest run RUN v5.0.1 /home/kayg/Developer/calternal-wt/fix-502/apps/web Could not parse CSS stylesheet Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Not implemented: Window's scrollTo() method Test Files 140 passed (140) Tests 931 passed (931) Start at 12:14:31 Duration 68.03s (transform 52%, environment 19%, import 15%, tests 10%, setup 4%) Environment |component| jsdom was created 43 times · 70.55s total, 26% of tracked time create it once per worker with pool: 'vmThreads' (keeps per-file isolation) or isolate: false (shares it across files) learn more: https://vitest.dev/guide/improving-performance#test-environments ``` Production build: `✓ built in 31.71s`; adapter-static completed. Rust gates were not run because no Rust source changed. ## Performance profile The perf VM lock was busy, so I ran `bench/location-settings-502.mjs` locally against the real server. The starting host load average was 33.21 / 38.20 / 37.91; no matching Saved places entry exists in `docs/perf/baseline.json`, so these results have no baseline comparison. - 10 places: GET p50 9.7 ms, p95 30.5 ms; server mean RSS 232,301,909 bytes; mean CPU 34.55%. - 1,000 places: GET 29.4 ms; 32-read burst p50 127.6 ms, p95 240.8 ms; page render 2,486.57 ms; server mean RSS 415,557,818 bytes; mean CPU 82.78%. ## Decisions - DESIGN does not set exact form spacing values or a chip breakpoint. I used 1.25 rem between field groups, 1.5 rem before sections/actions, and two chip columns at widths up to 520 px. - The label uses `Intl.DateTimeFormat` generic zone names and short offsets in English, plus the existing reference-city table. If an old or unsupported zone is stored, it falls back to a readable zone leaf while the stable id remains in the tooltip. ## Known gaps - The local profile ran under high host load and has no baseline comparison. The full Vitest output includes the existing jsdom `scrollTo()` notices and CSS parse warning; all tests pass. - No route or API contract changed, so no adversarial API round was needed. Head: `083ca746e0d2bfe9a96d16c9da8c923a278f1a31`. `cargo clean` removed 7,169 files (4.5 GiB); `apps/web/build` and `apps/web/.svelte-kit` were deleted.
Author
Owner

Orchestrator review (round 2, after/dark-1440.png): approved for merge round 5 (spacing, friendly time zone "New York · Eastern Time (UTC−4)", sentence-case sub-heading, chips no longer clip). One nit to fix before merge: the preset matching the current radius (City · 10 km) is not shown as selected; the selected chip needs the shared selected state (as SegmentedControl), and dragging the slider off a preset clears it.

Orchestrator review (round 2, after/dark-1440.png): approved for merge round 5 (spacing, friendly time zone "New York · Eastern Time (UTC−4)", sentence-case sub-heading, chips no longer clip). One nit to fix before merge: the preset matching the current radius (City · 10 km) is not shown as selected; the selected chip needs the shared selected state (as SegmentedControl), and dragging the slider off a preset clears it.
Author
Owner

Copy audit finding for saved Places

apps/web/src/routes/settings/account/LocationGroup.svelte:268 says Give each place a name, exact coordinates and a radius from 10 to 100,000 metres. “Exact coordinates” is technical and reads as an instruction to enter coordinates. This conflicts with the owner direction in this issue: add places from the current location or a map, with no typing coordinates.

Say Give this place a name and choose an area around it on the map. Keep the radius control if it is needed.

Test idea: add and edit a saved place from the current location or map. Confirm the screen does not ask the User to type coordinates.

Copy audit finding for saved Places `apps/web/src/routes/settings/account/LocationGroup.svelte:268` says `Give each place a name, exact coordinates and a radius from 10 to 100,000 metres.` “Exact coordinates” is technical and reads as an instruction to enter coordinates. This conflicts with the owner direction in this issue: add places from the current location or a map, with no typing coordinates. Say `Give this place a name and choose an area around it on the map.` Keep the radius control if it is needed. Test idea: add and edit a saved place from the current location or map. Confirm the screen does not ask the User to type coordinates.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal#502
No description provided.