Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/projects/code-xr/in-room-guide.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/projects/code-xr/project-evolution.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/projects/code-xr/vr-city-at-the-table.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/projects/code-xr/xr-room-v1-2-0.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/projects/code-xr/xr-scene-v1-2-0.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 4 additions & 8 deletions scripts/check-journey-timeline.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,7 @@ function getEntryStartDate(entry) {
};
}

function getHighlightDate(highlight, today) {
if (highlight.id === 'v120Current') {
return today;
}

function getHighlightDate(highlight) {
return {
year: highlight.year,
month: highlight.month ?? 1,
Expand All @@ -62,15 +58,15 @@ function hasScheduledContentInYear(entries, year, today) {
return true;
}

return entry.highlights?.some((highlight) => getHighlightDate(highlight, today).year === year) ?? false;
return entry.highlights?.some((highlight) => getHighlightDate(highlight).year === year) ?? false;
});
}

function getLatestScheduledYear(entries, today, minimumEndYear) {
const years = entries.flatMap((entry) => [
entry.startYear,
entry.endYear ?? today.year,
...(entry.highlights?.map((highlight) => getHighlightDate(highlight, today).year) ?? []),
...(entry.highlights?.map((highlight) => getHighlightDate(highlight).year) ?? []),
]);

return Math.max(minimumEndYear, today.year, ...years);
Expand Down Expand Up @@ -117,7 +113,7 @@ const baseEntries = [
startMonth: 1,
startDay: 14,
endYear: null,
highlights: [{ id: 'v120Current', year: 2026, month: 6, day: 23 }],
highlights: [{ id: 'v120Release', year: 2026, month: 7, day: 30 }],
},
{
id: 'masterTelecomUPM',
Expand Down
6 changes: 3 additions & 3 deletions src/content/journey.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ export const JOURNEY_ENTRIES: JourneyEntry[] = [
{ id: 'v008Poster', labelKey: 'journey.entries.codexr.highlights.v008Poster', year: 2025, month: 9, day: 7 },
{ id: 'v100Defense', labelKey: 'journey.entries.codexr.highlights.v100Defense', year: 2025, month: 10, day: 20 },
{ id: 'v110Release', labelKey: 'journey.entries.codexr.highlights.v110Release', year: 2026, month: 3, day: 22 },
{ id: 'v120Current', labelKey: 'journey.entries.codexr.highlights.v120Current', year: 2026, month: 6, day: 23 },
{ id: 'v120Release', labelKey: 'journey.entries.codexr.highlights.v120Release', year: 2026, month: 7, day: 30 },
],
tags: ['VS Code API', 'A-Frame', 'XR', 'TypeScript'],
link: 'https://github.com/aMonteSl/CodeXR',
Expand Down Expand Up @@ -183,8 +183,8 @@ export const TIMELINE_START = 2020
export const TIMELINE_END = 2026
export const CURRENT_DATE = {
year: 2026,
month: 6,
day: 23,
month: 8,
day: 29,
} as const

/** Convert a date to a decimal year (for precise positioning) */
Expand Down
6 changes: 3 additions & 3 deletions src/content/marketplaceStats.generated.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@

export const marketplaceStats = {
"codeXr": {
"downloadCount": 623,
"displayDownloads": "600+",
"updatedAt": "2026-06-24T18:47:12.583Z",
"downloadCount": 727,
"displayDownloads": "700+",
"updatedAt": "2026-08-29T12:44:09.545Z",
"sourceUrl": "https://marketplace.visualstudio.com/items?itemName=aMonteSl.code-xr"
}
} as const
Expand Down
6 changes: 3 additions & 3 deletions src/content/marketplaceStats.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"codeXr": {
"downloadCount": 623,
"displayDownloads": "600+",
"updatedAt": "2026-06-24T18:47:12.583Z",
"downloadCount": 727,
"displayDownloads": "700+",
"updatedAt": "2026-08-29T12:44:09.545Z",
"sourceUrl": "https://marketplace.visualstudio.com/items?itemName=aMonteSl.code-xr"
}
}
12 changes: 11 additions & 1 deletion src/content/projectImages.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,22 @@
{
"code-xr": {
"images": [
"xr-room-v1-2-0.webp",
"xr-scene-v1-2-0.webp",
"dependency-graph-force-3d.webp",
"dependency-graph-metric-space.webp",
"historical-comparison.webp",
"project-evolution.webp",
"in-room-guide.webp",
"livepanel-dependency-summary.webp",
"cross-network-pairing.webp",
"vr-city-at-the-table.webp",
"scene-v1-1-0.webp",
"collaborative-workspace.webp",
"pedestal-mapping-ui.webp",
"virtual-screen-controller.webp"
],
"heroImage": "scene-v1-1-0.webp"
"heroImage": "xr-room-v1-2-0.webp"
},
"honor-course-1": {
"images": [
Expand Down
174 changes: 154 additions & 20 deletions src/content/projects.json

Large diffs are not rendered by default.

18 changes: 9 additions & 9 deletions src/features/journey/ParallelStreamsSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -208,10 +208,10 @@ export function ParallelStreamsSection() {
return {
id: highlight.id,
label: t(`entries.${activeEntry.id}.highlights.${highlight.id}`),
date: formatHighlightDate(getHighlightDate(highlight, today)),
date: formatHighlightDate(getHighlightDate(highlight)),
lane: activeEntry.lane,
}
}, [activeEntry, activeHighlightRef, formatHighlightDate, t, today])
}, [activeEntry, activeHighlightRef, formatHighlightDate, t])

const handleEntryHoverStart = useCallback((entryId: string) => {
setHoveredHighlight(null)
Expand Down Expand Up @@ -283,8 +283,8 @@ export function ParallelStreamsSection() {

/** Get highlight percentage (year view) */
const getHighlightPercent = useCallback((h: JourneyHighlight) => {
return dateToTimelinePercent(getHighlightDate(h, today), timelineEndYear)
}, [timelineEndYear, today])
return dateToTimelinePercent(getHighlightDate(h), timelineEndYear)
}, [timelineEndYear])

/** Check if entry is visible in drill-down year */
const isEntryInYear = useCallback((entry: JourneyEntry, year: number): boolean => {
Expand Down Expand Up @@ -348,9 +348,9 @@ export function ParallelStreamsSection() {
const width = Math.max(endPercent - startPercent, 0.1)

return entry.highlights
.filter((highlight) => drillYear === undefined || getHighlightDate(highlight, today).year === drillYear)
.filter((highlight) => drillYear === undefined || getHighlightDate(highlight).year === drillYear)
.map((highlight) => {
const highlightDate = getHighlightDate(highlight, today)
const highlightDate = getHighlightDate(highlight)
const absolutePercent = drillYear === undefined
? getHighlightPercent(highlight)
: monthToPercent(highlightDate.month, highlightDate.day)
Expand Down Expand Up @@ -385,7 +385,7 @@ export function ParallelStreamsSection() {
/>
)
})
}, [animate, getHighlightPercent, handleHighlightClick, handleHighlightHoverEnd, handleHighlightHoverStart, isHighlightActive, monthToPercent, t, today])
}, [animate, getHighlightPercent, handleHighlightClick, handleHighlightHoverEnd, handleHighlightHoverStart, isHighlightActive, monthToPercent, t])

/** Handle year click for drill-down */
const handleYearClick = useCallback((year: number) => {
Expand Down Expand Up @@ -450,7 +450,7 @@ export function ParallelStreamsSection() {
id: h.id,
label: t(`entries.${activeEntry.id}.highlights.${h.id}`),
year: h.year,
date: formatHighlightDate(getHighlightDate(h, today)),
date: formatHighlightDate(getHighlightDate(h)),
}))}
activeHighlight={activeHighlight}
activeHighlightLabel={t('selectedMilestone')}
Expand Down Expand Up @@ -657,7 +657,7 @@ export function ParallelStreamsSection() {
<span className={cn('absolute bottom-0 left-1/2 h-3 w-3 -translate-x-1/2 translate-y-1/2 rounded-full ring-2 ring-[var(--bg)]', colors.bg)} />

{entry.highlights?.map((highlight) => {
const highlightTop = getVerticalTop(getHighlightDate(highlight, today))
const highlightTop = getVerticalTop(getHighlightDate(highlight))
const localTop = clampPercent(((highlightTop - top) / height) * 100)
const isSelected = isHighlightActive(entry.id, highlight.id)

Expand Down
10 changes: 3 additions & 7 deletions src/features/journey/timelineMath.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,7 @@ export function getEntryEndDate(entry: JourneyEntry, today: JourneyDate): Journe
}
}

export function getHighlightDate(highlight: JourneyHighlight, today: JourneyDate): JourneyDate {
if (highlight.id === 'v120Current') {
return today
}

export function getHighlightDate(highlight: JourneyHighlight): JourneyDate {
return {
year: highlight.year,
month: highlight.month ?? 1,
Expand Down Expand Up @@ -120,7 +116,7 @@ export function hasScheduledContentInYear(
return true
}

return entry.highlights?.some((highlight) => getHighlightDate(highlight, today).year === year) ?? false
return entry.highlights?.some((highlight) => getHighlightDate(highlight).year === year) ?? false
})
}

Expand All @@ -132,7 +128,7 @@ export function getLatestScheduledYear(
const explicitYears = entries.flatMap((entry) => [
entry.startYear,
entry.endYear ?? today.year,
...(entry.highlights?.map((highlight) => getHighlightDate(highlight, today).year) ?? []),
...(entry.highlights?.map((highlight) => getHighlightDate(highlight).year) ?? []),
])

return Math.max(minimumEndYear, today.year, ...explicitYears)
Expand Down
12 changes: 12 additions & 0 deletions src/features/projects/ProjectPageClient.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import { ProjectDetailLayout } from './components/ProjectDetailLayout'
import { ProjectDetailSummary } from './components/ProjectDetailSummary'
import { ProjectDetailFooter } from './components/ProjectDetailFooter'
import { ProjectMilestones } from './components/ProjectMilestones'
import { ProjectReleaseHighlights } from './components/ProjectReleaseHighlights'
import { ProjectTechRail } from './components/ProjectTechRail'
import type { Project } from './types'
import { getLocalizedProjectTitle, getProjectImagePaths } from './types'
Expand Down Expand Up @@ -132,6 +133,17 @@ export function ProjectPageClient({ project }: ProjectPageClientProps) {
doi={doi}
/>
}
release={
content.release ? (
<ProjectReleaseHighlights
release={content.release}
watchLabel={t('release.watch')}
tutorialLabel={t('release.tutorial')}
closeLabel={t('release.close')}
youtubeLabel={t('release.youtube')}
/>
) : undefined
}
summary={
<ProjectDetailSummary
title={t('detail.summaryTitle')}
Expand Down
4 changes: 3 additions & 1 deletion src/features/projects/components/ProjectDetailLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,20 @@ import type { ReactNode } from 'react'
interface ProjectDetailLayoutProps {
nav: ReactNode
hero: ReactNode
release?: ReactNode
summary: ReactNode
milestones?: ReactNode
tech: ReactNode
footer: ReactNode
}

export function ProjectDetailLayout({ nav, hero, summary, milestones, tech, footer }: ProjectDetailLayoutProps) {
export function ProjectDetailLayout({ nav, hero, release, summary, milestones, tech, footer }: ProjectDetailLayoutProps) {
return (
<div className="relative min-h-dvh">
{nav}
<main className="mx-auto flex w-full max-w-7xl flex-col gap-5 px-4 py-5 sm:px-6 lg:gap-5 lg:px-6 lg:py-6 xl:px-8">
{hero}
{release}
<div className="grid items-start gap-5 lg:grid-cols-[minmax(0,0.95fr)_minmax(20rem,0.4fr)] xl:grid-cols-[minmax(0,1fr)_minmax(21rem,0.38fr)]">
<div className="min-w-0">{summary}</div>
<div className="flex min-w-0 flex-col gap-5">
Expand Down
Loading
Loading