1
mirror of https://github.com/jakejarvis/jarv.is.git synced 2025-04-26 06:45:23 -04:00

lucide icons

This commit is contained in:
Jake Jarvis 2025-03-11 21:18:41 -04:00
parent 42d9470480
commit 8e89701453
Signed by: jake
SSH Key Fingerprint: SHA256:nCkvAjYA6XaSPUqc4TfbBQTpzr8Xj7ritg/sGInCdkc
20 changed files with 201 additions and 174 deletions

View File

@ -50,12 +50,6 @@
background-color: var(--colors-link); background-color: var(--colors-link);
} }
.submitIcon {
font-size: 1.3em;
margin-right: 0.3em;
line-height: 1;
}
.result { .result {
font-weight: 600; font-weight: 600;
line-height: 1.5; line-height: 1.5;
@ -73,5 +67,4 @@
width: 1.3em; width: 1.3em;
height: 1.3em; height: 1.3em;
vertical-align: -0.3em; vertical-align: -0.3em;
fill: currentColor;
} }

View File

@ -4,10 +4,9 @@ import { useActionState } from "react";
import TextareaAutosize from "react-textarea-autosize"; import TextareaAutosize from "react-textarea-autosize";
import Turnstile from "react-turnstile"; import Turnstile from "react-turnstile";
import clsx from "clsx"; import clsx from "clsx";
import { CheckIcon, XIcon } from "lucide-react";
import Link from "../../components/Link"; import Link from "../../components/Link";
import { sendMessage } from "./actions"; import { sendMessage } from "./actions";
import { GoCheck, GoX } from "react-icons/go";
import { SiMarkdown } from "react-icons/si";
import styles from "./form.module.css"; import styles from "./form.module.css";
@ -56,7 +55,13 @@ const ContactForm = () => {
lineHeight: 1.75, lineHeight: 1.75,
}} }}
> >
<SiMarkdown <svg
fill="currentColor"
stroke="currentColor"
strokeWidth="0"
viewBox="0 0 24 24"
height="1.25em"
width="1.25em"
style={{ style={{
display: "inline", display: "inline",
width: "1.25em", width: "1.25em",
@ -64,7 +69,10 @@ const ContactForm = () => {
verticalAlign: "-0.25em", verticalAlign: "-0.25em",
marginRight: "0.25em", marginRight: "0.25em",
}} }}
/>{" "} xmlns="http://www.w3.org/2000/svg"
>
<path d="M22.27 19.385H1.73A1.73 1.73 0 010 17.655V6.345a1.73 1.73 0 011.73-1.73h20.54A1.73 1.73 0 0124 6.345v11.308a1.73 1.73 0 01-1.73 1.731zM5.769 15.923v-4.5l2.308 2.885 2.307-2.885v4.5h2.308V8.078h-2.308l-2.307 2.885-2.308-2.885H3.46v7.847zM21.232 12h-2.309V8.077h-2.307V12h-2.308l3.461 4.039z"></path>
</svg>{" "}
Basic{" "} Basic{" "}
<Link href="https://commonmark.org/help/" title="Markdown reference sheet" style={{ fontWeight: 600 }}> <Link href="https://commonmark.org/help/" title="Markdown reference sheet" style={{ fontWeight: 600 }}>
Markdown syntax Markdown syntax
@ -87,15 +95,27 @@ const ContactForm = () => {
<span>Sending...</span> <span>Sending...</span>
) : ( ) : (
<> <>
<span className={styles.submitIcon}>📤</span> <span>Send</span> <span
style={{
fontSize: "1.3em",
marginRight: "0.3em",
lineHeight: "1",
}}
>
📤
</span>{" "}
<span>Send</span>
</> </>
)} )}
</button> </button>
)} )}
{formState?.message && ( {formState?.message && (
<div className={clsx(styles.result, formState?.success ? styles.success : styles.error)}> <div className={clsx(styles.result, formState?.success ? styles.success : styles.error)}>
{formState?.success ? <GoCheck className={styles.resultIcon} /> : <GoX className={styles.resultIcon} />}{" "} {formState?.success ? (
<CheckIcon size="1.3em" className={styles.resultIcon} />
) : (
<XIcon size="1.3em" className={styles.resultIcon} />
)}{" "}
{formState?.message} {formState?.message}
</div> </div>
)} )}

View File

