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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,6 @@ yarn-error.log*
.env
# vercel
.vercel

# lock files
package-lock.json
66 changes: 62 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,64 @@
# Plane Docs
<h1 style="text-align:center; font-size: 3.5em;">Plane</h1>

This repository contains the documentation for [Plane](https://github.com/makeplane/plane),
the Open Source alternative for JIRA, Linear and Height.
<figure>
<img src="https://raw.githubusercontent.com/makeplane/docs/master/public/logos/logo.svg" alt="The Plane Logo" style=" display:block; margin-left: auto; margin-right: auto; width: 25%;">
<figcaption style="text-align:center; font-size:3em;">Project management tool from the future.</figcaption>
</figure>

The documentation is hosted at [docs.plane.so](https://docs.plane.so)
----
This repository hosts all the documentation for Plane, and it is available at [docs.plane.so](https://docs.plane.so). If you are looking for the Plane code, please see the [Plane repo](https://github.com/makeplane/plane).

----

## Table of Contents

1. [About Plane](#about-plane)
2. [Installation](#installation)
3. [Usage](#usage)
4. [Contributing](#contributing)
5. [Community and Support](#community-and-support)

## About Plane

Plane is a user-friendly, extensible, and open-source project and product management tool. It serves as a versatile platform, allowing users to start their project management process with a simple task-tracking tool and smoothly progress towards implementing diverse project management methodologies, including Agile, Waterfall, and numerous others, to suit their growing needs.

## Installation

Setting up Plane's documentation on your local machine is straightforward. Follow these installation steps:


1. Install the Markdoc library with:

```bash
npm install @markdoc/markdoc
```

2. Install dependencies with:

```bash
npm install
```

3. Start the local development with:

```bash
npm run dev
```

This command launches a local development server, and you can access the documentation at http://localhost:3000.

## Usage

Refer to our comprehensive documentation at [docs.plane.so](https://docs.plane.so) for detailed instructions on using Plane, including setup, configuration, and practical examples.

## Contributing

We welcome contributions from the community to improve Plane. Here's how you can get involved:

* Review our [Contribution Guidelines](https://github.com/makeplane/plane/blob/master/CONTRIBUTING.md) for detailed instructions on contributing code, reporting issues, and more.

* Please follow our [Code of Conduct](https://github.com/makeplane/plane/blob/master/CODE_OF_CONDUCT.md) to ensure a respectful and inclusive community.

## Community and Support

For any issues or support, please contact the plane team via [Discord](https://discord.com/invite/A92xrEGCge).
27 changes: 27 additions & 0 deletions markdoc/tags.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { Callout } from '@/components/Callout'
import { QuickLink, QuickLinks } from '@/components/QuickLinks'
import { Col2 } from '@/components/Col2'
import { List } from '@/components/List'
import Link from '@/components/link'
import { BoldText } from '@/components/BoldText'
import { ExpansionTile } from '@/components/ExpansionTile'

const tags = {
callout: {
Expand Down Expand Up @@ -42,6 +47,28 @@ const tags = {
href: { type: String },
},
},
'col-2': {
render: Col2,
},
list: {
render: List,
},
link: {
attributes: {
href: { type: String, default: '' },
target: { type: String, default: '_self' },
},
render: Link,
},
'bold-text': {
render: BoldText,
},
expansion: {
attributes: {
collapsedTitle: { type: String, default: '' },
},
render: ExpansionTile,
},
}

export default tags
11 changes: 11 additions & 0 deletions public/Robots.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export default function robots() {
return {
rules: [
{
userAgent: "*"
}
],
sitemap: "https://docs.plane.so/sitemap.xml",
host: "https://docs.plane.so"
};
}
3 changes: 3 additions & 0 deletions src/components/BoldText.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function BoldText({ children }) {
return <span className="font-bold">{children}</span>
}
12 changes: 12 additions & 0 deletions src/components/Col2.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import Link from 'next/link'

import { Icon } from '@/components/Icon'

export function Col2({ children }) {
return (
<div className="flex w-full gap-4 pt-0 align-top">
<>{children}</>
</div>
)
}

28 changes: 28 additions & 0 deletions src/components/ExpansionTile.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { useState } from 'react'
import { Icon } from './Icon'

export function ExpansionTile({ children, collapsedTitle }) {
const [isExpanded, setIsExpanded] = useState(false)

return (
<div className="border border-x-white dark:border-x-slate-900 dark:border-y-slate-800">
<div
className="group flex cursor-pointer items-center gap-2 py-2"
onClick={() => {
setIsExpanded(!isExpanded)
}}
>
<div className="flex items-center justify-center">
{isExpanded ? (
<Icon icon="arrow" className="h-4 w-4 rotate-180" />
) : (
<Icon icon="arrow" className="h-4 w-4 rotate-90" />
)}
</div>

<div>{collapsedTitle}</div>
</div>
{isExpanded && children}
</div>
)
}
4 changes: 4 additions & 0 deletions src/components/Icon.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { PluginsIcon } from '@/components/icons/PluginsIcon'
import { PresetsIcon } from '@/components/icons/PresetsIcon'
import { ThemingIcon } from '@/components/icons/ThemingIcon'
import { WarningIcon } from '@/components/icons/WarningIcon'
import { ArrowIcon } from './icons/ArrowFilled'

const icons = {
installation: InstallationIcon,
Expand All @@ -15,6 +16,7 @@ const icons = {
theming: ThemingIcon,
lightbulb: LightbulbIcon,
warning: WarningIcon,
arrow: ArrowIcon
}

const iconStyles = {
Expand Down Expand Up @@ -75,3 +77,5 @@ export function LightMode({ className, ...props }) {
export function DarkMode({ className, ...props }) {
return <g className={clsx('hidden dark:inline', className)} {...props} />
}


33 changes: 31 additions & 2 deletions src/components/Layout.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,14 @@ const navigation = [
links: [
{ title: 'Home', href: '/' },
{ title: 'Quick start', href: '/quick-start' },
{ title: 'Self Hosting', href: '/self-hosting' },
{
title: 'Self Hosting',
href: '/self-hosting',
links: [
{ title: 'Docker Compose', href: '/docker-compose' },
{ title: 'Kubernetes', href: '/kubernetes' },
],
},
],
},
{
Expand Down Expand Up @@ -56,6 +63,29 @@ const navigation = [
{ title: 'Jira', href: '/importers/jira' },
],
},
{
title: 'APIs',
links: [
{ title: 'Introduction', href: '/apis/introduction' },
{ title: 'Project', href: '/apis/project' },
{ title: 'State', href: '/apis/state' },
{ title: 'Label', href: '/apis/label' },
{ title: 'Links', href: '/apis/links' },
{ title: 'Issue Attachment', href: '/apis/issue-attachment' },
{ title: 'Issue', href: '/apis/issue' },
{ title: 'Issue Activity', href: '/apis/issue-activity' },
{ title: 'Issue Comment', href: '/apis/issue-comment' },
{ title: 'Module', href: '/apis/module' },
{ title: 'Module Issue', href: '/apis/module-issue' },
{ title: 'Cycle', href: '/apis/cycle' },
{ title: 'Cycle Issue', href: '/apis/cycle-issue' },
{ title: 'Inbox Issue', href: '/apis/inbox-issue' },
],
},
{
title: 'Webhooks',
links: [{ title: 'Introduction', href: '/webhooks/introduction' }],
},
]

function GitHubIcon(props) {
Expand All @@ -72,7 +102,6 @@ function DiscordIcon(props) {
<g>
<path
d="M216.856339,16.5966031 C200.285002,8.84328665 182.566144,3.2084988 164.041564,0 C161.766523,4.11318106 159.108624,9.64549908 157.276099,14.0464379 C137.583995,11.0849896 118.072967,11.0849896 98.7430163,14.0464379 C96.9108417,9.64549908 94.1925838,4.11318106 91.8971895,0 C73.3526068,3.2084988 55.6133949,8.86399117 39.0420583,16.6376612 C5.61752293,67.146514 -3.4433191,116.400813 1.08711069,164.955721 C23.2560196,181.510915 44.7403634,191.567697 65.8621325,198.148576 C71.0772151,190.971126 75.7283628,183.341335 79.7352139,175.300261 C72.104019,172.400575 64.7949724,168.822202 57.8887866,164.667963 C59.7209612,163.310589 61.5131304,161.891452 63.2445898,160.431257 C105.36741,180.133187 151.134928,180.133187 192.754523,160.431257 C194.506336,161.891452 196.298154,163.310589 198.110326,164.667963 C191.183787,168.842556 183.854737,172.420929 176.223542,175.320965 C180.230393,183.341335 184.861538,190.991831 190.096624,198.16893 C211.238746,191.588051 232.743023,181.531619 254.911949,164.955721 C260.227747,108.668201 245.831087,59.8662432 216.856339,16.5966031 Z M85.4738752,135.09489 C72.8290281,135.09489 62.4592217,123.290155 62.4592217,108.914901 C62.4592217,94.5396472 72.607595,82.7145587 85.4738752,82.7145587 C98.3405064,82.7145587 108.709962,94.5189427 108.488529,108.914901 C108.508531,123.290155 98.3405064,135.09489 85.4738752,135.09489 Z M170.525237,135.09489 C157.88039,135.09489 147.510584,123.290155 147.510584,108.914901 C147.510584,94.5396472 157.658606,82.7145587 170.525237,82.7145587 C183.391518,82.7145587 193.761324,94.5189427 193.539891,108.914901 C193.539891,123.290155 183.391518,135.09489 170.525237,135.09489 Z"
fill="#5865F2"
fillRule="nonzero"
></path>
</g>
Expand Down
3 changes: 3 additions & 0 deletions src/components/List.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function List({ children }) {
return <span className="w-1/2">{children}</span>
}
64 changes: 43 additions & 21 deletions src/components/Navigation.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,50 @@ import Link from 'next/link'
import { useRouter } from 'next/router'
import clsx from 'clsx'

export function Navigation({ navigation, className }) {
const Renderlinks = (props) => {
let router = useRouter()
const { href, title } = props
return (
<Link
href={href}
className={clsx(
'block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-[12.5px] before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full',
href === router.pathname
? 'font-semibold text-sky-500 before:bg-sky-500'
: 'text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300'
)}
>
{title}
</Link>
)
}

const NestedLinks = (props) => {
const { links } = props

return (
<ul
role="list"
className="space-y-2 border-l-2 border-slate-100 dark:border-slate-800 lg:mt-4 lg:space-y-4 lg:border-slate-200"
>
{links.map((link) => (
<li key={link.href} className="relative">
<Renderlinks href={link.href} title={link.title} />
{link.links && link.links.length > 0 && (
<ul
role="list"
className="border-l-1 !ml-4 mt-2 space-y-2 border-slate-100 dark:border-slate-800 lg:space-y-4 lg:border-slate-200"
>
<NestedLinks links={link.links} />
</ul>
)}
</li>
))}
</ul>
)
}

export function Navigation({ navigation, className }) {
return (
<nav className={clsx('text-base lg:text-sm', className)}>
<ul role="list" className="space-y-9">
Expand All @@ -13,26 +54,7 @@ export function Navigation({ navigation, className }) {
<h2 className="font-display font-medium text-slate-900 dark:text-white">
{section.title}
</h2>
<ul
role="list"
className="mt-2 space-y-2 border-l-2 border-slate-100 dark:border-slate-800 lg:mt-4 lg:space-y-4 lg:border-slate-200"
>
{section.links.map((link) => (
<li key={link.href} className="relative">
<Link
href={link.href}
className={clsx(
'block w-full pl-3.5 before:pointer-events-none before:absolute before:-left-1 before:top-1/2 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full',
link.href === router.pathname
? 'font-semibold text-sky-500 before:bg-sky-500'
: 'text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300'
)}
>
{link.title}
</Link>
</li>
))}
</ul>
<NestedLinks links={section.links} />
</li>
))}
</ul>
Expand Down
62 changes: 62 additions & 0 deletions src/components/icons/ArrowFilled.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { DarkMode, Gradient, LightMode } from '@/components/Icon'

export function ArrowIcon({ id, color }) {
return (
<>
<defs>
<Gradient
id={`${id}-gradient`}
color={color}
gradientTransform="matrix(0 21 -21 0 20 3)"
/>
<Gradient
id={`${id}-gradient-dark`}
color={color}
gradientTransform="matrix(0 22.75 -22.75 0 16 6.25)"
/>
</defs>
<LightMode>
<svg
width="100%"
height="100%"
viewBox="0 0 48 48"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clip-path="url(#clip0_1303_45892)">
<path
d="M20.5359 6C22.0755 3.33333 25.9245 3.33333 27.4641 6L41.3205 30C42.8601 32.6667 40.9356 36 37.8564 36H10.1436C7.06439 36 5.13989 32.6667 6.67949 30L20.5359 6Z"
fill="#1E1E1E"
/>
</g>
<defs>
<clipPath id="clip0_1303_45892">
<rect width="100%" height="100%" fill="white" />
</clipPath>
</defs>
</svg>
</LightMode>
<DarkMode fill={`url(#${id}-gradient-dark)`}>
<svg
width="100%"
height="100%"
viewBox="0 0 48 48"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clip-path="url(#clip0_1303_45892)">
<path
d="M20.5359 6C22.0755 3.33333 25.9245 3.33333 27.4641 6L41.3205 30C42.8601 32.6667 40.9356 36 37.8564 36H10.1436C7.06439 36 5.13989 32.6667 6.67949 30L20.5359 6Z"
fill="#94A3B8"
/>
</g>
<defs>
<clipPath id="clip0_1303_45892">
<rect width="100%" height="100%" fill="white" />
</clipPath>
</defs>
</svg>
</DarkMode>
</>
)
}
Loading