Release v0.16.0#638
Closed
wilhel1812 wants to merge 333 commits intomainfrom
Closed
Conversation
…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
* 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.
…#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.
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release v0.16.0
Promotes verified staging snapshot to production. Includes merge fix: removed duplicate
selectSiteById/clearActiveSelectionleft by staging→main squash merge (kept staging version with coverage recompute trigger).What's in this release
Added
Changed
Fixed
Preflight
npm testpasses (352/352)npm run buildpasses, label:0.16.0+077725d1