Compare commits

..

No commits in common. "08c5ecfb6ae90b9b138d2f5951b48e72f182e2d1" and "e2ad0bb5f9aa06e0c91758ec9718d8756570915f" have entirely different histories.

7 changed files with 42 additions and 31 deletions

View File

@ -27,19 +27,24 @@ type ButtonProps = {
| (JSX.IntrinsicElements["a"] & { href: string }) | (JSX.IntrinsicElements["a"] & { href: string })
); );
export function Button(props: ButtonProps) { export function Button({
const className = clsx( variant = "primary",
variantStyles[props.variant ?? "primary"], size = "md",
sizeStyles[props.size ?? "md"], className,
...props
}: ButtonProps) {
className = clsx(
variantStyles[variant],
sizeStyles[size],
"cursor-pointer", "cursor-pointer",
props.className, className,
); );
return "href" in props && props.href ? ( return "href" in props && props.href ? (
<Link <Link
{...(props as JSX.IntrinsicElements["a"])}
class={className} class={className}
href={props.href} href={props.href}
{...(props as JSX.IntrinsicElements["a"])}
/> />
) : ( ) : (
<button class={className} {...(props as JSX.IntrinsicElements["button"])} /> <button class={className} {...(props as JSX.IntrinsicElements["button"])} />

View File

@ -31,20 +31,25 @@ const icons = {
), ),
}; };
export default function Callout(props: { export default function Callout({
title,
children,
type = "note",
collapsible = false,
}: {
title: string; title: string;
children: JSX.Element; children: JSX.Element;
type?: keyof typeof styles; type?: keyof typeof styles;
collapsible?: boolean; collapsible?: boolean;
}) { }) {
const IconComponent = icons[props.type || "note"]; const IconComponent = icons[type];
return ( return (
<div <div
class={clsx( class={clsx(
"my-8 flex flex-col rounded-3xl p-6", "my-8 flex flex-col rounded-3xl p-6",
styles[props.type || "note"].container, styles[type].container,
{ "cursor-pointer": props.collapsible }, { "cursor-pointer": collapsible },
)} )}
> >
<div class="flex items-center gap-6"> <div class="flex items-center gap-6">
@ -52,16 +57,14 @@ export default function Callout(props: {
<p <p
class={clsx( class={clsx(
"!m-0 font-display text-xl text-balance", "!m-0 font-display text-xl text-balance",
styles[props.type || "note"].title, styles[type].title,
)} )}
> >
{props.title} {title}
</p> </p>
</div> </div>
<div class="mt-4 flex-auto"> <div class="mt-4 flex-auto">
<div class={clsx("prose mt-2.5", styles[props.type || "note"].body)}> <div class={clsx("prose mt-2.5", styles[type].body)}>{children}</div>
{props.children}
</div>
</div> </div>
</div> </div>
); );

View File

@ -63,7 +63,7 @@ function PageLink(props: PageLinkProps) {
} }
export function PrevNextLinks() { export function PrevNextLinks() {
const pageContext = usePageContext(); const { urlPathname } = usePageContext();
const allLinks = navigation const allLinks = navigation
.flatMap((section) => section.links) .flatMap((section) => section.links)
@ -72,15 +72,13 @@ export function PrevNextLinks() {
}); });
const getNeighboringLinks = () => { const getNeighboringLinks = () => {
const linkIndex = allLinks.findIndex( const linkIndex = allLinks.findIndex((link) => link.href === urlPathname);
(link) => link.href === pageContext.urlPathname,
);
if (linkIndex === -1) return [null, null]; if (linkIndex === -1) return [null, null];
const previousPage = allLinks[linkIndex - 1] || null; const previousPage = allLinks[linkIndex - 1] || null;
let nextPage = allLinks[linkIndex + 1] || null; let nextPage = allLinks[linkIndex + 1] || null;
if (nextPage?.href === pageContext.urlPathname) { if (nextPage?.href === urlPathname) {
nextPage = allLinks[linkIndex + 2] || null; nextPage = allLinks[linkIndex + 2] || null;
} }

View File

@ -114,13 +114,13 @@ function SearchInput() {
); );
} }
function HighlightQuery(props: { text: string; query: string }) { function HighlightQuery({ text, query }: { text: string; query: string }) {
return ( return (
<Highlighter <Highlighter
highlightClass="group-aria-selected:underline bg-transparent text-violet-600" highlightClass="group-aria-selected:underline bg-transparent text-violet-600"
searchWords={[props.query]} searchWords={[query]}
autoEscape={true} autoEscape={true}
textToHighlight={props.text} textToHighlight={text}
/> />
); );
} }

View File

@ -3,6 +3,7 @@ import type { JSXElement } from "solid-js";
import { TableOfContents } from "@/partials/TableOfContents"; import { TableOfContents } from "@/partials/TableOfContents";
import { PrevNextLinks } from "@/components/PrevNextLinks"; import { PrevNextLinks } from "@/components/PrevNextLinks";
import { usePageContext } from "vike-solid/usePageContext"; import { usePageContext } from "vike-solid/usePageContext";
import { clientOnly } from "vike-solid/clientOnly";
import { clock } from "solid-heroicons/outline"; import { clock } from "solid-heroicons/outline";
import { navigation } from "@/libs/navigation"; import { navigation } from "@/libs/navigation";
import { Prose } from "@/components/Prose"; import { Prose } from "@/components/Prose";
@ -12,6 +13,10 @@ type DocsLayoutProps = {
children: JSXElement; children: JSXElement;
}; };
// const TableOfContents = clientOnly(() =>
// import("@/partials/TableOfContents").then((m) => m.TableOfContents),
// );
export function DocsLayout(props: DocsLayoutProps) { export function DocsLayout(props: DocsLayoutProps) {
const pageContext = usePageContext(); const pageContext = usePageContext();

View File

@ -25,24 +25,24 @@ function MenuIcon(props: JSX.IntrinsicElements["svg"]) {
function CloseIcon(props: JSX.IntrinsicElements["svg"]) { function CloseIcon(props: JSX.IntrinsicElements["svg"]) {
return ( return (
<svg <svg
{...props}
aria-hidden="true" aria-hidden="true"
viewBox="0 0 24 24" viewBox="0 0 24 24"
fill="none" fill="none"
stroke-width="2" stroke-width="2"
stroke-linecap="round" stroke-linecap="round"
{...props}
> >
<path d="M5 5l14 14M19 5l-14 14" /> <path d="M5 5l14 14M19 5l-14 14" />
</svg> </svg>
); );
} }
function CloseOnNavigation(props: { close: () => void }) { function CloseOnNavigation({ close }: { close: () => void }) {
const pageContext = usePageContext(); const { urlPathname } = usePageContext();
createEffect(() => { createEffect(() => {
props.close(); close();
}, [pageContext.urlPathname, props.close]); }, [urlPathname, close]);
return null; return null;
} }

View File

@ -26,7 +26,7 @@ function NavigationItem(props: NavigationItemProps) {
return ( return (
<> <>
<h3 <h2
class={clsx( class={clsx(
"font-display font-medium cursor-pointer", "font-display font-medium cursor-pointer",
isOpened() ? "text-violet-600" : "text-slate-900", isOpened() ? "text-violet-600" : "text-slate-900",
@ -56,9 +56,9 @@ function NavigationItem(props: NavigationItemProps) {
<span class="text-slate-400"> ({props.section.links.length})</span> <span class="text-slate-400"> ({props.section.links.length})</span>
</button> </button>
</h3> </h2>
{isOpened() && ( {isOpened() && (
<ul class="!mt-0 ml-2 space-y-1 border-l-2 border-slate-100 lg:mt-4 lg:space-y-2 lg:border-slate-200 mb-2"> <ul class="!mt-0 ml-2 space-y-1 border-l-2 border-slate-100 lg:mt-4 lg:space-y-2 lg:border-slate-200">
<For each={props.section.links}> <For each={props.section.links}>
{(link) => ( {(link) => (
<li class="relative"> <li class="relative">