fix: Fix searchbar for production

This commit is contained in:
Gauthier Daniels 2025-04-13 12:03:28 +02:00
parent 30cf34268b
commit b0ad917f9b
52 changed files with 4510 additions and 1119 deletions

3
.env.example Normal file
View File

@ -0,0 +1,3 @@
PORT=5500
HMR_PORT=5501
NODE_ENV=development

View File

@ -1,9 +1,13 @@
import { buildFlexSearch, type SearchResult } from "@/services/FlexSearchService"; import { buildFlexSearch, type SearchResult } from "@/services/FlexSearchService";
import { docsService } from "@/services/DocsService"; import { docsService } from "@/services/DocsService";
export const onSearch = async (query: string): Promise<SearchResult[]> => { export const onSearch = async (query: string, maxResults?: number): Promise<SearchResult[]> => {
const search = buildFlexSearch(await docsService.fetchDocs()); const search = buildFlexSearch(await docsService.fetchDocs());
const results = search(query); const results = search(query);
if (maxResults) {
return results.slice(0, maxResults);
}
return results; return results;
}; };

View File

@ -1,26 +1,34 @@
// import type { SearchResult } from "@/lib/search"; import { useId, useState, useEffect, createContext, useContext, Fragment } from "react";
import type { SearchResult } from "@/services/FlexSearchService"; import { SearchResult } from "@/services/FlexSearchService";
import { forwardRef, Fragment, Suspense, useCallback, useEffect, useId, useRef, useState } from "react";
import Highlighter from "react-highlight-words";
import { usePageContext } from "vike-react/usePageContext";
import { navigate as routerNavigate } from "vike/client/router";
// import { usePathname, useRouter, useSearchParams } from "next/navigation";
import {
type AutocompleteApi,
type AutocompleteCollection,
type AutocompleteState,
createAutocomplete,
} from "@algolia/autocomplete-core";
import { Dialog, DialogPanel } from "@headlessui/react"; import { Dialog, DialogPanel } from "@headlessui/react";
import { useDebounce } from "@/hooks/useDebounce";
import Highlighter from "react-highlight-words";
import { navigation } from "@/lib/navigation";
import { navigate } from "vike/client/router";
import { onSearch } from "./Search.telefunc";
import clsx from "clsx"; import clsx from "clsx";
import { navigation } from "@/lib/navigation"; const SearchContext = createContext<{
import { onSearch } from "./Search.telefunc"; query: string;
close: () => void;
type EmptyObject = Record<string, never>; results: SearchResult[];
isLoading: boolean;
type Autocomplete = AutocompleteApi<SearchResult, React.SyntheticEvent, React.MouseEvent, React.KeyboardEvent>; isOpened: boolean;
setQuery: (query: string) => void;
setIsOpened: (isOpened: boolean) => void;
setIsLoading: (isLoading: boolean) => void;
setResults: (results: SearchResult[]) => void;
}>({
query: "",
close: () => {},
results: [],
isLoading: false,
isOpened: false,
setQuery: () => {},
setIsOpened: () => {},
setIsLoading: () => {},
setResults: () => {},
});
function SearchIcon(props: React.ComponentPropsWithoutRef<"svg">) { function SearchIcon(props: React.ComponentPropsWithoutRef<"svg">) {
return ( return (
@ -30,61 +38,8 @@ function SearchIcon(props: React.ComponentPropsWithoutRef<"svg">) {
); );
} }
function useAutocomplete({ close }: { close: (autocomplete: Autocomplete) => void }) {
let id = useId();
// let router = useRouter();
let [autocompleteState, setAutocompleteState] = useState<AutocompleteState<SearchResult> | EmptyObject>({});
function navigate({ itemUrl }: { itemUrl?: string }) {
if (!itemUrl) {
return;
}
routerNavigate(itemUrl);
if (itemUrl === window.location.pathname + window.location.search + window.location.hash) {
close(autocomplete);
}
}
let [autocomplete] = useState<Autocomplete>(() =>
createAutocomplete<SearchResult, React.SyntheticEvent, React.MouseEvent, React.KeyboardEvent>({
id,
placeholder: "Find something...",
defaultActiveItemId: 0,
onStateChange({ state }) {
setAutocompleteState(state);
},
shouldPanelOpen({ state }) {
return state.query !== "";
},
navigator: {
navigate,
},
async getSources({ query }) {
return onSearch(query).then((searchResult) => {
return [
{
sourceId: "documentation",
getItems() {
return searchResult;
},
getItemUrl({ item }) {
return item.url;
},
onSelect: navigate,
},
];
});
},
}),
);
return { autocomplete, autocompleteState };
}
function LoadingIcon(props: React.ComponentPropsWithoutRef<"svg">) { function LoadingIcon(props: React.ComponentPropsWithoutRef<"svg">) {
let id = useId(); const id = useId();
return ( return (
<svg viewBox="0 0 20 20" fill="none" aria-hidden="true" {...props}> <svg viewBox="0 0 20 20" fill="none" aria-hidden="true" {...props}>
@ -100,6 +55,41 @@ function LoadingIcon(props: React.ComponentPropsWithoutRef<"svg">) {
); );
} }
function SearchInput() {
const { close, setQuery, query, isLoading } = useContext(SearchContext);
return (
<div className="group relative flex h-12">
<SearchIcon className="pointer-events-none absolute top-0 left-4 h-full w-5 fill-slate-400 dark:fill-slate-500" />
<input
data-autofocus
className={clsx(
"flex-auto appearance-none bg-transparent pl-12 text-slate-900 outline-hidden placeholder:text-slate-400 focus:w-full focus:flex-none sm:text-sm dark:text-white [&::-webkit-search-cancel-button]:hidden [&::-webkit-search-decoration]:hidden [&::-webkit-search-results-button]:hidden [&::-webkit-search-results-decoration]:hidden",
isLoading ? "pr-11" : "pr-4",
)}
onKeyDown={(event) => {
if (event.key === "Escape") {
// In Safari, closing the dialog with the escape key can sometimes cause the scroll position to jump to the
// bottom of the page. This is a workaround for that until we can figure out a proper fix in Headless UI.
if (document.activeElement instanceof HTMLElement) {
document.activeElement.blur();
}
close();
}
}}
value={query}
onChange={(event) => setQuery(event.currentTarget.value)}
/>
{isLoading && (
<div className="absolute inset-y-0 right-3 flex items-center">
<LoadingIcon className="h-6 w-6 animate-spin stroke-slate-200 text-slate-400 dark:stroke-slate-700 dark:text-slate-500" />
</div>
)}
</div>
);
}
function HighlightQuery({ text, query }: { text: string; query: string }) { function HighlightQuery({ text, query }: { text: string; query: string }) {
return ( return (
<Highlighter <Highlighter
@ -111,32 +101,26 @@ function HighlightQuery({ text, query }: { text: string; query: string }) {
); );
} }
function SearchResultItem({ function SearchResultItem({ result, query }: { result: SearchResult; query: string }) {
result, const { close } = useContext(SearchContext);
autocomplete, const id = useId();
collection,
query,
}: {
result: SearchResult;
autocomplete: Autocomplete;
collection: AutocompleteCollection<SearchResult>;
query: string;
}) {
let id = useId();
let sectionTitle = navigation.find((section) => const sectionTitle = navigation.find((section) =>
section.links.find((link) => link.href === result.url.split("#")[0]), section.links.find((link) => link.href === result.url.split("#")[0]),
)?.title; )?.title;
let hierarchy = [sectionTitle, result.pageTitle].filter((x): x is string => typeof x === "string");
const hierarchy = [sectionTitle, result.pageTitle].filter((x): x is string => typeof x === "string");
return ( return (
<li <li
className="group block cursor-default rounded-lg px-3 py-2 aria-selected:bg-slate-100 dark:aria-selected:bg-slate-700/30" className="group block cursor-default rounded-lg px-3 py-2 aria-selected:bg-slate-100 dark:aria-selected:bg-slate-700/30 hover:bg-slate-100 dark:hover:bg-slate-700/30"
aria-labelledby={`${id}-hierarchy ${id}-title`} aria-labelledby={`${id}-hierarchy ${id}-title`}
{...autocomplete.getItemProps({ role="option"
item: result, tabIndex={0}
source: collection.source, onClick={() => {
})} navigate(result.url);
close();
}}
> >
<div <div
id={`${id}-title`} id={`${id}-title`}
@ -165,19 +149,13 @@ function SearchResultItem({
); );
} }
function SearchResults({ function SearchResults() {
autocomplete, const { results, query } = useContext(SearchContext);
query,
collection, if (results.length === 0) {
}: {
autocomplete: Autocomplete;
query: string;
collection: AutocompleteCollection<SearchResult>;
}) {
if (collection.items.length === 0) {
return ( return (
<p className="px-4 py-8 text-center text-sm text-slate-700 dark:text-slate-400"> <p className="px-4 py-8 text-center text-sm text-slate-700 dark:text-slate-400">
No results for &ldquo; Aucun résultat pour &ldquo;
<span className="break-words text-slate-900 dark:text-white">{query}</span> <span className="break-words text-slate-900 dark:text-white">{query}</span>
&rdquo; &rdquo;
</p> </p>
@ -185,117 +163,24 @@ function SearchResults({
} }
return ( return (
<ul {...autocomplete.getListProps()}> <ul>
{collection.items.map((result) => ( {results.map((result) => (
<SearchResultItem <SearchResultItem key={result.url} result={result} query={query} />
key={result.url}
result={result}
autocomplete={autocomplete}
collection={collection}
query={query}
/>
))} ))}
</ul> </ul>
); );
} }
const SearchInput = forwardRef< function SearchDialog({ className }: { className?: string }) {
React.ComponentRef<"input">, const { close, isOpened, setIsOpened, results } = useContext(SearchContext);
{
autocomplete: Autocomplete;
autocompleteState: AutocompleteState<SearchResult> | EmptyObject;
onClose: () => void;
}
>(function SearchInput({ autocomplete, autocompleteState, onClose }, inputRef) {
let inputProps = autocomplete.getInputProps({ inputElement: null });
return (
<div className="group relative flex h-12">
<SearchIcon className="pointer-events-none absolute top-0 left-4 h-full w-5 fill-slate-400 dark:fill-slate-500" />
<input
ref={inputRef}
data-autofocus
className={clsx(
"flex-auto appearance-none bg-transparent pl-12 text-slate-900 outline-hidden placeholder:text-slate-400 focus:w-full focus:flex-none sm:text-sm dark:text-white [&::-webkit-search-cancel-button]:hidden [&::-webkit-search-decoration]:hidden [&::-webkit-search-results-button]:hidden [&::-webkit-search-results-decoration]:hidden",
autocompleteState.status === "stalled" ? "pr-11" : "pr-4",
)}
{...inputProps}
onKeyDown={(event) => {
if (event.key === "Escape" && !autocompleteState.isOpen && autocompleteState.query === "") {
// In Safari, closing the dialog with the escape key can sometimes cause the scroll position to jump to the
// bottom of the page. This is a workaround for that until we can figure out a proper fix in Headless UI.
if (document.activeElement instanceof HTMLElement) {
document.activeElement.blur();
}
onClose();
} else {
inputProps.onKeyDown(event);
}
}}
/>
{autocompleteState.status === "stalled" && (
<div className="absolute inset-y-0 right-3 flex items-center">
<LoadingIcon className="h-6 w-6 animate-spin stroke-slate-200 text-slate-400 dark:stroke-slate-700 dark:text-slate-500" />
</div>
)}
</div>
);
});
function CloseOnNavigation({
close,
autocomplete,
}: {
close: (autocomplete: Autocomplete) => void;
autocomplete: Autocomplete;
}) {
const { urlParsed } = usePageContext();
const { pathname, search } = urlParsed;
useEffect(() => { useEffect(() => {
close(autocomplete); if (isOpened) return;
}, [pathname, search, close, autocomplete]);
return null;
}
function SearchDialog({
open,
setOpen,
className,
}: {
open: boolean;
setOpen: (open: boolean) => void;
className?: string;
}) {
let formRef = useRef<React.ComponentRef<"form">>(null);
let panelRef = useRef<React.ComponentRef<"div">>(null);
let inputRef = useRef<React.ComponentRef<typeof SearchInput>>(null);
let close = useCallback(
(autocomplete: Autocomplete) => {
setOpen(false);
autocomplete.setQuery("");
},
[setOpen],
);
let { autocomplete, autocompleteState } = useAutocomplete({
close() {
close(autocomplete);
},
});
useEffect(() => {
if (open) {
return;
}
function onKeyDown(event: KeyboardEvent) { function onKeyDown(event: KeyboardEvent) {
if (event.key === "k" && (event.metaKey || event.ctrlKey)) { if (event.key === "k" && (event.metaKey || event.ctrlKey)) {
event.preventDefault(); event.preventDefault();
setOpen(true); setIsOpened(true);
} }
} }
@ -304,46 +189,21 @@ function SearchDialog({
return () => { return () => {
window.removeEventListener("keydown", onKeyDown); window.removeEventListener("keydown", onKeyDown);
}; };
}, [open, setOpen]); }, [isOpened, setIsOpened]);
return ( return (
<> <>
<Suspense fallback={null}> <Dialog open={isOpened} onClose={close} className={clsx("fixed inset-0 z-50", className)}>
<CloseOnNavigation close={close} autocomplete={autocomplete} />
</Suspense>
<Dialog open={open} onClose={() => close(autocomplete)} className={clsx("fixed inset-0 z-50", className)}>
<div className="fixed inset-0 bg-slate-900/50 backdrop-blur-sm" /> <div className="fixed inset-0 bg-slate-900/50 backdrop-blur-sm" />
<div className="fixed inset-0 overflow-y-auto px-4 py-4 sm:px-6 sm:py-20 md:py-32 lg:px-8 lg:py-[15vh]"> <div className="fixed inset-0 overflow-y-auto px-4 py-4 sm:px-6 sm:py-20 md:py-32 lg:px-8 lg:py-[15vh]">
<DialogPanel className="mx-auto transform-gpu overflow-hidden rounded-xl bg-white shadow-xl sm:max-w-xl dark:bg-slate-800 dark:ring-1 dark:ring-slate-700"> <DialogPanel className="mx-auto transform-gpu overflow-hidden rounded-xl bg-white shadow-xl sm:max-w-xl dark:bg-slate-800 dark:ring-1 dark:ring-slate-700">
<div {...autocomplete.getRootProps({})}> <form onSubmit={(event) => event.preventDefault()}>
<form <SearchInput />
ref={formRef} <div className="border-t border-slate-200 bg-white px-2 py-3 empty:hidden dark:border-slate-400/10 dark:bg-slate-800">
{...autocomplete.getFormProps({ {results.length > 0 && <SearchResults />}
inputElement: inputRef.current,
})}
>
<SearchInput
ref={inputRef}
autocomplete={autocomplete}
autocompleteState={autocompleteState}
onClose={() => setOpen(false)}
/>
<div
ref={panelRef}
className="border-t border-slate-200 bg-white px-2 py-3 empty:hidden dark:border-slate-400/10 dark:bg-slate-800"
{...autocomplete.getPanelProps({})}
>
{autocompleteState.isOpen && (
<SearchResults
autocomplete={autocomplete}
query={autocompleteState.query}
collection={autocompleteState.collections[0]}
/>
)}
</div> </div>
</form> </form>
</div>
</DialogPanel> </DialogPanel>
</div> </div>
</Dialog> </Dialog>
@ -351,44 +211,57 @@ function SearchDialog({
); );
} }
function useSearchProps() {
let buttonRef = useRef<React.ComponentRef<"button">>(null);
let [open, setOpen] = useState(false);
return {
buttonProps: {
ref: buttonRef,
onClick() {
setOpen(true);
},
},
dialogProps: {
open,
setOpen: useCallback((open: boolean) => {
let { width = 0, height = 0 } = buttonRef.current?.getBoundingClientRect() ?? {};
if (!open || (width !== 0 && height !== 0)) {
setOpen(open);
}
}, []),
},
};
}
export function Search() { export function Search() {
let [modifierKey, setModifierKey] = useState<string>(); const [results, setResults] = useState<SearchResult[]>([]);
let { buttonProps, dialogProps } = useSearchProps(); const [debouncedQuery, setDebouncedQuery] = useDebounce();
const [modifierKey, setModifierKey] = useState<string>();
const [isLoading, setIsLoading] = useState(false);
const [isOpened, setIsOpened] = useState(false);
const [query, setQuery] = useState("");
useEffect(() => { useEffect(() => {
const platform = navigator.userAgentData?.platform || navigator.platform; const platform = navigator.userAgentData?.platform || navigator.platform;
setModifierKey(/(Mac|iPhone|iPod|iPad)/i.test(platform) ? "⌘" : "Ctrl "); setModifierKey(/(Mac|iPhone|iPod|iPad)/i.test(platform) ? "⌘" : "Ctrl ");
}, []); }, []);
useEffect(() => {
setDebouncedQuery(query);
}, [query]);
useEffect(() => {
if (debouncedQuery.length === 0) {
setIsLoading(false);
setResults([]);
return;
}
setIsLoading(true);
onSearch(debouncedQuery, 5)
.then(setResults)
.finally(() => {
setIsLoading(false);
});
}, [debouncedQuery]);
return ( return (
<> <SearchContext.Provider
value={{
query,
close: () => setIsOpened(false),
results,
isLoading,
isOpened,
setQuery,
setIsOpened,
setIsLoading,
setResults,
}}
>
<button <button
type="button" type="button"
className="group flex h-6 w-6 items-center justify-center sm:justify-start md:h-auto md:w-80 md:flex-none md:rounded-lg md:py-2.5 md:pr-3.5 md:pl-4 md:text-sm md:ring-1 md:ring-slate-200 md:hover:ring-slate-300 lg:w-96 dark:md:bg-slate-800/75 dark:md:ring-white/5 dark:md:ring-inset dark:md:hover:bg-slate-700/40 dark:md:hover:ring-slate-500" className="group flex h-6 w-6 items-center justify-center sm:justify-start md:h-auto md:w-80 md:flex-none md:rounded-lg md:py-2.5 md:pr-3.5 md:pl-4 md:text-sm md:ring-1 md:ring-slate-200 md:hover:ring-slate-300 lg:w-96 dark:md:bg-slate-800/75 dark:md:ring-white/5 dark:md:ring-inset dark:md:hover:bg-slate-700/40 dark:md:hover:ring-slate-500"
{...buttonProps} onClick={() => setIsOpened(true)}
> >
<SearchIcon className="h-5 w-5 flex-none fill-slate-400 group-hover:fill-slate-500 md:group-hover:fill-slate-400 dark:fill-slate-500" /> <SearchIcon className="h-5 w-5 flex-none fill-slate-400 group-hover:fill-slate-500 md:group-hover:fill-slate-400 dark:fill-slate-500" />
<span className="sr-only md:not-sr-only md:ml-2 md:text-slate-500 md:dark:text-slate-400">Rechercher...</span> <span className="sr-only md:not-sr-only md:ml-2 md:text-slate-500 md:dark:text-slate-400">Rechercher...</span>
@ -399,7 +272,7 @@ export function Search() {
</kbd> </kbd>
)} )}
</button> </button>
<SearchDialog {...dialogProps} /> <SearchDialog />
</> </SearchContext.Provider>
); );
} }

206
app/dist/assets.json vendored Normal file
View File

@ -0,0 +1,206 @@
{
"_chunk-FoQi8sq6.js": {
"file": "assets/chunks/chunk-FoQi8sq6.js",
"name": "renderPageClientSide",
"dynamicImports": [
"virtual:vike:pageConfigValuesAll:client:/pages/_error",
"virtual:vike:pageConfigValuesAll:client:/pages/index",
"virtual:vike:pageConfigValuesAll:client:/pages/docs"
]
},
"_chunk-YnSR0nZE.js": {
"file": "assets/chunks/chunk-YnSR0nZE.js",
"name": "Loading",
"imports": [
"_chunk-FoQi8sq6.js"
],
"css": [
"assets/static/vike-react-fe70c48a.BcWtY8Ol.css",
"assets/static/layouts_style-b34a8e57.HyLxvJhb.css",
"assets/static/layouts_tailwind-00e65532.kM054_rr.css",
"assets/static/layouts_prism-feac250c.B2a_QZIO.css",
"assets/static/style-1efdef47.B5Troj4Q.css"
],
"assets": [
"assets/static/blur-indigo.Cbr0CUfr.png",
"assets/static/blur-cyan.DJww6-ho.png",
"assets/static/inter-cyrillic-ext-wght-normal.B2xhLi22.woff2",
"assets/static/inter-cyrillic-wght-normal.CMZtQduZ.woff2",
"assets/static/inter-greek-ext-wght-normal.CGAr0uHJ.woff2",
"assets/static/inter-greek-wght-normal.CaVNZxsx.woff2",
"assets/static/inter-vietnamese-wght-normal.CBcvBZtf.woff2",
"assets/static/inter-latin-ext-wght-normal.CFHvXkgd.woff2",
"assets/static/inter-latin-wght-normal.C2S99t-D.woff2",
"assets/static/lexend-vietnamese-wght-normal.RvljkFvg.woff2",
"assets/static/lexend-latin-ext-wght-normal.Ca5OILQq.woff2",
"assets/static/lexend-latin-wght-normal.ga3u8m5q.woff2"
]
},
"_layouts_prism-feac250c.B2a_QZIO.css": {
"file": "assets/static/layouts_prism-feac250c.B2a_QZIO.css",
"src": "_layouts_prism-feac250c.B2a_QZIO.css"
},
"_layouts_style-b34a8e57.HyLxvJhb.css": {
"file": "assets/static/layouts_style-b34a8e57.HyLxvJhb.css",
"src": "_layouts_style-b34a8e57.HyLxvJhb.css"
},
"_layouts_tailwind-00e65532.kM054_rr.css": {
"file": "assets/static/layouts_tailwind-00e65532.kM054_rr.css",
"src": "_layouts_tailwind-00e65532.kM054_rr.css"
},
"_style-1efdef47.B5Troj4Q.css": {
"file": "assets/static/style-1efdef47.B5Troj4Q.css",
"src": "_style-1efdef47.B5Troj4Q.css"
},
"_vike-react-fe70c48a.BcWtY8Ol.css": {
"file": "assets/static/vike-react-fe70c48a.BcWtY8Ol.css",
"src": "_vike-react-fe70c48a.BcWtY8Ol.css"
},
"images/blur-cyan.png": {
"file": "assets/static/blur-cyan.DJww6-ho.png",
"src": "images/blur-cyan.png"
},
"images/blur-indigo.png": {
"file": "assets/static/blur-indigo.Cbr0CUfr.png",
"src": "images/blur-indigo.png"
},
"node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-cyrillic-ext-wght-normal.woff2": {
"file": "assets/static/inter-cyrillic-ext-wght-normal.B2xhLi22.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-cyrillic-ext-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-cyrillic-wght-normal.woff2": {
"file": "assets/static/inter-cyrillic-wght-normal.CMZtQduZ.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-cyrillic-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-greek-ext-wght-normal.woff2": {
"file": "assets/static/inter-greek-ext-wght-normal.CGAr0uHJ.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-greek-ext-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-greek-wght-normal.woff2": {
"file": "assets/static/inter-greek-wght-normal.CaVNZxsx.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-greek-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-latin-ext-wght-normal.woff2": {
"file": "assets/static/inter-latin-ext-wght-normal.CFHvXkgd.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-latin-ext-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-latin-wght-normal.woff2": {
"file": "assets/static/inter-latin-wght-normal.C2S99t-D.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-latin-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-vietnamese-wght-normal.woff2": {
"file": "assets/static/inter-vietnamese-wght-normal.CBcvBZtf.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-vietnamese-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+lexend@5.2.6/node_modules/@fontsource-variable/lexend/files/lexend-latin-ext-wght-normal.woff2": {
"file": "assets/static/lexend-latin-ext-wght-normal.Ca5OILQq.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+lexend@5.2.6/node_modules/@fontsource-variable/lexend/files/lexend-latin-ext-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+lexend@5.2.6/node_modules/@fontsource-variable/lexend/files/lexend-latin-wght-normal.woff2": {
"file": "assets/static/lexend-latin-wght-normal.ga3u8m5q.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+lexend@5.2.6/node_modules/@fontsource-variable/lexend/files/lexend-latin-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+lexend@5.2.6/node_modules/@fontsource-variable/lexend/files/lexend-vietnamese-wght-normal.woff2": {
"file": "assets/static/lexend-vietnamese-wght-normal.RvljkFvg.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+lexend@5.2.6/node_modules/@fontsource-variable/lexend/files/lexend-vietnamese-wght-normal.woff2"
},
"node_modules/.pnpm/vike@0.4.228_react-streaming@0.3.50_react-dom@19.1.0_react@19.1.0__react@19.1.0__vite@6_a5d8557c8c03851ef9ff4b1fc2b0d591/node_modules/vike/dist/esm/client/client-routing-runtime/entry.js": {
"file": "assets/entries/entry-client-routing.Bc4tBJ4_.js",
"name": "entries/entry-client-routing",
"src": "node_modules/.pnpm/vike@0.4.228_react-streaming@0.3.50_react-dom@19.1.0_react@19.1.0__react@19.1.0__vite@6_a5d8557c8c03851ef9ff4b1fc2b0d591/node_modules/vike/dist/esm/client/client-routing-runtime/entry.js",
"isEntry": true,
"imports": [
"_chunk-FoQi8sq6.js"
]
},
"virtual:vike:pageConfigValuesAll:client:/pages/_error": {
"file": "assets/entries/pages_error.DlwLYWej.js",
"name": "entries/pages/_error",
"src": "virtual:vike:pageConfigValuesAll:client:/pages/_error",
"isEntry": true,
"isDynamicEntry": true,
"imports": [
"_chunk-YnSR0nZE.js",
"_chunk-FoQi8sq6.js"
],
"css": [
"assets/static/vike-react-fe70c48a.BcWtY8Ol.css",
"assets/static/layouts_style-b34a8e57.HyLxvJhb.css",
"assets/static/layouts_tailwind-00e65532.kM054_rr.css",
"assets/static/layouts_prism-feac250c.B2a_QZIO.css",
"assets/static/style-1efdef47.B5Troj4Q.css"
],
"assets": [
"assets/static/inter-cyrillic-ext-wght-normal.B2xhLi22.woff2",
"assets/static/inter-cyrillic-wght-normal.CMZtQduZ.woff2",
"assets/static/inter-greek-ext-wght-normal.CGAr0uHJ.woff2",
"assets/static/inter-greek-wght-normal.CaVNZxsx.woff2",
"assets/static/inter-vietnamese-wght-normal.CBcvBZtf.woff2",
"assets/static/inter-latin-ext-wght-normal.CFHvXkgd.woff2",
"assets/static/inter-latin-wght-normal.C2S99t-D.woff2",
"assets/static/lexend-vietnamese-wght-normal.RvljkFvg.woff2",
"assets/static/lexend-latin-ext-wght-normal.Ca5OILQq.woff2",
"assets/static/lexend-latin-wght-normal.ga3u8m5q.woff2"
]
},
"virtual:vike:pageConfigValuesAll:client:/pages/docs": {
"file": "assets/entries/pages_docs.Gi7h7KmT.js",
"name": "entries/pages/docs",
"src": "virtual:vike:pageConfigValuesAll:client:/pages/docs",
"isEntry": true,
"isDynamicEntry": true,
"imports": [
"_chunk-YnSR0nZE.js",
"_chunk-FoQi8sq6.js"
],
"css": [
"assets/static/vike-react-fe70c48a.BcWtY8Ol.css",
"assets/static/layouts_style-b34a8e57.HyLxvJhb.css",
"assets/static/layouts_tailwind-00e65532.kM054_rr.css",
"assets/static/layouts_prism-feac250c.B2a_QZIO.css",
"assets/static/style-1efdef47.B5Troj4Q.css"
],
"assets": [
"assets/static/inter-cyrillic-ext-wght-normal.B2xhLi22.woff2",
"assets/static/inter-cyrillic-wght-normal.CMZtQduZ.woff2",
"assets/static/inter-greek-ext-wght-normal.CGAr0uHJ.woff2",
"assets/static/inter-greek-wght-normal.CaVNZxsx.woff2",
"assets/static/inter-vietnamese-wght-normal.CBcvBZtf.woff2",
"assets/static/inter-latin-ext-wght-normal.CFHvXkgd.woff2",
"assets/static/inter-latin-wght-normal.C2S99t-D.woff2",
"assets/static/lexend-vietnamese-wght-normal.RvljkFvg.woff2",
"assets/static/lexend-latin-ext-wght-normal.Ca5OILQq.woff2",
"assets/static/lexend-latin-wght-normal.ga3u8m5q.woff2"
]
},
"virtual:vike:pageConfigValuesAll:client:/pages/index": {
"file": "assets/entries/pages_index.Bb824t1n.js",
"name": "entries/pages/index",
"src": "virtual:vike:pageConfigValuesAll:client:/pages/index",
"isEntry": true,
"isDynamicEntry": true,
"imports": [
"_chunk-YnSR0nZE.js",
"_chunk-FoQi8sq6.js"
],
"css": [
"assets/static/vike-react-fe70c48a.BcWtY8Ol.css",
"assets/static/layouts_style-b34a8e57.HyLxvJhb.css",
"assets/static/layouts_tailwind-00e65532.kM054_rr.css",
"assets/static/layouts_prism-feac250c.B2a_QZIO.css",
"assets/static/style-1efdef47.B5Troj4Q.css"
],
"assets": [
"assets/static/inter-cyrillic-ext-wght-normal.B2xhLi22.woff2",
"assets/static/inter-cyrillic-wght-normal.CMZtQduZ.woff2",
"assets/static/inter-greek-ext-wght-normal.CGAr0uHJ.woff2",
"assets/static/inter-greek-wght-normal.CaVNZxsx.woff2",
"assets/static/inter-vietnamese-wght-normal.CBcvBZtf.woff2",
"assets/static/inter-latin-ext-wght-normal.CFHvXkgd.woff2",
"assets/static/inter-latin-wght-normal.C2S99t-D.woff2",
"assets/static/lexend-vietnamese-wght-normal.RvljkFvg.woff2",
"assets/static/lexend-latin-ext-wght-normal.Ca5OILQq.woff2",
"assets/static/lexend-latin-wght-normal.ga3u8m5q.woff2"
]
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{e as c,o as u,s as f,r as s,g,h as d,j as m,k as p,l as S,m as k,n as y,q as P,u as h,v as w,c as N,w as C}from"../chunks/chunk-FoQi8sq6.js";function v(){window.addEventListener("popstate",H)}async function H(){c("onPopState()");const{isHistoryStateEnhanced:t,previous:n,current:i}=u();if(t)await L(n,i);else return}async function L(t,n){const i=n.state.scrollPosition||void 0;if(r(n.url)===r(t.url)&&n.url!==t.url){f(i);return}const o=n.state.triggeredBy==="user"||t.state.triggeredBy==="user",l=!n.state.timestamp||!t.state.timestamp?null:n.state.timestamp<t.state.timestamp;await s({scrollTarget:i,isBackwardNavigation:l,doNotRenderIfSamePage:o})}function r(t){return t.split("#")[0]}function B(){document.addEventListener("click",T)}async function T(t){if(!A(t))return;const n=R(t.target);if(!n)return;const i=n.getAttribute("href");if(i===null)return;if(i.includes("#")&&g(i)){t.preventDefault(),d(i.split("#")[1]);return}if(m(n))return;t.preventDefault();let e;{const a=n.getAttribute("keep-scroll-position");a!==null&&(e={preserveScroll:a!=="false"})}await s({scrollTarget:e,urlOriginal:i,isBackwardNavigation:!1})}function A(t){return t.button===0&&!t.ctrlKey&&!t.shiftKey&&!t.altKey&&!t.metaKey}function R(t){for(;t.tagName!=="A";){const{parentNode:n}=t;if(!n)return null;t=n}return t}async function E(){K();const t=I();B(),p(),await t}async function I(){h(w()===0),await s({scrollTarget:{preserveScroll:!0},isBackwardNavigation:null,isClientSideNavigation:!1})}function K(){S(),k(),y(),P(),v()}N();C();E();

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{u as a,j as e,L as i,i as o,a as r,D as l,b as n,c as s,o as d}from"../chunks/chunk-YnSR0nZE.js";/* empty css */import"../chunks/chunk-FoQi8sq6.js";/* empty css *//* empty css *//* empty css *//* empty css */function p(){const{is404:t}=a();return t?e.jsx(e.Fragment,{children:e.jsx("div",{className:"max-w-2xl min-w-0 flex-auto px-4 py-16 lg:max-w-none lg:pr-0 lg:pl-8 xl:px-16",children:e.jsxs("div",{className:"flex h-full flex-col items-center justify-center text-center",children:[e.jsx("p",{className:"font-display text-sm font-medium text-slate-900 dark:text-white",children:"404"}),e.jsx("h1",{className:"mt-3 font-display text-3xl tracking-tight text-slate-900 dark:text-white",children:"Page introuvable"}),e.jsx("p",{className:"mt-2 text-sm text-slate-500 dark:text-slate-400",children:"Désolé, nous ne pouvons pas trouver la page que vous recherchez."}),e.jsx(i,{href:"/",className:"mt-8 text-sm font-medium text-slate-900 dark:text-white",children:"Retour à l'accueil"})]})})}):e.jsxs(e.Fragment,{children:[e.jsx("h1",{children:"500 Internal Server Error"}),e.jsx("p",{children:"Something went wrong."})]})}const u=Object.freeze(Object.defineProperty({__proto__:null,default:p},Symbol.toStringTag,{value:"Module"})),y={isClientRuntimeLoaded:{type:"computed",definedAtData:null,valueSerialized:{type:"js-serialized",value:!0}},onBeforeRenderEnv:{type:"computed",definedAtData:null,valueSerialized:{type:"js-serialized",value:null}},dataEnv:{type:"computed",definedAtData:null,valueSerialized:{type:"js-serialized",value:null}},onRenderClient:{type:"standard",definedAtData:{filePathToShowToUser:"vike-react/__internal/integration/onRenderClient",fileExportPathToShowToUser:[]},valueSerialized:{type:"pointer-import",value:d}},onPageTransitionStart:{type:"standard",definedAtData:{filePathToShowToUser:"/pages/+onPageTransitionStart.ts",fileExportPathToShowToUser:[]},valueSerialized:{type:"plus-file",exportValues:s}},onPageTransitionEnd:{type:"standard",definedAtData:{filePathToShowToUser:"/pages/+onPageTransitionEnd.ts",fileExportPathToShowToUser:[]},valueSerialized:{type:"plus-file",exportValues:n}},Page:{type:"standard",definedAtData:{filePathToShowToUser:"/pages/_error/+Page.tsx",fileExportPathToShowToUser:[]},valueSerialized:{type:"plus-file",exportValues:u}},hydrationCanBeAborted:{type:"standard",definedAtData:{filePathToShowToUser:"vike-react/config",fileExportPathToShowToUser:["default","hydrationCanBeAborted"]},valueSerialized:{type:"js-serialized",value:!0}},Layout:{type:"cumulative",definedAtData:[{filePathToShowToUser:"/layouts/LayoutDefault.tsx",fileExportPathToShowToUser:[]}],valueSerialized:[{type:"pointer-import",value:l}]},title:{type:"standard",definedAtData:{filePathToShowToUser:"/pages/+title.ts",fileExportPathToShowToUser:[]},valueSerialized:{type:"plus-file",exportValues:r}},lang:{type:"standard",definedAtData:{filePathToShowToUser:"/pages/+config.ts",fileExportPathToShowToUser:["default","lang"]},valueSerialized:{type:"js-serialized",value:"fr"}},Loading:{type:"standard",definedAtData:{filePathToShowToUser:"vike-react/__internal/integration/Loading",fileExportPathToShowToUser:[]},valueSerialized:{type:"pointer-import",value:o}}};export{y as configValuesSerialized};

View File

@ -0,0 +1 @@
import{j as e,i as t,a,D as o,b as i,c as l,o as r}from"../chunks/chunk-YnSR0nZE.js";/* empty css */import"../chunks/chunk-FoQi8sq6.js";/* empty css *//* empty css *//* empty css *//* empty css */function n(){return e.jsx("main",{className:"max-w-2xl min-w-0 flex-auto px-4 py-16 lg:max-w-none lg:pr-0 lg:pl-8 xl:px-16",children:e.jsx("h1",{className:"font-bold text-3xl pb-4",children:"My Vike app"})})}const d=Object.freeze(Object.defineProperty({__proto__:null,default:n},Symbol.toStringTag,{value:"Module"})),y={isClientRuntimeLoaded:{type:"computed",definedAtData:null,valueSerialized:{type:"js-serialized",value:!0}},onBeforeRenderEnv:{type:"computed",definedAtData:null,valueSerialized:{type:"js-serialized",value:null}},dataEnv:{type:"computed",definedAtData:null,valueSerialized:{type:"js-serialized",value:null}},onRenderClient:{type:"standard",definedAtData:{filePathToShowToUser:"vike-react/__internal/integration/onRenderClient",fileExportPathToShowToUser:[]},valueSerialized:{type:"pointer-import",value:r}},onPageTransitionStart:{type:"standard",definedAtData:{filePathToShowToUser:"/pages/+onPageTransitionStart.ts",fileExportPathToShowToUser:[]},valueSerialized:{type:"plus-file",exportValues:l}},onPageTransitionEnd:{type:"standard",definedAtData:{filePathToShowToUser:"/pages/+onPageTransitionEnd.ts",fileExportPathToShowToUser:[]},valueSerialized:{type:"plus-file",exportValues:i}},Page:{type:"standard",definedAtData:{filePathToShowToUser:"/pages/index/+Page.tsx",fileExportPathToShowToUser:[]},valueSerialized:{type:"plus-file",exportValues:d}},hydrationCanBeAborted:{type:"standard",definedAtData:{filePathToShowToUser:"vike-react/config",fileExportPathToShowToUser:["default","hydrationCanBeAborted"]},valueSerialized:{type:"js-serialized",value:!0}},Layout:{type:"cumulative",definedAtData:[{filePathToShowToUser:"/layouts/LayoutDefault.tsx",fileExportPathToShowToUser:[]}],valueSerialized:[{type:"pointer-import",value:o}]},title:{type:"standard",definedAtData:{filePathToShowToUser:"/pages/+title.ts",fileExportPathToShowToUser:[]},valueSerialized:{type:"plus-file",exportValues:a}},lang:{type:"standard",definedAtData:{filePathToShowToUser:"/pages/+config.ts",fileExportPathToShowToUser:["default","lang"]},valueSerialized:{type:"js-serialized",value:"fr"}},Loading:{type:"standard",definedAtData:{filePathToShowToUser:"vike-react/__internal/integration/Loading",fileExportPathToShowToUser:[]},valueSerialized:{type:"pointer-import",value:t}}};export{y as configValuesSerialized};

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

View File

@ -0,0 +1 @@
pre[class*=language-]{color:var(--color-slate-50)}.token.tag,.token.class-name,.token.selector,.token.selector .class,.token.selector.class,.token.function{color:var(--color-pink-400)}.token.attr-name,.token.keyword,.token.rule,.token.pseudo-class,.token.important{color:var(--color-slate-300)}.token.module{color:var(--color-pink-400)}.token.attr-value,.token.class,.token.string,.token.property{color:var(--color-sky-300)}.token.punctuation,.token.attr-equals{color:var(--color-slate-500)}.token.unit,.language-css .token.function{color:var(--color-teal-200)}.token.comment,.token.operator,.token.combinator{color:var(--color-slate-400)}

View File

@ -0,0 +1 @@
a{text-decoration:none}#sidebar a{padding:2px 10px;margin-left:-10px}#sidebar a.is-active{background-color:#eee}body{margin:0;font-family:sans-serif}*{box-sizing:border-box}#page-content{opacity:1;transition:opacity .3s ease-in-out}body.page-is-transitioning #page-content{opacity:0}#root{height:100%;width:100%;display:flex}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/static/inter-cyrillic-ext-wght-normal.B2xhLi22.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/static/inter-cyrillic-wght-normal.CMZtQduZ.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/static/inter-greek-ext-wght-normal.CGAr0uHJ.woff2) format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/static/inter-greek-wght-normal.CaVNZxsx.woff2) format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/static/inter-vietnamese-wght-normal.CBcvBZtf.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/static/inter-latin-ext-wght-normal.CFHvXkgd.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/static/inter-latin-wght-normal.C2S99t-D.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Lexend Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/static/lexend-vietnamese-wght-normal.RvljkFvg.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Lexend Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/static/lexend-latin-ext-wght-normal.Ca5OILQq.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Lexend Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/static/lexend-latin-wght-normal.ga3u8m5q.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}

View File

@ -0,0 +1 @@
@keyframes vike-react-shine{to{background-position-x:-200%}}

BIN
app/dist/client/merise/mcd-1.webp vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
app/dist/client/merise/mcd-2.webp vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
app/dist/client/merise/mcd-3.webp vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
app/dist/client/merise/mcd-4.webp vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
app/dist/client/merise/mcd-5.webp vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

775
app/dist/server/chunks/chunk-Cog4aWZK.js vendored Normal file
View File

@ -0,0 +1,775 @@
import { jsx, Fragment, jsxs } from "react/jsx-runtime";
import { useState, useCallback, Suspense, useEffect, createContext, useContext, useId, Fragment as Fragment$1 } from "react";
import { usePageContext } from "vike-react/usePageContext";
import { Dialog, DialogPanel, Listbox, Label, ListboxButton, ListboxOptions, ListboxOption } from "@headlessui/react";
import { a as navigation, L as Link, T as ThemeContext, u as useTheme, o as onSearch, B as Button } from "./chunk-DhcPoVSR.js";
import clsx from "clsx";
import { Highlight } from "prism-react-renderer";
/* empty css */
/* empty css */
/* empty css */
/* empty css */
import "vike-react/config";
import Highlighter from "react-highlight-words";
import { navigate } from "vike/client/router";
/*! assets/logo.svg [vike:pluginModuleBanner] */
const logoUrl = "data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20width='100%25'%20height='100%25'%20viewBox='0%200%2057%2038'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20xml:space='preserve'%20xmlns:serif='http://www.serif.com/'%20style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;'%3e%3cg%20transform='matrix(-1.76727,0,0,1.76727,49.1089,-3.53454)'%3e%3cpath%20d='M16.161,18.989L20.49,23.32L21.9,21.91L2.1,2.1L0.69,3.51L2.714,5.535L-4.085,11.253L-4.085,13.054L3.185,19.167L4.629,17.337L-1.61,12.165L4.397,7.219L9.588,12.412L6,16L6.01,16.01L6,16.01L6,22L18,22L18,20.83L16.161,18.989ZM14.417,17.244L16,18.83L16,20L8,20L8,16.5L10.837,13.663L14.417,17.244ZM8,4L16,4L16,7.5L13.16,10.34L14.41,11.59L18,8.01L17.99,8L18,8L18,2L6,2L6,3.17L8,5.17L8,4ZM25.294,12.164L19.071,17.34L20.542,19.164L27.788,13.075L27.788,11.274L20.597,5.22L19.158,7.075L25.294,12.164Z'%20style='fill:url(%23_Linear1);'/%3e%3c/g%3e%3cdefs%3e%3clinearGradient%20id='_Linear1'%20x1='0'%20y1='0'%20x2='1'%20y2='0'%20gradientUnits='userSpaceOnUse'%20gradientTransform='matrix(12.792,-21.32,-21.32,-12.792,5.208,23.32)'%3e%3cstop%20offset='0'%20style='stop-color:rgb(43,127,255);stop-opacity:1'/%3e%3cstop%20offset='1'%20style='stop-color:rgb(142,81,255);stop-opacity:1'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e";
/*! pages/+Head.tsx [vike:pluginModuleBanner] */
function HeadDefault() {
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("link", { rel: "icon", href: logoUrl }) });
}
const import4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
default: HeadDefault
}, Symbol.toStringTag, { value: "Module" }));
/*! components/syntax/Navigation.tsx [vike:pluginModuleBanner] */
function Navigation({
className,
onLinkClick
}) {
const { urlPathname } = usePageContext();
return /* @__PURE__ */ jsx("nav", { className: clsx("text-base lg:text-sm", className), children: /* @__PURE__ */ jsx("ul", { role: "list", className: "space-y-9", children: navigation.map((section) => /* @__PURE__ */ jsxs("li", { children: [
/* @__PURE__ */ jsx("h2", { className: "font-display font-medium text-slate-900 dark:text-white", children: section.title }),
/* @__PURE__ */ jsx(
"ul",
{
role: "list",
className: "mt-2 space-y-2 border-l-2 border-slate-100 lg:mt-4 lg:space-y-4 lg:border-slate-200 dark:border-slate-800",
children: section.links.map((link) => /* @__PURE__ */ jsx("li", { className: "relative", children: /* @__PURE__ */ jsx(
Link,
{
href: link.href,
onClick: onLinkClick,
className: clsx(
"block w-full pl-3.5 before:pointer-events-none before:absolute before:top-1/2 before:-left-1 before:h-1.5 before:w-1.5 before:-translate-y-1/2 before:rounded-full",
link.href === urlPathname ? "font-semibold text-violet-500 before:bg-violet-500" : "text-slate-500 before:hidden before:bg-slate-300 hover:text-slate-600 hover:before:block dark:text-slate-400 dark:before:bg-slate-700 dark:hover:text-slate-300"
),
children: link.title
}
) }, link.href))
}
)
] }, section.title)) }) });
}
/*! components/syntax/Logo.tsx [vike:pluginModuleBanner] */
function LogomarkPaths() {
return /* @__PURE__ */ jsxs(Fragment, { children: [
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs(
"linearGradient",
{
id: "l",
x1: "0",
y1: "0",
x2: "1",
y2: "0",
gradientUnits: "userSpaceOnUse",
gradientTransform: "matrix(12.792,-21.32,-21.32,-12.792,5.208,23.32)",
children: [
/* @__PURE__ */ jsx("stop", { offset: "0", style: { stopColor: "rgb(43,127,255)" } }),
/* @__PURE__ */ jsx("stop", { offset: "1", style: { stopColor: "rgb(142,81,255)" } })
]
}
) }),
/* @__PURE__ */ jsx("g", { transform: "matrix(-1.76727,0,0,1.76727,49.1089,-3.53454)", children: /* @__PURE__ */ jsx(
"path",
{
d: "M16.161,18.989L20.49,23.32L21.9,21.91L2.1,2.1L0.69,3.51L2.714,5.535L-4.085,11.253L-4.085,13.054L3.185,19.167L4.629,17.337L-1.61,12.165L4.397,7.219L9.588,12.412L6,16L6.01,16.01L6,16.01L6,22L18,22L18,20.83L16.161,18.989ZM14.417,17.244L16,18.83L16,20L8,20L8,16.5L10.837,13.663L14.417,17.244ZM8,4L16,4L16,7.5L13.16,10.34L14.41,11.59L18,8.01L17.99,8L18,8L18,2L6,2L6,3.17L8,5.17L8,4ZM25.294,12.164L19.071,17.34L20.542,19.164L27.788,13.075L27.788,11.274L20.597,5.22L19.158,7.075L25.294,12.164Z",
style: { fill: "url(#l)" }
}
) })
] });
}
function Logo(props) {
return /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 231 38", ...props, children: [
/* @__PURE__ */ jsx(LogomarkPaths, {}),
/* @__PURE__ */ jsx(
"text",
{
className: "hidden lg:block fill-zinc-900 dark:fill-zinc-100",
fontFamily: "Inter Variable, sans-serif",
fontSize: 24,
fontWeight: "bold",
letterSpacing: "-.02em",
x: 74,
y: 26,
children: "Memento Dev"
}
)
] });
}
/*! components/syntax/MobileNavigation.tsx [vike:pluginModuleBanner] */
function MenuIcon(props) {
return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", fill: "none", strokeWidth: "2", strokeLinecap: "round", ...props, children: /* @__PURE__ */ jsx("path", { d: "M4 7h16M4 12h16M4 17h16" }) });
}
function CloseIcon(props) {
return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", fill: "none", strokeWidth: "2", strokeLinecap: "round", ...props, children: /* @__PURE__ */ jsx("path", { d: "M5 5l14 14M19 5l-14 14" }) });
}
function CloseOnNavigation({ close }) {
const { urlPathname } = usePageContext();
useEffect(() => {
close();
}, [urlPathname, close]);
return null;
}
function MobileNavigation() {
let [isOpen, setIsOpen] = useState(false);
let close = useCallback(() => setIsOpen(false), [setIsOpen]);
function onLinkClick(event) {
let link = event.currentTarget;
if (link.pathname + link.search + link.hash === window.location.pathname + window.location.search + window.location.hash) {
close();
}
}
return /* @__PURE__ */ jsxs(Fragment, { children: [
/* @__PURE__ */ jsx(
"button",
{
type: "button",
onClick: () => setIsOpen(true),
className: "relative",
"aria-label": "Ouvrir le menu de navigation",
children: /* @__PURE__ */ jsx(MenuIcon, { className: "h-6 w-6 stroke-slate-500" })
}
),
/* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(CloseOnNavigation, { close }) }),
/* @__PURE__ */ jsx(
Dialog,
{
open: isOpen,
onClose: () => close(),
className: "fixed inset-0 z-50 flex items-start overflow-y-auto bg-slate-900/50 pr-10 backdrop-blur-sm lg:hidden",
"aria-label": "Navigation",
children: /* @__PURE__ */ jsxs(DialogPanel, { className: "min-h-full w-full max-w-xs bg-white px-4 pt-5 pb-12 sm:px-6 dark:bg-slate-900", children: [
/* @__PURE__ */ jsxs("div", { className: "flex items-center", children: [
/* @__PURE__ */ jsx("button", { type: "button", onClick: () => close(), "aria-label": "Fermer le menu de navigation", children: /* @__PURE__ */ jsx(CloseIcon, { className: "h-6 w-6 stroke-slate-500" }) }),
/* @__PURE__ */ jsx(Link, { href: "/", className: "ml-6", "aria-label": "Page d'accueil", children: /* @__PURE__ */ jsx(Logo, { className: "h-9 w-9" }) })
] }),
/* @__PURE__ */ jsx(Navigation, { className: "mt-5 px-1", onLinkClick })
] })
}
)
] });
}
/*! providers/ThemeProvider.tsx [vike:pluginModuleBanner] */
function ThemeProvider(props) {
const [theme, setTheme] = useState(props.defaultTheme || "light");
useEffect(() => {
const rootElement = document.documentElement;
rootElement.classList.toggle("dark", theme === "dark");
rootElement.classList.toggle("light", theme === "light");
}, [theme]);
return /* @__PURE__ */ jsx(ThemeContext.Provider, { value: { theme, setTheme }, children: props.children });
}
/*! components/syntax/ThemeSelector.tsx [vike:pluginModuleBanner] */
const themes = [
{ name: "Clair", value: "light", icon: LightIcon },
{ name: "Sombre", value: "dark", icon: DarkIcon }
];
function LightIcon(props) {
return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", viewBox: "0 0 16 16", ...props, children: /* @__PURE__ */ jsx(
"path",
{
fillRule: "evenodd",
clipRule: "evenodd",
d: "M7 1a1 1 0 0 1 2 0v1a1 1 0 1 1-2 0V1Zm4 7a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm2.657-5.657a1 1 0 0 0-1.414 0l-.707.707a1 1 0 0 0 1.414 1.414l.707-.707a1 1 0 0 0 0-1.414Zm-1.415 11.313-.707-.707a1 1 0 0 1 1.415-1.415l.707.708a1 1 0 0 1-1.415 1.414ZM16 7.999a1 1 0 0 0-1-1h-1a1 1 0 1 0 0 2h1a1 1 0 0 0 1-1ZM7 14a1 1 0 1 1 2 0v1a1 1 0 1 1-2 0v-1Zm-2.536-2.464a1 1 0 0 0-1.414 0l-.707.707a1 1 0 0 0 1.414 1.414l.707-.707a1 1 0 0 0 0-1.414Zm0-8.486A1 1 0 0 1 3.05 4.464l-.707-.707a1 1 0 0 1 1.414-1.414l.707.707ZM3 8a1 1 0 0 0-1-1H1a1 1 0 0 0 0 2h1a1 1 0 0 0 1-1Z"
}
) });
}
function DarkIcon(props) {
return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", viewBox: "0 0 16 16", ...props, children: /* @__PURE__ */ jsx(
"path",
{
fillRule: "evenodd",
clipRule: "evenodd",
d: "M7.23 3.333C7.757 2.905 7.68 2 7 2a6 6 0 1 0 0 12c.68 0 .758-.905.23-1.332A5.989 5.989 0 0 1 5 8c0-1.885.87-3.568 2.23-4.668ZM12 5a1 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 0 2 1 1 0 0 0-1 1 1 1 0 1 1-2 0 1 1 0 0 0-1-1 1 1 0 1 1 0-2 1 1 0 0 0 1-1 1 1 0 0 1 1-1Z"
}
) });
}
function ThemeSelector(props) {
let [mounted, setMounted] = useState(false);
let { theme, setTheme } = useTheme();
useEffect(() => {
setMounted(true);
}, []);
if (!mounted) {
return /* @__PURE__ */ jsx("div", { className: "h-6 w-6" });
}
return /* @__PURE__ */ jsxs(Listbox, { as: "div", value: theme, onChange: setTheme, ...props, children: [
/* @__PURE__ */ jsx(Label, { className: "sr-only", children: "Theme" }),
/* @__PURE__ */ jsxs(
ListboxButton,
{
className: "flex h-6 w-6 items-center justify-center rounded-lg ring-1 shadow-md shadow-black/5 ring-black/5 dark:bg-slate-700 dark:ring-white/5 dark:ring-inset",
"aria-label": "Theme",
children: [
/* @__PURE__ */ jsx(LightIcon, { className: clsx("h-4 w-4 dark:hidden", "fill-violet-400") }),
/* @__PURE__ */ jsx(DarkIcon, { className: clsx("hidden h-4 w-4 dark:block", "fill-violet-400") })
]
}
),
/* @__PURE__ */ jsx(ListboxOptions, { className: "absolute top-full left-1/2 mt-3 w-36 -translate-x-1/2 space-y-1 rounded-xl bg-white p-3 text-sm font-medium ring-1 shadow-md shadow-black/5 ring-black/5 dark:bg-slate-800 dark:ring-white/5", children: themes.map((theme2) => /* @__PURE__ */ jsx(
ListboxOption,
{
value: theme2.value,
className: ({ focus, selected }) => clsx("flex cursor-pointer items-center rounded-[0.625rem] p-1 select-none", {
"text-violet-500": selected,
"text-slate-900 dark:text-white": focus && !selected,
"text-slate-700 dark:text-slate-400": !focus && !selected,
"bg-slate-100 dark:bg-slate-900/40": focus
}),
children: ({ selected }) => /* @__PURE__ */ jsxs(Fragment, { children: [
/* @__PURE__ */ jsx("div", { className: "rounded-md bg-white p-1 ring-1 shadow-sm ring-slate-900/5 dark:bg-slate-700 dark:ring-white/5 dark:ring-inset", children: /* @__PURE__ */ jsx(
theme2.icon,
{
className: clsx("h-4 w-4", selected ? "fill-violet-400 dark:fill-violet-400" : "fill-slate-400")
}
) }),
/* @__PURE__ */ jsx("div", { className: "ml-3", children: theme2.name })
] })
},
theme2.value
)) })
] });
}
/*! hooks/useDebounce.ts [vike:pluginModuleBanner] */
function useDebounce(debounceTime = 300) {
const [debouncedValue, setDebouncedValue] = useState("");
const [value, setValue] = useState("");
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value);
}, debounceTime);
return () => {
clearTimeout(handler);
};
}, [value]);
return [debouncedValue, setValue];
}
/*! components/syntax/Search.tsx [vike:pluginModuleBanner] */
const SearchContext = createContext({
query: "",
close: () => {
},
results: [],
isLoading: false,
isOpened: false,
setQuery: () => {
},
setIsOpened: () => {
},
setIsLoading: () => {
},
setResults: () => {
}
});
function SearchIcon(props) {
return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", viewBox: "0 0 20 20", ...props, children: /* @__PURE__ */ jsx("path", { d: "M16.293 17.707a1 1 0 0 0 1.414-1.414l-1.414 1.414ZM9 14a5 5 0 0 1-5-5H2a7 7 0 0 0 7 7v-2ZM4 9a5 5 0 0 1 5-5V2a7 7 0 0 0-7 7h2Zm5-5a5 5 0 0 1 5 5h2a7 7 0 0 0-7-7v2Zm8.707 12.293-3.757-3.757-1.414 1.414 3.757 3.757 1.414-1.414ZM14 9a4.98 4.98 0 0 1-1.464 3.536l1.414 1.414A6.98 6.98 0 0 0 16 9h-2Zm-1.464 3.536A4.98 4.98 0 0 1 9 14v2a6.98 6.98 0 0 0 4.95-2.05l-1.414-1.414Z" }) });
}
function LoadingIcon(props) {
const id = useId();
return /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 20 20", fill: "none", "aria-hidden": "true", ...props, children: [
/* @__PURE__ */ jsx("circle", { cx: "10", cy: "10", r: "5.5", strokeLinejoin: "round" }),
/* @__PURE__ */ jsx("path", { stroke: `url(#${id})`, strokeLinecap: "round", strokeLinejoin: "round", d: "M15.5 10a5.5 5.5 0 1 0-5.5 5.5" }),
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("linearGradient", { id, x1: "13", x2: "9.5", y1: "9", y2: "15", gradientUnits: "userSpaceOnUse", children: [
/* @__PURE__ */ jsx("stop", { stopColor: "currentColor" }),
/* @__PURE__ */ jsx("stop", { offset: "1", stopColor: "currentColor", stopOpacity: "0" })
] }) })
] });
}
function SearchInput() {
const { close, setQuery, query, isLoading } = useContext(SearchContext);
return /* @__PURE__ */ jsxs("div", { className: "group relative flex h-12", children: [
/* @__PURE__ */ jsx(SearchIcon, { className: "pointer-events-none absolute top-0 left-4 h-full w-5 fill-slate-400 dark:fill-slate-500" }),
/* @__PURE__ */ jsx(
"input",
{
"data-autofocus": true,
className: clsx(
"flex-auto appearance-none bg-transparent pl-12 text-slate-900 outline-hidden placeholder:text-slate-400 focus:w-full focus:flex-none sm:text-sm dark:text-white [&::-webkit-search-cancel-button]:hidden [&::-webkit-search-decoration]:hidden [&::-webkit-search-results-button]:hidden [&::-webkit-search-results-decoration]:hidden",
isLoading ? "pr-11" : "pr-4"
),
onKeyDown: (event) => {
if (event.key === "Escape") {
if (document.activeElement instanceof HTMLElement) {
document.activeElement.blur();
}
close();
}
},
value: query,
onChange: (event) => setQuery(event.currentTarget.value)
}
),
isLoading && /* @__PURE__ */ jsx("div", { className: "absolute inset-y-0 right-3 flex items-center", children: /* @__PURE__ */ jsx(LoadingIcon, { className: "h-6 w-6 animate-spin stroke-slate-200 text-slate-400 dark:stroke-slate-700 dark:text-slate-500" }) })
] });
}
function HighlightQuery({ text, query }) {
return /* @__PURE__ */ jsx(
Highlighter,
{
highlightClassName: "group-aria-selected:underline bg-transparent text-violet-600 dark:text-violet-400",
searchWords: [query],
autoEscape: true,
textToHighlight: text
}
);
}
function SearchResultItem({ result, query }) {
const { close } = useContext(SearchContext);
const id = useId();
const sectionTitle = navigation.find(
(section) => section.links.find((link) => link.href === result.url.split("#")[0])
)?.title;
const hierarchy = [sectionTitle, result.pageTitle].filter((x) => typeof x === "string");
return /* @__PURE__ */ jsxs(
"li",
{
className: "group block cursor-default rounded-lg px-3 py-2 aria-selected:bg-slate-100 dark:aria-selected:bg-slate-700/30 hover:bg-slate-100 dark:hover:bg-slate-700/30",
"aria-labelledby": `${id}-hierarchy ${id}-title`,
role: "option",
tabIndex: 0,
onClick: () => {
navigate(result.url);
close();
},
children: [
/* @__PURE__ */ jsx(
"div",
{
id: `${id}-title`,
"aria-hidden": "true",
className: "text-sm text-slate-700 group-aria-selected:text-violet-600 dark:text-slate-300 dark:group-aria-selected:text-violet-400",
children: /* @__PURE__ */ jsx(HighlightQuery, { text: result.title, query })
}
),
hierarchy.length > 0 && /* @__PURE__ */ jsx(
"div",
{
id: `${id}-hierarchy`,
"aria-hidden": "true",
className: "mt-0.5 truncate text-xs whitespace-nowrap text-slate-500 dark:text-slate-400",
children: hierarchy.map((item, itemIndex, items) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
/* @__PURE__ */ jsx(HighlightQuery, { text: item, query }),
/* @__PURE__ */ jsx("span", { className: itemIndex === items.length - 1 ? "sr-only" : "mx-2 text-slate-300 dark:text-slate-700", children: "/" })
] }, itemIndex))
}
)
]
}
);
}
function SearchResults() {
const { results, query } = useContext(SearchContext);
if (results.length === 0) {
return /* @__PURE__ */ jsxs("p", { className: "px-4 py-8 text-center text-sm text-slate-700 dark:text-slate-400", children: [
"Aucun résultat pour “",
/* @__PURE__ */ jsx("span", { className: "break-words text-slate-900 dark:text-white", children: query }),
"”"
] });
}
return /* @__PURE__ */ jsx("ul", { children: results.map((result) => /* @__PURE__ */ jsx(SearchResultItem, { result, query }, result.url)) });
}
function SearchDialog({ className }) {
const { close, isOpened, setIsOpened, results } = useContext(SearchContext);
useEffect(() => {
if (isOpened) return;
function onKeyDown(event) {
if (event.key === "k" && (event.metaKey || event.ctrlKey)) {
event.preventDefault();
setIsOpened(true);
}
}
window.addEventListener("keydown", onKeyDown);
return () => {
window.removeEventListener("keydown", onKeyDown);
};
}, [isOpened, setIsOpened]);
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(Dialog, { open: isOpened, onClose: close, className: clsx("fixed inset-0 z-50", className), children: [
/* @__PURE__ */ jsx("div", { className: "fixed inset-0 bg-slate-900/50 backdrop-blur-sm" }),
/* @__PURE__ */ jsx("div", { className: "fixed inset-0 overflow-y-auto px-4 py-4 sm:px-6 sm:py-20 md:py-32 lg:px-8 lg:py-[15vh]", children: /* @__PURE__ */ jsx(DialogPanel, { className: "mx-auto transform-gpu overflow-hidden rounded-xl bg-white shadow-xl sm:max-w-xl dark:bg-slate-800 dark:ring-1 dark:ring-slate-700", children: /* @__PURE__ */ jsxs("form", { onSubmit: (event) => event.preventDefault(), children: [
/* @__PURE__ */ jsx(SearchInput, {}),
/* @__PURE__ */ jsx("div", { className: "border-t border-slate-200 bg-white px-2 py-3 empty:hidden dark:border-slate-400/10 dark:bg-slate-800", children: results.length > 0 && /* @__PURE__ */ jsx(SearchResults, {}) })
] }) }) })
] }) });
}
function Search() {
const [results, setResults] = useState([]);
const [debouncedQuery, setDebouncedQuery] = useDebounce();
const [modifierKey, setModifierKey] = useState();
const [isLoading, setIsLoading] = useState(false);
const [isOpened, setIsOpened] = useState(false);
const [query, setQuery] = useState("");
useEffect(() => {
const platform = navigator.userAgentData?.platform || navigator.platform;
setModifierKey(/(Mac|iPhone|iPod|iPad)/i.test(platform) ? "⌘" : "Ctrl ");
}, []);
useEffect(() => {
setDebouncedQuery(query);
}, [query]);
useEffect(() => {
if (debouncedQuery.length === 0) {
setIsLoading(false);
setResults([]);
return;
}
setIsLoading(true);
onSearch(debouncedQuery, 5).then(setResults).finally(() => {
setIsLoading(false);
});
}, [debouncedQuery]);
return /* @__PURE__ */ jsxs(
SearchContext.Provider,
{
value: {
query,
close: () => setIsOpened(false),
results,
isLoading,
isOpened,
setQuery,
setIsOpened,
setIsLoading,
setResults
},
children: [
/* @__PURE__ */ jsxs(
"button",
{
type: "button",
className: "group flex h-6 w-6 items-center justify-center sm:justify-start md:h-auto md:w-80 md:flex-none md:rounded-lg md:py-2.5 md:pr-3.5 md:pl-4 md:text-sm md:ring-1 md:ring-slate-200 md:hover:ring-slate-300 lg:w-96 dark:md:bg-slate-800/75 dark:md:ring-white/5 dark:md:ring-inset dark:md:hover:bg-slate-700/40 dark:md:hover:ring-slate-500",
onClick: () => setIsOpened(true),
children: [
/* @__PURE__ */ jsx(SearchIcon, { className: "h-5 w-5 flex-none fill-slate-400 group-hover:fill-slate-500 md:group-hover:fill-slate-400 dark:fill-slate-500" }),
/* @__PURE__ */ jsx("span", { className: "sr-only md:not-sr-only md:ml-2 md:text-slate-500 md:dark:text-slate-400", children: "Rechercher..." }),
modifierKey && /* @__PURE__ */ jsxs("kbd", { className: "ml-auto hidden font-medium text-slate-400 md:block dark:text-slate-500", children: [
/* @__PURE__ */ jsx("kbd", { className: "font-sans", children: modifierKey }),
/* @__PURE__ */ jsx("kbd", { className: "font-sans", children: "K" })
] })
]
}
),
/* @__PURE__ */ jsx(SearchDialog, {})
]
}
);
}
/*! components/syntax/HeroBackground.tsx [vike:pluginModuleBanner] */
function HeroBackground(props) {
const id = useId();
return /* @__PURE__ */ jsxs("svg", { "aria-hidden": "true", viewBox: "0 0 668 1069", width: 668, height: 1069, fill: "none", ...props, children: [
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("clipPath", { id: `${id}-clip-path`, children: /* @__PURE__ */ jsx("path", { fill: "#fff", transform: "rotate(-180 334 534.4)", d: "M0 0h668v1068.8H0z" }) }) }),
/* @__PURE__ */ jsxs("g", { opacity: ".4", clipPath: `url(#${id}-clip-path)`, strokeWidth: 4, children: [
/* @__PURE__ */ jsx(
"path",
{
opacity: ".3",
d: "M584.5 770.4v-474M484.5 770.4v-474M384.5 770.4v-474M283.5 769.4v-474M183.5 768.4v-474M83.5 767.4v-474",
stroke: "#334155"
}
),
/* @__PURE__ */ jsx(
"path",
{
d: "M83.5 221.275v6.587a50.1 50.1 0 0 0 22.309 41.686l55.581 37.054a50.102 50.102 0 0 1 22.309 41.686v6.587M83.5 716.012v6.588a50.099 50.099 0 0 0 22.309 41.685l55.581 37.054a50.102 50.102 0 0 1 22.309 41.686v6.587M183.7 584.5v6.587a50.1 50.1 0 0 0 22.31 41.686l55.581 37.054a50.097 50.097 0 0 1 22.309 41.685v6.588M384.101 277.637v6.588a50.1 50.1 0 0 0 22.309 41.685l55.581 37.054a50.1 50.1 0 0 1 22.31 41.686v6.587M384.1 770.288v6.587a50.1 50.1 0 0 1-22.309 41.686l-55.581 37.054A50.099 50.099 0 0 0 283.9 897.3v6.588",
stroke: "#334155"
}
),
/* @__PURE__ */ jsx(
"path",
{
d: "M384.1 770.288v6.587a50.1 50.1 0 0 1-22.309 41.686l-55.581 37.054A50.099 50.099 0 0 0 283.9 897.3v6.588M484.3 594.937v6.587a50.1 50.1 0 0 1-22.31 41.686l-55.581 37.054A50.1 50.1 0 0 0 384.1 721.95v6.587M484.3 872.575v6.587a50.1 50.1 0 0 1-22.31 41.686l-55.581 37.054a50.098 50.098 0 0 0-22.309 41.686v6.582M584.501 663.824v39.988a50.099 50.099 0 0 1-22.31 41.685l-55.581 37.054a50.102 50.102 0 0 0-22.309 41.686v6.587M283.899 945.637v6.588a50.1 50.1 0 0 1-22.309 41.685l-55.581 37.05a50.12 50.12 0 0 0-22.31 41.69v6.59M384.1 277.637c0 19.946 12.763 37.655 31.686 43.962l137.028 45.676c18.923 6.308 31.686 24.016 31.686 43.962M183.7 463.425v30.69c0 21.564 13.799 40.709 34.257 47.529l134.457 44.819c18.922 6.307 31.686 24.016 31.686 43.962M83.5 102.288c0 19.515 13.554 36.412 32.604 40.645l235.391 52.309c19.05 4.234 32.605 21.13 32.605 40.646M83.5 463.425v-58.45M183.699 542.75V396.625M283.9 1068.8V945.637M83.5 363.225v-141.95M83.5 179.524v-77.237M83.5 60.537V0M384.1 630.425V277.637M484.301 830.824V594.937M584.5 1068.8V663.825M484.301 555.275V452.988M584.5 622.075V452.988M384.1 728.537v-56.362M384.1 1068.8v-20.88M384.1 1006.17V770.287M283.9 903.888V759.85M183.699 1066.71V891.362M83.5 1068.8V716.012M83.5 674.263V505.175",
stroke: "#334155"
}
),
/* @__PURE__ */ jsx("circle", { cx: "83.5", cy: "384.1", r: "10.438", transform: "rotate(-180 83.5 384.1)", fill: "#1E293B", stroke: "#334155" }),
/* @__PURE__ */ jsx("circle", { cx: "83.5", cy: "200.399", r: "10.438", transform: "rotate(-180 83.5 200.399)", stroke: "#334155" }),
/* @__PURE__ */ jsx("circle", { cx: "83.5", cy: "81.412", r: "10.438", transform: "rotate(-180 83.5 81.412)", stroke: "#334155" }),
/* @__PURE__ */ jsx(
"circle",
{
cx: "183.699",
cy: "375.75",
r: "10.438",
transform: "rotate(-180 183.699 375.75)",
fill: "#1E293B",
stroke: "#334155"
}
),
/* @__PURE__ */ jsx(
"circle",
{
cx: "183.699",
cy: "563.625",
r: "10.438",
transform: "rotate(-180 183.699 563.625)",
fill: "#1E293B",
stroke: "#334155"
}
),
/* @__PURE__ */ jsx("circle", { cx: "384.1", cy: "651.3", r: "10.438", transform: "rotate(-180 384.1 651.3)", fill: "#1E293B", stroke: "#334155" }),
/* @__PURE__ */ jsx(
"circle",
{
cx: "484.301",
cy: "574.062",
r: "10.438",
transform: "rotate(-180 484.301 574.062)",
fill: "#0EA5E9",
fillOpacity: ".42",
stroke: "#0EA5E9"
}
),
/* @__PURE__ */ jsx(
"circle",
{
cx: "384.1",
cy: "749.412",
r: "10.438",
transform: "rotate(-180 384.1 749.412)",
fill: "#1E293B",
stroke: "#334155"
}
),
/* @__PURE__ */ jsx("circle", { cx: "384.1", cy: "1027.05", r: "10.438", transform: "rotate(-180 384.1 1027.05)", stroke: "#334155" }),
/* @__PURE__ */ jsx("circle", { cx: "283.9", cy: "924.763", r: "10.438", transform: "rotate(-180 283.9 924.763)", stroke: "#334155" }),
/* @__PURE__ */ jsx("circle", { cx: "183.699", cy: "870.487", r: "10.438", transform: "rotate(-180 183.699 870.487)", stroke: "#334155" }),
/* @__PURE__ */ jsx(
"circle",
{
cx: "283.9",
cy: "738.975",
r: "10.438",
transform: "rotate(-180 283.9 738.975)",
fill: "#1E293B",
stroke: "#334155"
}
),
/* @__PURE__ */ jsx(
"circle",
{
cx: "83.5",
cy: "695.138",
r: "10.438",
transform: "rotate(-180 83.5 695.138)",
fill: "#1E293B",
stroke: "#334155"
}
),
/* @__PURE__ */ jsx(
"circle",
{
cx: "83.5",
cy: "484.3",
r: "10.438",
transform: "rotate(-180 83.5 484.3)",
fill: "#0EA5E9",
fillOpacity: ".42",
stroke: "#0EA5E9"
}
),
/* @__PURE__ */ jsx(
"circle",
{
cx: "484.301",
cy: "432.112",
r: "10.438",
transform: "rotate(-180 484.301 432.112)",
fill: "#1E293B",
stroke: "#334155"
}
),
/* @__PURE__ */ jsx(
"circle",
{
cx: "584.5",
cy: "432.112",
r: "10.438",
transform: "rotate(-180 584.5 432.112)",
fill: "#1E293B",
stroke: "#334155"
}
),
/* @__PURE__ */ jsx(
"circle",
{
cx: "584.5",
cy: "642.95",
r: "10.438",
transform: "rotate(-180 584.5 642.95)",
fill: "#1E293B",
stroke: "#334155"
}
),
/* @__PURE__ */ jsx("circle", { cx: "484.301", cy: "851.699", r: "10.438", transform: "rotate(-180 484.301 851.699)", stroke: "#334155" }),
/* @__PURE__ */ jsx("circle", { cx: "384.1", cy: "256.763", r: "10.438", transform: "rotate(-180 384.1 256.763)", stroke: "#334155" })
] })
] });
}
/*! images/blur-indigo.png [vike:pluginModuleBanner] */
const blurIndigoImage = "/assets/static/blur-indigo.Cbr0CUfr.png";
/*! images/blur-cyan.png [vike:pluginModuleBanner] */
const blurCyanImage = "/assets/static/blur-cyan.DJww6-ho.png";
/*! components/common/Image.tsx [vike:pluginModuleBanner] */
function Image(props) {
return /* @__PURE__ */ jsx("img", { ...props, src: props.src, alt: props.alt, loading: "lazy" });
}
/*! components/syntax/Hero.tsx [vike:pluginModuleBanner] */
const codeLanguage = "javascript";
const code = `export default {
role: 'developer',
qualifications: [
'DWWM',
'CDA',
'CDUI',
]
}`;
const tabs = [
{ name: "memento-dev.config.js", isActive: true },
{ name: "package.json", isActive: false }
];
function TrafficLightsIcon(props) {
return /* @__PURE__ */ jsxs("svg", { "aria-hidden": "true", viewBox: "0 0 42 10", fill: "none", ...props, children: [
/* @__PURE__ */ jsx("circle", { cx: "5", cy: "5", r: "4.5" }),
/* @__PURE__ */ jsx("circle", { cx: "21", cy: "5", r: "4.5" }),
/* @__PURE__ */ jsx("circle", { cx: "37", cy: "5", r: "4.5" })
] });
}
function Hero() {
return /* @__PURE__ */ jsx("div", { className: "overflow-hidden bg-slate-900 dark:mt-[-4.75rem] dark:-mb-32 dark:pt-[4.75rem] dark:pb-32", children: /* @__PURE__ */ jsx("div", { className: "py-16 sm:px-2 lg:relative lg:px-0 lg:py-20", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto grid max-w-2xl w-full grid-cols-1 items-center gap-x-8 gap-y-16 px-4 lg:max-w-8xl lg:grid-cols-2 lg:px-8 xl:gap-x-16 xl:px-12", children: [
/* @__PURE__ */ jsxs("div", { className: "relative z-10 md:text-center lg:text-left", children: [
/* @__PURE__ */ jsx(
Image,
{
className: "absolute right-full bottom-full -mr-72 -mb-56 opacity-50",
src: blurCyanImage,
alt: "",
width: 530,
height: 530
}
),
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
/* @__PURE__ */ jsx("p", { className: "inline bg-linear-to-r from-indigo-200 via-violet-400 to-indigo-200 bg-clip-text font-display text-5xl tracking-tight text-transparent", children: "Souviens-toi que tu développeras." }),
/* @__PURE__ */ jsx("p", { className: "mt-3 text-2xl tracking-tight text-slate-400", children: "Découvrez des ressources essentielles pour améliorer tes compétences en développement." }),
/* @__PURE__ */ jsxs("div", { className: "mt-8 flex gap-4 md:justify-center lg:justify-start", children: [
/* @__PURE__ */ jsx(Button, { href: "/", children: "Accédez aux ressources" }),
/* @__PURE__ */ jsx(Button, { href: "/", variant: "secondary", children: "Voir sur Github" })
] })
] })
] }),
/* @__PURE__ */ jsxs("div", { className: "relative lg:static xl:pl-10", children: [
/* @__PURE__ */ jsx("div", { className: "absolute inset-x-[-50vw] -top-32 -bottom-48 [mask-image:linear-gradient(transparent,white,white)] lg:-top-32 lg:right-0 lg:-bottom-32 lg:left-[calc(50%+14rem)] lg:[mask-image:none] dark:[mask-image:linear-gradient(transparent,white,transparent)] lg:dark:[mask-image:linear-gradient(white,white,transparent)]", children: /* @__PURE__ */ jsx(HeroBackground, { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 lg:left-0 lg:translate-x-0 lg:translate-y-[-60%]" }) }),
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
/* @__PURE__ */ jsx(Image, { className: "absolute -top-64 -right-64", src: blurCyanImage, alt: "", width: 530, height: 530 }),
/* @__PURE__ */ jsx(Image, { className: "absolute -right-44 -bottom-40", src: blurIndigoImage, alt: "", width: 567, height: 567 }),
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 rounded-2xl bg-linear-to-tr from-violet-300 via-violet-300/70 to-purple-300 opacity-10 blur-lg" }),
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 rounded-2xl bg-linear-to-tr from-violet-300 via-violet-300/70 to-purple-300 opacity-10" }),
/* @__PURE__ */ jsxs("div", { className: "relative rounded-2xl bg-[#0A101F]/80 ring-1 ring-white/10 backdrop-blur-sm", children: [
/* @__PURE__ */ jsx("div", { className: "absolute -top-px right-11 left-20 h-px bg-linear-to-r from-violet-300/0 via-violet-300/70 to-violet-300/0" }),
/* @__PURE__ */ jsx("div", { className: "absolute right-20 -bottom-px left-11 h-px bg-linear-to-r from-purple-400/0 via-purple-400 to-purple-400/0" }),
/* @__PURE__ */ jsxs("div", { className: "pt-4 pl-4", children: [
/* @__PURE__ */ jsx(TrafficLightsIcon, { className: "h-2.5 w-auto stroke-slate-500/30" }),
/* @__PURE__ */ jsx("div", { className: "mt-4 flex space-x-2 text-xs", children: tabs.map((tab) => /* @__PURE__ */ jsx(
"div",
{
className: clsx(
"flex h-6 rounded-full",
tab.isActive ? "bg-linear-to-r from-violet-400/30 via-violet-400 to-violet-400/30 p-px font-medium text-violet-300" : "text-slate-500"
),
children: /* @__PURE__ */ jsx("div", { className: clsx("flex items-center rounded-full px-2.5", tab.isActive && "bg-slate-800"), children: tab.name })
},
tab.name
)) }),
/* @__PURE__ */ jsxs("div", { className: "mt-6 flex items-start px-1 text-sm", children: [
/* @__PURE__ */ jsx(
"div",
{
"aria-hidden": "true",
className: "border-r border-slate-300/5 pr-4 font-mono text-slate-600 select-none",
children: Array.from({
length: code.split("\n").length
}).map((_, index) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
(index + 1).toString().padStart(2, "0"),
/* @__PURE__ */ jsx("br", {})
] }, index))
}
),
/* @__PURE__ */ jsx(Highlight, { code, language: codeLanguage, theme: { plain: {}, styles: [] }, children: ({ className, style, tokens, getLineProps, getTokenProps }) => /* @__PURE__ */ jsx("pre", { className: clsx(className, "flex overflow-x-auto pb-6"), style, children: /* @__PURE__ */ jsx("code", { className: "px-4", children: tokens.map((line, lineIndex) => /* @__PURE__ */ jsx("div", { ...getLineProps({ line }), children: line.map((token, tokenIndex) => /* @__PURE__ */ jsx("span", { ...getTokenProps({ token }) }, tokenIndex)) }, lineIndex)) }) }) })
] })
] })
] })
] })
] })
] }) }) });
}
/*! layouts/LayoutDefault.tsx [vike:pluginModuleBanner] */
function GitHubIcon(props) {
return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", viewBox: "0 0 16 16", ...props, children: /* @__PURE__ */ jsx("path", { d: "M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z" }) });
}
function Header() {
let [isScrolled, setIsScrolled] = useState(false);
useEffect(() => {
function onScroll() {
setIsScrolled(window.scrollY > 0);
}
onScroll();
window.addEventListener("scroll", onScroll, { passive: true });
return () => {
window.removeEventListener("scroll", onScroll);
};
}, []);
return /* @__PURE__ */ jsxs(
"header",
{
className: clsx(
"sticky top-0 z-50 flex flex-none flex-wrap items-center justify-between bg-white px-4 py-5 shadow-md shadow-slate-900/5 transition duration-500 sm:px-6 lg:px-8 dark:shadow-none",
isScrolled ? "dark:bg-slate-900/95 dark:backdrop-blur-sm dark:[@supports(backdrop-filter:blur(0))]:bg-slate-900/75" : "dark:bg-transparent"
),
children: [
/* @__PURE__ */ jsx("div", { className: "mr-6 flex lg:hidden", children: /* @__PURE__ */ jsx(MobileNavigation, {}) }),
/* @__PURE__ */ jsx("div", { className: "relative flex grow basis-0 items-center", children: /* @__PURE__ */ jsx(Link, { href: "/", "aria-label": "Home page", children: /* @__PURE__ */ jsx(Logo, { className: "h-9 w-auto lg:block" }) }) }),
/* @__PURE__ */ jsx("div", { className: "-my-5 mr-6 sm:mr-8 md:mr-0", children: /* @__PURE__ */ jsx(Search, {}) }),
/* @__PURE__ */ jsxs("div", { className: "relative flex basis-0 justify-end gap-6 sm:gap-8 md:grow", children: [
/* @__PURE__ */ jsx(ThemeSelector, { className: "relative z-10" }),
/* @__PURE__ */ jsx(Link, { href: "https://gitea.gauthierdaniels.fr/GauthierWebDev/memento-dev", className: "group", "aria-label": "GitHub", children: /* @__PURE__ */ jsx(GitHubIcon, { className: "h-6 w-6 fill-slate-400 group-hover:fill-slate-500 dark:group-hover:fill-slate-300" }) })
] })
]
}
);
}
function DefaultLayout({ children }) {
const { urlPathname } = usePageContext();
const isHomePage = urlPathname === "/";
return /* @__PURE__ */ jsx(ThemeProvider, { children: /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-col", children: [
/* @__PURE__ */ jsx(Header, {}),
isHomePage && /* @__PURE__ */ jsx(Hero, {}),
/* @__PURE__ */ jsxs("div", { className: "relative mx-auto w-full flex max-w-8xl flex-auto justify-center sm:px-2 lg:px-8 xl:px-12", children: [
/* @__PURE__ */ jsxs("div", { className: "hidden lg:relative lg:block lg:flex-none", children: [
/* @__PURE__ */ jsx("div", { className: "absolute inset-y-0 right-0 w-[50vw] bg-slate-50 dark:hidden" }),
/* @__PURE__ */ jsx("div", { className: "absolute top-16 right-0 bottom-0 hidden h-12 w-px bg-linear-to-t from-slate-800 dark:block" }),
/* @__PURE__ */ jsx("div", { className: "absolute top-28 right-0 bottom-0 hidden w-px bg-slate-800 dark:block" }),
/* @__PURE__ */ jsx("div", { className: "sticky top-[4.75rem] -ml-0.5 h-[calc(100vh-4.75rem)] w-64 overflow-x-hidden overflow-y-auto py-16 pr-8 pl-0.5 xl:w-72 xl:pr-16", children: /* @__PURE__ */ jsx(Navigation, {}) })
] }),
children
] })
] }) });
}
/*! pages/+config.ts [vike:pluginModuleBanner] */
const config = {
// https://vike.dev/head-tags
title: "Memento Dev"
};
/*! pages/+title.ts [vike:pluginModuleBanner] */
function title() {
return `Synthèses et ressources pour développeurs - ${config.title}`;
}
const import6 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
title
}, Symbol.toStringTag, { value: "Module" }));
export {
DefaultLayout as D,
import4 as a,
config as c,
import6 as i,
title as t
};