@ -1,5 +1,6 @@
import { Suspense } from "react"; import { Suspense } from "react";
import { ErrorBoundary } from "react-error-boundary"; import { ErrorBoundary } from "react-error-boundary";
import { CalendarIcon, TagIcon, SquarePenIcon, EyeIcon } from "lucide-react";
import Link from "../../../components/Link"; import Link from "../../../components/Link";
import Time from "../../../components/Time"; import Time from "../../../components/Time";
import Comments from "../../../components/Comments"; import Comments from "../../../components/Comments";
@ -8,7 +9,6 @@ import HitCounter from "./counter";
import { getPostSlugs, getFrontMatter } from "../../../lib/helpers/posts"; import { getPostSlugs, getFrontMatter } from "../../../lib/helpers/posts";
import { metadata as defaultMetadata } from "../../layout"; import { metadata as defaultMetadata } from "../../layout";
import config from "../../../lib/config/constants"; import config from "../../../lib/config/constants";
import { FiCalendar, FiTag, FiEdit, FiEye } from "react-icons/fi";
import type { Metadata, Route } from "next"; import type { Metadata, Route } from "next";
import type { Article, WithContext } from "schema-dts"; import type { Article, WithContext } from "schema-dts";
@ -85,14 +85,14 @@ export default async function Page({ params }: { params: Promise<{ slug: string
<div className={styles.meta}> <div className={styles.meta}>
<div className={styles.metaItem}> <div className={styles.metaItem}>
<Link href={`/notes/${frontmatter.slug}` as Route} plain className={styles.metaLink}> <Link href={`/notes/${frontmatter.slug}` as Route} plain className={styles.metaLink}>
<FiCalendar className={styles.metaIcon} /> <CalendarIcon size="1.2em" className={styles.metaIcon} />
<Time date={frontmatter.date} format="MMMM D, YYYY" /> <Time date={frontmatter.date} format="MMMM D, YYYY" />
</Link> </Link>
</div> </div>
{frontmatter.tags && ( {frontmatter.tags && (
<div className={styles.metaItem}> <div className={styles.metaItem}>
<FiTag className={styles.metaIcon} /> <TagIcon size="1.2em" className={styles.metaIcon} />
<span className={styles.metaTags}> <span className={styles.metaTags}>
{frontmatter.tags.map((tag) => ( {frontmatter.tags.map((tag) => (
<span key={tag} title={tag} className={styles.metaTag} aria-label={`Tagged with ${tag}`}> <span key={tag} title={tag} className={styles.metaTag} aria-label={`Tagged with ${tag}`}>
@ -110,7 +110,7 @@ export default async function Page({ params }: { params: Promise<{ slug: string
plain plain
className={styles.metaLink} className={styles.metaLink}
> >
<FiEdit className={styles.metaIcon} /> <SquarePenIcon size="1.2em" className={styles.metaIcon} />
<span>Improve This Post</span> <span>Improve This Post</span>
</Link> </Link>
</div> </div>
@ -126,7 +126,7 @@ export default async function Page({ params }: { params: Promise<{ slug: string
marginRight: 0, marginRight: 0,
}} }}
> >
<FiEye className={styles.metaIcon} /> <EyeIcon size="1.2em" className={styles.metaIcon} />
<Suspense fallback={<Loading boxes={3} width={20} />}> <Suspense fallback={<Loading boxes={3} width={20} />}>
<HitCounter slug={`notes/${frontmatter.slug}`} /> <HitCounter slug={`notes/${frontmatter.slug}`} />
</Suspense> </Suspense>

View File

@ -1,6 +1,6 @@
import hash from "@emotion/hash"; import hash from "@emotion/hash";
import { rgba } from "polished"; import { rgba } from "polished";
import { GoLock } from "react-icons/go"; import { LockIcon } from "lucide-react";
import UnstyledLink from "../components/Link"; import UnstyledLink from "../components/Link";
import type { ComponentPropsWithoutRef } from "react"; import type { ComponentPropsWithoutRef } from "react";
import type { Route } from "next"; import type { Route } from "next";
@ -249,13 +249,7 @@ export default function Page() {
plain plain
openInNewTab openInNewTab
> >
<GoLock <LockIcon size="1.25em" style={{ verticalAlign: "-0.25em" }} />{" "}
size="1.25em"
style={{
verticalAlign: "-0.25em",
strokeWidth: 0.5,
}}
/>{" "}
<span <span
style={{ style={{
margin: "0 0.15em", margin: "0 0.15em",

View File

@ -71,22 +71,20 @@ export default async function Page() {
<p style={{ textAlign: "center", fontSize: "0.95em", margin: "0.5em 0" }}> <p style={{ textAlign: "center", fontSize: "0.95em", margin: "0.5em 0" }}>
<Link href="/y2k"> <Link href="/y2k">
<svg <svg
xmlns="http://www.w3.org/2000/svg"
fill="currentColor" fill="currentColor"
stroke="currentColor" stroke="currentColor"
strokeWidth="0" strokeWidth="0"
viewBox="0 0 24 24" viewBox="0 0 24 24"
role="img" height="1.2em"
width="1.2em"
style={{ style={{
display: "inline", display: "inline",
width: "1.2em", width: "1.2em",
height: "1.2em", height: "1.2em",
verticalAlign: "-0.15em", verticalAlign: "-0.15em",
marginRight: "0.1em", marginRight: "0.1em",
fill: "currentColor",
stroke: "currentcolor",
strokeWidth: 0,
}} }}
xmlns="http://www.w3.org/2000/svg"
> >
<path d="M5.712 1.596l-.756.068-.238.55.734-.017zm1.39.927l-.978.137-.326.807.96-.12.345-.824zM4.89 3.535l-.72.05-.24.567.721-.017zm3.724.309l-1.287.068-.394.96 1.27-.052zm1.87.566l-1.579.069-.566 1.357 1.596-.088.548-1.338zm-4.188.037l-.977.153-.343.806.976-.12zm6.144.668l-1.87.135-.637 1.527 1.87-.154zm2.925.219c-.11 0-.222 0-.334.002l-.767 1.85c1.394-.03 2.52.089 3.373.38l-1.748 4.201c-.955-.304-2.082-.444-3.36-.394l-.54 1.305a8.762 8.762 0 0 1 3.365.396l-1.663 4.014c-1.257-.27-2.382-.395-3.387-.344l-.782 1.887c3.363-.446 6.348.822 9.009 3.773L24 9.23c-2.325-2.575-5.2-3.88-8.637-3.896zm-.644.002l-2.024.12-.687 1.68 2.025-.19zm-10.603.05l-.719.036-.224.566h.703l.24-.601zm3.69.397l-1.287.069-.395.959 1.27-.05zM5.54 6.3l-.994.154-.344.807.98-.121zm4.137.066l-1.58.069L7.53 7.77l1.596-.085.55-1.32zm1.955.688l-1.87.135-.636 1.527 1.887-.154zm2.282.19l-2.01.136-.7 1.682 2.04-.19.67-1.63zm-10.57.066l-.739.035-.238.564h.72l.257-.6zm3.705.293l-1.303.085-.394.96 1.287-.034zm11.839.255a6.718 6.718 0 0 1 2.777 1.717l-1.75 4.237c-.617-.584-1.15-.961-1.611-1.149l-1.201-.498zM4.733 8.22l-.976.154-.344.807.961-.12.36-.841zm4.186 0l-1.594.052-.549 1.354L8.37 9.54zm1.957.668L8.99 9.04l-.619 1.508 1.87-.135.636-1.527zm2.247.275l-2.007.12-.703 1.665 2.042-.156zM2.52 9.267l-.718.033-.24.549.718-.016zm3.725.273l-1.289.07-.41.96 1.287-.03.412-1zm1.87.6l-1.596.05-.55 1.356 1.598-.084.547-1.322zm-4.186.037l-.979.136-.324.805.96-.119zm6.14.633l-1.87.154-.653 1.527 1.906-.154zm2.267.275l-2.026.12-.686 1.663 2.025-.172zm-10.569.031l-.739.037-.238.565.72-.016zm3.673.362l-1.289.068-.41.978 1.305-.05zm-2.285.533l-.976.154-.326.805.96-.12.342-.84zm4.153.07l-1.596.066-.565 1.356 1.612-.084zm1.957.666l-1.889.154-.617 1.526 1.886-.15zm2.28.223l-2.025.12-.685 1.665 2.041-.172.67-1.613zm-10.584.05l-.738.053L0 13.64l.72-.02.24-.6zm3.705.31l-1.285.07-.395.976 1.287-.05.393-.997zm11.923.07c1.08.29 2.024.821 2.814 1.613l-1.715 4.183c-.892-.754-1.82-1.32-2.814-1.664l1.715-4.133zm-10.036.515L4.956 14l-.549 1.32 1.578-.066.567-1.338zm-4.184.014l-.996.156-.309.79.961-.106zm6.14.67l-1.904.154-.617 1.527 1.89-.154.632-1.527zm2.231.324l-2.025.123-.686 1.682 2.026-.174zm-6.863.328l-1.3.068-.397.98 1.285-.054zm1.871.584l-1.578.068-.566 1.334 1.595-.064zm1.953.701l-1.867.137-.635 1.51 1.87-.137zm2.23.31l-2.005.122-.703 1.68 2.04-.19.67-1.61z"></path> <path d="M5.712 1.596l-.756.068-.238.55.734-.017zm1.39.927l-.978.137-.326.807.96-.12.345-.824zM4.89 3.535l-.72.05-.24.567.721-.017zm3.724.309l-1.287.068-.394.96 1.27-.052zm1.87.566l-1.579.069-.566 1.357 1.596-.088.548-1.338zm-4.188.037l-.977.153-.343.806.976-.12zm6.144.668l-1.87.135-.637 1.527 1.87-.154zm2.925.219c-.11 0-.222 0-.334.002l-.767 1.85c1.394-.03 2.52.089 3.373.38l-1.748 4.201c-.955-.304-2.082-.444-3.36-.394l-.54 1.305a8.762 8.762 0 0 1 3.365.396l-1.663 4.014c-1.257-.27-2.382-.395-3.387-.344l-.782 1.887c3.363-.446 6.348.822 9.009 3.773L24 9.23c-2.325-2.575-5.2-3.88-8.637-3.896zm-.644.002l-2.024.12-.687 1.68 2.025-.19zm-10.603.05l-.719.036-.224.566h.703l.24-.601zm3.69.397l-1.287.069-.395.959 1.27-.05zM5.54 6.3l-.994.154-.344.807.98-.121zm4.137.066l-1.58.069L7.53 7.77l1.596-.085.55-1.32zm1.955.688l-1.87.135-.636 1.527 1.887-.154zm2.282.19l-2.01.136-.7 1.682 2.04-.19.67-1.63zm-10.57.066l-.739.035-.238.564h.72l.257-.6zm3.705.293l-1.303.085-.394.96 1.287-.034zm11.839.255a6.718 6.718 0 0 1 2.777 1.717l-1.75 4.237c-.617-.584-1.15-.961-1.611-1.149l-1.201-.498zM4.733 8.22l-.976.154-.344.807.961-.12.36-.841zm4.186 0l-1.594.052-.549 1.354L8.37 9.54zm1.957.668L8.99 9.04l-.619 1.508 1.87-.135.636-1.527zm2.247.275l-2.007.12-.703 1.665 2.042-.156zM2.52 9.267l-.718.033-.24.549.718-.016zm3.725.273l-1.289.07-.41.96 1.287-.03.412-1zm1.87.6l-1.596.05-.55 1.356 1.598-.084.547-1.322zm-4.186.037l-.979.136-.324.805.96-.119zm6.14.633l-1.87.154-.653 1.527 1.906-.154zm2.267.275l-2.026.12-.686 1.663 2.025-.172zm-10.569.031l-.739.037-.238.565.72-.016zm3.673.362l-1.289.068-.41.978 1.305-.05zm-2.285.533l-.976.154-.326.805.96-.12.342-.84zm4.153.07l-1.596.066-.565 1.356 1.612-.084zm1.957.666l-1.889.154-.617 1.526 1.886-.15zm2.28.223l-2.025.12-.685 1.665 2.041-.172.67-1.613zm-10.584.05l-.738.053L0 13.64l.72-.02.24-.6zm3.705.31l-1.285.07-.395.976 1.287-.05.393-.997zm11.923.07c1.08.29 2.024.821 2.814 1.613l-1.715 4.183c-.892-.754-1.82-1.32-2.814-1.664l1.715-4.133zm-10.036.515L4.956 14l-.549 1.32 1.578-.066.567-1.338zm-4.184.014l-.996.156-.309.79.961-.106zm6.14.67l-1.904.154-.617 1.527 1.89-.154.632-1.527zm2.231.324l-2.025.123-.686 1.682 2.026-.174zm-6.863.328l-1.3.068-.397.98 1.285-.054zm1.871.584l-1.578.068-.566 1.334 1.595-.064zm1.953.701l-1.867.137-.635 1.51 1.87-.137zm2.23.31l-2.005.122-.703 1.68 2.04-.19.67-1.61z"></path>
</svg>{" "} </svg>{" "}

View File

@ -52,11 +52,10 @@
.card .metaIcon { .card .metaIcon {
display: inline; display: inline;
width: 16px; width: 1.25em;
height: 16px; height: 1.25em;
vertical-align: -0.3em; vertical-align: -0.25em;
margin-right: 0.5em; margin-right: 0.5em;
stroke-width: 0.75;
} }
.card .metaLanguage { .card .metaLanguage {

View File

@ -1,12 +1,11 @@
import { graphql } from "@octokit/graphql"; import { graphql } from "@octokit/graphql";
import { GitForkIcon, StarIcon } from "lucide-react";
import PageTitle from "../../components/PageTitle"; import PageTitle from "../../components/PageTitle";
import Link from "../../components/Link"; import Link from "../../components/Link";
import RelativeTime from "../../components/RelativeTime"; import RelativeTime from "../../components/RelativeTime";
import commaNumber from "comma-number"; import commaNumber from "comma-number";
import config from "../../lib/config/constants"; import config from "../../lib/config/constants";
import { metadata as defaultMetadata } from "../layout"; import { metadata as defaultMetadata } from "../layout";
import { GoStar, GoRepoForked } from "react-icons/go";
import { SiGithub } from "react-icons/si";
import type { Metadata } from "next"; import type { Metadata } from "next";
import type { User, Repository } from "@octokit/graphql-schema"; import type { User, Repository } from "@octokit/graphql-schema";
@ -144,7 +143,7 @@ export default async function Page() {
plain plain
className={styles.metaLink} className={styles.metaLink}
> >
<GoStar className={styles.metaIcon} /> <StarIcon size="1.25em" className={styles.metaIcon} />
{commaNumber(repo.stars)} {commaNumber(repo.stars)}
</Link> </Link>
</div> </div>
@ -159,7 +158,7 @@ export default async function Page() {
plain plain
className={styles.metaLink} className={styles.metaLink}
> >
<GoRepoForked className={styles.metaIcon} /> <GitForkIcon size="1.25em" className={styles.metaIcon} />
{commaNumber(repo.forks)} {commaNumber(repo.forks)}
</Link> </Link>
</div> </div>
@ -183,7 +182,11 @@ export default async function Page() {
> >
<Link href={`https://github.com/${config.authorSocial.github}`}> <Link href={`https://github.com/${config.authorSocial.github}`}>
View more on{" "} View more on{" "}
<SiGithub <svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
height="1.2em"
width="1.2em"
style={{ style={{
display: "inline", display: "inline",
width: "1.2em", width: "1.2em",
@ -192,7 +195,9 @@ export default async function Page() {
margin: "0 0.15em", margin: "0 0.15em",
fill: "var(--colors-text)", fill: "var(--colors-text)",
}} }}
/>{" "} >
<path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
</svg>{" "}
GitHub... GitHub...
</Link> </Link>
</p> </p>

View File

@ -1,4 +1,5 @@
.button { .button {
color: var(--colors-mediumDark);
line-height: 1px; line-height: 1px;
cursor: pointer; cursor: pointer;
} }

View File

@ -4,7 +4,7 @@ import { forwardRef, useState, useEffect } from "react";
import innerText from "react-innertext"; import innerText from "react-innertext";
import copy from "copy-to-clipboard"; import copy from "copy-to-clipboard";
import clsx from "clsx"; import clsx from "clsx";
import { FiClipboard, FiCheck } from "react-icons/fi"; import { ClipboardIcon, CheckIcon } from "lucide-react";
import type { ReactNode, Ref, ComponentPropsWithoutRef, ElementRef, MouseEventHandler } from "react"; import type { ReactNode, Ref, ComponentPropsWithoutRef, ElementRef, MouseEventHandler } from "react";
import styles from "./CopyButton.module.css"; import styles from "./CopyButton.module.css";
@ -57,7 +57,11 @@ const CopyButton = (
className={clsx(styles.button, copied && styles.copied, className)} className={clsx(styles.button, copied && styles.copied, className)}
{...rest} {...rest}
> >
{copied ? <FiCheck className={styles.icon} /> : <FiClipboard className={styles.icon} />} {copied ? (
<CheckIcon size="1.25em" className={styles.icon} />
) : (
<ClipboardIcon size="1.25em" className={styles.icon} />
)}
</button> </button>
); );
}; };

View File

@ -21,8 +21,8 @@
color: var(--colors-mediumDark) !important; color: var(--colors-mediumDark) !important;
} }
.link.hover:hover, .link:has(.icon):hover,
.link.hover:focus-visible { .link:has(.icon):focus-visible {
color: var(--colors-medium) !important; color: var(--colors-medium) !important;
} }
@ -32,7 +32,7 @@
} }
.link.underline:hover, .link.underline:hover,
.link.hover:focus-visible { .link.underline:focus-visible {
border-bottom-color: var(--colors-kindaLight); border-bottom-color: var(--colors-kindaLight);
} }
@ -41,7 +41,7 @@
width: 1.25em; width: 1.25em;
height: 1.25em; height: 1.25em;
vertical-align: -0.25em; vertical-align: -0.25em;
margin: 0 0.075em; margin: 0 0.1em;
} }
.heart { .heart {

View File

@ -1,7 +1,6 @@
import clsx from "clsx"; import clsx from "clsx";
import { HeartIcon } from "lucide-react";
import Link from "../Link"; import Link from "../Link";
import { GoHeartFill } from "react-icons/go";
import { SiNextdotjs } from "react-icons/si";
import config from "../../lib/config/constants"; import config from "../../lib/config/constants";
import type { ComponentPropsWithoutRef } from "react"; import type { ComponentPropsWithoutRef } from "react";
@ -28,7 +27,7 @@ const Footer = ({ className, ...rest }: FooterProps) => {
<div> <div>
Made with{" "} Made with{" "}
<span className={styles.heart} title="Love"> <span className={styles.heart} title="Love">
<GoHeartFill className={styles.icon} style={{ strokeWidth: 2 }} /> <HeartIcon size="1.25em" fill="currentColor" className={styles.icon} />
</span>{" "} </span>{" "}
and{" "} and{" "}
<Link <Link
@ -36,9 +35,20 @@ const Footer = ({ className, ...rest }: FooterProps) => {
title="Powered by Next.js" title="Powered by Next.js"
aria-label="Next.js" aria-label="Next.js"
plain plain
className={clsx(styles.link, styles.hover)} className={styles.link}
> >
<SiNextdotjs className={styles.icon} /> <svg
xmlns="http://www.w3.org/2000/svg"
fill="currentColor"
stroke="currentColor"
strokeWidth="0"
viewBox="0 0 24 24"
height="1.25em"
width="1.25em"
className={styles.icon}
>
<path d="M18.665 21.978C16.758 23.255 14.465 24 12 24 5.377 24 0 18.623 0 12S5.377 0 12 0s12 5.377 12 12c0 3.583-1.574 6.801-4.067 9.001L9.219 7.2H7.2v9.596h1.615V9.251l9.85 12.727Zm-3.332-8.533 1.6 2.061V7.2h-1.6v6.245Z"></path>
</svg>
</Link> </Link>
.{" "} .{" "}
<Link <Link

View File

@ -1,5 +1,5 @@
import Link from "../Link"; import Link from "../Link";
import { FiLink } from "react-icons/fi"; import { LinkIcon } from "lucide-react";
import type { ComponentPropsWithoutRef } from "react"; import type { ComponentPropsWithoutRef } from "react";
export type HeadingAnchorProps = Omit<ComponentPropsWithoutRef<typeof Link>, "href"> & { export type HeadingAnchorProps = Omit<ComponentPropsWithoutRef<typeof Link>, "href"> & {
@ -9,8 +9,8 @@ export type HeadingAnchorProps = Omit<ComponentPropsWithoutRef<typeof Link>, "hr
const HeadingAnchor = ({ id, title, ...rest }: HeadingAnchorProps) => { const HeadingAnchor = ({ id, title, ...rest }: HeadingAnchorProps) => {
return ( return (
<Link href={`#${id}`} title={`Jump to "${title}"`} aria-hidden plain style={{ lineHeight: 1 }} {...rest}> <Link href={`#${id}`} title={`Jump to "${title}"`} aria-hidden plain {...rest}>
<FiLink size="0.8em" /> <LinkIcon size="0.8em" />
</Link> </Link>
); );
}; };

View File

@ -6,6 +6,7 @@ import MenuItem from "../MenuItem";
import ThemeToggle from "../ThemeToggle"; import ThemeToggle from "../ThemeToggle";
import { menuItems } from "../../lib/config/menu"; import { menuItems } from "../../lib/config/menu";
import type { ComponentPropsWithoutRef } from "react"; import type { ComponentPropsWithoutRef } from "react";
import type { LucideIcon } from "lucide-react";
import styles from "./Menu.module.css"; import styles from "./Menu.module.css";
@ -28,7 +29,7 @@ const Menu = ({ className, ...rest }: MenuProps) => {
})} })}
<li className={styles.menuItem}> <li className={styles.menuItem}>
<MenuItem icon={ThemeToggle} /> <MenuItem icon={ThemeToggle as LucideIcon} />
</li> </li>
</ul> </ul>
); );

View File

@ -1,15 +1,15 @@
import clsx from "clsx"; import clsx from "clsx";
import Link from "../Link"; import Link from "../Link";
import type { Route } from "next"; import type { Route } from "next";
import type { IconType } from "react-icons";
import type { ComponentPropsWithoutRef } from "react"; import type { ComponentPropsWithoutRef } from "react";
import type { LucideIcon } from "lucide-react";
import styles from "./MenuItem.module.css"; import styles from "./MenuItem.module.css";
export type MenuItemProps = Omit<ComponentPropsWithoutRef<typeof Link>, "href"> & { export type MenuItemProps = Omit<ComponentPropsWithoutRef<typeof Link>, "href"> & {
text?: string; text?: string;
href?: Route; href?: Route;
icon?: IconType; icon?: LucideIcon;
current?: boolean; current?: boolean;
}; };
@ -18,7 +18,7 @@ const MenuItem = ({ text, href, icon, current, className, ...rest }: MenuItemPro
const item = ( const item = (
<> <>
{Icon && <Icon className={styles.icon} />} {Icon && <Icon size="1.25em" className={styles.icon} />}
{text && <span className={styles.label}>{text}</span>} {text && <span className={styles.label}>{text}</span>}
</> </>
); );

View File

@ -1,21 +1,14 @@
.title { .title {
margin-top: 0; margin-top: 0;
margin-bottom: 0.6em; margin-bottom: 0.6em;
font-size: 1.9em; font-size: 2em;
font-weight: 600; font-weight: 500;
text-transform: lowercase; text-transform: lowercase;
letter-spacing: 0.02em;
} }
.slug::before { .slug::before {
content: "\002E\002F"; /* "./" */ content: "\002E\002F"; /* "./" */
letter-spacing: 0.1em; letter-spacing: 0.1em;
color: var(--colors-mediumLight) !important; color: var(--colors-mediumLight);
margin-right: -0.1em; margin-right: -0.1em;
} }
@media (max-width: 768px) {
.title {
font-size: 2em;
}
}

View File

@ -1,16 +1,15 @@
"use client"; "use client";
import { useHasMounted, useTheme } from "../../hooks"; import { useHasMounted, useTheme } from "../../hooks";
import { FiSun, FiMoon } from "react-icons/fi"; import { EllipsisIcon, MoonIcon, SunIcon } from "lucide-react";
import { BsThreeDots } from "react-icons/bs"; import type { ComponentPropsWithoutRef } from "react";
import type { LucideIcon } from "lucide-react";
import styles from "./ThemeToggle.module.css"; import styles from "./ThemeToggle.module.css";
export type ThemeToggleProps = { export type ThemeToggleProps = ComponentPropsWithoutRef<LucideIcon>;
className?: string;
};
const ThemeToggle = ({ className }: ThemeToggleProps) => { const ThemeToggle = ({ ...rest }: ThemeToggleProps) => {
const hasMounted = useHasMounted(); const hasMounted = useHasMounted();
const { theme, setTheme } = useTheme(); const { theme, setTheme } = useTheme();
@ -18,7 +17,7 @@ const ThemeToggle = ({ className }: ThemeToggleProps) => {
if (!hasMounted) { if (!hasMounted) {
return ( return (
<div className={styles.toggle}> <div className={styles.toggle}>
<BsThreeDots className={className} style={{ fill: "var(--colors-mediumLight)" }} /> <EllipsisIcon style={{ stroke: "var(--colors-mediumLight)" }} {...rest} />
</div> </div>
); );
} }
@ -30,7 +29,7 @@ const ThemeToggle = ({ className }: ThemeToggleProps) => {
title={theme === "light" ? "Toggle Dark Mode" : "Toggle Light Mode"} title={theme === "light" ? "Toggle Dark Mode" : "Toggle Light Mode"}
aria-label={theme === "light" ? "Toggle Dark Mode" : "Toggle Light Mode"} aria-label={theme === "light" ? "Toggle Dark Mode" : "Toggle Light Mode"}
> >
{theme === "light" ? <FiSun className={className} /> : <FiMoon className={className} />} {theme === "light" ? <SunIcon {...rest} /> : <MoonIcon {...rest} />}
</button> </button>
); );
}; };

View File

@ -1,25 +1,25 @@
import { FiHome, FiEdit3, FiCode, FiMail } from "react-icons/fi"; import { CodeIcon, HomeIcon, MailIcon, PencilLineIcon } from "lucide-react";
import type { MenuItemProps } from "../../components/MenuItem"; import type { MenuItemProps } from "../../components/MenuItem";
export const menuItems: MenuItemProps[] = [ export const menuItems: MenuItemProps[] = [
{ {
text: "Home", text: "Home",
href: "/", href: "/",
icon: FiHome, icon: HomeIcon,
}, },
{ {
text: "Notes", text: "Notes",
href: "/notes", href: "/notes",
icon: FiEdit3, icon: PencilLineIcon,
}, },
{ {
text: "Projects", text: "Projects",
href: "/projects", href: "/projects",
icon: FiCode, icon: CodeIcon,
}, },
{ {
text: "Contact", text: "Contact",
href: "/contact", href: "/contact",
icon: FiMail, icon: MailIcon,
}, },
]; ];

View File

@ -1,5 +1,4 @@
import Link from "../../components/Link"; import Link from "../../components/Link";
import { SiGithub } from "react-icons/si";
import featuredImage from "./covid19dashboards.png"; import featuredImage from "./covid19dashboards.png";
export const frontmatter = { export const frontmatter = {
@ -13,12 +12,23 @@ export const frontmatter = {
export const OctocatLink = ({ repo }) => { export const OctocatLink = ({ repo }) => {
return ( return (
<Link <Link href={`https://github.com/${repo}`} plain style={{ margin: "0 0.4em" }}>
href={`https://github.com/${repo}`} <svg
plain xmlns="http://www.w3.org/2000/svg"
style={{ margin: "0 0.4em", color: "var(--colors-text) !important" }} strokeWidth="0"
> viewBox="0 0 24 24"
<SiGithub style={{ display: "inline", height: "1.2em", width: "1.2em", verticalAlign: "-0.2em" }} /> height="1.2em"
width="1.2em"
style={{
display: "inline",
height: "1.2em",
width: "1.2em",
verticalAlign: "-0.2em",
fill: "var(--colors-text)",
}}
>
<path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
</svg>
</Link> </Link>
); );
}; };

View File

@ -23,9 +23,9 @@
"@giscus/react": "^3.1.0", "@giscus/react": "^3.1.0",
"@mdx-js/loader": "^3.1.0", "@mdx-js/loader": "^3.1.0",
"@mdx-js/react": "^3.1.0", "@mdx-js/react": "^3.1.0",
"@next/bundle-analyzer": "15.2.2-canary.7", "@next/bundle-analyzer": "15.3.0-canary.0",
"@next/mdx": "15.2.2-canary.7", "@next/mdx": "15.3.0-canary.0",
"@next/third-parties": "15.2.2-canary.7", "@next/third-parties": "15.3.0-canary.0",
"@octokit/graphql": "^8.2.1", "@octokit/graphql": "^8.2.1",
"@octokit/graphql-schema": "^15.26.0", "@octokit/graphql-schema": "^15.26.0",
"@prisma/client": "^6.5.0", "@prisma/client": "^6.5.0",
@ -35,8 +35,9 @@
"dayjs": "^1.11.13", "dayjs": "^1.11.13",
"fast-glob": "^3.3.3", "fast-glob": "^3.3.3",
"feed": "^4.2.2", "feed": "^4.2.2",
"lucide-react": "0.479.0",
"modern-normalize": "^3.0.1", "modern-normalize": "^3.0.1",
"next": "15.2.2-canary.7", "next": "15.3.0-canary.0",
"obj-str": "^1.1.0", "obj-str": "^1.1.0",
"p-map": "^7.0.3", "p-map": "^7.0.3",
"p-memoize": "^7.1.1", "p-memoize": "^7.1.1",
@ -45,7 +46,6 @@
"react": "19.0.0", "react": "19.0.0",
"react-dom": "19.0.0", "react-dom": "19.0.0",
"react-error-boundary": "^5.0.0", "react-error-boundary": "^5.0.0",
"react-icons": "5.5.0",
"react-innertext": "^1.1.5", "react-innertext": "^1.1.5",
"react-is": "19.0.0", "react-is": "19.0.0",
"react-textarea-autosize": "^8.5.7", "react-textarea-autosize": "^8.5.7",
@ -78,7 +78,7 @@
"@types/react-is": "^19.0.0", "@types/react-is": "^19.0.0",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"eslint": "^9.22.0", "eslint": "^9.22.0",
"eslint-config-next": "15.2.2-canary.7", "eslint-config-next": "15.3.0-canary.0",
"eslint-config-prettier": "^10.1.1", "eslint-config-prettier": "^10.1.1",
"eslint-plugin-import": "^2.31.0", "eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-jsx-a11y": "^6.10.2",

156
pnpm-lock.yaml generated
View File

@ -21,14 +21,14 @@ importers:
specifier: ^3.1.0 specifier: ^3.1.0
version: 3.1.0(@types/react@19.0.10)(react@19.0.0) version: 3.1.0(@types/react@19.0.10)(react@19.0.0)
'@next/bundle-analyzer': '@next/bundle-analyzer':
specifier: 15.2.2-canary.7 specifier: 15.3.0-canary.0
version: 15.2.2-canary.7 version: 15.3.0-canary.0
'@next/mdx': '@next/mdx':
specifier: 15.2.2-canary.7 specifier: 15.3.0-canary.0
version: 15.2.2-canary.7(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0)) version: 15.3.0-canary.0(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0))
'@next/third-parties': '@next/third-parties':
specifier: 15.2.2-canary.7 specifier: 15.3.0-canary.0
version: 15.2.2-canary.7(next@15.2.2-canary.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) version: 15.3.0-canary.0(next@15.3.0-canary.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)
'@octokit/graphql': '@octokit/graphql':
specifier: ^8.2.1 specifier: ^8.2.1
version: 8.2.1 version: 8.2.1
@ -56,12 +56,15 @@ importers:
feed: feed:
specifier: ^4.2.2 specifier: ^4.2.2
version: 4.2.2 version: 4.2.2
lucide-react:
specifier: 0.479.0
version: 0.479.0(react@19.0.0)
modern-normalize: modern-normalize:
specifier: ^3.0.1 specifier: ^3.0.1
version: 3.0.1 version: 3.0.1
next: next:
specifier: 15.2.2-canary.7 specifier: 15.3.0-canary.0
version: 15.2.2-canary.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) version: 15.3.0-canary.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
obj-str: obj-str:
specifier: ^1.1.0 specifier: ^1.1.0
version: 1.1.0 version: 1.1.0
@ -86,9 +89,6 @@ importers:
react-error-boundary: react-error-boundary:
specifier: ^5.0.0 specifier: ^5.0.0
version: 5.0.0(react@19.0.0) version: 5.0.0(react@19.0.0)
react-icons:
specifier: 5.5.0
version: 5.5.0(react@19.0.0)
react-innertext: react-innertext:
specifier: ^1.1.5 specifier: ^1.1.5
version: 1.1.5(@types/react@19.0.10)(react@19.0.0) version: 1.1.5(@types/react@19.0.10)(react@19.0.0)
@ -181,8 +181,8 @@ importers:
specifier: ^9.22.0 specifier: ^9.22.0
version: 9.22.0 version: 9.22.0
eslint-config-next: eslint-config-next:
specifier: 15.2.2-canary.7 specifier: 15.3.0-canary.0
version: 15.2.2-canary.7(eslint@9.22.0)(typescript@5.8.2) version: 15.3.0-canary.0(eslint@9.22.0)(typescript@5.8.2)
eslint-config-prettier: eslint-config-prettier:
specifier: ^10.1.1 specifier: ^10.1.1
version: 10.1.1(eslint@9.22.0) version: 10.1.1(eslint@9.22.0)
@ -602,17 +602,17 @@ packages:
'@types/react': '>=16' '@types/react': '>=16'
react: '>=16' react: '>=16'
'@next/bundle-analyzer@15.2.2-canary.7': '@next/bundle-analyzer@15.3.0-canary.0':
resolution: {integrity: sha512-VC24nH2u5sIr0+dySVIqCzPkxx75O1VQXgnlAtxdj2BZuWUWgA3MY7nl/4aMERI3Iz670slt1eeO8J/uPJE9/w==} resolution: {integrity: sha512-7xMSGa0whsN8igWtsmliaMF9x1BQro0sysoTKz+9B6mLOE481+C//ZsLK9hAM4b0MCL3gYAFKgBzcGaWT2Q6Yg==}
'@next/env@15.2.2-canary.7': '@next/env@15.3.0-canary.0':
resolution: {integrity: sha512-j1y9ucHqzNNbEN6Jqd7AWimUYzk/oG00SbDb9IaGX/61J6aOKTF5cSZ8AAgkm2IqhvELaXfOhk/hHwG8N0I2uQ==} resolution: {integrity: sha512-DsS8aqEHx5JeyPel3GaHtg5p9zytWsU17b6kTFPm19OmaAdh7AaNyDw4a/0170vdB90Gi/dXe87sInRRHRetfw==}
'@next/eslint-plugin-next@15.2.2-canary.7': '@next/eslint-plugin-next@15.3.0-canary.0':
resolution: {integrity: sha512-wuxlmTw3PiRwHOdlb+43vH9ggcS9HLLzC3nROkFp3AWjj/ZQg71T0zybB64Vu8OicYoLTwaZOJP/EFDYLpHTMA==} resolution: {integrity: sha512-uYOOe6k0obZMUMX8dfWeRHy9zQd2zZCSHGpeMnt5gJ5W0YdbuRi/WvsT/kZDPfqYuyT0rTpViKymvRCGYPvzxw==}
'@next/mdx@15.2.2-canary.7': '@next/mdx@15.3.0-canary.0':
resolution: {integrity: sha512-CZzPi6YQvA86IE0EqkeIn9Qh95baOLZ/0yqXsMBhHOwx9nV1g9twOEFGP0ro0DM+7R++e32N7zCEaBG7PTi+zA==} resolution: {integrity: sha512-6RSTK8tXja6etVRsRP+4qwk4cBZ4mn4i3ZSIEUw0fAKmo8QzxOW+ZWuAqOqBCf8WgxyOegYUcqjUzstR+aEdKQ==}
peerDependencies: peerDependencies:
'@mdx-js/loader': '>=0.15.0' '@mdx-js/loader': '>=0.15.0'
'@mdx-js/react': '>=0.15.0' '@mdx-js/react': '>=0.15.0'
@ -622,56 +622,56 @@ packages:
'@mdx-js/react': '@mdx-js/react':
optional: true optional: true
'@next/swc-darwin-arm64@15.2.2-canary.7': '@next/swc-darwin-arm64@15.3.0-canary.0':
resolution: {integrity: sha512-C2++v9N6LowkahZj9IsuJ0JIzD/mVkGJ189iS1TM+zc39UyOJ1U6dgyW6MZ9ogDO+p4l9Tj8tO0S2ZU0DXmUwA==} resolution: {integrity: sha512-b7coo/zIlV5j6ouCyo7HaZr31JSaq37AWJMtzP2midjklGqA2ZnFEAOVAWHMz/niV/SdwFBLGA08fVTX0KCbaw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@next/swc-darwin-x64@15.2.2-canary.7': '@next/swc-darwin-x64@15.3.0-canary.0':
resolution: {integrity: sha512-dikxwyTTdbHnqt+ISiCBv9TZFDdpusXkvIM5Ldwxfeqe5wzBXRyJp8dDs6JSJ871txqInt3aZrUQy73MdL9kfA==} resolution: {integrity: sha512-CBKyXc/fUA0ehOf707hwBIRMFMG94Udv7HK7ddBUED4P6xFtk8uohxZ9865Ms/K4c/qX+WS0V3QzPTfjbdI24w==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@next/swc-linux-arm64-gnu@15.2.2-canary.7': '@next/swc-linux-arm64-gnu@15.3.0-canary.0':
resolution: {integrity: sha512-t26JgARXfqbsVFJriQyb2ID4mJMsr8JZRmNZgj5YJK3Ybhnp/xFGWE7QxIZcYdvkrNzzRZr28xZYg2dwEnE5OQ==} resolution: {integrity: sha512-FeKG+2YVcxAwAGXCvbYTy2skJ5k5J6EzRhfAqQ6pMuDQkfRZLDuMRKfv37c3BsA4H/MJy47cPXCnS5dE9WjJVQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@next/swc-linux-arm64-musl@15.2.2-canary.7': '@next/swc-linux-arm64-musl@15.3.0-canary.0':
resolution: {integrity: sha512-o8o/ck07RxkYya5K6FzMB6LGtLkN7E6rEFXOhSQsMrwvz0cSjeALWVwYsVEtZmEEywwor1RPLxQM+ndTUo0KUA==} resolution: {integrity: sha512-E8OZM3hYQ3ftxRTqNCVHmWC5CnC9tCrKzWBvBDUXD2SV9VMat3sv7ido22W1+9DFhYxC9qHuPNZCt1B0M/kvMQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@next/swc-linux-x64-gnu@15.2.2-canary.7': '@next/swc-linux-x64-gnu@15.3.0-canary.0':
resolution: {integrity: sha512-JVNNQzrz9wZ0MJNUQwN/KtLCjnm3zAn+j5pe3GjDTHoLcBmO/5YFp0TP/BF2sGSUTic6tgsvU/5lxHuB0Zo49A==} resolution: {integrity: sha512-T6Zt3mdDqUpDxQCFmw+JfYLvmxsFWQaX9ECR2nXHoztRa75GGAnr0DBr8T1OJXH5YVLSz3bDsAuwzuwdSSgW4w==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@next/swc-linux-x64-musl@15.2.2-canary.7': '@next/swc-linux-x64-musl@15.3.0-canary.0':
resolution: {integrity: sha512-+8EVLgVk6zNYeTngx+qgXNr8gPlyrKh8gxrvUp5Zu2RdYoPxCLlockgMCQmvOTVfzM6h3GXXPcwMBnJIzFd18Q==} resolution: {integrity: sha512-4SvZWk0BBFuByZHRh+00tr6e93AnIgCRka7aVNOxvohmUqJpKDW4TPCz+SzRvS2qKcvoEgmQ6tS1eYUk6V4czQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@next/swc-win32-arm64-msvc@15.2.2-canary.7': '@next/swc-win32-arm64-msvc@15.3.0-canary.0':
resolution: {integrity: sha512-rnoDG7VPT5vr9HJOfUuDYp2xQKNeMDLYbLuS/xySrKnyhEYYJRm0leNRNOtOxMyg4nSQf5Yr2e1MFuAU8/hByw==} resolution: {integrity: sha512-s/SYd2gbUUfB/pRLUs8s9LP2jkuo+rUYsoOrvTte3gjzpIfc7XMz9KVZtWw6gWIKtKsy+ip0pAGx/qFsEQOeXA==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@next/swc-win32-x64-msvc@15.2.2-canary.7': '@next/swc-win32-x64-msvc@15.3.0-canary.0':
resolution: {integrity: sha512-5eKM1usgTg5H3Mpr275Tdvmr+obdxJbis5MTIxTFNWVw4KbxM4NW3GVbG43Z71DkizLm92AVtqO6O3YoB6bSvA==} resolution: {integrity: sha512-Kz4lnTvVpY4dr3mHs9MvuJbLXM0JWzBwNJntt4dBmRRUmYqTTpvdx6nXwLBw6S6uOUq3fhKljxCGHV4qiowK6g==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@next/third-parties@15.2.2-canary.7': '@next/third-parties@15.3.0-canary.0':
resolution: {integrity: sha512-d7gsLyprMrFy5FOCHn2t4W2alVs6gIVKcdnSpQrRmMOK6kkc2Qm+AzFpzzALjgdTjGYq38gYjoup5Kbf0iRiZQ==} resolution: {integrity: sha512-gcjV+VS/JT/jGmP0lbaPImMvHndN8xUwhYpHmZrE/KGUK78ozHjx0ARtGMZDYpOXYnHu/xsUMUphXmBasc1M0Q==}
peerDependencies: peerDependencies:
next: ^13.0.0 || ^14.0.0 || ^15.0.0 next: ^13.0.0 || ^14.0.0 || ^15.0.0
react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
@ -1373,8 +1373,8 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'} engines: {node: '>=12'}
eslint-config-next@15.2.2-canary.7: eslint-config-next@15.3.0-canary.0:
resolution: {integrity: sha512-/wGWOrfR/S66JnRDGqUVes/tl/s91zA4e/L2g1I3xJNErnU5S1QcV5Io+FJbNYxFsynHtGp0EXqwra3CUbSPHw==} resolution: {integrity: sha512-yY81GoFDjajTnLq92PjBA0DuJWU8hmU88xlCE+OSCs+RuTp9Ta16+IZVVTZgWTz1zI/wVNtA8wMvc7qXs51aHA==}
peerDependencies: peerDependencies:
eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
typescript: '>=3.3.1' typescript: '>=3.3.1'
@ -2116,6 +2116,11 @@ packages:
lru-cache@10.4.3: lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
lucide-react@0.479.0:
resolution: {integrity: sha512-aBhNnveRhorBOK7uA4gDjgaf+YlHMdMhQ/3cupk6exM10hWlEU+2QtWYOfhXhjAsmdb6LeKR+NZnow4UxRRiTQ==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
markdown-extensions@2.0.0: markdown-extensions@2.0.0:
resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==}
engines: {node: '>=16'} engines: {node: '>=16'}
@ -2340,8 +2345,8 @@ packages:
natural-compare@1.4.0: natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
next@15.2.2-canary.7: next@15.3.0-canary.0:
resolution: {integrity: sha512-oQt/T9SPT4nhVWwNH3YkPo11GjfmOxImdlAtttkENzOiHDC782ec6HFR/4IZDGJrlHS54zf9mmKG2I6f099kgg==} resolution: {integrity: sha512-5PT9X65OBHwY22hu3O04ylZ4zznRhKdMOR1A4Hagw3eHrXO4UYtkcnhMErWq4BbrgYKYg+5XJ+kgNcHN7H8big==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -2612,11 +2617,6 @@ packages:
peerDependencies: peerDependencies:
react: '>=16.13.1' react: '>=16.13.1'
react-icons@5.5.0:
resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==}
peerDependencies:
react: '*'
react-innertext@1.1.5: react-innertext@1.1.5:
resolution: {integrity: sha512-PWAqdqhxhHIv80dT9znP2KvS+hfkbRovFp4zFYHFFlOoQLRiawIic81gKb3U1wEyJZgMwgs3JoLtwryASRWP3Q==} resolution: {integrity: sha512-PWAqdqhxhHIv80dT9znP2KvS+hfkbRovFp4zFYHFFlOoQLRiawIic81gKb3U1wEyJZgMwgs3JoLtwryASRWP3Q==}
peerDependencies: peerDependencies:
@ -3592,53 +3592,53 @@ snapshots:
'@types/react': 19.0.10 '@types/react': 19.0.10
react: 19.0.0 react: 19.0.0
'@next/bundle-analyzer@15.2.2-canary.7': '@next/bundle-analyzer@15.3.0-canary.0':
dependencies: dependencies:
webpack-bundle-analyzer: 4.10.1 webpack-bundle-analyzer: 4.10.1
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
- utf-8-validate - utf-8-validate
'@next/env@15.2.2-canary.7': {} '@next/env@15.3.0-canary.0': {}
'@next/eslint-plugin-next@15.2.2-canary.7': '@next/eslint-plugin-next@15.3.0-canary.0':
dependencies: dependencies:
fast-glob: 3.3.1 fast-glob: 3.3.1
'@next/mdx@15.2.2-canary.7(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0))': '@next/mdx@15.3.0-canary.0(@mdx-js/loader@3.1.0(acorn@8.14.1))(@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0))':
dependencies: dependencies:
source-map: 0.7.4 source-map: 0.7.4
optionalDependencies: optionalDependencies:
'@mdx-js/loader': 3.1.0(acorn@8.14.1) '@mdx-js/loader': 3.1.0(acorn@8.14.1)
'@mdx-js/react': 3.1.0(@types/react@19.0.10)(react@19.0.0) '@mdx-js/react': 3.1.0(@types/react@19.0.10)(react@19.0.0)
'@next/swc-darwin-arm64@15.2.2-canary.7': '@next/swc-darwin-arm64@15.3.0-canary.0':
optional: true optional: true
'@next/swc-darwin-x64@15.2.2-canary.7': '@next/swc-darwin-x64@15.3.0-canary.0':
optional: true optional: true
'@next/swc-linux-arm64-gnu@15.2.2-canary.7': '@next/swc-linux-arm64-gnu@15.3.0-canary.0':
optional: true optional: true
'@next/swc-linux-arm64-musl@15.2.2-canary.7': '@next/swc-linux-arm64-musl@15.3.0-canary.0':
optional: true optional: true
'@next/swc-linux-x64-gnu@15.2.2-canary.7': '@next/swc-linux-x64-gnu@15.3.0-canary.0':
optional: true optional: true
'@next/swc-linux-x64-musl@15.2.2-canary.7': '@next/swc-linux-x64-musl@15.3.0-canary.0':
optional: true optional: true
'@next/swc-win32-arm64-msvc@15.2.2-canary.7': '@next/swc-win32-arm64-msvc@15.3.0-canary.0':
optional: true optional: true
'@next/swc-win32-x64-msvc@15.2.2-canary.7': '@next/swc-win32-x64-msvc@15.3.0-canary.0':
optional: true optional: true
'@next/third-parties@15.2.2-canary.7(next@15.2.2-canary.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)': '@next/third-parties@15.3.0-canary.0(next@15.3.0-canary.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)':
dependencies: dependencies:
next: 15.2.2-canary.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: 15.3.0-canary.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react: 19.0.0 react: 19.0.0
third-party-capital: 1.0.20 third-party-capital: 1.0.20
@ -4489,9 +4489,9 @@ snapshots:
escape-string-regexp@5.0.0: {} escape-string-regexp@5.0.0: {}
eslint-config-next@15.2.2-canary.7(eslint@9.22.0)(typescript@5.8.2): eslint-config-next@15.3.0-canary.0(eslint@9.22.0)(typescript@5.8.2):
dependencies: dependencies:
'@next/eslint-plugin-next': 15.2.2-canary.7 '@next/eslint-plugin-next': 15.3.0-canary.0
'@rushstack/eslint-patch': 1.10.5 '@rushstack/eslint-patch': 1.10.5
'@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2) '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.22.0)(typescript@5.8.2))(eslint@9.22.0)(typescript@5.8.2)
'@typescript-eslint/parser': 8.26.0(eslint@9.22.0)(typescript@5.8.2) '@typescript-eslint/parser': 8.26.0(eslint@9.22.0)(typescript@5.8.2)
@ -5459,6 +5459,10 @@ snapshots:
lru-cache@10.4.3: {} lru-cache@10.4.3: {}
lucide-react@0.479.0(react@19.0.0):
dependencies:
react: 19.0.0
markdown-extensions@2.0.0: {} markdown-extensions@2.0.0: {}
markdown-table@3.0.4: {} markdown-table@3.0.4: {}
@ -5935,9 +5939,9 @@ snapshots:
natural-compare@1.4.0: {} natural-compare@1.4.0: {}
next@15.2.2-canary.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0): next@15.3.0-canary.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies: dependencies:
'@next/env': 15.2.2-canary.7 '@next/env': 15.3.0-canary.0
'@swc/counter': 0.1.3 '@swc/counter': 0.1.3
'@swc/helpers': 0.5.15 '@swc/helpers': 0.5.15
busboy: 1.6.0 busboy: 1.6.0
@ -5947,14 +5951,14 @@ snapshots:
react-dom: 19.0.0(react@19.0.0) react-dom: 19.0.0(react@19.0.0)
styled-jsx: 5.1.6(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0)
optionalDependencies: optionalDependencies:
'@next/swc-darwin-arm64': 15.2.2-canary.7 '@next/swc-darwin-arm64': 15.3.0-canary.0
'@next/swc-darwin-x64': 15.2.2-canary.7 '@next/swc-darwin-x64': 15.3.0-canary.0
'@next/swc-linux-arm64-gnu': 15.2.2-canary.7 '@next/swc-linux-arm64-gnu': 15.3.0-canary.0
'@next/swc-linux-arm64-musl': 15.2.2-canary.7 '@next/swc-linux-arm64-musl': 15.3.0-canary.0
'@next/swc-linux-x64-gnu': 15.2.2-canary.7 '@next/swc-linux-x64-gnu': 15.3.0-canary.0
'@next/swc-linux-x64-musl': 15.2.2-canary.7 '@next/swc-linux-x64-musl': 15.3.0-canary.0
'@next/swc-win32-arm64-msvc': 15.2.2-canary.7 '@next/swc-win32-arm64-msvc': 15.3.0-canary.0
'@next/swc-win32-x64-msvc': 15.2.2-canary.7 '@next/swc-win32-x64-msvc': 15.3.0-canary.0
sharp: 0.33.5 sharp: 0.33.5
transitivePeerDependencies: transitivePeerDependencies:
- '@babel/core' - '@babel/core'
@ -6215,10 +6219,6 @@ snapshots:
'@babel/runtime': 7.26.9 '@babel/runtime': 7.26.9
react: 19.0.0 react: 19.0.0
react-icons@5.5.0(react@19.0.0):
dependencies:
react: 19.0.0
react-innertext@1.1.5(@types/react@19.0.10)(react@19.0.0): react-innertext@1.1.5(@types/react@19.0.10)(react@19.0.0):
dependencies: dependencies:
'@types/react': 19.0.10 '@types/react': 19.0.10