docs: milestones (#4593)

* docs: milestones

* fix: light mode

* feat: dates and links

* use item interface from timeline

* fix ssr build

* responseive design and styling

---------

Co-authored-by: martabal <74269598+martabal@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
This commit is contained in:
Jason Rasmussen 2023-10-22 22:34:23 -04:00 committed by GitHub
parent b05132a01a
commit 36b3521be8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 630 additions and 7 deletions

View file

@ -101,6 +101,11 @@ const config = {
position: 'right',
label: 'Docs',
},
{
to: '/milestones',
position: 'right',
label: 'Milestones',
},
{
to: '/docs/api',
position: 'right',

28
docs/package-lock.json generated
View file

@ -10,6 +10,8 @@
"dependencies": {
"@docusaurus/core": "^2.4.3",
"@docusaurus/preset-classic": "^2.4.3",
"@mdi/js": "^7.3.67",
"@mdi/react": "^1.6.1",
"@mdx-js/react": "^1.6.22",
"autoprefixer": "^10.4.13",
"classnames": "^2.3.2",
@ -2862,6 +2864,19 @@
"resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
"integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A=="
},
"node_modules/@mdi/js": {
"version": "7.3.67",
"resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.3.67.tgz",
"integrity": "sha512-MnRjknFqpTC6FifhGHjZ0+QYq2bAkZFQqIj8JA2AdPZbBxUvr8QSgB2yPAJ8/ob/XkR41xlg5majDR3c1JP1hw=="
},
"node_modules/@mdi/react": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@mdi/react/-/react-1.6.1.tgz",
"integrity": "sha512-4qZeDcluDFGFTWkHs86VOlHkm6gnKaMql13/gpIcUQ8kzxHgpj31NuCkD8abECVfbULJ3shc7Yt4HJ6Wu6SN4w==",
"dependencies": {
"prop-types": "^15.7.2"
}
},
"node_modules/@mdx-js/mdx": {
"version": "1.6.22",
"resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz",
@ -16932,6 +16947,19 @@
"resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
"integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A=="
},
"@mdi/js": {
"version": "7.3.67",
"resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.3.67.tgz",
"integrity": "sha512-MnRjknFqpTC6FifhGHjZ0+QYq2bAkZFQqIj8JA2AdPZbBxUvr8QSgB2yPAJ8/ob/XkR41xlg5majDR3c1JP1hw=="
},
"@mdi/react": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/@mdi/react/-/react-1.6.1.tgz",
"integrity": "sha512-4qZeDcluDFGFTWkHs86VOlHkm6gnKaMql13/gpIcUQ8kzxHgpj31NuCkD8abECVfbULJ3shc7Yt4HJ6Wu6SN4w==",
"requires": {
"prop-types": "^15.7.2"
}
},
"@mdx-js/mdx": {
"version": "1.6.22",
"resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz",

View file

@ -19,6 +19,8 @@
"dependencies": {
"@docusaurus/core": "^2.4.3",
"@docusaurus/preset-classic": "^2.4.3",
"@mdi/js": "^7.3.67",
"@mdi/react": "^1.6.1",
"@mdx-js/react": "^1.6.22",
"autoprefixer": "^10.4.13",
"classnames": "^2.3.2",

View file

@ -0,0 +1,86 @@
import React from 'react';
import Icon from '@mdi/react';
import { mdiCheckboxMarkedCircleOutline } from '@mdi/js';
import useIsBrowser from '@docusaurus/useIsBrowser';
export interface Item {
icon: string;
title: string;
description?: string;
release: string;
tag?: string;
date: Date;
}
interface Props {
items: Item[];
}
export default function Timeline({ items }: Props): JSX.Element {
const isBrowser = useIsBrowser();
return (
<ul className="flex flex-col pl-4">
{items.map((item, index) => {
const isFirst = index === 0;
const isLast = index === items.length - 1;
const classNames: string[] = [];
if (isFirst) {
classNames.push('');
}
if (isLast) {
classNames.push('rounded rounded-b-full');
}
return (
<li key={index} className="flex min-h-24 w-[700px] max-w-[90vw]">
<div className="md:flex justify-start w-36 mr-8 items-center dark:text-immich-dark-primary text-immich-primary hidden">
{isBrowser ? item.date.toLocaleDateString(navigator.language) : ''}
</div>
<div className={`${isFirst && 'relative top-[50%]'} ${isLast && 'relative bottom-[50%]'}`}>
<div
className={`h-full border-solid border-4 border-immich-primary dark:border-immich-dark-primary ${
isFirst && 'rounded rounded-t-full'
} ${isLast && 'rounded rounded-b-full'}`}
></div>
</div>
<div className="z-10 flex items-center bg-immich-primary dark:bg-immich-dark-primary border-2 border-solid rounded-full dark:text-black text-white relative top-[50%] left-[-3px] translate-y-[-50%] translate-x-[-50%] w-8 h-8 shadow-lg ">
<Icon path={mdiCheckboxMarkedCircleOutline} size={1.25} />
</div>
<section className=" dark:bg-immich-dark-gray bg-immich-gray dark:border-0 border-gray-200 border border-solid rounded-2xl flex flex-col w-full gap-2 p-4 ml-4 my-2 hover:bg-immich-primary/10 dark:hover:bg-immich-dark-primary/10 transition-all">
<div className="m-0 text-lg flex w-full items-center justify-between gap-2">
<p className="m-0 items-start flex gap-2">
<Icon path={item.icon} size={1} />
<span>{item.title}</span>
</p>
<span className="dark:text-immich-dark-primary text-immich-primary">
{item.tag ? (
<a
href={`https://github.com/immich-app/immich/releases/tag/${item.tag}`}
target="_blank"
rel="noopener"
>
[{item.release}]{' '}
</a>
) : (
<span>
[{item.release} {isBrowser ? item.date.toLocaleDateString(navigator.language) : ''}]
</span>
)}
</span>
</div>
<div className="md:hidden text-xs">
Release Date - {isBrowser ? item.date.toLocaleDateString(navigator.language) : ''}
</div>
<p className="m-0 text-sm text-gray-600 dark:text-gray-300">{item.description}</p>
</section>
</li>
);
})}
</ul>
);
}

View file

@ -1,7 +0,0 @@
---
title: Markdown page example
---
# Markdown page example
You don't need React to write simple standalone pages.

View file

@ -0,0 +1,509 @@
import {
mdiAccountGroup,
mdiAndroid,
mdiAppleIos,
mdiArchiveOutline,
mdiBookSearchOutline,
mdiCheckAll,
mdiCheckboxMarked,
mdiCollage,
mdiDevices,
mdiFaceMan,
mdiFaceManOutline,
mdiFile,
mdiFileSearch,
mdiFolder,
mdiHeart,
mdiImage,
mdiImageAlbum,
mdiImageMultipleOutline,
mdiImageSearch,
mdiKeyboardSettingsOutline,
mdiMagnify,
mdiMap,
mdiMaterialDesign,
mdiMerge,
mdiMonitor,
mdiMotionPlayOutline,
mdiPanVertical,
mdiPartyPopper,
mdiRaw,
mdiRotate360,
mdiSecurity,
mdiServer,
mdiShareAll,
mdiShareCircle,
mdiStar,
mdiTag,
mdiText,
mdiThemeLightDark,
mdiTrashCanOutline,
mdiVideo,
mdiWeb,
} from '@mdi/js';
import Layout from '@theme/Layout';
import React from 'react';
import Timeline, { Item } from '../components/timeline';
const items: Item[] = [
{
icon: mdiTrashCanOutline,
title: 'Trash Feature',
description: 'Trash, restore from trash, and automatically empty the recycle bin after 30 days.',
release: 'v1.82.0',
tag: 'v1.82.0',
date: new Date(2023, 9, 17),
},
{
icon: mdiBookSearchOutline,
title: 'External Libraries',
description: 'Automatically import media into Immich based on imports paths and ignore patterns.',
release: 'v1.79.0',
tag: 'v1.79.0',
date: new Date(2023, 8, 21),
},
{
icon: mdiMap,
title: 'Map View (Mobile)',
description: 'Heat map implementation in the mobile app.',
release: 'v1.76.0',
tag: 'v1.76.0',
date: new Date(2023, 7, 29),
},
{
icon: mdiFile,
title: 'Configuration File',
description: 'Auto-configure an Immich installation via a configuration file.',
release: 'v1.75.0',
tag: 'v1.75.0',
date: new Date(2023, 7, 26),
},
{
icon: mdiMonitor,
title: 'Slideshow Mode (Web)',
description: 'Start a full-screen slideshow from an Album on the web.',
release: 'v1.75.0',
tag: 'v1.75.0',
date: new Date(2023, 7, 26),
},
{
icon: mdiServer,
title: 'Hardware Transcoding',
description: 'Support hardware acceleration (QuickSync, VAAPI, and Nvidia) for video transcoding.',
release: 'v1.72.0',
tag: 'v1.72.0',
date: new Date(2023, 7, 6),
},
{
icon: mdiImageAlbum,
title: 'View Albums via Time Buckets',
description: 'Upgrade albums to use time buckets, an optimized virtual viewport.',
release: 'v1.72.0',
tag: 'v1.72.0',
date: new Date(2023, 7, 6),
},
{
icon: mdiImageAlbum,
title: 'Album Description',
description: 'Save an album description.',
release: 'v1.72.0',
tag: 'v1.72.0',
date: new Date(2023, 7, 6),
},
{
icon: mdiRotate360,
title: '360° Photos (Web)',
description: 'View 360° Photos on the web.',
release: 'v1.71.0',
tag: 'v1.71.0',
date: new Date(2023, 6, 29),
},
{
icon: mdiMotionPlayOutline,
title: 'Android Motion Photos',
description: 'Add support for Android Motion Photos.',
release: 'v1.69.0',
tag: 'v1.69.0',
date: new Date(2023, 6, 23),
},
{
icon: mdiFaceManOutline,
title: 'Show/Hide Faces',
description: 'Add the options to show or hide faces.',
release: 'v1.68.0',
tag: 'v1.68.0',
date: new Date(2023, 6, 20),
},
{
icon: mdiMerge,
title: 'Merge Faces',
description: 'Add the ability to merge multiple faces together.',
release: 'v1.67.0',
tag: 'v1.67.0',
date: new Date(2023, 6, 14),
},
{
icon: mdiImage,
title: 'Feature Photo',
description: 'Add the option to change the feature photo for a person.',
release: 'v1.66.0',
tag: 'v1.66.0',
date: new Date(2023, 6, 4),
},
{
icon: mdiKeyboardSettingsOutline,
title: 'Multi-Select via SHIFT',
description: 'Add the option to multi-select while holding SHIFT.',
release: 'v1.66.0',
tag: 'v1.66.0',
date: new Date(2023, 6, 4),
},
{
icon: mdiImageMultipleOutline,
title: 'Memories (Mobile)',
description: 'View "On this day..." memories in the mobile app.',
release: 'v1.65.0',
tag: 'v1.65.0',
date: new Date(2023, 5, 30),
},
{
icon: mdiFaceMan,
title: 'Facial Recognition (Mobile)',
description: 'View detected faces in the mobile app.',
release: 'v1.63.0',
tag: 'v1.63.0',
date: new Date(2023, 5, 24),
},
{
icon: mdiImageMultipleOutline,
title: 'Memories (Web)',
description: 'View pictures taken in past years on this day on the web.',
release: 'v1.61.0',
tag: 'v1.61.0',
date: new Date(2023, 5, 16),
},
{
icon: mdiCollage,
title: 'Justified Layout (Web)',
description: 'Implement justified layout (collage) on the web.',
release: 'v1.61.0',
tag: 'v1.61.0',
date: new Date(2023, 5, 16),
},
{
icon: mdiRaw,
title: 'RAW File Formats',
description: 'Support for RAW file formats.',
release: 'v1.61.0',
tag: 'v1.61.0',
date: new Date(2023, 5, 16),
},
{
icon: mdiShareAll,
title: 'Partner Sharing (Mobile)',
description: 'View shared partner photos in the mobile app.',
release: 'v1.58.0',
tag: 'v1.58.0',
date: new Date(2023, 4, 28),
},
{
icon: mdiFile,
title: 'XMP Sidecar',
description: 'Attach XMP Sidecar files to assets.',
release: 'v1.58.0',
tag: 'v1.58.0',
date: new Date(2023, 4, 28),
},
{
icon: mdiFolder,
title: 'Custom Storage Label',
description: 'Replace the user UUID in the storage template with a custom label.',
release: 'v1.57.0',
tag: 'v1.57.0',
date: new Date(2023, 4, 23),
},
{
icon: mdiShareCircle,
title: 'Partner Sharing',
description: 'Share your entire collection with another user.',
release: 'v1.56.0',
tag: 'v1.56.0',
date: new Date(2023, 4, 18),
},
{
icon: mdiFaceMan,
title: 'Facial Recognition',
description: 'Detect faces in pictures and cluster them together as people, which can be named.',
release: 'v1.56.0',
tag: 'v1.56.0',
date: new Date(2023, 4, 18),
},
{
icon: mdiMap,
title: 'Map View (Web)',
description: 'View a global map, with clusters of photos based on corresponding GPS data.',
release: 'v1.55.0',
tag: 'v1.55.0',
date: new Date(2023, 4, 9),
},
{
icon: mdiDevices,
title: 'Manage Auth Devices',
description: 'Manage logged-in devices and revoke access from User Settings.',
release: 'v1.55.0',
tag: 'v1.55.0',
date: new Date(2023, 4, 9),
},
{
icon: mdiStar,
description: 'Reach 10K Starts on GitHub!',
title: '10,000 Stars',
release: 'v1.54.0',
tag: 'v1.54.0',
date: new Date(2023, 3, 18),
},
{
icon: mdiText,
title: 'Asset Descriptions',
description: 'Save an asset description',
release: 'v1.54.0',
tag: 'v1.54.0',
date: new Date(2023, 3, 18),
},
{
icon: mdiArchiveOutline,
title: 'Archiving',
description: 'Remove assets from the main timeline by archiving them.',
release: 'v1.54.0',
tag: 'v1.54.0',
date: new Date(2023, 3, 18),
},
{
icon: mdiDevices,
title: 'Responsive Web App',
description: 'Optimize the web app for small screen.',
release: 'v1.54.0',
tag: 'v1.54.0',
date: new Date(2023, 3, 18),
},
{
icon: mdiFileSearch,
title: 'Search By Metadata',
description: 'Search images by filename, description, tagged people, make, model, and other metadata.',
release: 'v1.52.0',
tag: 'v1.52.0',
date: new Date(2023, 2, 29),
},
{
icon: mdiImageSearch,
title: 'CLIP Search',
description: 'Search images with free-form text like "Sunset at the beach".',
release: 'v1.51.0',
tag: 'v1.51.0',
date: new Date(2023, 2, 20),
},
{
icon: mdiMagnify,
title: 'Explore Page',
description: 'View tagged places, object, and people.',
release: 'v1.51.0',
tag: 'v1.51.0',
date: new Date(2023, 2, 20),
},
{
icon: mdiAppleIos,
title: 'iOS Background Uploads',
description: 'Automatically backup pictures in the background on iOS.',
release: 'v1.48.0',
tag: 'v1.48.0',
date: new Date(2023, 1, 21),
},
{
icon: mdiMotionPlayOutline,
title: 'Auto-Link Live Photos',
description: 'Automatically link live photos, even when uploaded as separate files.',
release: 'v1.48.0',
tag: 'v1.48.0',
date: new Date(2023, 2, 21),
},
{
icon: mdiMaterialDesign,
title: 'Material Design 3 (Mobile)',
description: 'Upgrade the mobile app to Material Design 3.',
release: 'v1.47.0',
tag: 'v1.47.0',
date: new Date(2023, 1, 13),
},
{
icon: mdiHeart,
title: 'Favorites (Mobile)',
description: 'Show favorites on the mobile app.',
release: 'v1.46.0',
tag: 'v1.46.0',
date: new Date(2023, 1, 9),
},
{
icon: mdiPartyPopper,
title: 'Immich Turns 1',
description: 'Immich is officially one year old.',
release: 'v1.43.0',
tag: 'v1.43.0',
date: new Date(2023, 0, 27),
},
{
icon: mdiHeart,
title: 'Favorites Page (Web)',
description: 'Favorite and view favorites on the web.',
release: 'v1.43.0',
tag: 'v1.43.0',
date: new Date(2023, 0, 27),
},
{
icon: mdiShareCircle,
title: 'Public Share Links',
description: 'Share photos and albums publicly via a shared link.',
release: 'v1.41.0',
tag: 'v1.41.1_64-dev',
date: new Date(2023, 0, 10),
},
{
icon: mdiFolder,
title: 'User-Defined Storage Structure',
description: 'Support custom storage structures.',
release: 'v1.39.0',
tag: 'v1.39.0_61-dev',
date: new Date(2022, 11, 19),
},
{
icon: mdiMotionPlayOutline,
title: 'iOS Live Photos',
description: 'Backup and display iOS Live Photos.',
release: 'v1.36.0',
tag: 'v1.36.0_55-dev',
date: new Date(2022, 10, 20),
},
{
icon: mdiSecurity,
title: 'OAuth Integration',
description: 'Support OAuth2 and OIDC capable identity providers.',
release: 'v1.36.0',
tag: 'v1.36.0_55-dev',
date: new Date(2022, 10, 20),
},
{
icon: mdiWeb,
title: 'Documentation Site',
description: 'Release an official documentation website.',
release: 'v1.33.1',
tag: 'v1.33.0_52-dev',
date: new Date(2022, 9, 26),
},
{
icon: mdiThemeLightDark,
title: 'Dark Mode (Web)',
description: 'Dark mode on the web.',
release: 'v1.32.0',
tag: ' v1.32.0_50-dev',
date: new Date(2022, 9, 14),
},
{
icon: mdiPanVertical,
title: 'Virtual Scrollbar (Web)',
description: 'View the main timeline with a virtual scrollbar, allowing to jump to any point in time, instantly.',
release: 'v1.27.0',
tag: 'v1.27.0_37-dev',
date: new Date(2022, 8, 6),
},
{
icon: mdiCheckAll,
title: 'Checksum Duplication Check',
description: 'Enforce per user sha1 checksum uniqueness.',
release: 'v1.27.0',
tag: 'v1.27.0_37-dev',
date: new Date(2022, 8, 6),
},
{
icon: mdiAndroid,
title: 'Android Background Backup',
description: 'Automatic backup in the background on Android.',
release: 'v1.24.0',
tag: 'v1.24.0_34-dev',
date: new Date(2022, 7, 19),
},
{
icon: mdiAccountGroup,
title: 'Admin Portal',
description: 'Manage users and admin settings from the web.',
release: 'v1.10.0',
tag: 'v1.10.0_15-dev',
date: new Date(2022, 4, 29),
},
{
icon: mdiShareCircle,
title: 'Album Sharing',
description: 'Share albums with other users.',
release: 'v1.7.0',
tag: 'v1.7.0_11-dev ',
date: new Date(2022, 3, 24),
},
{
icon: mdiTag,
title: 'Image Tagging',
description: 'Tag images with custom values.',
release: 'v1.7.0',
tag: 'v1.7.0_11-dev ',
date: new Date(2022, 3, 24),
},
{
icon: mdiImage,
title: 'View Exif',
description: 'View metadata about assets.',
release: 'v1.3.0',
tag: 'V1.3.0-dev ',
date: new Date(2022, 2, 22),
},
{
icon: mdiCheckboxMarked,
title: 'Multi Select',
description: 'Select and execute actions on multiple assets at the same time.',
release: 'v1.2.0',
tag: 'V0.2-dev ',
date: new Date(2022, 1, 8),
},
{
icon: mdiVideo,
title: 'Video Player',
description: 'Play videos in the web and on mobile.',
release: 'v1.2.0',
tag: 'v0.2-dev ',
date: new Date(2022, 1, 8),
},
{
icon: mdiPartyPopper,
title: 'First Commit',
description: 'First commit on GitHub, Immich is born.',
release: 'v1.0.0',
date: new Date(2022, 2, 3),
},
];
export default function MilestonePage(): JSX.Element {
return (
<Layout title="Milestones" description="History of Immich">
<section className="my-8">
<h1 className="md:text-6xl text-center mb-10 text-immich-primary dark:text-immich-dark-primary">
Major Milestones
</h1>
<p className="text-center text-xl">
A list of project achievements and milestones, <br />
by release date.
</p>
<div className="flex row justify-around mt-8">
<div className="flex max-w-full ">
<Timeline items={items} />
</div>
</div>
</section>
</Layout>
);
}