1089
app/dist/server/chunks/chunk-DhcPoVSR.js vendored Normal file

File diff suppressed because it is too large Load Diff

160
app/dist/server/entries/pages_docs.mjs vendored Normal file
View File

@ -0,0 +1,160 @@
import { onRenderHtml } from "vike-react/__internal/integration/onRenderHtml";
import { useData } from "vike-react/useData";
import Markdoc from "@markdoc/markdoc";
import { t as tags, n as nodes, d as docsService } from "../chunks/chunk-DhcPoVSR.js";
import React from "react";
import { readingTime } from "reading-time-estimator";
import { useConfig } from "vike-react/useConfig";
import { t as title, c as config, i as import6$1, D as DefaultLayout, a as import4 } from "../chunks/chunk-Cog4aWZK.js";
import { render } from "vike/abort";
import import6 from "vike-react/__internal/integration/Loading";
import "telefunc";
import "flexsearch";
import "@sindresorhus/slugify";
import "react/jsx-runtime";
import "vike-react/usePageContext";
import "clsx";
import "@heroicons/react/24/outline";
import "prism-react-renderer";
import "js-yaml";
import "fast-glob";
import "path";
import "fs";
import "@headlessui/react";
/* empty css */
/* empty css */
/* empty css */
/* empty css */
import "vike-react/config";
import "react-highlight-words";
import "vike/client/router";
/*! pages/docs/+Page.tsx [vike:pluginModuleBanner] */
function Page() {
const { doc, estimatedReadingTime } = useData();
const parsedDoc = Markdoc.parse(doc.content);
const transformedDoc = Markdoc.transform(parsedDoc, { nodes, tags, variables: { estimatedReadingTime } });
return Markdoc.renderers.react(transformedDoc, React);
}
const import2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
default: Page
}, Symbol.toStringTag, { value: "Module" }));
/*! pages/buildTitle.ts [vike:pluginModuleBanner] */
function buildTitle(pageTitle) {
if (!pageTitle) return title();
return `${pageTitle} - ${config.title}`;
}
/*! pages/docs/+data.ts [vike:pluginModuleBanner] */
async function data(pageContext) {
const config2 = useConfig();
const { key } = pageContext.routeParams;
const doc = await docsService.getDoc("docs", key);
if (!doc) {
throw render(404);
}
const readingTimeObject = readingTime(doc.content, 300, "fr");
config2({
title: buildTitle(doc.title),
description: doc.description
});
docsService.transform(doc);
return { doc, estimatedReadingTime: readingTimeObject.text };
}
const import3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
data
}, Symbol.toStringTag, { value: "Module" }));
/*! virtual:vike:pageConfigValuesAll:server:/pages/docs [vike:pluginModuleBanner] */
const configValuesSerialized = {
["isClientRuntimeLoaded"]: {
type: "computed",
definedAtData: null,
valueSerialized: {
type: "js-serialized",
value: true
}
},
["onRenderHtml"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "vike-react/__internal/integration/onRenderHtml", "fileExportPathToShowToUser": [] },
valueSerialized: {
type: "pointer-import",
value: onRenderHtml
}
},
["Page"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "/pages/docs/+Page.tsx", "fileExportPathToShowToUser": [] },
valueSerialized: {
type: "plus-file",
exportValues: import2
}
},
["passToClient"]: {
type: "cumulative",
definedAtData: [{ "filePathToShowToUser": "vike-react/config", "fileExportPathToShowToUser": ["default", "passToClient"] }],
valueSerialized: [{
type: "js-serialized",
value: ["_configFromHook"]
}]
},
["data"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "/pages/docs/+data.ts", "fileExportPathToShowToUser": [] },
valueSerialized: {
type: "plus-file",
exportValues: import3
}
},
["Head"]: {
type: "cumulative",
definedAtData: [{ "filePathToShowToUser": "/pages/+Head.tsx", "fileExportPathToShowToUser": [] }],
valueSerialized: [{
type: "plus-file",
exportValues: import4
}]
},
["Layout"]: {
type: "cumulative",
definedAtData: [{ "filePathToShowToUser": "/layouts/LayoutDefault.tsx", "fileExportPathToShowToUser": [] }],
valueSerialized: [{
type: "pointer-import",
value: DefaultLayout
}]
},
["title"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "/pages/+title.ts", "fileExportPathToShowToUser": [] },
valueSerialized: {
type: "plus-file",
exportValues: import6$1
}
},
["description"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "/pages/+config.ts", "fileExportPathToShowToUser": ["default", "description"] },
valueSerialized: {
type: "js-serialized",
value: "Demo showcasing Vike"
}
},
["lang"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "/pages/+config.ts", "fileExportPathToShowToUser": ["default", "lang"] },
valueSerialized: {
type: "js-serialized",
value: "fr"
}
},
["Loading"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "vike-react/__internal/integration/Loading", "fileExportPathToShowToUser": [] },
valueSerialized: {
type: "pointer-import",
value: import6
}
}
};
export {
configValuesSerialized
};

