mirror of
				https://github.com/KevinMidboe/immich.git
				synced 2025-10-29 17:40:28 +00:00 
			
		
		
		
	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:
		| @@ -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
									
									
									
								
							
							
						
						
									
										28
									
								
								docs/package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -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", | ||||
|   | ||||
| @@ -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", | ||||
|   | ||||
							
								
								
									
										86
									
								
								docs/src/components/timeline.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								docs/src/components/timeline.tsx
									
									
									
									
									
										Normal 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> | ||||
|   ); | ||||
| } | ||||
| @@ -1,7 +0,0 @@ | ||||
| --- | ||||
| title: Markdown page example | ||||
| --- | ||||
|  | ||||
| # Markdown page example | ||||
|  | ||||
| You don't need React to write simple standalone pages. | ||||
							
								
								
									
										509
									
								
								docs/src/pages/milestones.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										509
									
								
								docs/src/pages/milestones.tsx
									
									
									
									
									
										Normal 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> | ||||
|   ); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user