Compare commits
2 Commits
435cfff1c1
...
1fb8ddc0a3
| Author | SHA1 | Date | |
|---|---|---|---|
| 1fb8ddc0a3 | |||
| 9e9a48e3d4 |
@ -68,6 +68,25 @@ export function PrevNextLinks() {
|
|||||||
const pageContext = usePageContext();
|
const pageContext = usePageContext();
|
||||||
|
|
||||||
const allLinks = navigation
|
const allLinks = navigation
|
||||||
|
.sort((a, b) => {
|
||||||
|
// positions order (for sorting):
|
||||||
|
// 1. start
|
||||||
|
// 2. auto | undefined
|
||||||
|
// 3. end
|
||||||
|
|
||||||
|
if (a.position === "start" && b.position !== "start") return -1;
|
||||||
|
if (a.position !== "start" && b.position === "start") return 1;
|
||||||
|
|
||||||
|
if (a.position === "end" && b.position !== "end") return 1;
|
||||||
|
if (a.position !== "end" && b.position === "end") return -1;
|
||||||
|
|
||||||
|
if (a.position === "auto" && b.position !== "auto") return -1;
|
||||||
|
if (a.position !== "auto" && b.position === "auto") return 1;
|
||||||
|
|
||||||
|
if (a.position === undefined && b.position !== undefined) return -1;
|
||||||
|
if (a.position !== undefined && b.position === undefined) return 1;
|
||||||
|
return 0;
|
||||||
|
})
|
||||||
.flatMap((section) => section.links)
|
.flatMap((section) => section.links)
|
||||||
.flatMap((link) => {
|
.flatMap((link) => {
|
||||||
return link.subitems ? [link, ...link.subitems] : link;
|
return link.subitems ? [link, ...link.subitems] : link;
|
||||||
|
|||||||
@ -44,21 +44,23 @@ type DocsHeaderProps = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export function DocsHeader(props: DocsHeaderProps) {
|
export function DocsHeader(props: DocsHeaderProps) {
|
||||||
const { urlPathname } = usePageContext();
|
const pageContext = usePageContext();
|
||||||
|
|
||||||
const section = navigation.find((section) =>
|
const getSection = () => {
|
||||||
section.links.find((link) => link.href === urlPathname),
|
return navigation.find((section) =>
|
||||||
|
section.links.find((link) => link.href === pageContext.urlPathname),
|
||||||
);
|
);
|
||||||
|
};
|
||||||
|
|
||||||
if (!props.title && !section) {
|
if (!props.title && !getSection()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<header class="mb-9 space-y-1">
|
<header class="mb-9 space-y-1">
|
||||||
{section && (
|
{getSection() && (
|
||||||
<p class="font-display text-sm font-medium text-violet-500">
|
<p class="font-display text-sm font-medium text-violet-500">
|
||||||
{section.title}
|
{getSection()?.title}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
{props.title && (
|
{props.title && (
|
||||||
|
|||||||
@ -52,7 +52,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.token.module,
|
.token.module,
|
||||||
.token.attr-name,
|
|
||||||
.token.keyword,
|
.token.keyword,
|
||||||
.token.rule,
|
.token.rule,
|
||||||
.token.pseudo-class,
|
.token.pseudo-class,
|
||||||
@ -67,6 +66,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.token.generic,
|
.token.generic,
|
||||||
|
.token.attr-name,
|
||||||
|
.token.boolean,
|
||||||
|
.token.number,
|
||||||
.token.class-name {
|
.token.class-name {
|
||||||
color: #C18401;
|
color: #C18401;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,12 +8,12 @@ const reactCreateElementSnippets = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "React sans JSX",
|
name: "React sans JSX",
|
||||||
codeLanguage: "js",
|
codeLanguage: "jsx",
|
||||||
code: `React.createElement("button", { className: "button" }, "Clique moi !");`,
|
code: `React.createElement("button", { className: "button" }, "Clique moi !");`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "React avec JSX",
|
name: "React avec JSX",
|
||||||
codeLanguage: "tsx",
|
codeLanguage: "jsx",
|
||||||
code: `<button className="button">Clique moi !</button>`,
|
code: `<button className="button">Clique moi !</button>`,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
@ -18,9 +18,8 @@ const reactUseButtonComponentSnippets = [
|
|||||||
name: "Utilisation du composant Button",
|
name: "Utilisation du composant Button",
|
||||||
codeLanguage: "jsx",
|
codeLanguage: "jsx",
|
||||||
withLineNumbers: true,
|
withLineNumbers: true,
|
||||||
code: `import React from "react";
|
code: `import { Button } from "./Button";
|
||||||
|
import React from "react";
|
||||||
import { Button } from "./Button";
|
|
||||||
|
|
||||||
export function App() {
|
export function App() {
|
||||||
return (
|
return (
|
||||||
@ -66,9 +65,8 @@ const reactUseButtonComponentPropsSnippets = [
|
|||||||
name: "Ajout de la prop `onClick`",
|
name: "Ajout de la prop `onClick`",
|
||||||
codeLanguage: "jsx",
|
codeLanguage: "jsx",
|
||||||
withLineNumbers: true,
|
withLineNumbers: true,
|
||||||
code: `import React from "react";
|
code: `import { Button } from "./Button";
|
||||||
|
import React from "react";
|
||||||
import { Button } from "./Button";
|
|
||||||
|
|
||||||
export function App() {
|
export function App() {
|
||||||
function handleClick() {
|
function handleClick() {
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import type { NavigationLink } from "@/libs/navigation";
|
||||||
|
|
||||||
import { chevronDown, chevronUp } from "solid-heroicons/solid";
|
import { chevronDown, chevronUp } from "solid-heroicons/solid";
|
||||||
import { createEffect, createSignal, For } from "solid-js";
|
import { createEffect, createSignal, For } from "solid-js";
|
||||||
import { usePageContext } from "vike-solid/usePageContext";
|
import { usePageContext } from "vike-solid/usePageContext";
|
||||||
@ -14,22 +16,32 @@ type NavigationItemProps = {
|
|||||||
function NavigationItem(props: NavigationItemProps) {
|
function NavigationItem(props: NavigationItemProps) {
|
||||||
const pageContext = usePageContext();
|
const pageContext = usePageContext();
|
||||||
|
|
||||||
const [isOpened, setIsOpened] = createSignal(
|
const checkIsLinkActive = (link: NavigationLink) => {
|
||||||
props.section.links.some(
|
return (
|
||||||
(link) =>
|
|
||||||
link.href === pageContext.urlPathname ||
|
link.href === pageContext.urlPathname ||
|
||||||
link.subitems?.some(
|
link.subitems?.some((subitem) => subitem.href === pageContext.urlPathname)
|
||||||
(subitem) => subitem.href === pageContext.urlPathname,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const checkIsActive = () => {
|
||||||
|
return props.section.links.some((link) => checkIsLinkActive(link));
|
||||||
|
};
|
||||||
|
|
||||||
|
const [isOpened, setIsOpened] = createSignal(checkIsActive());
|
||||||
|
|
||||||
|
createEffect(() => {
|
||||||
|
// If the current URL path is the same as the link's href, set isOpened to true
|
||||||
|
if (!isOpened() && checkIsActive()) {
|
||||||
|
setIsOpened(true);
|
||||||
|
}
|
||||||
|
}, [pageContext.urlPathname]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<h3
|
<h3
|
||||||
class={clsx(
|
class={clsx(
|
||||||
"font-display font-medium cursor-pointer",
|
"font-display font-medium cursor-pointer",
|
||||||
isOpened() ? "text-violet-600" : "text-slate-900",
|
checkIsActive() ? "text-violet-600" : "text-slate-900",
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
@ -65,12 +77,7 @@ function NavigationItem(props: NavigationItemProps) {
|
|||||||
<NavigationSubItem
|
<NavigationSubItem
|
||||||
link={link}
|
link={link}
|
||||||
onLinkClick={props.onLinkClick}
|
onLinkClick={props.onLinkClick}
|
||||||
isOpened={
|
isOpened={checkIsLinkActive(link)}
|
||||||
link.href === pageContext.urlPathname ||
|
|
||||||
link.subitems?.some(
|
|
||||||
(subitem) => subitem.href === pageContext.urlPathname,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
/>
|
/>
|
||||||
</li>
|
</li>
|
||||||
)}
|
)}
|
||||||
@ -82,7 +89,7 @@ function NavigationItem(props: NavigationItemProps) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type NavigationSubItemProps = {
|
type NavigationSubItemProps = {
|
||||||
link: (typeof navigation)[number]["links"][number];
|
link: NavigationLink;
|
||||||
onLinkClick?: (event: MouseEvent) => void;
|
onLinkClick?: (event: MouseEvent) => void;
|
||||||
isOpened?: boolean;
|
isOpened?: boolean;
|
||||||
};
|
};
|
||||||
@ -91,13 +98,15 @@ function NavigationSubItem(props: NavigationSubItemProps) {
|
|||||||
const [isOpened, setIsOpened] = createSignal(props.isOpened);
|
const [isOpened, setIsOpened] = createSignal(props.isOpened);
|
||||||
const pageContext = usePageContext();
|
const pageContext = usePageContext();
|
||||||
|
|
||||||
createEffect(() => {
|
const checkIsLinkActive = (link: NavigationLink) => {
|
||||||
setIsOpened(
|
return (
|
||||||
props.link.href === pageContext.urlPathname ||
|
link.href === pageContext.urlPathname ||
|
||||||
props.link.subitems?.some(
|
link.subitems?.some((subitem) => subitem.href === pageContext.urlPathname)
|
||||||
(subitem) => subitem.href === pageContext.urlPathname,
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
createEffect(() => {
|
||||||
|
setIsOpened(checkIsLinkActive(props.link) || props.isOpened);
|
||||||
}, [pageContext.urlPathname, props.link]);
|
}, [pageContext.urlPathname, props.link]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -136,7 +145,7 @@ function NavigationSubItem(props: NavigationSubItemProps) {
|
|||||||
props.link.subitems,
|
props.link.subitems,
|
||||||
},
|
},
|
||||||
props.link.href !== pageContext.urlPathname && "before:hidden",
|
props.link.href !== pageContext.urlPathname && "before:hidden",
|
||||||
isOpened()
|
checkIsLinkActive(props.link)
|
||||||
? "text-violet-500 before:bg-violet-500"
|
? "text-violet-500 before:bg-violet-500"
|
||||||
: "text-slate-500 before:bg-slate-300 hover:text-slate-600 hover:before:block",
|
: "text-slate-500 before:bg-slate-300 hover:text-slate-600 hover:before:block",
|
||||||
)}
|
)}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user