132
app/dist/server/entries/pages_error.mjs vendored Normal file
View File

@ -0,0 +1,132 @@
import { onRenderHtml } from "vike-react/__internal/integration/onRenderHtml";
import { jsx, Fragment, jsxs } from "react/jsx-runtime";
import { usePageContext } from "vike-react/usePageContext";
import { L as Link } from "../chunks/chunk-DhcPoVSR.js";
import { i as import6$1, D as DefaultLayout, a as import4 } from "../chunks/chunk-Cog4aWZK.js";
import import6 from "vike-react/__internal/integration/Loading";
import "telefunc";
import "flexsearch";
import "@sindresorhus/slugify";
import "@markdoc/markdoc";
import "react";
import "clsx";
import "@heroicons/react/24/outline";
import "prism-react-renderer";
import "js-yaml";
import "fast-glob";
import "path";
import "fs";
import "@headlessui/react";
/* empty css */
/* empty css */
/* empty css */
/* empty css */
import "vike-react/config";
import "react-highlight-words";
import "vike/client/router";
/*! pages/_error/+Page.tsx [vike:pluginModuleBanner] */
function Page() {
const { is404 } = usePageContext();
if (is404) {
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("div", { className: "max-w-2xl min-w-0 flex-auto px-4 py-16 lg:max-w-none lg:pr-0 lg:pl-8 xl:px-16", children: /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col items-center justify-center text-center", children: [
/* @__PURE__ */ jsx("p", { className: "font-display text-sm font-medium text-slate-900 dark:text-white", children: "404" }),
/* @__PURE__ */ jsx("h1", { className: "mt-3 font-display text-3xl tracking-tight text-slate-900 dark:text-white", children: "Page introuvable" }),
/* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-slate-500 dark:text-slate-400", children: "Désolé, nous ne pouvons pas trouver la page que vous recherchez." }),
/* @__PURE__ */ jsx(Link, { href: "/", className: "mt-8 text-sm font-medium text-slate-900 dark:text-white", children: "Retour à l'accueil" })
] }) }) });
}
return /* @__PURE__ */ jsxs(Fragment, { children: [
/* @__PURE__ */ jsx("h1", { children: "500 Internal Server Error" }),
/* @__PURE__ */ jsx("p", { children: "Something went wrong." })
] });
}
const import2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
default: Page
}, Symbol.toStringTag, { value: "Module" }));
/*! virtual:vike:pageConfigValuesAll:server:/pages/_error [vike:pluginModuleBanner] */
const configValuesSerialized = {
["isClientRuntimeLoaded"]: {
type: "computed",
definedAtData: null,
valueSerialized: {
type: "js-serialized",
value: true
}
},
["onRenderHtml"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "vike-react/__internal/integration/onRenderHtml", "fileExportPathToShowToUser": [] },
valueSerialized: {
type: "pointer-import",
value: onRenderHtml
}
},
["Page"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "/pages/_error/+Page.tsx", "fileExportPathToShowToUser": [] },
valueSerialized: {
type: "plus-file",
exportValues: import2
}
},
["passToClient"]: {
type: "cumulative",
definedAtData: [{ "filePathToShowToUser": "vike-react/config", "fileExportPathToShowToUser": ["default", "passToClient"] }],
valueSerialized: [{
type: "js-serialized",
value: ["_configFromHook"]
}]
},
["Head"]: {
type: "cumulative",
definedAtData: [{ "filePathToShowToUser": "/pages/+Head.tsx", "fileExportPathToShowToUser": [] }],
valueSerialized: [{
type: "plus-file",
exportValues: import4
}]
},
["Layout"]: {
type: "cumulative",
definedAtData: [{ "filePathToShowToUser": "/layouts/LayoutDefault.tsx", "fileExportPathToShowToUser": [] }],
valueSerialized: [{
type: "pointer-import",
value: DefaultLayout
}]
},
["title"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "/pages/+title.ts", "fileExportPathToShowToUser": [] },
valueSerialized: {
type: "plus-file",
exportValues: import6$1
}
},
["description"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "/pages/+config.ts", "fileExportPathToShowToUser": ["default", "description"] },
valueSerialized: {
type: "js-serialized",
value: "Demo showcasing Vike"
}
},
["lang"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "/pages/+config.ts", "fileExportPathToShowToUser": ["default", "lang"] },
valueSerialized: {
type: "js-serialized",
value: "fr"
}
},
["Loading"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "vike-react/__internal/integration/Loading", "fileExportPathToShowToUser": [] },
valueSerialized: {
type: "pointer-import",
value: import6
}
}
};
export {
configValuesSerialized
};

120
app/dist/server/entries/pages_index.mjs vendored Normal file
View File

@ -0,0 +1,120 @@
import { onRenderHtml } from "vike-react/__internal/integration/onRenderHtml";
import { jsx } from "react/jsx-runtime";
import { i as import6$1, D as DefaultLayout, a as import4 } from "../chunks/chunk-Cog4aWZK.js";
import import6 from "vike-react/__internal/integration/Loading";
import "react";
import "vike-react/usePageContext";
import "@headlessui/react";
import "../chunks/chunk-DhcPoVSR.js";
import "telefunc";
import "flexsearch";
import "@sindresorhus/slugify";
import "@markdoc/markdoc";
import "clsx";
import "@heroicons/react/24/outline";
import "prism-react-renderer";
import "js-yaml";
import "fast-glob";
import "path";
import "fs";
/* empty css */
/* empty css */
/* empty css */
/* empty css */
import "vike-react/config";
import "react-highlight-words";
import "vike/client/router";
/*! pages/index/+Page.tsx [vike:pluginModuleBanner] */
function Page() {
return /* @__PURE__ */ jsx("main", { className: "max-w-2xl min-w-0 flex-auto px-4 py-16 lg:max-w-none lg:pr-0 lg:pl-8 xl:px-16", children: /* @__PURE__ */ jsx("h1", { className: "font-bold text-3xl pb-4", children: "My Vike app" }) });
}
const import2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
default: Page
}, Symbol.toStringTag, { value: "Module" }));
/*! virtual:vike:pageConfigValuesAll:server:/pages/index [vike:pluginModuleBanner] */
const configValuesSerialized = {
["isClientRuntimeLoaded"]: {
type: "computed",
definedAtData: null,
valueSerialized: {
type: "js-serialized",
value: true
}
},
["onRenderHtml"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "vike-react/__internal/integration/onRenderHtml", "fileExportPathToShowToUser": [] },
valueSerialized: {
type: "pointer-import",
value: onRenderHtml
}
},
["Page"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "/pages/index/+Page.tsx", "fileExportPathToShowToUser": [] },
valueSerialized: {
type: "plus-file",
exportValues: import2
}
},
["passToClient"]: {
type: "cumulative",
definedAtData: [{ "filePathToShowToUser": "vike-react/config", "fileExportPathToShowToUser": ["default", "passToClient"] }],
valueSerialized: [{
type: "js-serialized",
value: ["_configFromHook"]
}]
},
["Head"]: {
type: "cumulative",
definedAtData: [{ "filePathToShowToUser": "/pages/+Head.tsx", "fileExportPathToShowToUser": [] }],
valueSerialized: [{
type: "plus-file",
exportValues: import4
}]
},
["Layout"]: {
type: "cumulative",
definedAtData: [{ "filePathToShowToUser": "/layouts/LayoutDefault.tsx", "fileExportPathToShowToUser": [] }],
valueSerialized: [{
type: "pointer-import",
value: DefaultLayout
}]
},
["title"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "/pages/+title.ts", "fileExportPathToShowToUser": [] },
valueSerialized: {
type: "plus-file",
exportValues: import6$1
}
},
["description"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "/pages/+config.ts", "fileExportPathToShowToUser": ["default", "description"] },
valueSerialized: {
type: "js-serialized",
value: "Demo showcasing Vike"
}
},
["lang"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "/pages/+config.ts", "fileExportPathToShowToUser": ["default", "lang"] },
valueSerialized: {
type: "js-serialized",
value: "fr"
}
},
["Loading"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "vike-react/__internal/integration/Loading", "fileExportPathToShowToUser": [] },
valueSerialized: {
type: "pointer-import",
value: import6
}
}
};
export {
configValuesSerialized
};

