Skip to content

Release v0.16.0#638

Closed
wilhel1812 wants to merge 333 commits intomainfrom
release/promote-0.16.0
Closed

Release v0.16.0#638
wilhel1812 wants to merge 333 commits intomainfrom
release/promote-0.16.0

Conversation

@wilhel1812
Copy link
Copy Markdown
Owner

Release v0.16.0

Promotes verified staging snapshot to production. Includes merge fix: removed duplicate selectSiteById/clearActiveSelection left by staging→main squash merge (kept staging version with coverage recompute trigger).

What's in this release

Added

Changed

Fixed

Preflight

  • All 0.16.0 milestone issues closed and verified on staging
  • npm test passes (352/352)
  • npm run build passes, label: 0.16.0+077725d1
  • CHANGELOG.md updated
  • Milestone release checklist completed: docs/milestone-release-checklist.md

…p) (#296)

- Add networkError flag to MeshmapFetchResult for cache fallback path
- Sidebar: show 'Live fetch failed' warning + retry when using stale cache
- MapView: show warning section + retry when live fetch fails but cached data exists
…182) (#298)

- Remove entire 'More' panel (Local Storage Safety, Language selector,
  reference links, Credits & Attribution section)
- Remove dead code: exportLocalLibraries, downloadJson, StorageHealth
  type/functions, getSnapshotCount, storage-related state variables
- Add sidebar footer with inline links: GitHub icon (simple-icons) · Terms · Privacy
- Add simple-icons npm package for GitHub SVG icon
- Update CSS: remove .section-more, add .sidebar-footer-links styles
Uniform icon+text links: Handshake Terms, HatGlasses Privacy, GitHub GitHub
* fix: replace broken mobile attribution with sidebar footer + floating display

- Add map attribution to sidebar footer with Map and Copyright icons
- Add floating pill for desktop when sidebar is hidden (map/profile expanded)
- Add text overlay for mobile when map is expanded (no pill, just text on map)
- Text overlay uses text-shadow for readability in both light/dark themes

Refs: #240

* fix: strip © from attribution, hide old maplibre attribution, use pill on mobile

- Replace © symbols in attribution string with Lucide copyright icons
- Hide old MapLibre attribution control with CSS display:none
- Use floating-attribution-pill for both desktop and mobile when sidebar hidden

Refs: #240
…inactive (#304)

* fix: make inline site editor map reactive to coordinate changes

* fix: Open Library button not working on mobile when sidebar panel is inactive

The SimulationLibraryPanel modal and its request-handling effect lived
inside the Sidebar component, which on mobile is only mounted when the
sidebar tab is active. This meant clicking 'Open Library' (or the
auto-open on first visit) animated but never opened the modal.

Moved the request interception effect and modal rendering to AppShell,
which is always mounted. Removed the now-redundant effect from Sidebar.
…ry fix (#304) (#305)

* fix: replace broken mobile attribution with sidebar footer + floating display

- Add map attribution to sidebar footer with Map and Copyright icons
- Add floating pill for desktop when sidebar is hidden (map/profile expanded)
- Add text overlay for mobile when map is expanded (no pill, just text on map)
- Text overlay uses text-shadow for readability in both light/dark themes

Refs: #240

* fix: strip © from attribution, hide old maplibre attribution, use pill on mobile

- Replace © symbols in attribution string with Lucide copyright icons
- Hide old MapLibre attribution control with CSS display:none
- Use floating-attribution-pill for both desktop and mobile when sidebar hidden

Refs: #240

* fix: make attribution clickable, fix mobile pill position

- Add attributionUrl to basemaps and render as links
- Position pill above mobile tab bar using CSS var
- Link opens in new tab with proper rel for security

Refs: #240

* fix: remove Map icon, enable link clicks in pill, match sidebar link style

Refs: #240

* fix: match link colors to sidebar footer links (muted, text on hover)

Refs: #240

* fix: use same CSS class for all footer links to match styling

Refs: #240

* fix: separate footer into three equal rows (attribution, links, version)

Refs: #240

* fix: use text © instead of Lucide icons, add flex-wrap for multi-line support

Refs: #240
The sidebar footer had both the old lucide-icon attribution and the new
text-© clickable attribution. Removed the old one and cleaned up unused
imports (MapIcon, Copyright) and dead CSS (.sidebar-footer-attribution).
…) (#310)

Path profile fullscreen now routes through a dedicated toggle that always
keeps the profile panel active and does not invoke map panel hiding behavior.
Also removed the mobile profile-tab re-tap shortcut that could promote to
map fullscreen and conflict with the profile fullscreen control.
Replace useCallback with a plain function for the profile fullscreen toggle
so no hook is introduced after early-return branches in AppShell. This
resolves the staging runtime crash (React minified error #310).
…#312)

When profile fullscreen hid the sidebar, app-shell still kept the desktop
sidebar column width reservation. On narrow desktop windows this collapsed
the workspace/profile panel to zero width. Add an is-profile-expanded shell
class and collapse grid columns to a single full-width track for profile
fullscreen, matching map fullscreen layout behavior.
…#313)

Path profile fullscreen should occupy the workspace without right-panel overlap.
MapView inspector rendering now explicitly requires profile fullscreen to be off,
so the inspector cannot remain visible in expanded profile mode.
Path profile fullscreen still reserved sidebar space via workspace panel
right padding and non-expanded control offsets. Clear right padding in
profile-expanded layout and gate sidebar-offset control positioning to
non-profile-expanded states.
wilhel1812 and others added 28 commits April 10, 2026 17:30
…ix, Norway peaks dataset (#606)

- Migrate all panorama visuals to canvas (terrain quads, ridge lines, grid,
  nodes, labels); SVG retained only for hover cursor + hit-detection rect.
  useLayoutEffect eliminates the one-frame lag between terrain shading and other
  chart elements on scroll.
- Fix vertical seam artifacts: extend each quad's right edge by 1px so adjacent
  quads overlap rather than gap at sub-pixel boundaries.
- Replace verticalBlend (0–1 arbitrary) with exaggeration (1–20x, default 4x).
  1x = natural proportions (same px/deg vertically and horizontally).
- Fix label collision detection for 45°-rotated labels: use rotated horizontal
  footprint (W + H) / sqrt(2) instead of unrotated width. Increases visible
  label count and removes incorrectly rejected labels.
- Fix cursor line CSS selector: wrap in <g className="profile-cursor"> so
  .profile-cursor line CSS rule applies correctly (was a pre-existing bug).
- Run OSM peak tile pipeline with norway-latest.osm.pbf: 13,824 named Norway
  peaks (benchmark gate requires 1,000), 14,159 total features, 138 tiles.
  Replaces bootstrap dataset (38 Norway peaks) with full OSM coverage.
- Implement relation lat/lon/center tag extraction in extract_osm_peaks.py.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…line (#607)

- Label collision: use height-only footprint (H/√2 ≈ 10px constant) regardless of
  name length; increase hardCap from laneWidth/40 to laneWidth/16 — many more
  labels visible simultaneously
- Remove clutter feature entirely (state, UI button, geometry, canvas rendering)
- Remove lines UI and ridge-line canvas rendering (AudioLines button, slider
  popover branch, depthBand stroke loop); lineSampleCount fixed at 10 internally
- Default FOV changed from 240° (fovScale=1.5) to 120° (fovScale=3)
- Increase relief shading contrast: less surface blend (0.08+haze*0.55),
  stronger lambert ((lambert-0.4)*0.85), higher base alpha (0.92-haze*0.4)
- Fix terrain seams: render quads opaque to offscreen canvas, composite to
  main canvas with single globalAlpha — eliminates double-opacity at overlaps
- Add scripts/download-overpass-peaks.mjs: download all named peaks/volcanoes
  from Overpass API in 8 latitude bands with retry and resume support
- Update build-osm-peak-tiles.mjs: add --ndjson mode to bypass Python extraction
  (for use with Overpass-sourced data); skip # comment lines in NDJSON

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
#610)

- HTML overlay labels: sites get pill badges with RadioTower icon and
  state-color background; peaks get Mountain/MountainSnow icon (based on
  elevation ≥ 1000m threshold); leader lines stay on canvas
- Elevation domain: anchor top of viewport to terrain max angle instead
  of centering on terrain midpoint — fixes empty bottom half when viewing
  from a tall vantage point
- Shading contrast: relief lighting multiplier 0.85→1.1; classic alpha
  0.18→0.32 and blend range widened for more visible classic overlay
- Button icons: MoveVertical (vertical), Brush (shading toggle, now
  active=classic-on semantics), ScanSearch (map hover lens)
- Azimuth axis: inject N/S/E/W ticks into visible window; highlight N in
  red; deduplicate against nearby regular ticks
- Legend popover: replace full chart-action-row with Info icon button that
  opens a ui-surface-pill popover listing all 4 state dot meanings
- UI gallery: add pill-popover and card-popover pattern cards; add
  .ui-surface-pill.is-card modifier (border-radius: 12px)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…ug panel (#611)

- Labels: restore 45° rotation via CSS transform-origin+rotate; icon size 10px
- Elevation domain: derive top anchor from stable basePanorama (full 360°) only,
  preventing viewport jumps while panning as detail panoramas load
- Shading: always render relief; Brush button now toggles classic as an additive
  overlay on top (instead of replacing relief)
- Hover lens icon: MapPinned
- Legend popover: card variant (is-card)
- Temporary shading debug panel: top-left card popover with 6 vertical sliders
  (light mult, relief alpha, haze start/range, classic alpha/haze); toggle via
  "dbg" button; remove once values are finalised

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(#101): label rotation/icons, stable Y-anchor, shading toggle, debug panel

- Labels: restore 45° rotation via CSS transform-origin+rotate; icon size 10px
- Elevation domain: derive top anchor from stable basePanorama (full 360°) only,
  preventing viewport jumps while panning as detail panoramas load
- Shading: always render relief; Brush button now toggles classic as an additive
  overlay on top (instead of replacing relief)
- Hover lens icon: MapPinned
- Legend popover: card variant (is-card)
- Temporary shading debug panel: top-left card popover with 6 vertical sliders
  (light mult, relief alpha, haze start/range, classic alpha/haze); toggle via
  "dbg" button; remove once values are finalised

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(#101): remove unused minSampleAngle/maxSampleAngle after stable-anchor refactor

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
)

- Remove duplicate stablePanorama/stableMaxSampleAngle/stableMinSampleAngle
  block introduced by squash-merge collision
- Fix Lucide icons inside .chart-panel being stretched to 100% by the global
  svg rule; scope rule to svg:not(.lucide) and reset .lucide dimensions

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Removes the chart-action-row that compressed the profile panel while
peaks were loading; instead renders a small indeterminate progress bar
overlaid at the bottom-center of the chart area. Also removes classic
overlay state/button/pass and fixes ThemeVariant type mismatch.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…ols, grab cursor (#615)

- Add --radius-pill/card/btn tokens to :root and replace all hardcoded border-radius values
- New shared Surface forwardRef component (src/components/ui/Surface.tsx)
- Replace dbgLightMult with split Shadow/Highlight controls and updated shading formula
- Debug panel: fixed positioning, close button, expanded slider set
- Use Surface in panorama slider/legend popovers and UiGalleryPage demos
- Add cursor: grab / grabbing to .chart-svg-wrap
- Fullscreen label pill height fix (higher-specificity companion rule)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
)

- Truncate panorama labels at 20ch with ellipsis to prevent viewport overflow
- Override crosshair cursor with grab/grabbing in panorama mode via :has()
- Remove temporary shading debug panel, toggle button, and all debug state
- Hardcode final shading values: shadow=0.7, highlight=1.0, alpha=0.9, haze=0.55
- Remove all panorama-shading-debug CSS (~60 lines)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- Move text-overflow/ellipsis from flex parent to inner text elements
  (ellipsis doesn't render on flex containers). Pill border/background
  stays intact; only the text inside truncates at 20ch.
- Remove vertical grid lines from panorama X-axis (keep bottom labels).

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
The toSegment was using fromAntennaHeightM at the cursor point instead of
toAntennaHeightM. This caused the two LOS lines to not meet at the cursor
when antenna heights differ between sites.
Use terrain+2m at cursor point instead of site antenna heights. When hovering
in the middle of the path, the cursor represents a generic receiver at
terrain elevation with a default 2m antenna, not either site's antenna.
When at full path (cursor at endpoint), keep using actual site antenna heights.
)

- Replace Maximize2 with PanelBottomOpen for expand-to-full on bottom panel
- Use PanelLeftOpen/PanelRightOpen/PanelBottomOpen for show state icons
- Add panel-toggle-bounce keyframes with bounce effect for overlay buttons
- Add 350ms transitions for panel hide/show animation
- Desktop: toggle bounces when appearing/disappearing with 50ms delay
- Mobile: slide transitions for panel state changes
…mulations (#630)

* fix(deeplink): prevent false unavailable on cold slug load

* chore(build): refresh build metadata for deeplink fix commit
- Add terrain distance heatmap toggle with Paintbrush icon
- Uses centralized heatmap colors from new src/themes/heatmapColors.ts
- Far terrain maps to red, near terrain maps to blue
- Add heatmap legend to legend popover when active
- Change default FOV from 120° to 90°
- Extend FOV slider range to 360°→15°
- Centralize FOV constants in panoramaView.ts (FOV_SCALE_MIN/DEFAULT/MAX)

Closes #633
Adds official NP WMTS layers as a peer regional basemap provider alongside Kartverket. Implements three presets: topographic (NP_Basiskart), satellite (NP_Satellitt), and orthophoto (NP_Ortofoto), using EPSG:3857 (web mercator) services from geodata.npolar.no.

Changes:
- basemaps.ts: new "npolar" provider type, npolarStyle() with per-preset WMTS URLs and correct bounds
- appStore.ts: validate "npolar" in normalizeBasemapProvider
- MapView.tsx: max zoom 18 for NP (intentional), exclude from renderWorldCopies and auto-fallback
- basemaps.test.ts: smoke tests for all three NP presets resolving without fallback

No API key required; services are public CC-BY-4.0 licensed.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
… staging→main merge

Squash merge left both old (main) and new (staging) versions of these two
actions. Keeping staging version which includes coverageStore recompute trigger.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@wilhel1812 wilhel1812 closed this Apr 12, 2026
@wilhel1812 wilhel1812 deleted the release/promote-0.16.0 branch April 13, 2026 08:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants