From dd9f7a82dce26f0a2dac09bb2244d4e1f99435af Mon Sep 17 00:00:00 2001 From: Davide Scaini Date: Wed, 13 May 2026 00:36:44 +0200 Subject: [PATCH] Segments phase 2: /segments/ browse page, /segments/new/ creation flow, activity detail shortcut --- site/src/components/ActivityDetail.svelte | 10 + site/src/components/SegmentCreate.svelte | 392 ++++++++++++++++++++++ site/src/components/SegmentsView.svelte | 210 ++++++++++++ site/src/layouts/Base.astro | 4 + site/src/pages/segments/index.astro | 9 + site/src/pages/segments/new/index.astro | 7 + 6 files changed, 632 insertions(+) create mode 100644 site/src/components/SegmentCreate.svelte create mode 100644 site/src/components/SegmentsView.svelte create mode 100644 site/src/pages/segments/index.astro create mode 100644 site/src/pages/segments/new/index.astro diff --git a/site/src/components/ActivityDetail.svelte b/site/src/components/ActivityDetail.svelte index c8ac1fc..969f4f8 100644 --- a/site/src/components/ActivityDetail.svelte +++ b/site/src/components/ActivityDetail.svelte @@ -329,6 +329,16 @@ + +{#if trackUrl} +
+ + Create segment from this activity +
+{/if} + {#if error}

{error}

diff --git a/site/src/components/SegmentCreate.svelte b/site/src/components/SegmentCreate.svelte new file mode 100644 index 0000000..240d616 --- /dev/null +++ b/site/src/components/SegmentCreate.svelte @@ -0,0 +1,392 @@ + + +
+
+ ← Segments +

New Segment

+
+ + + {#if !selectedActivity} +

Pick an activity to crop the segment from.

+ + + {#if loadingActivities} +

Loading activities…

+ {:else if filteredActivities.length === 0} +

No GPS activities found{searchQuery ? ' matching your search' : ''}.

+ {:else} +
+ {#each filteredActivities.slice(0, 100) as a (a.id)} + + {/each} +
+ + {#if filteredActivities.length > 100} +

Showing first 100 results — refine your search to narrow down.

+ {/if} + + {#if pendingShards.length > 0} + + {/if} + {/if} + + + {:else} + +
+ {sportIcon(selectedActivity.sport as any)} +
+

{selectedActivity.title ?? 'Untitled'}

+

{formatDate(selectedActivity.started_at)}

+
+ +
+ + {#if loadingTrack} +
Loading track…
+ {:else if trackError} +
{trackError}
+ {:else} + +
+
+
+ + +
+

Drag the handles to set the segment start and end

+
+
+
+ + +
+

+ Selected: {formatDistance(selectedDistance)} + ({selectedPolyline.length} points) +

+
+ + +
+ + +
+ + {#if saveError} +

{saveError}

+ {/if} + + + {/if} + {/if} +
+ + diff --git a/site/src/components/SegmentsView.svelte b/site/src/components/SegmentsView.svelte new file mode 100644 index 0000000..d0a2173 --- /dev/null +++ b/site/src/components/SegmentsView.svelte @@ -0,0 +1,210 @@ + + +
+ +
+

Segments

+ + + New segment + +
+ + +
+
+ {#if loading} +
Loading…
+ {/if} +
+ + +
+ {#if segments.length === 0 && !loading} +

+ No segments in this area.
+ Create the first one → +

+ {:else} +
+ {#each segments as seg (seg.id)} +
selectedId = selectedId === seg.id ? null : seg.id} + role="button" + tabindex="0" + on:keydown={e => e.key === 'Enter' && (selectedId = selectedId === seg.id ? null : seg.id)} + > +
+
+
+ {#if seg.sport}{sportIcon(seg.sport as any)}{/if} + {seg.name} +
+

+ {formatDistance(seg.distance_m)} · by {seg.created_by} · {formatDate(seg.created_at)} +

+
+ +
+ + {#if selectedId === seg.id} + + {/if} +
+ {/each} +
+ {/if} +
+
diff --git a/site/src/layouts/Base.astro b/site/src/layouts/Base.astro index d4575c4..b1d5297 100644 --- a/site/src/layouts/Base.astro +++ b/site/src/layouts/Base.astro @@ -220,6 +220,7 @@ try { {mobileApp && ( Convert )} + Segments About {wikiUrl && (
Segments Settings diff --git a/site/src/pages/segments/index.astro b/site/src/pages/segments/index.astro new file mode 100644 index 0000000..0b1fa10 --- /dev/null +++ b/site/src/pages/segments/index.astro @@ -0,0 +1,9 @@ +--- +import Base from '../../layouts/Base.astro'; +import SegmentsView from '../../components/SegmentsView.svelte'; +--- + +
+ +
+ diff --git a/site/src/pages/segments/new/index.astro b/site/src/pages/segments/new/index.astro new file mode 100644 index 0000000..15de21d --- /dev/null +++ b/site/src/pages/segments/new/index.astro @@ -0,0 +1,7 @@ +--- +import Base from '../../../layouts/Base.astro'; +import SegmentCreate from '../../../components/SegmentCreate.svelte'; +--- + + +