385
app/dist/server/entry.mjs vendored Normal file
View File

@ -0,0 +1,385 @@
import { setGlobalContext_buildEntry } from "vike/__internal";
import { setTelefuncLoaders } from "telefunc/__internal/loadBuild";
/*! pages/docs/+route.ts [vike:pluginModuleBanner] */
const routeRegex = /^\/docs\/(.*)$/;
function route(pageContext) {
const match = pageContext.urlPathname.match(routeRegex);
if (!match) return false;
const [, key] = match;
return { routeParams: { key } };
}
const import1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
route
}, Symbol.toStringTag, { value: "Module" }));
/*! virtual:vike:importUserCode:server [vike:pluginModuleBanner] */
const pageFilesLazy = {};
const pageFilesEager = {};
const pageFilesExportNamesLazy = {};
const pageFilesExportNamesEager = {};
const pageFilesList = [];
const neverLoaded = {};
const pageConfigsSerialized = [
{
pageId: "/pages/_error",
isErrorPage: true,
routeFilesystem: void 0,
loadConfigValuesAll: () => ({ moduleId: "virtual:vike:pageConfigValuesAll:server:/pages/_error", moduleExports: import("./entries/pages_error.mjs") }),
configValuesSerialized: {
["isClientRuntimeLoaded"]: {
type: "computed",
definedAtData: null,
valueSerialized: {
type: "js-serialized",
value: true
}
},
["clientRouting"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "vike-react/config", "fileExportPathToShowToUser": ["default", "clientRouting"] },
valueSerialized: {
type: "js-serialized",
value: true
}
}
}
},
{
pageId: "/pages/index",
isErrorPage: void 0,
routeFilesystem: { "routeString": "/", "definedAtLocation": "/pages/index/" },
loadConfigValuesAll: () => ({ moduleId: "virtual:vike:pageConfigValuesAll:server:/pages/index", moduleExports: import("./entries/pages_index.mjs") }),
configValuesSerialized: {
["isClientRuntimeLoaded"]: {
type: "computed",
definedAtData: null,
valueSerialized: {
type: "js-serialized",
value: true
}
},
["clientRouting"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "vike-react/config", "fileExportPathToShowToUser": ["default", "clientRouting"] },
valueSerialized: {
type: "js-serialized",
value: true
}
}
}
},
{
pageId: "/pages/docs",
isErrorPage: void 0,
routeFilesystem: { "routeString": "/docs", "definedAtLocation": "/pages/docs/" },
loadConfigValuesAll: () => ({ moduleId: "virtual:vike:pageConfigValuesAll:server:/pages/docs", moduleExports: import("./entries/pages_docs.mjs") }),
configValuesSerialized: {
["isClientRuntimeLoaded"]: {
type: "computed",
definedAtData: null,
valueSerialized: {
type: "js-serialized",
value: true
}
},
["route"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "/pages/docs/+route.ts", "fileExportPathToShowToUser": [] },
valueSerialized: {
type: "plus-file",
exportValues: import1
}
},
["clientRouting"]: {
type: "standard",
definedAtData: { "filePathToShowToUser": "vike-react/config", "fileExportPathToShowToUser": ["default", "clientRouting"] },
valueSerialized: {
type: "js-serialized",
value: true
}
}
}
}
];
const pageConfigGlobalSerialized = {
configValuesSerialized: {
["htmlAttributes"]: {
type: "cumulative",
definedAtData: [{ "filePathToShowToUser": "/pages/+config.ts", "fileExportPathToShowToUser": ["default", "htmlAttributes"] }],
valueSerialized: [{
type: "js-serialized",
value: { "class": "h-full antialiased" }
}]
},
["bodyAttributes"]: {
type: "cumulative",
definedAtData: [{ "filePathToShowToUser": "/pages/+config.ts", "fileExportPathToShowToUser": ["default", "bodyAttributes"] }],
valueSerialized: [{
type: "js-serialized",
value: { "class": "flex min-h-full bg-white dark:bg-slate-900" }
}]
}
}
};
const pageFilesLazyIsomorph1 = /* @__PURE__ */ Object.assign({});
const pageFilesLazyIsomorph = { ...pageFilesLazyIsomorph1 };
pageFilesLazy[".page"] = pageFilesLazyIsomorph;
const pageFilesLazyServer1 = /* @__PURE__ */ Object.assign({});
const pageFilesLazyServer = { ...pageFilesLazyServer1 };
pageFilesLazy[".page.server"] = pageFilesLazyServer;
const pageFilesEagerRoute1 = /* @__PURE__ */ Object.assign({});
const pageFilesEagerRoute = { ...pageFilesEagerRoute1 };
pageFilesEager[".page.route"] = pageFilesEagerRoute;
const pageFilesExportNamesEagerClient1 = /* @__PURE__ */ Object.assign({});
const pageFilesExportNamesEagerClient = { ...pageFilesExportNamesEagerClient1 };
pageFilesExportNamesEager[".page.client"] = pageFilesExportNamesEagerClient;
const virtualFileExports = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
neverLoaded,
pageConfigGlobalSerialized,
pageConfigsSerialized,
pageFilesEager,
pageFilesExportNamesEager,
pageFilesExportNamesLazy,
pageFilesLazy,
pageFilesList
}, Symbol.toStringTag, { value: "Module" }));
/*! node_modules/.pnpm/telefunc@0.1.87_@babel+core@7.26.10_@babel+parser@7.27.0_@babel+types@7.27.0_react-stre_779ec5fef2a5267e40fd00b9dc06fd8a/node_modules/telefunc/dist/cjs/node/vite/importGlob/telefuncFilesGlob.js [vike:pluginModuleBanner] */
const telefuncFilesGlob = /* @__PURE__ */ Object.assign({ "/components/syntax/Search.telefunc.ts": () => import("./chunks/chunk-DhcPoVSR.js").then((n) => n.S) });
const telefuncFiles = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
telefuncFilesGlob
}, Symbol.toStringTag, { value: "Module" }));
/*! virtual:@brillout/vite-plugin-server-entry:serverEntry [vike:pluginModuleBanner] */
{
const assetsManifest = {
"_chunk-FoQi8sq6.js": {
"file": "assets/chunks/chunk-FoQi8sq6.js",
"name": "renderPageClientSide",
"dynamicImports": [
"virtual:vike:pageConfigValuesAll:client:/pages/_error",
"virtual:vike:pageConfigValuesAll:client:/pages/index",
"virtual:vike:pageConfigValuesAll:client:/pages/docs"
]
},
"_chunk-YnSR0nZE.js": {
"file": "assets/chunks/chunk-YnSR0nZE.js",
"name": "Loading",
"imports": [
"_chunk-FoQi8sq6.js"
],
"css": [
"assets/static/vike-react-fe70c48a.BcWtY8Ol.css",
"assets/static/layouts_style-b34a8e57.HyLxvJhb.css",
"assets/static/layouts_tailwind-00e65532.kM054_rr.css",
"assets/static/layouts_prism-feac250c.B2a_QZIO.css",
"assets/static/style-1efdef47.B5Troj4Q.css"
],
"assets": [
"assets/static/blur-indigo.Cbr0CUfr.png",
"assets/static/blur-cyan.DJww6-ho.png",
"assets/static/inter-cyrillic-ext-wght-normal.B2xhLi22.woff2",
"assets/static/inter-cyrillic-wght-normal.CMZtQduZ.woff2",
"assets/static/inter-greek-ext-wght-normal.CGAr0uHJ.woff2",
"assets/static/inter-greek-wght-normal.CaVNZxsx.woff2",
"assets/static/inter-vietnamese-wght-normal.CBcvBZtf.woff2",
"assets/static/inter-latin-ext-wght-normal.CFHvXkgd.woff2",
"assets/static/inter-latin-wght-normal.C2S99t-D.woff2",
"assets/static/lexend-vietnamese-wght-normal.RvljkFvg.woff2",
"assets/static/lexend-latin-ext-wght-normal.Ca5OILQq.woff2",
"assets/static/lexend-latin-wght-normal.ga3u8m5q.woff2"
]
},
"_layouts_prism-feac250c.B2a_QZIO.css": {
"file": "assets/static/layouts_prism-feac250c.B2a_QZIO.css",
"src": "_layouts_prism-feac250c.B2a_QZIO.css"
},
"_layouts_style-b34a8e57.HyLxvJhb.css": {
"file": "assets/static/layouts_style-b34a8e57.HyLxvJhb.css",
"src": "_layouts_style-b34a8e57.HyLxvJhb.css"
},
"_layouts_tailwind-00e65532.kM054_rr.css": {
"file": "assets/static/layouts_tailwind-00e65532.kM054_rr.css",
"src": "_layouts_tailwind-00e65532.kM054_rr.css"
},
"_style-1efdef47.B5Troj4Q.css": {
"file": "assets/static/style-1efdef47.B5Troj4Q.css",
"src": "_style-1efdef47.B5Troj4Q.css"
},
"_vike-react-fe70c48a.BcWtY8Ol.css": {
"file": "assets/static/vike-react-fe70c48a.BcWtY8Ol.css",
"src": "_vike-react-fe70c48a.BcWtY8Ol.css"
},
"images/blur-cyan.png": {
"file": "assets/static/blur-cyan.DJww6-ho.png",
"src": "images/blur-cyan.png"
},
"images/blur-indigo.png": {
"file": "assets/static/blur-indigo.Cbr0CUfr.png",
"src": "images/blur-indigo.png"
},
"node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-cyrillic-ext-wght-normal.woff2": {
"file": "assets/static/inter-cyrillic-ext-wght-normal.B2xhLi22.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-cyrillic-ext-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-cyrillic-wght-normal.woff2": {
"file": "assets/static/inter-cyrillic-wght-normal.CMZtQduZ.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-cyrillic-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-greek-ext-wght-normal.woff2": {
"file": "assets/static/inter-greek-ext-wght-normal.CGAr0uHJ.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-greek-ext-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-greek-wght-normal.woff2": {
"file": "assets/static/inter-greek-wght-normal.CaVNZxsx.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-greek-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-latin-ext-wght-normal.woff2": {
"file": "assets/static/inter-latin-ext-wght-normal.CFHvXkgd.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-latin-ext-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-latin-wght-normal.woff2": {
"file": "assets/static/inter-latin-wght-normal.C2S99t-D.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-latin-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-vietnamese-wght-normal.woff2": {
"file": "assets/static/inter-vietnamese-wght-normal.CBcvBZtf.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+inter@5.2.5/node_modules/@fontsource-variable/inter/files/inter-vietnamese-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+lexend@5.2.6/node_modules/@fontsource-variable/lexend/files/lexend-latin-ext-wght-normal.woff2": {
"file": "assets/static/lexend-latin-ext-wght-normal.Ca5OILQq.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+lexend@5.2.6/node_modules/@fontsource-variable/lexend/files/lexend-latin-ext-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+lexend@5.2.6/node_modules/@fontsource-variable/lexend/files/lexend-latin-wght-normal.woff2": {
"file": "assets/static/lexend-latin-wght-normal.ga3u8m5q.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+lexend@5.2.6/node_modules/@fontsource-variable/lexend/files/lexend-latin-wght-normal.woff2"
},
"node_modules/.pnpm/@fontsource-variable+lexend@5.2.6/node_modules/@fontsource-variable/lexend/files/lexend-vietnamese-wght-normal.woff2": {
"file": "assets/static/lexend-vietnamese-wght-normal.RvljkFvg.woff2",
"src": "node_modules/.pnpm/@fontsource-variable+lexend@5.2.6/node_modules/@fontsource-variable/lexend/files/lexend-vietnamese-wght-normal.woff2"
},
"node_modules/.pnpm/vike@0.4.228_react-streaming@0.3.50_react-dom@19.1.0_react@19.1.0__react@19.1.0__vite@6_a5d8557c8c03851ef9ff4b1fc2b0d591/node_modules/vike/dist/esm/client/client-routing-runtime/entry.js": {
"file": "assets/entries/entry-client-routing.Bc4tBJ4_.js",
"name": "entries/entry-client-routing",
"src": "node_modules/.pnpm/vike@0.4.228_react-streaming@0.3.50_react-dom@19.1.0_react@19.1.0__react@19.1.0__vite@6_a5d8557c8c03851ef9ff4b1fc2b0d591/node_modules/vike/dist/esm/client/client-routing-runtime/entry.js",
"isEntry": true,
"imports": [
"_chunk-FoQi8sq6.js"
]
},
"virtual:vike:pageConfigValuesAll:client:/pages/_error": {
"file": "assets/entries/pages_error.DlwLYWej.js",
"name": "entries/pages/_error",
"src": "virtual:vike:pageConfigValuesAll:client:/pages/_error",
"isEntry": true,
"isDynamicEntry": true,
"imports": [
"_chunk-YnSR0nZE.js",
"_chunk-FoQi8sq6.js"
],
"css": [
"assets/static/vike-react-fe70c48a.BcWtY8Ol.css",
"assets/static/layouts_style-b34a8e57.HyLxvJhb.css",
"assets/static/layouts_tailwind-00e65532.kM054_rr.css",
"assets/static/layouts_prism-feac250c.B2a_QZIO.css",
"assets/static/style-1efdef47.B5Troj4Q.css"
],
"assets": [
"assets/static/inter-cyrillic-ext-wght-normal.B2xhLi22.woff2",
"assets/static/inter-cyrillic-wght-normal.CMZtQduZ.woff2",
"assets/static/inter-greek-ext-wght-normal.CGAr0uHJ.woff2",
"assets/static/inter-greek-wght-normal.CaVNZxsx.woff2",
"assets/static/inter-vietnamese-wght-normal.CBcvBZtf.woff2",
"assets/static/inter-latin-ext-wght-normal.CFHvXkgd.woff2",
"assets/static/inter-latin-wght-normal.C2S99t-D.woff2",
"assets/static/lexend-vietnamese-wght-normal.RvljkFvg.woff2",
"assets/static/lexend-latin-ext-wght-normal.Ca5OILQq.woff2",
"assets/static/lexend-latin-wght-normal.ga3u8m5q.woff2"
]
},
"virtual:vike:pageConfigValuesAll:client:/pages/docs": {
"file": "assets/entries/pages_docs.Gi7h7KmT.js",
"name": "entries/pages/docs",
"src": "virtual:vike:pageConfigValuesAll:client:/pages/docs",
"isEntry": true,
"isDynamicEntry": true,
"imports": [
"_chunk-YnSR0nZE.js",
"_chunk-FoQi8sq6.js"
],
"css": [
"assets/static/vike-react-fe70c48a.BcWtY8Ol.css",
"assets/static/layouts_style-b34a8e57.HyLxvJhb.css",
"assets/static/layouts_tailwind-00e65532.kM054_rr.css",
"assets/static/layouts_prism-feac250c.B2a_QZIO.css",
"assets/static/style-1efdef47.B5Troj4Q.css"
],
"assets": [
"assets/static/inter-cyrillic-ext-wght-normal.B2xhLi22.woff2",
"assets/static/inter-cyrillic-wght-normal.CMZtQduZ.woff2",
"assets/static/inter-greek-ext-wght-normal.CGAr0uHJ.woff2",
"assets/static/inter-greek-wght-normal.CaVNZxsx.woff2",
"assets/static/inter-vietnamese-wght-normal.CBcvBZtf.woff2",
"assets/static/inter-latin-ext-wght-normal.CFHvXkgd.woff2",
"assets/static/inter-latin-wght-normal.C2S99t-D.woff2",
"assets/static/lexend-vietnamese-wght-normal.RvljkFvg.woff2",
"assets/static/lexend-latin-ext-wght-normal.Ca5OILQq.woff2",
"assets/static/lexend-latin-wght-normal.ga3u8m5q.woff2"
]
},
"virtual:vike:pageConfigValuesAll:client:/pages/index": {
"file": "assets/entries/pages_index.Bb824t1n.js",
"name": "entries/pages/index",
"src": "virtual:vike:pageConfigValuesAll:client:/pages/index",
"isEntry": true,
"isDynamicEntry": true,
"imports": [
"_chunk-YnSR0nZE.js",
"_chunk-FoQi8sq6.js"
],
"css": [
"assets/static/vike-react-fe70c48a.BcWtY8Ol.css",
"assets/static/layouts_style-b34a8e57.HyLxvJhb.css",
"assets/static/layouts_tailwind-00e65532.kM054_rr.css",
"assets/static/layouts_prism-feac250c.B2a_QZIO.css",
"assets/static/style-1efdef47.B5Troj4Q.css"
],
"assets": [
"assets/static/inter-cyrillic-ext-wght-normal.B2xhLi22.woff2",
"assets/static/inter-cyrillic-wght-normal.CMZtQduZ.woff2",
"assets/static/inter-greek-ext-wght-normal.CGAr0uHJ.woff2",
"assets/static/inter-greek-wght-normal.CaVNZxsx.woff2",
"assets/static/inter-vietnamese-wght-normal.CBcvBZtf.woff2",
"assets/static/inter-latin-ext-wght-normal.CFHvXkgd.woff2",
"assets/static/inter-latin-wght-normal.C2S99t-D.woff2",
"assets/static/lexend-vietnamese-wght-normal.RvljkFvg.woff2",
"assets/static/lexend-latin-ext-wght-normal.Ca5OILQq.woff2",
"assets/static/lexend-latin-wght-normal.ga3u8m5q.woff2"
]
}
};
const buildInfo = {
"versionAtBuildTime": "0.4.228",
"usesClientRouter": false,
"viteConfigRuntime": {
"root": "/app",
"build": {
"outDir": "/app/dist/"
},
"_baseViteOriginal": "/__UNSET__",
"vitePluginServerEntry": {}
}
};
setGlobalContext_buildEntry({
virtualFileExports,
assetsManifest,
buildInfo
});
}
setTelefuncLoaders({
loadTelefuncFiles: () => telefuncFiles,
loadManifest: () => ({
"version": "0.1.87",
"config": {}
})
});

1
app/dist/server/package.json vendored Normal file
View File

@ -0,0 +1 @@
{ "type": "module" }

View File

@ -1,16 +1,16 @@
import { dirname } from "node:path";
import { fileURLToPath } from "node:url";
import { vikeHandler } from "./server/vike-handler";
import { telefuncHandler } from "./server/telefunc-handler";
import Fastify from "fastify";
import { createHandler } from "@universal-middleware/fastify"; import { createHandler } from "@universal-middleware/fastify";
import { telefuncHandler } from "./server/telefunc-handler";
import { vikeHandler } from "./server/vike-handler";
import { fileURLToPath } from "node:url";
import { dirname } from "node:path";
import Fastify from "fastify";
const __filename = fileURLToPath(import.meta.url); const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename); const __dirname = dirname(__filename);
const root = __dirname;
const port = process.env.PORT ? parseInt(process.env.PORT, 10) : 3000;
const hmrPort = process.env.HMR_PORT ? parseInt(process.env.HMR_PORT, 10) : 24678; const hmrPort = process.env.HMR_PORT ? parseInt(process.env.HMR_PORT, 10) : 24678;
const port = process.env.PORT ? parseInt(process.env.PORT, 10) : 3000;
const root = __dirname;
async function startServer() { async function startServer() {
const app = Fastify(); const app = Fastify();
@ -57,12 +57,6 @@ async function startServer() {
const app = await startServer(); const app = await startServer();
app.listen( app.listen({ port, host: "0.0.0.0" }, () => {
{
port: port,
host: "0.0.0.0",
},
() => {
console.log(`Server listening on http://localhost:${port}`); console.log(`Server listening on http://localhost:${port}`);
}, });
);

View File

@ -0,0 +1,37 @@
import type { SearchResult } from "@/lib/search";
import { useDebounce } from "./useDebounce";
import { useState, useEffect, use } from "react";
export function useAutoComplete(onSearch: (query: string) => Promise<SearchResult[]>) {
const [results, setResults] = useState<SearchResult[]>([]);
const [isLoading, setIsLoading] = useState(false);
const [isOpened, setIsOpened] = useState(false);
const [query, setQuery] = useDebounce();
useEffect(() => {
// Attach the event listener to the window
function handleKeyDown(event: KeyboardEvent) {
if (event.key === "Escape") {
setIsOpened(false);
} else if (event.key === "K" && (event.ctrlKey || event.metaKey)) {
event.preventDefault();
setIsOpened(true);
}
}
window.addEventListener("keydown", handleKeyDown);
return () => {
window.removeEventListener("keydown", handleKeyDown);
};
}, []);
return {
results,
isLoading,
isOpened,
query,
setQuery,
};
}

18
app/hooks/useDebounce.ts Normal file
View File

@ -0,0 +1,18 @@
import React, { useEffect, useState } from "react";
export function useDebounce(debounceTime: number = 300): [string, React.Dispatch<React.SetStateAction<string>>] {
const [debouncedValue, setDebouncedValue] = useState<string>("");
const [value, setValue] = useState<string>("");
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value);
}, debounceTime);
return () => {
clearTimeout(handler);
};
}, [value]);
return [debouncedValue, setValue];
}

View File

@ -62,7 +62,7 @@ function Header() {
<div className="relative flex basis-0 justify-end gap-6 sm:gap-8 md:grow"> <div className="relative flex basis-0 justify-end gap-6 sm:gap-8 md:grow">
<ThemeSelector className="relative z-10" /> <ThemeSelector className="relative z-10" />
<Link href="https://github.com" className="group" aria-label="GitHub"> <Link href="https://gitea.gauthierdaniels.fr/GauthierWebDev/memento-dev" className="group" aria-label="GitHub">
<GitHubIcon className="h-6 w-6 fill-slate-400 group-hover:fill-slate-500 dark:group-hover:fill-slate-300" /> <GitHubIcon className="h-6 w-6 fill-slate-400 group-hover:fill-slate-500 dark:group-hover:fill-slate-300" />
</Link> </Link>
</div> </div>

View File

@ -85,7 +85,6 @@ export function buildSearchIndex(pagesDir: string): FlexSearch.Document<SearchRe
sections = cache.get(file)![1]; sections = cache.get(file)![1];
} else { } else {
const ast = Markdoc.parse(md); const ast = Markdoc.parse(md);
console.log(ast.attributes);
const title = ast.attributes?.frontmatter?.match(/^title:\s*(.*?)\s*$/m)?.[1]; const title = ast.attributes?.frontmatter?.match(/^title:\s*(.*?)\s*$/m)?.[1];
sections = [{ content: title ?? "", subsections: [] }]; sections = [{ content: title ?? "", subsections: [] }];
extractSections(ast, sections); extractSections(ast, sections);
@ -119,8 +118,6 @@ export function search(
enrich: true, enrich: true,
}); });
// console.log({ sectionIndex, query, options, results });
if (results.length === 0) { if (results.length === 0) {
return []; return [];
} }

View File

@ -1,4 +1,5 @@
import { type Node } from "@markdoc/markdoc"; import type { Node } from "@markdoc/markdoc";
import { slugifyWithCounter } from "@sindresorhus/slugify"; import { slugifyWithCounter } from "@sindresorhus/slugify";
interface HeadingNode extends Node { interface HeadingNode extends Node {

21
app/markdoc/Tag.ts Normal file
View File

@ -0,0 +1,21 @@
// Workaround about undefined import only in production build
import type { RenderableTreeNode } from "@markdoc/markdoc";
export class Tag<N extends string = string, A extends Record<string, any> = Record<string, any>> {
readonly $$mdtype = "Tag" as const;
static isTag = (tag: any): tag is Tag => {
return !!(tag?.$$mdtype === "Tag");
};
name: N;
attributes: A;
children: RenderableTreeNode[];
constructor(name = "div" as N, attributes = {} as A, children: RenderableTreeNode[] = []) {
this.name = name;
this.attributes = attributes;
this.children = children;
}
}

View File

@ -1,9 +1,12 @@
import { Config, nodes as defaultNodes, Node, Tag } from "@markdoc/markdoc"; import type { Config, Node } from "@markdoc/markdoc";
import { slugifyWithCounter } from "@sindresorhus/slugify"; import { slugifyWithCounter } from "@sindresorhus/slugify";
import { DocsLayout } from "@syntax/DocsLayout";
import Markdoc from "@markdoc/markdoc";
import { Fence } from "@syntax/Fence";
import yaml from "js-yaml"; import yaml from "js-yaml";
import { DocsLayout } from "@syntax/DocsLayout"; const { nodes: defaultNodes, Tag } = Markdoc;
import { Fence } from "@syntax/Fence";
let documentSlugifyMap = new Map(); let documentSlugifyMap = new Map();

View File

@ -24,7 +24,6 @@ const tags = {
collapsible?: boolean; collapsible?: boolean;
children: React.ReactNode; children: React.ReactNode;
}) => { }) => {
console.log(props);
return <Callout {...props} collapsible={props.collapsible} type={props.type || "note"} />; return <Callout {...props} collapsible={props.collapsible} type={props.type || "note"} />;
}, },
}, },

