mirror of
https://github.com/immich-app/immich.git
synced 2025-01-21 00:52:43 -05:00
docs: roadmap (#9902)
This commit is contained in:
parent
380ed966d8
commit
66fced40e7
4 changed files with 429 additions and 486 deletions
|
@ -100,9 +100,9 @@ const config = {
|
||||||
label: 'Docs',
|
label: 'Docs',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
to: '/milestones',
|
to: '/roadmap',
|
||||||
position: 'right',
|
position: 'right',
|
||||||
label: 'Milestones',
|
label: 'Roadmap',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
to: '/docs/api',
|
to: '/docs/api',
|
||||||
|
|
|
@ -1,28 +1,22 @@
|
||||||
import React from 'react';
|
|
||||||
import Icon from '@mdi/react';
|
|
||||||
import { mdiCheckboxMarkedCircleOutline } from '@mdi/js';
|
|
||||||
import useIsBrowser from '@docusaurus/useIsBrowser';
|
import useIsBrowser from '@docusaurus/useIsBrowser';
|
||||||
|
import { mdiCheckboxBlankCircle, mdiCheckboxMarkedCircle } from '@mdi/js';
|
||||||
|
import Icon from '@mdi/react';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
export interface Item {
|
export type Item = {
|
||||||
icon: string;
|
icon: string;
|
||||||
title: string;
|
title: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
release?: string;
|
link?: { url: string; text: string };
|
||||||
tag?: string;
|
done?: false;
|
||||||
date: Date;
|
getDateLabel: (language: string) => string;
|
||||||
dateType: DateType;
|
};
|
||||||
}
|
|
||||||
|
|
||||||
export enum DateType {
|
|
||||||
RELEASE = 'Release Date',
|
|
||||||
DATE = 'Date',
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
items: Item[];
|
items: Item[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function Timeline({ items }: Props): JSX.Element {
|
export function Timeline({ items }: Props): JSX.Element {
|
||||||
const isBrowser = useIsBrowser();
|
const isBrowser = useIsBrowser();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -30,21 +24,15 @@ export default function Timeline({ items }: Props): JSX.Element {
|
||||||
{items.map((item, index) => {
|
{items.map((item, index) => {
|
||||||
const isFirst = index === 0;
|
const isFirst = index === 0;
|
||||||
const isLast = index === items.length - 1;
|
const isLast = index === items.length - 1;
|
||||||
|
const done = item.done ?? true;
|
||||||
const classNames: string[] = [];
|
const dateLabel = item.getDateLabel(isBrowser ? navigator.language : 'en-US');
|
||||||
|
const timelineIcon = done ? mdiCheckboxMarkedCircle : mdiCheckboxBlankCircle;
|
||||||
if (isFirst) {
|
const cardIcon = item.icon;
|
||||||
classNames.push('');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isLast) {
|
|
||||||
classNames.push('rounded rounded-b-full');
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li key={index} className="flex min-h-24 w-[700px] max-w-[90vw]">
|
<li key={index} className={`flex min-h-24 w-[700px] max-w-[90vw] ${done ? '' : 'italic'}`}>
|
||||||
<div className="md:flex justify-start w-36 mr-8 items-center dark:text-immich-dark-primary text-immich-primary hidden">
|
<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) : ''}
|
{dateLabel}
|
||||||
</div>
|
</div>
|
||||||
<div className={`${isFirst && 'relative top-[50%]'} ${isLast && 'relative bottom-[50%]'}`}>
|
<div className={`${isFirst && 'relative top-[50%]'} ${isLast && 'relative bottom-[50%]'}`}>
|
||||||
<div
|
<div
|
||||||
|
@ -54,33 +42,26 @@ export default function Timeline({ items }: Props): JSX.Element {
|
||||||
></div>
|
></div>
|
||||||
</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 ">
|
<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} />
|
{<Icon path={timelineIcon} size={1.25} />}
|
||||||
</div>
|
</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 md:ml-4 my-2 hover:bg-immich-primary/10 dark:hover:bg-immich-dark-primary/10 transition-all">
|
<section className=" dark:bg-immich-dark-gray bg-immich-gray dark:border-0 border-gray-200 border border-solid rounded-2xl flex flex-row w-full gap-2 p-4 md: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">
|
<div className="flex-col flex-grow items-center justify-between gap-2">
|
||||||
<p className="m-0 items-start flex gap-2">
|
<p className="m-0 mb-2 text-lg items-start flex gap-2">
|
||||||
<Icon path={item.icon} size={1} />
|
<Icon path={cardIcon} size={1} />
|
||||||
<span>{item.title}</span>
|
<span>{item.title}</span>
|
||||||
</p>
|
</p>
|
||||||
|
<p className="m-0 text-sm text-gray-600 dark:text-gray-300">{item.description}</p>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col justify-between place-items-end">
|
||||||
<span className="dark:text-immich-dark-primary text-immich-primary">
|
<span className="dark:text-immich-dark-primary text-immich-primary">
|
||||||
{item.tag ? (
|
{item.link && (
|
||||||
<a
|
<a href={item.link.url} target="_blank" rel="noopener">
|
||||||
href={`https://github.com/immich-app/immich/releases/tag/${item.tag}`}
|
[{item.link.text}]
|
||||||
target="_blank"
|
|
||||||
rel="noopener"
|
|
||||||
>
|
|
||||||
[{item.release ?? item.tag}]{' '}
|
|
||||||
</a>
|
</a>
|
||||||
) : (
|
|
||||||
item.release && <span>[{item.release}]</span>
|
|
||||||
)}
|
)}
|
||||||
</span>
|
</span>
|
||||||
|
<div className="md:hidden text-sm text-right">{dateLabel}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="md:hidden text-xs">
|
|
||||||
{`${item.dateType} - ${isBrowser ? item.date.toLocaleDateString(navigator.language) : ''}`}
|
|
||||||
</div>
|
|
||||||
<p className="m-0 text-sm text-gray-600 dark:text-gray-300">{item.description}</p>
|
|
||||||
</section>
|
</section>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
|
|
File diff suppressed because it is too large
Load diff
1
docs/static/_redirects
vendored
1
docs/static/_redirects
vendored
|
@ -28,3 +28,4 @@
|
||||||
/docs/features/search /docs/features/smart-search 301
|
/docs/features/search /docs/features/smart-search 301
|
||||||
/docs/guides/api-album-sync /docs/community-projects 301
|
/docs/guides/api-album-sync /docs/community-projects 301
|
||||||
/docs/guides/remove-offline-files /docs/community-projects 301
|
/docs/guides/remove-offline-files /docs/community-projects 301
|
||||||
|
/milestones /roadmap 301
|
||||||
|
|
Loading…
Add table
Reference in a new issue