15 Commits

Author SHA1 Message Date
Renovate Bot
10839c6339 Update dependency eslint to v9
Some checks failed
renovate/artifacts Artifact file update failure
2024-10-08 13:08:16 +00:00
1296a34657 better responsiveness
All checks were successful
Deploy / deploy (ubuntu-latest, 2.44.0) (push) Successful in 1m18s
Took 1 minute
2024-10-07 20:59:59 -04:00
1717c0859d better responsiveness
All checks were successful
Deploy / deploy (ubuntu-latest, 2.44.0) (push) Successful in 1m1s
Took 11 minutes
2024-10-07 20:58:31 -04:00
dc89db4eed image viewer component
All checks were successful
Deploy / deploy (ubuntu-latest, 2.44.0) (push) Successful in 1m50s
Took 19 minutes
2024-10-07 20:47:52 -04:00
40b799e280 update docs page breadcrumb
Took 5 minutes
2024-10-07 20:29:06 -04:00
71c24bd6cc fix page buttons on the docs page footer being broken for some links
All checks were successful
Deploy / deploy (ubuntu-latest, 2.44.0) (push) Successful in 1m9s
Took 3 minutes
2024-10-07 20:24:34 -04:00
c4f7d4bf7e fix active page indicator on the sidebar being broken for some links
Took 9 minutes
2024-10-07 20:21:35 -04:00
54230367e1 sort docs content by order field in frontmatter metadata
All checks were successful
Deploy / deploy (ubuntu-latest, 2.44.0) (push) Successful in 1m1s
Took 7 minutes
2024-10-07 20:12:33 -04:00
68fae2e29e Merge remote-tracking branch 'origin/master'
All checks were successful
Deploy / deploy (ubuntu-latest, 2.44.0) (push) Successful in 1m4s
2024-10-07 20:06:18 -04:00
be319a4d7b fix the root docs page not working
Took 4 minutes
2024-10-07 20:06:04 -04:00
325891663b Merge pull request 'Update dependency eslint-config-next to v14.2.14' (#1) from renovate/eslint-config-next-14.x into master
All checks were successful
Deploy / deploy (ubuntu-latest, 2.44.0) (push) Successful in 1m54s
Reviewed-on: #1
2024-10-07 17:02:47 -07:00
36af41cbe4 some more docs content
Some checks failed
Deploy / deploy (ubuntu-latest, 2.44.0) (push) Has been cancelled
Took 18 minutes
2024-10-07 20:01:53 -04:00
fbde7667bc use proper page extension for edit links
Took 9 minutes
2024-10-07 19:43:41 -04:00
cdcee387b5 some content and changes
All checks were successful
Deploy / deploy (ubuntu-latest, 2.44.0) (push) Successful in 1m2s
Took 3 hours 4 minutes
2024-10-07 19:34:00 -04:00
Renovate Bot
901f7706d4 Update dependency eslint-config-next to v14.2.14 2024-10-07 20:14:19 +00:00
21 changed files with 245 additions and 361 deletions

BIN
bun.lockb

Binary file not shown.

View File

@ -1,7 +0,0 @@
---
title: 'Hello'
published: '2024-10-06'
summary: 'petentium usu tota noluisse errem elaboraret auctor.'
---
# hello

View File

@ -1,7 +0,0 @@
---
title: 'Hey'
published: '2024-10-06'
summary: 'petentium usu tota noluisse errem elaboraret auctor.'
---
# hey

View File

@ -1,7 +0,0 @@
---
title: 'Hi'
published: '2024-10-06'
summary: 'petentium usu tota noluisse errem elaboraret auctor.'
---
# hi

View File

@ -1,293 +0,0 @@
---
title: '🚀 Introduction'
published: '2024-10-06'
summary: 'petentium usu tota noluisse errem elaboraret auctor.'
---
# Get started with Pulse App!
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
# an mel dissentiunt ponderum eius dicant adhuc,
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
# vim an explicari eirmod pro singulis scripta iaculis fermentum.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
# eruditi propriae vulputate elit venenatis reprehendunt delectus.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
# dicunt antiopam ultricies nisl egestas voluptatibus harum,
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
# viverra senserit cursus theophrastus elaboraret iudicabit ligula.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
# posidonium dicat eum nostra auctor quaeque harum
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
# doctus primis disputationi atqui magnis himenaeos fastidii
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
# ligula cras prodesset litora ridens docendi euripidis
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
# efficitur detraxit detraxit fames appareat mutat elit
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
# donec nominavi qui dolorum adversarium eum eleifend
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
# nunc contentiones numquam pharetra his vero solum
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.
petentium usu tota noluisse errem elaboraret auctor.

24
docs/intro.mdx Normal file
View File

@ -0,0 +1,24 @@
---
title: '🚀 Introduction'
published: '2024-10-06'
summary: 'petentium usu tota noluisse errem elaboraret auctor.'
order: 1
---
> [!IMPORTANT]
> These docs are currently a work in progress and are subject to change.
# Pulse App
<span className="flex gap-2 items-center select-none">
<Activity className="w-4 h-4 text-primary" /> <span>A lightweight service monitoring solution for tracking the availability of whatever service your heart desires!</span>
</span>
## Getting Started
Let's get you up and running—this will only take a few minutes! Start by [creating your account](#creating-your-account) and
making your first status page. You can do this on our cloud or on your [own instance](/self-hosting). Once done, you can add
your services and start monitoring them. See [Next Steps](#next-steps) for more.
### Creating your Account
- First, head to our [Dashboard](https://pulseapp.cc/dashboard) and fill out the form. ![Registering](https://cdn.rainnny.club/auhNOjrcYz6u.png)
- Next, complete the onboarding process and set up your first organization, and status page. ![Onboarding](https://cdn.rainnny.club/AfDgjHG5QTpZ.png)
- Finally, you can [start monitoring your services](#next-steps)!

View File

@ -0,0 +1,9 @@
---
title: '🐋 Docker'
published: '2024-10-07'
summary: 'petentium usu tota noluisse errem elaboraret auctor.'
order: 4
---
# 🐋 Deploying on Docker
...

View File

@ -0,0 +1,9 @@
---
title: '🧩 Components'
published: '2024-10-07'
summary: 'petentium usu tota noluisse errem elaboraret auctor.'
order: 2
---
# 🧩 Components
...

View File

@ -0,0 +1,9 @@
---
title: '✔️ Supported Services'
published: '2024-10-07'
summary: 'petentium usu tota noluisse errem elaboraret auctor.'
order: 3
---
# ✔️ Supported Services
Below is a list of all the services that are currently supported by Pulse App. Are we missing a service? Please [open an issue](https://git.rainnny.club/PulseApp/API/issues)!

View File

@ -41,7 +41,7 @@
"@types/react": "^18",
"@types/react-dom": "^18",
"eslint": "^9.0.0",
"eslint-config-next": "14.2.8",
"eslint-config-next": "14.2.14",
"postcss": "^8",
"tailwindcss": "^3.4.1",
"typescript": "^5"

View File

@ -13,7 +13,6 @@ import { capitalizeWords } from "@/lib/string";
import { Metadata } from "next";
import Embed from "@/components/embed";
import DocsFooter from "@/components/docs-footer";
import { cn } from "@/lib/utils";
import OnThisPage from "@/components/on-this-page";
/**
@ -32,9 +31,10 @@ const DocsPage = async ({
// Get the content to display based on the provided slug
const pages: DocsContentMetadata[] = getDocsContent();
const decodedSlug: string = decodeURIComponent(slug || "");
const page: DocsContentMetadata | undefined = pages.find(
(metadata: DocsContentMetadata): boolean =>
metadata.slug === (slug || "intro")
metadata.slug === (decodedSlug || "intro")
);
if (!page) {
notFound();
@ -44,20 +44,17 @@ const DocsPage = async ({
return (
<main className="w-full flex flex-col">
{/* Breadcrumb */}
<Breadcrumb className="pt-4 select-none">
<Breadcrumb className="pt-4 pb-3 select-none">
<BreadcrumbList>
{splitSlug.map(
(part: string, index: number): ReactElement => {
const active: boolean =
index === splitSlug.length - 1;
{splitSlug
.slice(0, -1)
.map((part: string, index: number): ReactElement => {
const slug: string = splitSlug
.slice(1, index + 1)
.slice(1, index + 2) // Include one more to account for the index shift
.join("/");
return (
<div className="flex items-center" key={part}>
<BreadcrumbItem
className={cn(active && "text-primary")}
>
<BreadcrumbItem>
<BreadcrumbLink
href={slug}
draggable={false}
@ -65,13 +62,17 @@ const DocsPage = async ({
{capitalizeWords(part)}
</BreadcrumbLink>
</BreadcrumbItem>
{index < splitSlug.length - 1 && (
{index < splitSlug.length - 1 && ( // Adjusted to avoid separator after the last breadcrumb
<BreadcrumbSeparator className="pl-1.5" />
)}
</div>
);
}
)}
})}
<BreadcrumbItem className="text-primary">
<BreadcrumbLink href="#" draggable={false}>
{page.title}{" "}
</BreadcrumbLink>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>

View File

@ -51,7 +51,7 @@ const RootLayout = ({
}}
>
<TooltipProvider delayDuration={100}>
<div className="px-3 sm:px-7 max-w-screen-2xl min-h-screen mx-auto flex flex-col transition-all">
<div className="px-3 md:px-7 max-w-screen-2xl min-h-screen mx-auto flex flex-col transition-all">
<Navbar />
<div className="pt-[4.5rem] w-full h-full flex flex-grow gap-5">
<div className="relative hidden xs:flex">

View File

@ -16,6 +16,11 @@ type DocsContentMetadata = MDXMetadata & {
* The summary of this content.
*/
summary: string;
/**
* The order of this content.
*/
order: number;
};
/**

View File

@ -13,7 +13,7 @@ const DocsFooter = ({
}: {
pages: DocsContentMetadata[];
}): ReactElement => {
const path: string = usePathname();
const path: string = decodeURIComponent(usePathname());
const current: number = pages.findIndex(
(page: DocsContentMetadata) =>
@ -46,15 +46,17 @@ const DocsFooter = ({
pages[current]?.published
).toLocaleString(DateTime.DATETIME_MED)}
>
<span className="text-sm opacity-75">
<span className="text-xs sm:text-sm opacity-75 transition-all transform-gpu">
Published {publicationDate}
</span>
</SimpleTooltip>
</div>
{/* Pages */}
<Separator className="my-4 bg-separator-gradient" />
<div className="flex justify-between">
{previous || next ? (
<Separator className="my-4 bg-separator-gradient" />
) : undefined}
<div className="flex justify-between text-xs sm:text-base">
{/* Previous */}
{previous && (
<Link

View File

@ -0,0 +1,32 @@
"use client";
import { ReactElement, ReactNode } from "react";
import { Dialog, DialogContent, DialogTrigger } from "@/components/ui/dialog";
import { cn } from "@/lib/utils";
type ImageViewerProps = {
className?: string | undefined;
children: ReactNode;
};
const ImageViewer = ({
className,
children,
}: ImageViewerProps): ReactElement => {
return (
<Dialog>
<DialogTrigger
className={cn(
"hover:scale-[1.005] transition-all transform-gpu",
className
)}
>
{children}
</DialogTrigger>
<DialogContent className="p-0 min-w-[20rem] max-w-screen-xl">
{children}
</DialogContent>
</Dialog>
);
};
export default ImageViewer;

View File

@ -1,12 +1,47 @@
import { ReactElement, ReactNode } from "react";
import { isValidElement, ReactElement, ReactNode } from "react";
import { MDXRemote } from "remote-mdx/rsc";
import { cn } from "@/lib/utils";
import remarkGfm from "remark-gfm";
import {
Activity,
CircleAlert,
Lightbulb,
MessageSquareWarning,
OctagonAlert,
TriangleAlert,
} from "lucide-react";
import Link from "next/link";
import { capitalizeWords } from "@/lib/string";
import ImageViewer from "@/components/image-viewer";
const blockquoteStyles: { [key: string]: any } = {
NOTE: {
icon: <CircleAlert className="w-4 h-4" />,
style: "text-[#1F6FEB] border-[#1F6FEB]",
},
TIP: {
icon: <Lightbulb className="w-4 h-4" />,
style: "text-[#4A8BD5] border-[#4A8BD5]",
},
IMPORTANT: {
icon: <MessageSquareWarning className="w-4 h-4" />,
style: "text-[#8957E5] border-[#8957E5]",
},
WARNING: {
icon: <TriangleAlert className="w-4 h-4" />,
style: "text-[#9E6A03] border-[#9E6A03]",
},
CAUTION: {
icon: <OctagonAlert className="w-4 h-4" />,
style: "text-[#DA3633] border-[#DA3633]",
},
};
/**
* The MDX components to style.
*/
const components = {
// Headings
h1: ({ children }: { children: ReactNode }): ReactElement => (
<Heading as="h1" size={1} className="text-4xl">
{children}
@ -37,6 +72,8 @@ const components = {
{children}
</Heading>
),
// Text
a: ({
href,
children,
@ -44,19 +81,59 @@ const components = {
href: string;
children: ReactNode;
}): ReactElement => (
<a
className="text-minecraft-green-4 cursor-pointer hover:opacity-85 transition-all transform-gpu"
<Link
className="text-primary cursor-pointer hover:opacity-75 transition-all transform-gpu"
href={href}
draggable={false}
>
{children}
</a>
</Link>
),
p: ({ children }: { children: ReactNode }): ReactElement => (
<p className="leading-4 text-zinc-300/80">{children}</p>
<p className="leading-5 select-none">{children}</p>
),
// Media
img: ({ src, alt }: { src: string; alt: string }): ReactElement => (
<ImageViewer className="m-2 my-2.5">
<img
className="ring-1 ring-muted/45 rounded-2xl select-none"
src={src}
alt={alt}
draggable={false}
/>
</ImageViewer>
),
// Lists
ul: ({ children }: { children: ReactNode }): ReactElement => (
<ul className="px-3 list-disc list-inside">{children}</ul>
<ul className="px-3 list-disc list-inside select-none">{children}</ul>
),
// Blockquotes
blockquote: ({ children }: { children: ReactNode }): ReactElement => {
const match = extractBlockQuoteText(children).match(
/^\s*\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)]\s*(.*)/i
);
let style: any;
if (!match || !(style = blockquoteStyles[match[1]])) {
return <blockquote>{children}</blockquote>;
}
return (
<blockquote
className={cn(
"my-2 pl-3 py-1.5 flex flex-col gap-2 border-l-[3px] select-none",
style.style
)}
>
<h1 className="flex gap-2 items-center">
{style.icon}
{capitalizeWords(match[1])}
</h1>
<p className="text-foreground opacity-85">{match[2]}</p>
</blockquote>
);
},
};
/**
@ -71,6 +148,8 @@ export const CustomMDX = (props: any): ReactElement => (
components={{
...components,
...(props.components || {}),
Link,
Activity,
}}
options={{
mdxOptions: {
@ -83,6 +162,7 @@ export const CustomMDX = (props: any): ReactElement => (
/**
* A heading component.
*
* @param as the type of heading
* @param className the class name of the heading
* @param size the size of the heading
* @param children the children within the heading
@ -104,7 +184,11 @@ const Heading = ({
return (
<Component
id={id}
className={cn("pt-2.5 font-bold", size >= 2 && "pt-7", className)}
className={cn(
"py-3 font-bold select-none",
size >= 2 && "pt-7",
className
)}
>
{children}
</Component>
@ -117,3 +201,16 @@ const slugify = (text: string): string =>
.replace(/[^\w\s-]/g, "")
.replace(/[\s_-]+/g, "-")
.trim();
const extractBlockQuoteText = (node: ReactNode): string => {
if (typeof node === "string") {
return node;
}
if (Array.isArray(node)) {
return node.map(extractBlockQuoteText).join("");
}
if (isValidElement(node)) {
return extractBlockQuoteText(node.props.children);
}
return "";
};

View File

@ -9,7 +9,7 @@ const Navbar = (): ReactElement => {
const pages: DocsContentMetadata[] = getDocsContent();
return (
<nav className="fixed left-0 inset-x-0 bg-white/[0.007] backdrop-saturate-100 backdrop-blur-xl border-b z-50">
<div className="px-3 sm:px-7 max-w-screen-2xl mx-auto py-4 flex justify-between items-center transition-all transform-gpu">
<div className="px-3 md:px-7 max-w-screen-2xl mx-auto py-4 flex justify-between items-center transition-all transform-gpu">
{/* Branding */}
<Link
className="flex gap-1 items-end hover:opacity-75 transition-all transform-gpu select-none"

View File

@ -127,7 +127,7 @@ const OnThisPage = ({ page }: { page: DocsContentMetadata }): ReactElement => {
{/* Footer */}
<div>
<Separator className="mt-1 mb-3.5" />
<Separator className="mt-1 mb-3.5 bg-separator-gradient" />
<Footer page={page} />
</div>
</motion.div>
@ -148,7 +148,7 @@ const Footer = ({ page }: { page: DocsContentMetadata }): ReactElement => {
{/* Edit on Git */}
<Link
className="flex gap-1.5 items-center text-xs hover:opacity-75 transition-all transform-gpu group"
href={`https://git.rainnny.club/PulseApp/docs/src/branch/master/docs/${page.slug}.md`}
href={`https://git.rainnny.club/PulseApp/docs/src/branch/master/docs/${page.slug}${page.extension}`}
target="_blank"
draggable={false}
>

View File

@ -20,11 +20,11 @@ const SidebarLinks = ({
}): ReactElement => {
const tree = useMemo(() => buildTree(pages), [pages]);
return (
<>
<div className="flex flex-col gap-1">
{Object.values(tree).map((node: TreeNode) => (
<CategoryItem key={node.slug} node={node} />
))}
</>
</div>
);
};
@ -44,14 +44,14 @@ const CategoryItem = ({
depth?: number;
isLast?: boolean;
}) => {
const path = usePathname();
const path = decodeURIComponent(usePathname());
const active =
(path === "/" && node.slug === "intro") || path === `/${node.slug}`;
const [isOpen, setIsOpen] = useState(true);
const hasChildren = Object.keys(node.children).length > 0;
return (
<div className={cn(`relative select-none`, depth > 0 && "ml-2.5")}>
<div className={cn(`relative select-none`, depth > 0 && "ml-4")}>
{/* Indentation */}
{depth > 0 && (
<div
@ -72,7 +72,7 @@ const CategoryItem = ({
>
<Button
className={cn(
`relative w-full px-1.5 h-8 text-base justify-between hover:bg-accent/20`,
`relative w-full px-1.5 h-8 lg:text-base justify-between hover:bg-accent/20`,
depth > 0 && "pl-4",
active &&
"text-primary/95 font-bold hover:text-primary"
@ -83,7 +83,7 @@ const CategoryItem = ({
{hasChildren && (
<motion.div
initial={false}
animate={{ rotate: isOpen ? 90 : 180 }}
animate={{ rotate: isOpen ? 90 : 0 }}
transition={{ duration: 0.2 }}
>
<ChevronRight className="w-4 h-4" />

View File

@ -6,6 +6,8 @@ import { UseThemeProps } from "next-themes/dist/types";
import { Monitor, MoonStar, Sun } from "lucide-react";
import { cn } from "@/lib/utils";
import { Button } from "@/components/ui/button";
import SimpleTooltip from "@/components/simple-tooltip";
import { capitalizeWords } from "@/lib/string";
const themes = {
dark: <MoonStar className="w-4 h-4" />,
@ -31,18 +33,22 @@ const ThemeSwitcher = (): ReactElement => {
{Object.entries(themes).map(([theme, icon]) => {
const active: boolean = mounted && theme === activeTheme;
return (
<Button
<SimpleTooltip
key={theme}
className={cn(
"p-1 h-6 opacity-80 rounded-full",
active &&
"ring-1 bg-zinc-900 ring-white/15 opacity-100"
)}
variant="ghost"
onClick={() => setTheme(theme)}
content={`${capitalizeWords(theme)} Theme`}
>
{icon}
</Button>
<Button
className={cn(
"p-1 h-6 opacity-80 rounded-full",
active &&
"ring-1 bg-zinc-900 ring-white/15 opacity-100"
)}
variant="ghost"
onClick={() => setTheme(theme)}
>
{icon}
</Button>
</SimpleTooltip>
);
})}
</div>

View File

@ -21,7 +21,11 @@ export const getDocsContent = (): DocsContentMetadata[] => {
for (const directory of getRecursiveDirectories(DOCS_DIR)) {
content.push(...getMetadata<DocsContentMetadata>(DOCS_DIR, directory));
}
return content;
return content.sort((a: DocsContentMetadata, b: DocsContentMetadata) => {
const orderA = a.order ?? Number.MAX_SAFE_INTEGER;
const orderB = b.order ?? Number.MAX_SAFE_INTEGER;
return orderA - orderB;
});
};
/**