View File

@ -3,10 +3,14 @@
"dev": "tsx ./fastify-entry.ts", "dev": "tsx ./fastify-entry.ts",
"build": "vike build", "build": "vike build",
"preview": "cross-env NODE_ENV=production tsx ./fastify-entry.ts", "preview": "cross-env NODE_ENV=production tsx ./fastify-entry.ts",
"lint": "eslint ." "lint": "eslint .",
"prod": "npm-run-all build preview"
}, },
"dependencies": { "dependencies": {
"@algolia/autocomplete-core": "^1.18.1", "@algolia/autocomplete-core": "^1.18.1",
"@algolia/autocomplete-js": "^1.18.1",
"@algolia/autocomplete-plugin-algolia-insights": "^1.18.1",
"@algolia/autocomplete-preset-algolia": "^1.18.1",
"@fastify/middie": "^9.0.3", "@fastify/middie": "^9.0.3",
"@fastify/static": "^8.1.1", "@fastify/static": "^8.1.1",
"@fontsource-variable/inter": "^5.2.5", "@fontsource-variable/inter": "^5.2.5",
@ -14,16 +18,19 @@
"@headlessui/react": "^2.2.0", "@headlessui/react": "^2.2.0",
"@heroicons/react": "^2.2.0", "@heroicons/react": "^2.2.0",
"@markdoc/markdoc": "^0.5.1", "@markdoc/markdoc": "^0.5.1",
"@rollup/plugin-node-resolve": "^16.0.1",
"@sindresorhus/slugify": "^2.2.1", "@sindresorhus/slugify": "^2.2.1",
"@tailwindcss/typography": "^0.5.16", "@tailwindcss/typography": "^0.5.16",
"@universal-middleware/core": "^0.4.4", "@universal-middleware/core": "^0.4.4",
"@universal-middleware/fastify": "^0.5.9", "@universal-middleware/fastify": "^0.5.9",
"@vitejs/plugin-react": "^4.3.4", "@vitejs/plugin-react": "^4.3.4",
"algoliasearch": "^5.23.3",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"fast-glob": "^3.3.3", "fast-glob": "^3.3.3",
"fastify": "^5.2.1", "fastify": "^5.2.1",
"flexsearch": "^0.7.43", "flexsearch": "^0.7.43",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"npm-run-all": "^4.1.5",
"prism-react-renderer": "^2.4.1", "prism-react-renderer": "^2.4.1",
"prisma": "^6.5.0", "prisma": "^6.5.0",
"react": "^19.0.0", "react": "^19.0.0",
@ -37,6 +44,7 @@
"vike-react": "^0.5.13" "vike-react": "^0.5.13"
}, },
"devDependencies": { "devDependencies": {
"@algolia/client-search": "^5.23.3",
"@eslint/js": "^9.22.0", "@eslint/js": "^9.22.0",
"@tailwindcss/vite": "^4.0.12", "@tailwindcss/vite": "^4.0.12",
"@types/js-yaml": "^4.0.9", "@types/js-yaml": "^4.0.9",

2048
app/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -14,8 +14,6 @@ export function ThemeProvider(props: ThemeProviderProps) {
rootElement.classList.toggle("dark", theme === "dark"); rootElement.classList.toggle("dark", theme === "dark");
rootElement.classList.toggle("light", theme === "light"); rootElement.classList.toggle("light", theme === "light");
console.log("changed theme to", theme);
}, [theme]); }, [theme]);
return <ThemeContext.Provider value={{ theme, setTheme }}>{props.children}</ThemeContext.Provider>; return <ThemeContext.Provider value={{ theme, setTheme }}>{props.children}</ThemeContext.Provider>;

View File

@ -12,17 +12,6 @@ services:
volumes: volumes:
- ./app:/app - ./app:/app
restart: unless-stopped restart: unless-stopped
networks:
- memento-data
memento-dev-redis:
container_name: memento-dev-redis
image: redis:alpine
volumes:
- redis-data:/data
restart: unless-stopped
networks:
- memento-data
networks: networks:
memento-data: memento-data: