diff --git a/builder/app/src/components/planner/LayerDateBar.svelte b/builder/app/src/components/planner/LayerDateBar.svelte
index 87441b49a..766f0c44a 100644
--- a/builder/app/src/components/planner/LayerDateBar.svelte
+++ b/builder/app/src/components/planner/LayerDateBar.svelte
@@ -3,7 +3,7 @@
import SeasonGrid from './SeasonGrid.svelte';
import DateCalendar from './DateCalendar.svelte';
import Segmented from './Segmented.svelte';
- import { addMonths, columnDate, dateLabel, type DataLayer, type Grid } from '../../lib/planner/layers/data-layer';
+ import { addDays, addMonths, columnDate, dateLabel, type DataLayer, type Grid } from '../../lib/planner/layers/data-layer';
let { date, year, variable, onDate }: { date: string; year: Grid; variable: DataLayer['variable']; onDate: (date: string) => void } = $props();
@@ -18,8 +18,7 @@
onDate(next);
}
function shift(days: number) {
- const [y, m, d] = date.split('-').map(Number);
- step(new Date(Date.UTC(y, m - 1, d + days)).toISOString().slice(0, 10));
+ step(addDays(date, days));
}
function key(event: KeyboardEvent) {
const year = date.slice(0, 4);
diff --git a/builder/app/src/components/planner/LayerInspect.svelte b/builder/app/src/components/planner/LayerInspect.svelte
index 512514471..2071fef25 100644
--- a/builder/app/src/components/planner/LayerInspect.svelte
+++ b/builder/app/src/components/planner/LayerInspect.svelte
@@ -27,7 +27,7 @@
{#if chart}
{#each chart.grids as grid, g (g)}
{#if grid.label}
{grid.label}
{/if}
-
+ 1 ? 3 : 4) : 8} label={`${grid.label || chart.headline}. One row per year, newest at the bottom.`} />
{#if !compact && (grid.legend || g === chart.grids.length - 1)}
{#if g === chart.grids.length - 1}Your date{/if}
diff --git a/builder/app/src/components/planner/LayerStrip.svelte b/builder/app/src/components/planner/LayerStrip.svelte
index 152ba6950..90ff28c43 100644
--- a/builder/app/src/components/planner/LayerStrip.svelte
+++ b/builder/app/src/components/planner/LayerStrip.svelte
@@ -52,7 +52,7 @@
- {layer.label}{layer.error || (samples ? `${dateLabel(date)} · hover for past years` : 'Loading…')}
+ {strip.label ?? layer.label}{layer.error || (samples ? `${dateLabel(date)} · hover for past years` : 'Loading…')}
{
+ if (!multi || !dataLayer?.nights || !routeSamples || !visualRoute) return [];
+ const points = profileSamples(visualRoute);
+ const ends = days.slice(0, -1);
+ const stops = ends.map(day => ({ index: Math.min(points.length - 1, sampleIndex(points, day.to)), date: addDays(shownDate, (dayLabels[day.number] ?? day.number) - 1) }));
+ return dataLayer.nights(routeSamples, stops).flatMap((text, i) => text ? [{ coordinate: coordinateAt(coordinates, ends[i].to), text }] : []);
+ });
// A map click with a layer shown adds the years at that spot to the callout.
let pinSamples = $state.raw<{ layer: DataLayer; at: Coordinate; samples: unknown } | null>(null);
$effect(() => {
@@ -965,7 +973,7 @@
gap.coordinates)} {coordinates} points={mapPoints} {selectedId} {hoveredId} onPointHover={(id) => hoveredId = id} callout={calloutCoordinate} {drawing}
- {theme} {hillshade} {contours} {mapOverlays} dataLayer={{ layers: dataLayers, shown: dataLayer, date: shownDate }} bottomInset={dataLayer ? dateBarHeight + 34 : 0} accessMode={trip.bike === 'hiking' ? 'walking' : 'cycling'} {showRoute} {hoverProgress} highlightedCoordinates={highlighted} pickMode={picking} routingPackage={currentRoute?.package}
+ {theme} {hillshade} {contours} {mapOverlays} dataLayer={{ layers: dataLayers, shown: dataLayer, date: shownDate, notes: layerNotes }} bottomInset={dataLayer ? dateBarHeight + 34 : 0} accessMode={trip.bike === 'hiking' ? 'walking' : 'cycling'} {showRoute} {hoverProgress} highlightedCoordinates={highlighted} pickMode={picking} routingPackage={currentRoute?.package}
highlightedPlaceIds={searching ? results.map(result => result.place.id) : []}
shownCategories={categoryIds.filter(category => !hiddenCategories.includes(category))} {highlightedPlaces} {landmarks}
onBounds={(bounds, preserveSearch) => { viewBounds = bounds; if (!preserveSearch) searchViewRevision++; }} onEmptyClick={emptyClick} onPointSelect={selectPoint} onPointMove={movePoint} onPointPreview={previewPoint} onDayEndDrag={moveDayEnd}
diff --git a/builder/app/src/components/planner/PlannerIcon.svelte b/builder/app/src/components/planner/PlannerIcon.svelte
index 24864ee0c..8f3f3f2e6 100644
--- a/builder/app/src/components/planner/PlannerIcon.svelte
+++ b/builder/app/src/components/planner/PlannerIcon.svelte
@@ -42,6 +42,7 @@
trash: 'M4 7h16M9 7V4h6v3M6 7l1 13h10l1-13M10 11v6m4-6v6',
mountain: 'm2 20 7-13 4 7 3-5 6 11H2Zm4-7 3 1 2-3',
snow: 'M12 2v20M3.3 7l17.4 10M3.3 17 20.7 7M9.5 3.5 12 6l2.5-2.5M9.5 20.5 12 18l2.5 2.5M18.1 5.6 17.2 9l3.4.9M20.6 14.1 17.2 15l.9 3.4M3.4 14.1 6.8 15l-.9 3.4M5.9 5.6 6.8 9l-3.4.9',
+ weather: 'M7 19h10a4 4 0 0 0 .7-7.9A5.5 5.5 0 0 0 7.2 10 4.5 4.5 0 0 0 7 19Z',
};