commit 85937c22134a37d1679c1cce48c7a0895bfc63e9 Author: GauthierWebDev Date: Fri Apr 11 11:11:22 2025 +0200 chore: new architecture and technos diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..da07aa6 Binary files /dev/null and b/.DS_Store differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..98ed1d1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/.env +app/.pnpm-store +app/node_modules \ No newline at end of file diff --git a/app/.env b/app/.env new file mode 100644 index 0000000..153f9d9 --- /dev/null +++ b/app/.env @@ -0,0 +1,7 @@ +# Environment variables declared in this file are automatically made available to Prisma. +# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema + +# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. +# See the documentation for all the connection string options: https://pris.ly/d/connection-strings + +DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public" \ No newline at end of file diff --git a/app/.prettierrc b/app/.prettierrc new file mode 100644 index 0000000..963354f --- /dev/null +++ b/app/.prettierrc @@ -0,0 +1,3 @@ +{ + "printWidth": 120 +} diff --git a/app/README.md b/app/README.md new file mode 100644 index 0000000..9dbe03c --- /dev/null +++ b/app/README.md @@ -0,0 +1,53 @@ +Generated with [vike.dev/new](https://vike.dev/new) ([version 410](https://www.npmjs.com/package/create-vike/v/0.0.410)) using this command: + +```sh +pnpm create vike@latest --react --tailwindcss --telefunc --fastify --eslint --prettier +``` + +## Contents + +* [React](#react) + + * [`/pages/+config.ts`](#pagesconfigts) + * [Routing](#routing) + * [`/pages/_error/+Page.jsx`](#pages_errorpagejsx) + * [`/pages/+onPageTransitionStart.ts` and `/pages/+onPageTransitionEnd.ts`](#pagesonpagetransitionstartts-and-pagesonpagetransitionendts) + * [SSR](#ssr) + * [HTML Streaming](#html-streaming) + +## React + +This app is ready to start. It's powered by [Vike](https://vike.dev) and [React](https://react.dev/learn). + +### `/pages/+config.ts` + +Such `+` files are [the interface](https://vike.dev/config) between Vike and your code. It defines: + +* A default [`` component](https://vike.dev/Layout) (that wraps your [`` components](https://vike.dev/Page)). +* A default [`title`](https://vike.dev/title). +* Global [`` tags](https://vike.dev/head-tags). + +### Routing + +[Vike's built-in router](https://vike.dev/routing) lets you choose between: + +* [Filesystem Routing](https://vike.dev/filesystem-routing) (the URL of a page is determined based on where its `+Page.jsx` file is located on the filesystem) +* [Route Strings](https://vike.dev/route-string) +* [Route Functions](https://vike.dev/route-function) + +### `/pages/_error/+Page.jsx` + +The [error page](https://vike.dev/error-page) which is rendered when errors occur. + +### `/pages/+onPageTransitionStart.ts` and `/pages/+onPageTransitionEnd.ts` + +The [`onPageTransitionStart()` hook](https://vike.dev/onPageTransitionStart), together with [`onPageTransitionEnd()`](https://vike.dev/onPageTransitionEnd), enables you to implement page transition animations. + +### SSR + +SSR is enabled by default. You can [disable it](https://vike.dev/ssr) for all your pages or only for some pages. + +### HTML Streaming + +You can enable/disable [HTML streaming](https://vike.dev/stream) for all your pages, or only for some pages while still using it for others. + diff --git a/app/assets/logo.afdesign b/app/assets/logo.afdesign new file mode 100644 index 0000000..6345ef8 Binary files /dev/null and b/app/assets/logo.afdesign differ diff --git a/app/assets/logo.afdesign~lock~ b/app/assets/logo.afdesign~lock~ new file mode 100644 index 0000000..aadd587 Binary files /dev/null and b/app/assets/logo.afdesign~lock~ differ diff --git a/app/assets/logo.svg b/app/assets/logo.svg new file mode 100644 index 0000000..1c45366 --- /dev/null +++ b/app/assets/logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/components/common/Image.tsx b/app/components/common/Image.tsx new file mode 100644 index 0000000..bb8a7a3 --- /dev/null +++ b/app/components/common/Image.tsx @@ -0,0 +1,3 @@ +export function Image(props: { src: string; alt: string } & React.ComponentPropsWithoutRef<"img">) { + return {props.alt}; +} diff --git a/app/components/common/Link.tsx b/app/components/common/Link.tsx new file mode 100644 index 0000000..e7f465e --- /dev/null +++ b/app/components/common/Link.tsx @@ -0,0 +1,13 @@ +import { usePageContext } from "vike-react/usePageContext"; +import clsx from "clsx"; + +export function Link(props: React.AnchorHTMLAttributes & { href: string }) { + const { urlPathname } = usePageContext(); + const isActive = props.href === "/" ? urlPathname === props.href : urlPathname.startsWith(props.href); + + return ( + + {props.children} + + ); +} diff --git a/app/components/md/Tabs.tsx b/app/components/md/Tabs.tsx new file mode 100644 index 0000000..da75fa4 --- /dev/null +++ b/app/components/md/Tabs.tsx @@ -0,0 +1,95 @@ +import type { Dispatch, SetStateAction } from "react"; + +import { createContext, useContext, useEffect, useState } from "react"; +import { Button } from "@syntax/Button"; +import clsx from "clsx"; + +type TabType = { + label: string; + value: string; +}; + +type TabsContextType = { + selectedTab: string; + selectTab: Dispatch>; + tabs: TabType[]; + addTab: (tab: TabType) => void; +}; + +const TabsContext = createContext({ + selectedTab: "", + selectTab: () => {}, + tabs: [], + addTab: () => {}, +}); + +export function Tabs({ + defaultSelectedTab = "", + children, +}: { + defaultSelectedTab?: string; + children: React.ReactNode; +}) { + const [selectedTab, selectTab] = useState(defaultSelectedTab); + const [tabs, setTabs] = useState([]); + + const addTab = (tab: TabType) => + setTabs((prevTabs) => { + // Append to the end of the array and make sure it's unique + if (prevTabs.some((t) => t.value === tab.value)) { + return prevTabs; + } + + return [...prevTabs, tab]; + }); + + return ( + +
+
+
    + {tabs.map((tab) => ( +
  • + selectTab(tab.value)} /> +
  • + ))} +
+
+
{children}
+
+
+ ); +} + +export function TabItem({ tab, isSelected, select }: { tab: TabType; isSelected: boolean; select: () => void }) { + return ( + + ); +} + +export function TabContent({ label, value, children }: { label: string; value: string; children: React.ReactNode }) { + const { addTab, selectedTab } = useContext(TabsContext); + + useEffect(() => { + addTab({ label, value }); + }, []); + + return ( +
*:first-of-type]:!mt-0", "[&>*:last-of-type]:!mb-0", selectedTab !== value && "hidden")}> + {children} +
+ ); +} diff --git a/app/components/syntax/Button.tsx b/app/components/syntax/Button.tsx new file mode 100644 index 0000000..5d326cc --- /dev/null +++ b/app/components/syntax/Button.tsx @@ -0,0 +1,23 @@ +import { Link } from "@/components/common/Link"; +import clsx from "clsx"; + +const variantStyles = { + primary: + "rounded-full bg-violet-300 py-2 px-4 text-sm font-semibold text-slate-900 hover:bg-violet-200 focus:outline-hidden focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-violet-300/50 active:bg-violet-500", + secondary: + "rounded-full bg-slate-800 py-2 px-4 text-sm font-medium text-white hover:bg-slate-700 focus:outline-hidden focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white/50 active:text-slate-400", +}; + +type ButtonProps = { + variant?: keyof typeof variantStyles; +} & (React.ComponentPropsWithoutRef | (React.ComponentPropsWithoutRef<"button"> & { href?: undefined })); + +export function Button({ variant = "primary", className, ...props }: ButtonProps) { + className = clsx(variantStyles[variant], "cursor-pointer", className); + + return typeof props.href === "undefined" ? ( + + + + + +
+
+ +
+
+ + +
+
+
+
+
+
+ +
+ {tabs.map((tab) => ( +
+
+ {tab.name} +
+
+ ))} +
+
+ + + {({ className, style, tokens, getLineProps, getTokenProps }) => ( +
+                          
+                            {tokens.map((line, lineIndex) => (
+                              
+ {line.map((token, tokenIndex) => ( + + ))} +
+ ))} +
+
+ )} +
+
+
+
+
+
+
+
+
+ ); +} diff --git a/app/components/syntax/HeroBackground.tsx b/app/components/syntax/HeroBackground.tsx new file mode 100644 index 0000000..82a7688 --- /dev/null +++ b/app/components/syntax/HeroBackground.tsx @@ -0,0 +1,121 @@ +import { useId } from "react"; + +export function HeroBackground(props: React.ComponentPropsWithoutRef<"svg">) { + const id = useId(); + + return ( + + ); +} diff --git a/app/components/syntax/Icon.tsx b/app/components/syntax/Icon.tsx new file mode 100644 index 0000000..862ce62 --- /dev/null +++ b/app/components/syntax/Icon.tsx @@ -0,0 +1,72 @@ +import { InstallationIcon } from "@syntax/icons/InstallationIcon"; +import { LightbulbIcon } from "@syntax/icons/LightbulbIcon"; +import { PluginsIcon } from "@syntax/icons/PluginsIcon"; +import { PresetsIcon } from "@syntax/icons/PresetsIcon"; +import { ThemingIcon } from "@syntax/icons/ThemingIcon"; +import { WarningIcon } from "@syntax/icons/WarningIcon"; +import { useId } from "react"; +import clsx from "clsx"; + +const icons = { + installation: InstallationIcon, + presets: PresetsIcon, + plugins: PluginsIcon, + theming: ThemingIcon, + lightbulb: LightbulbIcon, + warning: WarningIcon, +}; + +const iconStyles = { + blue: "[--icon-foreground:var(--color-slate-900)] [--icon-background:var(--color-white)]", + amber: "[--icon-foreground:var(--color-amber-900)] [--icon-background:var(--color-amber-100)]", +}; + +export function Icon({ + icon, + color = "blue", + className, + ...props +}: { + color?: keyof typeof iconStyles; + icon: keyof typeof icons; +} & Omit, "color">) { + let id = useId(); + let IconComponent = icons[icon]; + + return ( + + ); +} + +const gradients = { + blue: [{ stopColor: "#0EA5E9" }, { stopColor: "#22D3EE", offset: ".527" }, { stopColor: "#818CF8", offset: 1 }], + amber: [ + { stopColor: "#FDE68A", offset: ".08" }, + { stopColor: "#F59E0B", offset: ".837" }, + ], +}; + +export function Gradient({ + color = "blue", + ...props +}: { + color?: keyof typeof gradients; +} & Omit, "color">) { + return ( + + {gradients[color].map((stop, stopIndex) => ( + + ))} + + ); +} + +export function LightMode({ className, ...props }: React.ComponentPropsWithoutRef<"g">) { + return ; +} + +export function DarkMode({ className, ...props }: React.ComponentPropsWithoutRef<"g">) { + return ; +} diff --git a/app/components/syntax/Logo.tsx b/app/components/syntax/Logo.tsx new file mode 100644 index 0000000..32f7ae3 --- /dev/null +++ b/app/components/syntax/Logo.tsx @@ -0,0 +1,54 @@ +function LogomarkPaths() { + // return ( + // + // + // + // + // ); + + return ( + <> + + + + + + + + + + + + ); +} + +export function Logo(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + + + Memento Dev + + + ); +} diff --git a/app/components/syntax/MobileNavigation.tsx b/app/components/syntax/MobileNavigation.tsx new file mode 100644 index 0000000..587f839 --- /dev/null +++ b/app/components/syntax/MobileNavigation.tsx @@ -0,0 +1,82 @@ +import { Suspense, useCallback, useEffect, useState } from "react"; +import { usePageContext } from "vike-react/usePageContext"; +import { Dialog, DialogPanel } from "@headlessui/react"; +import { Navigation } from "@syntax/Navigation"; +import { Link } from "@/components/common/Link"; +import { Logo } from "@syntax/Logo"; + +function MenuIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +function CloseIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +function CloseOnNavigation({ close }: { close: () => void }) { + const { urlPathname } = usePageContext(); + + useEffect(() => { + close(); + }, [urlPathname, close]); + + return null; +} + +export function MobileNavigation() { + let [isOpen, setIsOpen] = useState(false); + let close = useCallback(() => setIsOpen(false), [setIsOpen]); + + function onLinkClick(event: React.MouseEvent) { + let link = event.currentTarget; + if ( + link.pathname + link.search + link.hash === + window.location.pathname + window.location.search + window.location.hash + ) { + close(); + } + } + + return ( + <> + + + + + 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" + > + +
+ + + + + +
+ +
+
+ + ); +} diff --git a/app/components/syntax/Navigation.tsx b/app/components/syntax/Navigation.tsx new file mode 100644 index 0000000..3f70ec5 --- /dev/null +++ b/app/components/syntax/Navigation.tsx @@ -0,0 +1,47 @@ +import { usePageContext } from "vike-react/usePageContext"; +import { Link } from "@/components/common/Link"; +import { navigation } from "@/lib/navigation"; +import clsx from "clsx"; + +export function Navigation({ + className, + onLinkClick, +}: { + className?: string; + onLinkClick?: React.MouseEventHandler; +}) { + const { urlPathname } = usePageContext(); + + return ( + + ); +} diff --git a/app/components/syntax/PrevNextLinks.tsx b/app/components/syntax/PrevNextLinks.tsx new file mode 100644 index 0000000..529dde5 --- /dev/null +++ b/app/components/syntax/PrevNextLinks.tsx @@ -0,0 +1,64 @@ +import { usePageContext } from "vike-react/usePageContext"; +import { Link } from "@/components/common/Link"; +import clsx from "clsx"; + +import { navigation } from "@/lib/navigation"; + +function ArrowIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +function PageLink({ + title, + href, + dir = "next", + ...props +}: Omit, "dir" | "title"> & { + title: string; + href: string; + dir?: "previous" | "next"; +}) { + return ( +
+
+ {dir === "next" ? "Suivant" : "Précédent"} +
+
+ + {title} + + +
+
+ ); +} + +export function PrevNextLinks() { + let { urlPathname } = usePageContext(); + + let allLinks = navigation.flatMap((section) => section.links); + let linkIndex = allLinks.findIndex((link) => link.href === urlPathname); + let previousPage = linkIndex > -1 ? allLinks[linkIndex - 1] : null; + let nextPage = linkIndex > -1 ? allLinks[linkIndex + 1] : null; + + if (!nextPage && !previousPage) { + return null; + } + + return ( +
+ {previousPage && } + {nextPage && } +
+ ); +} diff --git a/app/components/syntax/Prose.tsx b/app/components/syntax/Prose.tsx new file mode 100644 index 0000000..01bd70b --- /dev/null +++ b/app/components/syntax/Prose.tsx @@ -0,0 +1,33 @@ +import clsx from "clsx"; + +export function Prose({ + as, + className, + ...props +}: React.ComponentPropsWithoutRef & { + as?: T; +}) { + let Component = as ?? "div"; + + return ( + + ); +} diff --git a/app/components/syntax/QuickLinks.tsx b/app/components/syntax/QuickLinks.tsx new file mode 100644 index 0000000..ac0b39f --- /dev/null +++ b/app/components/syntax/QuickLinks.tsx @@ -0,0 +1,34 @@ +import { Link } from "@/components/common/Link"; +import { Icon } from "@syntax/Icon"; + +export function QuickLinks({ children }: { children: React.ReactNode }) { + return
{children}
; +} + +export function QuickLink({ + title, + description, + href, + icon, +}: { + title: string; + description: string; + href: string; + icon: React.ComponentProps["icon"]; +}) { + return ( +
+
+
+ +

+ + + {title} + +

+

{description}

+
+
+ ); +} diff --git a/app/components/syntax/Search.telefunc.ts b/app/components/syntax/Search.telefunc.ts new file mode 100644 index 0000000..7adefc9 --- /dev/null +++ b/app/components/syntax/Search.telefunc.ts @@ -0,0 +1,8 @@ +import type { SearchResult } from "@/lib/search"; + +import { buildSearchIndex, search } from "@/lib/search"; + +export const onSearch = async (query: string): Promise => { + const searchIndex = buildSearchIndex("./app/docs"); + return search(searchIndex, query); +}; diff --git a/app/components/syntax/Search.tsx b/app/components/syntax/Search.tsx new file mode 100644 index 0000000..0c8912a --- /dev/null +++ b/app/components/syntax/Search.tsx @@ -0,0 +1,405 @@ +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 clsx from "clsx"; + +import { navigation } from "@/lib/navigation"; +import { onSearch } from "./Search.telefunc"; + +import type { SearchResult } from "@/lib/search"; + +type EmptyObject = Record; + +type Autocomplete = AutocompleteApi; + +function SearchIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +function useAutocomplete({ close }: { close: (autocomplete: Autocomplete) => void }) { + let id = useId(); + // let router = useRouter(); + let [autocompleteState, setAutocompleteState] = useState | EmptyObject>({}); + + function navigate({ itemUrl }: { itemUrl?: string }) { + if (!itemUrl) { + return; + } + + // router.push(itemUrl); + + if (itemUrl === window.location.pathname + window.location.search + window.location.hash) { + close(autocomplete); + } + } + + let [autocomplete] = useState(() => + createAutocomplete({ + 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() { + console.log({ searchResult }); + return []; + return searchResult; + }, + getItemUrl({ item }) { + return item.url; + }, + onSelect: navigate, + }, + ]; + }); + }, + }), + ); + + return { autocomplete, autocompleteState }; +} + +function LoadingIcon(props: React.ComponentPropsWithoutRef<"svg">) { + let id = useId(); + + return ( + + ); +} + +function HighlightQuery({ text, query }: { text: string; query: string }) { + return ( + + ); +} + +function SearchResult({ + result, + autocomplete, + collection, + query, +}: { + result: Result; + autocomplete: Autocomplete; + collection: AutocompleteCollection; + query: string; +}) { + let id = useId(); + + let sectionTitle = navigation.find((section) => + section.links.find((link) => link.href === result.url.split("#")[0]), + )?.title; + let hierarchy = [sectionTitle, result.pageTitle].filter((x): x is string => typeof x === "string"); + + return ( +
  • + + {hierarchy.length > 0 && ( + + )} +
  • + ); +} + +function SearchResults({ + autocomplete, + query, + collection, +}: { + autocomplete: Autocomplete; + query: string; + collection: AutocompleteCollection; +}) { + if (collection.items.length === 0) { + return ( +

    + No results for “ + {query} + ” +

    + ); + } + + return ( +
      + {collection.items.map((result) => ( + + ))} +
    + ); +} + +const SearchInput = forwardRef< + React.ComponentRef<"input">, + { + autocomplete: Autocomplete; + autocompleteState: AutocompleteState | EmptyObject; + onClose: () => void; + } +>(function SearchInput({ autocomplete, autocompleteState, onClose }, inputRef) { + let inputProps = autocomplete.getInputProps({ inputElement: null }); + + return ( +
    + + { + 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" && ( +
    + +
    + )} +
    + ); +}); + +function CloseOnNavigation({ + close, + autocomplete, +}: { + close: (autocomplete: Autocomplete) => void; + autocomplete: Autocomplete; +}) { + const { urlParsed } = usePageContext(); + const { pathname, search } = urlParsed; + + useEffect(() => { + close(autocomplete); + }, [pathname, search, close, autocomplete]); + + return null; +} + +function SearchDialog({ + open, + setOpen, + className, +}: { + open: boolean; + setOpen: (open: boolean) => void; + className?: string; +}) { + let formRef = useRef>(null); + let panelRef = useRef>(null); + let inputRef = useRef>(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) { + if (event.key === "k" && (event.metaKey || event.ctrlKey)) { + event.preventDefault(); + setOpen(true); + } + } + + window.addEventListener("keydown", onKeyDown); + + return () => { + window.removeEventListener("keydown", onKeyDown); + }; + }, [open, setOpen]); + + return ( + <> + + + + close(autocomplete)} className={clsx("fixed inset-0 z-50", className)}> +
    + +
    + +
    +
    + setOpen(false)} + /> +
    + {autocompleteState.isOpen && ( + + )} +
    + +
    +
    +
    +
    + + ); +} + +function useSearchProps() { + let buttonRef = useRef>(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() { + let [modifierKey, setModifierKey] = useState(); + let { buttonProps, dialogProps } = useSearchProps(); + + useEffect(() => { + setModifierKey(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform) ? "⌘" : "Ctrl "); + }, []); + + return ( + <> + + + + ); +} diff --git a/app/components/syntax/TableOfContents.tsx b/app/components/syntax/TableOfContents.tsx new file mode 100644 index 0000000..4c94268 --- /dev/null +++ b/app/components/syntax/TableOfContents.tsx @@ -0,0 +1,113 @@ +"use client"; + +import { useCallback, useEffect, useState } from "react"; +import { Link } from "@/components/common/Link"; +import clsx from "clsx"; + +import { type Section, type Subsection } from "@/lib/sections"; + +export function TableOfContents({ tableOfContents }: { tableOfContents: Array
    }) { + let [currentSection, setCurrentSection] = useState(tableOfContents[0]?.id); + + let getHeadings = useCallback((tableOfContents: Array
    ) => { + return tableOfContents + .flatMap((node) => [node.id, ...node.children.map((child) => child.id)]) + .map((id) => { + let el = document.getElementById(id); + if (!el) return null; + + let style = window.getComputedStyle(el); + let scrollMt = parseFloat(style.scrollMarginTop); + + let top = window.scrollY + el.getBoundingClientRect().top - scrollMt; + return { id, top }; + }) + .filter((x): x is { id: string; top: number } => x !== null); + }, []); + + useEffect(() => { + if (tableOfContents.length === 0) return; + const headings = getHeadings(tableOfContents); + + function onScroll() { + const top = window.scrollY; + + let current = headings[0]?.id; + + for (const heading of headings) { + if (top >= heading.top - 10) { + current = heading.id; + } else { + break; + } + } + setCurrentSection(current); + } + window.addEventListener("scroll", onScroll, { passive: true }); + onScroll(); + return () => { + window.removeEventListener("scroll", onScroll); + }; + }, [getHeadings, tableOfContents]); + + function isActive(section: Section | Subsection) { + if (section.id === currentSection) { + return true; + } + if (!section.children) { + return false; + } + return section.children.findIndex(isActive) > -1; + } + + return ( +
    + +
    + ); +} diff --git a/app/components/syntax/ThemeSelector.tsx b/app/components/syntax/ThemeSelector.tsx new file mode 100644 index 0000000..9dd6b9a --- /dev/null +++ b/app/components/syntax/ThemeSelector.tsx @@ -0,0 +1,107 @@ +import { useEffect, useState } from "react"; +// import { useTheme } from 'next-themes' +import { Label, Listbox, ListboxButton, ListboxOption, ListboxOptions } from "@headlessui/react"; +import clsx from "clsx"; + +const themes = [ + { name: "Light", value: "light", icon: LightIcon }, + { name: "Dark", value: "dark", icon: DarkIcon }, + { name: "System", value: "system", icon: SystemIcon }, +]; + +function LightIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +function DarkIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +function SystemIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +export function ThemeSelector(props: React.ComponentPropsWithoutRef>) { + const useTheme = () => { + return { + theme: "light", + setTheme: (theme: string) => {}, + }; + }; + let { theme, setTheme } = useTheme(); + let [mounted, setMounted] = useState(false); + + useEffect(() => { + setMounted(true); + }, []); + + if (!mounted) { + return
    ; + } + + return ( + + + + + + + + {themes.map((theme) => ( + + 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, + }) + } + > + {({ selected }) => ( + <> +
    + +
    +
    {theme.name}
    + + )} +
    + ))} +
    +
    + ); +} diff --git a/app/components/syntax/icons/InstallationIcon.tsx b/app/components/syntax/icons/InstallationIcon.tsx new file mode 100644 index 0000000..20c1bc7 --- /dev/null +++ b/app/components/syntax/icons/InstallationIcon.tsx @@ -0,0 +1,39 @@ +import { DarkMode, Gradient, LightMode } from "@syntax/Icon"; + +export function InstallationIcon({ + id, + color, +}: { + id: string; + color?: React.ComponentProps["color"]; +}) { + return ( + <> + + + + + + + + + + + + + ); +} diff --git a/app/components/syntax/icons/LightbulbIcon.tsx b/app/components/syntax/icons/LightbulbIcon.tsx new file mode 100644 index 0000000..f0e2439 --- /dev/null +++ b/app/components/syntax/icons/LightbulbIcon.tsx @@ -0,0 +1,38 @@ +import { DarkMode, Gradient, LightMode } from "@syntax/Icon"; + +export function LightbulbIcon({ id, color }: { id: string; color?: React.ComponentProps["color"] }) { + return ( + <> + + + + + + + + + + + + + + + ); +} diff --git a/app/components/syntax/icons/PluginsIcon.tsx b/app/components/syntax/icons/PluginsIcon.tsx new file mode 100644 index 0000000..4797471 --- /dev/null +++ b/app/components/syntax/icons/PluginsIcon.tsx @@ -0,0 +1,47 @@ +import { DarkMode, Gradient, LightMode } from "@syntax/Icon"; + +export function PluginsIcon({ id, color }: { id: string; color?: React.ComponentProps["color"] }) { + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/app/components/syntax/icons/PresetsIcon.tsx b/app/components/syntax/icons/PresetsIcon.tsx new file mode 100644 index 0000000..d6e29b2 --- /dev/null +++ b/app/components/syntax/icons/PresetsIcon.tsx @@ -0,0 +1,35 @@ +import { DarkMode, Gradient, LightMode } from "@syntax/Icon"; + +export function PresetsIcon({ id, color }: { id: string; color?: React.ComponentProps["color"] }) { + return ( + <> + + + + + + + + + + + + + + + + + + + ); +} diff --git a/app/components/syntax/icons/ThemingIcon.tsx b/app/components/syntax/icons/ThemingIcon.tsx new file mode 100644 index 0000000..15a6960 --- /dev/null +++ b/app/components/syntax/icons/ThemingIcon.tsx @@ -0,0 +1,51 @@ +import { DarkMode, Gradient, LightMode } from "@syntax/Icon"; + +export function ThemingIcon({ id, color }: { id: string; color?: React.ComponentProps["color"] }) { + return ( + <> + + + + + + + + + + + + + + + + ); +} diff --git a/app/components/syntax/icons/WarningIcon.tsx b/app/components/syntax/icons/WarningIcon.tsx new file mode 100644 index 0000000..091536f --- /dev/null +++ b/app/components/syntax/icons/WarningIcon.tsx @@ -0,0 +1,47 @@ +import { DarkMode, Gradient, LightMode } from "@syntax/Icon"; + +export function WarningIcon({ id, color }: { id: string; color?: React.ComponentProps["color"] }) { + return ( + <> + + + + + + + + + + + + + + + ); +} diff --git a/app/data/docs/installation/page.md b/app/data/docs/installation/page.md new file mode 100644 index 0000000..139f6df --- /dev/null +++ b/app/data/docs/installation/page.md @@ -0,0 +1,17 @@ +--- +title: Installation +description: Quidem magni aut exercitationem maxime rerum eos. +tags: [installation, getting-started] +--- + +Quasi sapiente voluptates aut minima non doloribus similique quisquam. In quo expedita ipsum nostrum corrupti incidunt. Et aut eligendi ea perferendis. + +--- + +## Quis vel iste dicta + +Sit commodi iste iure molestias qui amet voluptatem sed quaerat. Nostrum aut pariatur. Sint ipsa praesentium dolor error cumque velit tenetur. + +### Et pariatur ab quas + +Sit commodi iste iure molestias qui amet voluptatem sed quaerat. Nostrum aut pariatur. Sint ipsa praesentium dolor error cumque velit tenetur quaerat exercitationem. Consequatur et cum atque mollitia qui quia necessitatibus. diff --git a/app/data/docs/introduction-to-string-theory/page.md b/app/data/docs/introduction-to-string-theory/page.md new file mode 100644 index 0000000..178e5d9 --- /dev/null +++ b/app/data/docs/introduction-to-string-theory/page.md @@ -0,0 +1,74 @@ +--- +title: Introdution to string theory +nextjs: + metadata: + title: Introdution to string theory + description: Quidem magni aut exercitationem maxime rerum eos. +--- + +Quasi sapiente voluptates aut minima non doloribus similique quisquam. In quo expedita ipsum nostrum corrupti incidunt. Et aut eligendi ea perferendis. + +--- + +## Quis vel iste dicta + +Sit commodi iste iure molestias qui amet voluptatem sed quaerat. Nostrum aut pariatur. Sint ipsa praesentium dolor error cumque velit tenetur. + +### Et pariatur ab quas + +Sit commodi iste iure molestias qui amet voluptatem sed quaerat. Nostrum aut pariatur. Sint ipsa praesentium dolor error cumque velit tenetur quaerat exercitationem. Consequatur et cum atque mollitia qui quia necessitatibus. + +```js +/** @type {import('@tailwindlabs/lorem').ipsum} */ +export default { + lorem: 'ipsum', + dolor: ['sit', 'amet', 'consectetur'], + adipiscing: { + elit: true, + }, +} +``` + +Possimus saepe veritatis sint nobis et quam eos. Architecto consequatur odit perferendis fuga eveniet possimus rerum cumque. Ea deleniti voluptatum deserunt voluptatibus ut non iste. Provident nam asperiores vel laboriosam omnis ducimus enim nesciunt quaerat. Minus tempora cupiditate est quod. + +### Natus aspernatur iste + +Sit commodi iste iure molestias qui amet voluptatem sed quaerat. Nostrum aut pariatur. Sint ipsa praesentium dolor error cumque velit tenetur quaerat exercitationem. Consequatur et cum atque mollitia qui quia necessitatibus. + +Voluptas beatae omnis omnis voluptas. Cum architecto ab sit ad eaque quas quia distinctio. Molestiae aperiam qui quis deleniti soluta quia qui. Dolores nostrum blanditiis libero optio id. Mollitia ad et asperiores quas saepe alias. + +--- + +## Quos porro ut molestiae + +Sit commodi iste iure molestias qui amet voluptatem sed quaerat. Nostrum aut pariatur. Sint ipsa praesentium dolor error cumque velit tenetur. + +### Voluptatem quas possimus + +Sit commodi iste iure molestias qui amet voluptatem sed quaerat. Nostrum aut pariatur. Sint ipsa praesentium dolor error cumque velit tenetur quaerat exercitationem. Consequatur et cum atque mollitia qui quia necessitatibus. + +Possimus saepe veritatis sint nobis et quam eos. Architecto consequatur odit perferendis fuga eveniet possimus rerum cumque. Ea deleniti voluptatum deserunt voluptatibus ut non iste. Provident nam asperiores vel laboriosam omnis ducimus enim nesciunt quaerat. Minus tempora cupiditate est quod. + +### Id vitae minima + +Sit commodi iste iure molestias qui amet voluptatem sed quaerat. Nostrum aut pariatur. Sint ipsa praesentium dolor error cumque velit tenetur quaerat exercitationem. Consequatur et cum atque mollitia qui quia necessitatibus. + +Voluptas beatae omnis omnis voluptas. Cum architecto ab sit ad eaque quas quia distinctio. Molestiae aperiam qui quis deleniti soluta quia qui. Dolores nostrum blanditiis libero optio id. Mollitia ad et asperiores quas saepe alias. + +--- + +## Vitae laborum maiores + +Sit commodi iste iure molestias qui amet voluptatem sed quaerat. Nostrum aut pariatur. Sint ipsa praesentium dolor error cumque velit tenetur. + +### Corporis exercitationem + +Sit commodi iste iure molestias qui amet voluptatem sed quaerat. Nostrum aut pariatur. Sint ipsa praesentium dolor error cumque velit tenetur quaerat exercitationem. Consequatur et cum atque mollitia qui quia necessitatibus. + +Possimus saepe veritatis sint nobis et quam eos. Architecto consequatur odit perferendis fuga eveniet possimus rerum cumque. Ea deleniti voluptatum deserunt voluptatibus ut non iste. Provident nam asperiores vel laboriosam omnis ducimus enim nesciunt quaerat. Minus tempora cupiditate est quod. + +### Reprehenderit magni + +Sit commodi iste iure molestias qui amet voluptatem sed quaerat. Nostrum aut pariatur. Sint ipsa praesentium dolor error cumque velit tenetur quaerat exercitationem. Consequatur et cum atque mollitia qui quia necessitatibus. + +Voluptas beatae omnis omnis voluptas. Cum architecto ab sit ad eaque quas quia distinctio. Molestiae aperiam qui quis deleniti soluta quia qui. Dolores nostrum blanditiis libero optio id. Mollitia ad et asperiores quas saepe alias. diff --git a/app/data/docs/react/page.md b/app/data/docs/react/page.md new file mode 100644 index 0000000..8baf0aa --- /dev/null +++ b/app/data/docs/react/page.md @@ -0,0 +1,239 @@ +--- +title: "Introduction à React" +description: "Parlons un peu de React, ce qu'il est, ce qu'il fait et pourquoi il est si populaire." +tags: [Frontend, React, JavaScript, TypeScript, Bibliothèque, Interface utilisateur (UI)] +--- + +Parlons peu, parlons bien ! 😄 + +React est une **bibliothèque** _(non, pas un **framework** !)_ JavaScript open-source développée par Facebook. +Elle est utilisée pour construire des interfaces utilisateur _(UI)_ interactives et dynamiques. + +{% callout type="note" title="Pourquoi React est si populaire ?" %} + +- **Facilité d'utilisation** : React est facile à apprendre et à utiliser. Il est basé sur JavaScript, qui est l'un des langages de programmation les plus populaires. +- **Réutilisabilité des composants** : React permet de créer des composants réutilisables. Cela signifie que tu peux créer un composant une fois et l'utiliser partout où tu en as besoin. +- **Performances** : React utilise un DOM virtuel _(Virtual DOM)_ pour améliorer les performances de l'application. +- **Communauté active** : React a une communauté active de développeurs qui contribuent à son développement et partagent des ressources utiles. + +{% /callout %} + +Mais on peut aussi y noter des points faibles bien entendu, car tout n'est pas rose : + +- **Courbe d'apprentissage** : Bien que React soit "facile" à apprendre, les concepts avancés demandent un peu de temps pour être maîtrisés. +- **Taille du bundle** : React est relativement lourd en termes de taille de bundle, ce qui peut affecter les performances de l'application en terme de chargement initial. +- **GAFAM** : Comme d'autres bibliothèques/frameworks, React n'échappe pas à la critique de la part de certains développeurs qui ne souhaitent pas utiliser des technologies développées par des géants du web. + +## 🤔 Pourquoi une bibliothèque et pas un framework ? + +Très grand débat que voilà ! Vraiment.. il y a des guerres qui se sont déclarées pour moins que ça 😅 + +Blague à part, pour pouvoir dire que React n'est pas un framework, il faut comprendre la différence entre les deux : + +- **Framework** : Un framework est un ensemble de bibliothèques et de composants qui sont prédéfinis et structurés pour te permettre de construire une application. + En gros, le framework te dit comment faire les choses. +- **Bibliothèque** : Une bibliothèque est un ensemble de fonctions et de composants que tu peux utiliser pour construire une application. + En gros, c'est toi qui décides comment faire les choses. + +Et si tu connais déjà React, je te vois venir avec tes grands sabots... ! + +{% callout type="note" title="React a ses propres règles, on ne peut pas faire n'importe quoi !" %} + +C'est vrai ! React a ses propres règles et conventions, mais il te laisse quand même une grande liberté pour organiser ton code comme tu le souhaites. + +Si on se concentre sur la **préoccupation principale** de React, c'est de gérer l'**interface utilisateur** _(UI)_ de ton application. +En aucun cas, React _(tel quel et "pour le moment")_ va te dire comment gérer ton état global, comment gérer tes requêtes HTTP, etc. + +Mais tu peux totalement utiliser React **au sein** d'un framework ! + Tu as notamment des frameworks comme [**Next.js**](https://nextjs.org/) ou [**Gatsby**](https://www.gatsbyjs.com/) qui utilisent React +avec des fonctionnalités supplémentaires pour gérer le routage, le rendu côté serveur, etc. + +_(Le meilleur, selon moi, c'est [**Vike**](https://vike.dev/) qui te permet d'utiliser presque n'importe quelle bibliothèque avec une même architecture 😏)_ + +Mais concentrons-nous sur React en tant que bibliothèque, et non en tant que framework 😉 + +{% /callout %} + +## 📝 JSX + +Ce qui peut être déroutant au premier abord avec React, c'est le **JSX**. +On serait tenté de dire que c'est du HTML, mais en fait : **pas du tout** ! + +Le JSX est un sucre syntaxique _(syntactic sugar)_ qui permet d'écrire du code JavaScript en se basant sur le système de balisage HTML. + +L'avantage de JSX c'est que le code devient beaucoup plus lisible et plus proche de ce que tu connais déjà avec HTML. +Mais il s'agit bien de JavaScript, et non de HTML ! + +## 🧩 Composants + +React est basé sur le concept de **composants**. Un composant est une partie réutilisable de l'interface utilisateur _(UI)_ qui peut être affichée à l'écran. + +Dans la majorité des cas, on va chercher à **mutualiser** les composants pour éviter de répéter du code inutilement. +L'exemple le plus flagrant sera par exemple tous les boutons de ton application, qui auront probablement tous la même apparence et le même comportement. + +Il est aussi possible de les **imbriquer** les uns dans les autres ! +En fait, on joue avec des Lego, mais en version code 👷 + +Mais si on veut vraiment montrer le potentiel de React, parlons maintenant... 🥁 +Des **states**, **cycles de vie** et des **props** ! + +## 🛠️ States, Cycles de vie et Props + +T'assomer aussi vite avec ces termes qui ne te parlent peut-être pas, c'est pas cool de ma part... +Pardon pour les gros mots, je me calme tout de suite ! 🙈 + +Si ça te rassure, je vais très rapidement évoquer ce qu'il se cache derrière ces termes barbares, +je réserve les détails pour des articles dédiés 😉 + +### 🗄️ States + +... ou également appelés **états** en français. + +Le but du state, c'est de stocker des données qui vont être **observées** par React. +À chaque fois que le state va être modifié, React va **réagir** et mettre à jour l'interface utilisateur _(UI)_ en conséquence afin d'afficher les nouvelles données. + +### 🔄 Cycles de vie + +Les **cycles de vie** _(lifecycle)_ sont des méthodes qui sont appelées à des moments précis dans le cycle de vie d'un composant React. + +Si tu as lu la section qui parle brièvement des states, tu auras peut-être remarqué cette phrase : + +> À chaque fois que le state va être modifié, React va **réagir** et mettre à jour l'interface utilisateur [...] + +Et bien c'est là que les cycles de vie entrent en jeu ! +Un composant sur React va avoir un cycle de vie, caractérisé par trois phases : + +1. **Montage du composant** _(Mounting)_ : le composant est créé et inséré dans le DOM. +2. **Mise à jour du composant** _(Updating)_ : le composant est mis à jour en fonction des changements de state ou de props. +3. **Démontage du composant** _(Unmounting)_ : le composant est retiré du DOM. + +Ces différentes phases vont nous permettre d'interagir avec le composant à des moments précis, et d'effectuer des actions en conséquence. + +### 📦 Props + +Et pour finir, les **props** _(properties ou tout simplement "propriétés" en français)_ ! + +Il s'agit ni plus ni moins que des **arguments** que tu vas passer à un composant, comme tu le ferais avec une fonction. + +Cependant il faut noter une chose : + +On transmet les props à un composant précis, qui sera donc un composant **enfant**. +Un composant enfant ne pourra pas transmettre des props à un composant parent, c'est unidirectionnel _(mais on verra comment on peut faire autrement 😉)_. + +## 🖥️ Une petite démo ? + +OK, mais vraiment petite ! + +Prenons l'exemple d'une application qui servira **uniquement** à afficher une liste de tâches _(une todolist donc !)_. +_(Bon... utiliser React uniquement pour ça c'est abusé, mais c'est pour l'exemple 😅)_ + +{% tabs defaultSelectedTab="demo-app" %} + +{% tab value="demo-app" label="App.tsx" %} + +```tsx showLineNumbers +import TodoList from "./TodoList"; +import React from "react"; + +const App = () => { + return ( +
    +

    TodoList

    + + +
    + ); +}; +``` + +{% /tab %} + +{% tab value="demo-todolist" label="TodoList.tsx" %} + +```tsx showLineNumbers +import TodoListItem from "./TodoListItem"; +import React from "react"; + +const TodoList = () => { + const [items, setItems] = React.useState([]); + const [inputValue, setInputValue] = React.useState(""); + + const handleInputValueChange = (event: React.ChangeEvent) => { + setInputValue(event.target.value); + }; + + const handleSubmit = (event: React.FormEvent) => { + // On empêche le comportement par défaut du formulaire + event.preventDefault(); + + // On ajoute un nouvel élément à la liste des tâches + setItems([...items, inputValue]); + + // On réinitialise la valeur de l'input + setInputValue(""); + }; + + return ( +
    +
    + + + +
    + +
      + {items.map((item, index) => ( +
    • + +
    • + ))} +
    +
    + ); +}; + +export default TodoList; +``` + +{% /tab %} + +{% tab value="demo-todolistitem" label="TodoListItem.tsx" %} + +```tsx showLineNumbers +import React from "react"; + +interface TodoListItemProps { + item: string; +} + +const TodoListItem = (props: TodoListItemProps) => { + return {props.item}; +}; + +export default TodoListItem; +``` + +{% /tab %} + +{% /tabs %} + +On peut très bien imaginer des améliorations à cette application, comme par exemple : + +- Supprimer une tâche +- Réinitialiser la liste des tâches +- Marquer une tâche comme terminée _(et inversement)_ +- Ordonner les tâches pour afficher en priorité les tâches non terminées +- Enregistrer les tâches dans le navigateur pour les retrouver après un rafraîchissement de la page + +Et si on se gardait ça pour la suite ? 😉 + +## Conclusion + +Tu l'auras compris, React permet de résoudre un certain nombre de problématiques que l'on peut rencontrer lors du développement d'une application web. + +Pas des problématiques majeures, mais ça nous permet tout de même en tant que développeur de gagner du temps et de l'efficacité ! + +Dans le cas où le fait que ce soit créé et maintenu par Facebook _(ou GAFAM de manière générale)_ est contre tes valeurs, +tu as des solutions très semblables qui existent, comme [**SolidJS**](https://www.solidjs.com/) par exemple. + +Et si tu veux en savoir plus, je t'invite à lire les articles suivants qui vont te permettre de rentrer un peu plus dans le détail de React ! 🚀 diff --git a/app/database/todoItems.ts b/app/database/todoItems.ts new file mode 100644 index 0000000..5404680 --- /dev/null +++ b/app/database/todoItems.ts @@ -0,0 +1,17 @@ +interface TodoItem { + text: string; +} + +const todosDefault = [{ text: "Buy milk" }, { text: "Buy strawberries" }]; + +const database = + // We create an in-memory database. + // - We use globalThis so that the database isn't reset upon HMR. + // - The database is reset when restarting the server, use a proper database (SQLite/PostgreSQL/...) if you want persistent data. + // biome-ignore lint: + ((globalThis as unknown as { __database: { todos: TodoItem[] } }).__database ??= { todos: todosDefault }); + +const { todos } = database; + +export { todos }; +export type { TodoItem }; diff --git a/app/eslint.config.js b/app/eslint.config.js new file mode 100644 index 0000000..751c129 --- /dev/null +++ b/app/eslint.config.js @@ -0,0 +1,65 @@ +// @ts-nocheck + +import eslint from "@eslint/js"; +import prettier from "eslint-plugin-prettier/recommended"; +import react from "eslint-plugin-react/configs/recommended.js"; +import globals from "globals"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + { + ignores: [ + "dist/*", + // Temporary compiled files + "**/*.ts.build-*.mjs", + + // JS files at the root of the project + "*.js", + "*.cjs", + "*.mjs", + ], + }, + eslint.configs.recommended, + ...tseslint.configs.recommended, + { + languageOptions: { + parserOptions: { + warnOnUnsupportedTypeScriptVersion: false, + sourceType: "module", + ecmaVersion: "latest", + }, + }, + }, + { + rules: { + "@typescript-eslint/no-unused-vars": [ + 1, + { + argsIgnorePattern: "^_", + }, + ], + "@typescript-eslint/no-namespace": 0, + "react/react-in-jsx-scope": false, + }, + }, + + { + files: ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"], + ...react, + languageOptions: { + ...react.languageOptions, + globals: { + ...globals.serviceworker, + ...globals.browser, + }, + }, + + settings: { + react: { + version: "detect", + }, + }, + }, + + prettier, +); diff --git a/app/fastify-entry.ts b/app/fastify-entry.ts new file mode 100644 index 0000000..2441470 --- /dev/null +++ b/app/fastify-entry.ts @@ -0,0 +1,68 @@ +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"; + +const __filename = fileURLToPath(import.meta.url); +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; + +async function startServer() { + const app = Fastify(); + + // Avoid pre-parsing body, otherwise it will cause issue with universal handlers + // This will probably change in the future though, you can follow https://github.com/magne4000/universal-middleware for updates + app.removeAllContentTypeParsers(); + app.addContentTypeParser("*", function (_request, _payload, done) { + done(null, ""); + }); + + await app.register(await import("@fastify/middie")); + + if (process.env.NODE_ENV === "production") { + await app.register(await import("@fastify/static"), { + root: `${root}/dist/client`, + wildcard: false, + }); + } else { + // Instantiate Vite's development server and integrate its middleware to our server. + // ⚠️ We should instantiate it *only* in development. (It isn't needed in production + // and would unnecessarily bloat our server in production.) + const vite = await import("vite"); + const viteDevMiddleware = ( + await vite.createServer({ + root, + server: { middlewareMode: true, hmr: { port: hmrPort } }, + }) + ).middlewares; + app.use(viteDevMiddleware); + } + + app.post<{ Body: string }>("/_telefunc", createHandler(telefuncHandler)()); + + /** + * Vike route + * + * @link {@see https://vike.dev} + **/ + app.all("/*", createHandler(vikeHandler)()); + + return app; +} + +const app = await startServer(); + +app.listen( + { + port: port, + host: "0.0.0.0", + }, + () => { + console.log(`Server listening on http://localhost:${port}`); + }, +); diff --git a/app/images/blur-cyan.png b/app/images/blur-cyan.png new file mode 100644 index 0000000..e98d7b9 Binary files /dev/null and b/app/images/blur-cyan.png differ diff --git a/app/images/blur-indigo.png b/app/images/blur-indigo.png new file mode 100644 index 0000000..3fc10f9 Binary files /dev/null and b/app/images/blur-indigo.png differ diff --git a/app/layouts/LayoutDefault.tsx b/app/layouts/LayoutDefault.tsx new file mode 100644 index 0000000..8ce8487 --- /dev/null +++ b/app/layouts/LayoutDefault.tsx @@ -0,0 +1,95 @@ +import { MobileNavigation } from "@syntax/MobileNavigation"; +import { usePageContext } from "vike-react/usePageContext"; +import { ThemeSelector } from "@syntax/ThemeSelector"; +import { Link } from "@/components/common/Link"; +import { Navigation } from "@syntax/Navigation"; +import { useEffect, useState } from "react"; +import { Search } from "@syntax/Search"; +import { Hero } from "@syntax/Hero"; +import { Logo } from "@syntax/Logo"; +import clsx from "clsx"; + +import "./style.css"; +import "./tailwind.css"; +import "./prism.css"; +import "unfonts.css"; + +function GitHubIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +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 ( +
    +
    + +
    + +
    + + + +
    + +
    + +
    + +
    + + + + +
    +
    + ); +} + +export default function DefaultLayout({ children }: { children: React.ReactNode }) { + const { urlPathname } = usePageContext(); + const isHomePage = urlPathname === "/"; + + return ( +
    +
    + + {isHomePage && } + +
    +
    +
    +
    +
    +
    + +
    +
    + {children} +
    +
    + ); +} diff --git a/app/layouts/prism.css b/app/layouts/prism.css new file mode 100644 index 0000000..afd7e5d --- /dev/null +++ b/app/layouts/prism.css @@ -0,0 +1,47 @@ +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); +} diff --git a/app/layouts/style.css b/app/layouts/style.css new file mode 100644 index 0000000..483a6de --- /dev/null +++ b/app/layouts/style.css @@ -0,0 +1,35 @@ +/* Links */ +a { + text-decoration: none; +} +#sidebar a { + padding: 2px 10px; + margin-left: -10px; +} +#sidebar a.is-active { + background-color: #eee; +} + +/* Reset */ +body { + margin: 0; + font-family: sans-serif; +} +* { + box-sizing: border-box; +} + +/* Page Transition Animation */ +#page-content { + opacity: 1; + transition: opacity 0.3s ease-in-out; +} +body.page-is-transitioning #page-content { + opacity: 0; +} + +#root { + height: 100%; + width: 100%; + display: flex; +} diff --git a/app/layouts/tailwind.css b/app/layouts/tailwind.css new file mode 100644 index 0000000..11708e0 --- /dev/null +++ b/app/layouts/tailwind.css @@ -0,0 +1,48 @@ +@import "tailwindcss"; +@import "./prism.css"; + +@plugin '@tailwindcss/typography'; + +@custom-variant dark (&:where(.dark, .dark *)); + +@theme { + --text-*: initial; + --text-xs: 0.75rem; + --text-xs--line-height: 1rem; + --text-sm: 0.875rem; + --text-sm--line-height: 1.5rem; + --text-base: 1rem; + --text-base--line-height: 2rem; + --text-lg: 1.125rem; + --text-lg--line-height: 1.75rem; + --text-xl: 1.25rem; + --text-xl--line-height: 2rem; + --text-2xl: 1.5rem; + --text-2xl--line-height: 2.5rem; + --text-3xl: 2rem; + --text-3xl--line-height: 2.5rem; + --text-4xl: 2.5rem; + --text-4xl--line-height: 3rem; + --text-5xl: 3rem; + --text-5xl--line-height: 3.5rem; + --text-6xl: 3.75rem; + --text-6xl--line-height: 1; + --text-7xl: 4.5rem; + --text-7xl--line-height: 1; + --text-8xl: 6rem; + --text-8xl--line-height: 1; + --text-9xl: 8rem; + --text-9xl--line-height: 1; + + --font-sans: "Inter Variable"; + --font-display: "Lexend Variable"; + --font-display--font-feature-settings: "ss01"; + + --container-8xl: 88rem; +} + +@layer base { + [inert] ::-webkit-scrollbar { + display: none; + } +} diff --git a/app/lib/navigation.ts b/app/lib/navigation.ts new file mode 100644 index 0000000..4018717 --- /dev/null +++ b/app/lib/navigation.ts @@ -0,0 +1,13 @@ +export const navigation = [ + { + title: "Introduction", + links: [ + { title: "Getting started", href: "/" }, + { title: "Installation", href: "/docs/installation" }, + ], + }, + { + title: "React", + links: [{ title: "Introduction", href: "/docs/react" }], + }, +]; diff --git a/app/lib/search.ts b/app/lib/search.ts new file mode 100644 index 0000000..afbe78c --- /dev/null +++ b/app/lib/search.ts @@ -0,0 +1,128 @@ +import { slugifyWithCounter } from "@sindresorhus/slugify"; +import Markdoc from "@markdoc/markdoc"; +import FlexSearch from "flexsearch"; +import glob from "fast-glob"; +import * as path from "path"; +import * as fs from "fs"; + +const slugify = slugifyWithCounter(); + +interface Node { + type: string; + attributes?: { + content?: string; + level?: number; + id?: string; + }; + children?: Node[]; +} + +interface Section { + content: string; + hash?: string; + subsections: string[]; +} + +export interface SearchResult { + url: string; + title: string; + pageTitle?: string; + content?: string; +} + +function toString(node: Node): string { + let str = node.type === "text" && typeof node.attributes?.content === "string" ? node.attributes.content : ""; + if ("children" in node) { + for (let child of node.children) { + str += toString(child); + } + } + return str; +} + +function extractSections(node: Node, sections: Section[], isRoot: boolean = true): void { + if (isRoot) { + slugify.reset(); + } + if (node.type === "heading" || node.type === "paragraph") { + let content = toString(node).trim(); + if (node.type === "heading" && node.attributes?.level <= 2) { + let hash = node.attributes?.id ?? slugify(content); + sections.push({ content, hash, subsections: [] }); + } else { + sections[sections.length - 1].subsections.push(content); + } + } else if ("children" in node) { + for (let child of node.children) { + extractSections(child, sections, false); + } + } +} + +export function buildSearchIndex(pagesDir: string): FlexSearch.Document { + const cache = new Map(); + const sectionIndex = new FlexSearch.Document({ + tokenize: "full", + document: { + id: "url", + index: ["title", "content"], + }, + context: { + resolution: 9, + depth: 2, + bidirectional: true, + }, + }); + + const files = glob.sync("**/page.md", { cwd: pagesDir }); + const data = files.map((file) => { + const url = file === "page.md" ? "/" : `/${file.replace(/\/page\.md$/, "")}`; + const md = fs.readFileSync(path.join(pagesDir, file), "utf8"); + + let sections: Section[]; + + if (cache.get(file)?.[0] === md) { + sections = cache.get(file)![1]; + } else { + const ast = Markdoc.parse(md); + const title = ast.attributes?.frontmatter?.match(/^title:\s*(.*?)\s*$/m)?.[1]; + sections = [{ content: title ?? "", subsections: [] }]; + extractSections(ast, sections); + cache.set(file, [md, sections]); + } + + return { url, sections }; + }); + + for (const { url, sections } of data) { + for (const { content, hash, subsections } of sections) { + sectionIndex.add({ + url: url + (hash ? `#${hash}` : ""), + title: content, + content: [content, ...subsections].join("\n"), + pageTitle: hash ? sections[0].content : undefined, + }); + } + } + + return sectionIndex; +} + +export function search( + sectionIndex: FlexSearch.Document, + query: string, + options: Record = {}, +): SearchResult[] { + const result = sectionIndex.search(query, { + ...options, + enrich: true, + }); + if (result.length === 0) { + return []; + } + return result[0].result.map((item: any) => ({ + url: item.id, + title: item.doc.title, + pageTitle: item.doc.pageTitle, + })); +} diff --git a/app/lib/sections.ts b/app/lib/sections.ts new file mode 100644 index 0000000..f20a4e9 --- /dev/null +++ b/app/lib/sections.ts @@ -0,0 +1,92 @@ +import { type Node } from "@markdoc/markdoc"; +import { slugifyWithCounter } from "@sindresorhus/slugify"; + +interface HeadingNode extends Node { + type: "heading"; + attributes: { + level: 1 | 2 | 3 | 4 | 5 | 6; + id?: string; + [key: string]: unknown; + }; +} + +type H2Node = HeadingNode & { + attributes: { + level: 2; + }; +}; + +type H3Node = HeadingNode & { + attributes: { + level: 3; + }; +}; + +function isHeadingNode(node: Node): node is HeadingNode { + return ( + node.type === "heading" && + [1, 2, 3, 4, 5, 6].includes(node.attributes.level) && + (typeof node.attributes.id === "string" || typeof node.attributes.id === "undefined") + ); +} + +function isH2Node(node: Node): node is H2Node { + return isHeadingNode(node) && node.attributes.level === 2; +} + +function isH3Node(node: Node): node is H3Node { + return isHeadingNode(node) && node.attributes.level === 3; +} + +function getNodeText(node: Node) { + let text = ""; + for (let child of node.children ?? []) { + if (child.type === "text") { + text += child.attributes.content; + } + text += getNodeText(child); + } + return text; +} + +export type Subsection = H3Node["attributes"] & { + id: string; + title: string; + children?: undefined; +}; + +export type Section = H2Node["attributes"] & { + id: string; + title: string; + children: Array; +}; + +export function collectSections(nodes: Array, slugify = slugifyWithCounter()) { + const sections: Array
    = []; + + for (const node of nodes) { + if (isH2Node(node) || isH3Node(node)) { + const title = getNodeText(node); + if (title) { + const id = slugify(title); + + if (isH3Node(node)) { + if (!sections[sections.length - 1]) { + throw new Error("Cannot add `h3` to table of contents without a preceding `h2`"); + } + sections[sections.length - 1].children.push({ + ...node.attributes, + id, + title, + }); + } else { + sections.push({ ...node.attributes, id, title, children: [] }); + } + } + } + + sections.push(...collectSections(node.children ?? [], slugify)); + } + + return sections; +} diff --git a/app/markdoc/nodes.ts b/app/markdoc/nodes.ts new file mode 100644 index 0000000..72ba7a9 --- /dev/null +++ b/app/markdoc/nodes.ts @@ -0,0 +1,59 @@ +import { Config, nodes as defaultNodes, Node, Tag } from "@markdoc/markdoc"; +import { slugifyWithCounter } from "@sindresorhus/slugify"; +import yaml from "js-yaml"; + +import { DocsLayout } from "@syntax/DocsLayout"; +import { Fence } from "@syntax/Fence"; + +let documentSlugifyMap = new Map(); + +const nodes = { + document: { + ...defaultNodes.document, + render: DocsLayout, + transform(node: Node, config: Config) { + documentSlugifyMap.set(config, slugifyWithCounter()); + + return new Tag( + this.render, + { + frontmatter: yaml.load(node.attributes.frontmatter), + nodes: node.children, + }, + node.transformChildren(config), + ); + }, + }, + heading: { + ...defaultNodes.heading, + transform(node: Node, config: Config) { + const slugify = documentSlugifyMap.get(config); + const attributes = node.transformAttributes(config); + const children = node.transformChildren(config); + const text = children.filter((child) => typeof child === "string").join(" "); + const id = attributes.id ?? slugify(text); + + return new Tag(`h${node.attributes.level}`, { ...attributes, id }, children); + }, + }, + th: { + ...defaultNodes.th, + attributes: { + ...defaultNodes.th.attributes, + scope: { + type: String, + default: "col", + }, + }, + }, + fence: { + render: Fence, + attributes: { + language: { + type: String, + }, + }, + }, +}; + +export default nodes; diff --git a/app/markdoc/tags.tsx b/app/markdoc/tags.tsx new file mode 100644 index 0000000..06309f9 --- /dev/null +++ b/app/markdoc/tags.tsx @@ -0,0 +1,60 @@ +import { QuickLink, QuickLinks } from "@syntax/QuickLinks"; +import { TabContent, Tabs } from "@/components/md/Tabs"; +import { Callout } from "@syntax/Callout"; + +const tags = { + callout: { + attributes: { + title: { type: String }, + type: { + type: String, + default: "note", + matches: ["note", "warning"], + errorLevel: "critical", + }, + }, + render: Callout, + }, + figure: { + selfClosing: true, + attributes: { + src: { type: String }, + alt: { type: String }, + caption: { type: String }, + }, + render: ({ src, alt = "", caption }: { src: string; alt: string; caption: string }) => ( +
    + {alt} +
    {caption}
    +
    + ), + }, + "quick-links": { + render: QuickLinks, + }, + "quick-link": { + selfClosing: true, + render: QuickLink, + attributes: { + title: { type: String }, + description: { type: String }, + icon: { type: String }, + href: { type: String }, + }, + }, + tabs: { + render: Tabs, + attributes: { + defaultSelectedTab: { type: String }, + }, + }, + tab: { + render: TabContent, + attributes: { + label: { type: String }, + value: { type: String }, + }, + }, +}; + +export default tags; diff --git a/app/package.json b/app/package.json new file mode 100644 index 0000000..b09d34d --- /dev/null +++ b/app/package.json @@ -0,0 +1,59 @@ +{ + "scripts": { + "dev": "tsx ./fastify-entry.ts", + "build": "vike build", + "preview": "cross-env NODE_ENV=production tsx ./fastify-entry.ts", + "lint": "eslint ." + }, + "dependencies": { + "@algolia/autocomplete-core": "^1.18.1", + "@fastify/middie": "^9.0.3", + "@fastify/static": "^8.1.1", + "@fontsource-variable/inter": "^5.2.5", + "@fontsource-variable/lexend": "^5.2.5", + "@headlessui/react": "^2.2.0", + "@markdoc/markdoc": "^0.5.1", + "@sindresorhus/slugify": "^2.2.1", + "@tailwindcss/typography": "^0.5.16", + "@universal-middleware/core": "^0.4.4", + "@universal-middleware/fastify": "^0.5.9", + "@vitejs/plugin-react": "^4.3.4", + "clsx": "^2.1.1", + "fast-glob": "^3.3.3", + "fastify": "^5.2.1", + "flexsearch": "^0.7.43", + "js-yaml": "^4.1.0", + "prism-react-renderer": "^2.4.1", + "prisma": "^6.5.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-highlight-words": "^0.21.0", + "simple-functional-loader": "^1.2.1", + "telefunc": "^0.1.87", + "unplugin-fonts": "^1.3.1", + "vike": "^0.4.224", + "vike-react": "^0.5.13" + }, + "devDependencies": { + "@eslint/js": "^9.22.0", + "@tailwindcss/vite": "^4.0.12", + "@types/js-yaml": "^4.0.9", + "@types/node": "^18.19.76", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@types/react-highlight-words": "^0.20.0", + "cross-env": "^7.0.3", + "eslint": "^9.22.0", + "eslint-config-prettier": "^10.1.1", + "eslint-plugin-prettier": "^5.2.3", + "eslint-plugin-react": "^7.37.4", + "globals": "^16.0.0", + "prettier": "^3.5.3", + "tailwindcss": "^4.0.12", + "tsx": "^4.19.3", + "typescript": "^5.8.2", + "typescript-eslint": "^8.26.0", + "vite": "^6.2.1" + }, + "type": "module" +} \ No newline at end of file diff --git a/app/pages/+Head.tsx b/app/pages/+Head.tsx new file mode 100644 index 0000000..4f22d8b --- /dev/null +++ b/app/pages/+Head.tsx @@ -0,0 +1,12 @@ +// https://vike.dev/Head + +import React from "react"; +import logoUrl from "../assets/logo.svg"; + +export default function HeadDefault() { + return ( + <> + + + ); +} diff --git a/app/pages/+config.ts b/app/pages/+config.ts new file mode 100644 index 0000000..0c1b11a --- /dev/null +++ b/app/pages/+config.ts @@ -0,0 +1,24 @@ +import vikeReact from "vike-react/config"; +import type { Config } from "vike/types"; +import Layout from "../layouts/LayoutDefault.js"; + +// Default config (can be overridden by pages) +// https://vike.dev/config + +export default { + // https://vike.dev/Layout + Layout, + + // https://vike.dev/head-tags + title: "Memento Dev", + description: "Demo showcasing Vike", + + htmlAttributes: { + class: "h-full antialiased", + }, + bodyAttributes: { + class: "flex min-h-full bg-white dark:bg-slate-900", + }, + + extends: vikeReact, +} satisfies Config; diff --git a/app/pages/+onPageTransitionEnd.ts b/app/pages/+onPageTransitionEnd.ts new file mode 100644 index 0000000..75af2e0 --- /dev/null +++ b/app/pages/+onPageTransitionEnd.ts @@ -0,0 +1,6 @@ +import type { OnPageTransitionEndAsync } from "vike/types"; + +export const onPageTransitionEnd: OnPageTransitionEndAsync = async () => { + console.log("Page transition end"); + document.querySelector("body")?.classList.remove("page-is-transitioning"); +}; diff --git a/app/pages/+onPageTransitionStart.ts b/app/pages/+onPageTransitionStart.ts new file mode 100644 index 0000000..12c344b --- /dev/null +++ b/app/pages/+onPageTransitionStart.ts @@ -0,0 +1,6 @@ +import type { OnPageTransitionStartAsync } from "vike/types"; + +export const onPageTransitionStart: OnPageTransitionStartAsync = async () => { + console.log("Page transition start"); + document.querySelector("body")?.classList.add("page-is-transitioning"); +}; diff --git a/app/pages/_error/+Page.tsx b/app/pages/_error/+Page.tsx new file mode 100644 index 0000000..b8448b0 --- /dev/null +++ b/app/pages/_error/+Page.tsx @@ -0,0 +1,32 @@ +import { usePageContext } from "vike-react/usePageContext"; +import { Link } from "@/components/common/Link"; + +export default function Page() { + const { is404 } = usePageContext(); + if (is404) { + return ( + <> +
    +
    +

    404

    +

    + Page introuvable +

    +

    + Désolé, nous ne pouvons pas trouver la page que vous recherchez. +

    + + Retour à l'accueil + +
    +
    + + ); + } + return ( + <> +

    500 Internal Server Error

    +

    Something went wrong.

    + + ); +} diff --git a/app/pages/docs/+Page.tsx b/app/pages/docs/+Page.tsx new file mode 100644 index 0000000..43ffd68 --- /dev/null +++ b/app/pages/docs/+Page.tsx @@ -0,0 +1,16 @@ +import type { Data } from "./+data"; + +import { useData } from "vike-react/useData"; +import Markdoc from "@markdoc/markdoc"; +import nodes from "@/markdoc/nodes"; +import tags from "@/markdoc/tags"; +import React from "react"; + +export default function Page() { + const { doc } = useData(); + + const parsedDoc = Markdoc.parse(doc.content); + const transformedDoc = Markdoc.transform(parsedDoc, { nodes, tags, variables: {} }); + + return Markdoc.renderers.react(transformedDoc, React); +} diff --git a/app/pages/docs/+data.ts b/app/pages/docs/+data.ts new file mode 100644 index 0000000..9213dc1 --- /dev/null +++ b/app/pages/docs/+data.ts @@ -0,0 +1,29 @@ +import type { PageContext } from "vike/types"; + +import { docsService } from "@/services/DocsService"; +import { useConfig } from "vike-react/useConfig"; +import Markdoc from "@markdoc/markdoc"; +import { render } from "vike/abort"; + +export type Data = Awaited>; + +export async function data(pageContext: PageContext) { + const config = useConfig(); + + const { key } = pageContext.routeParams; + + const doc = await docsService.getDoc("docs", key); + + if (!doc) { + throw render(404); + } + + config({ + title: doc.title, + description: doc.description, + }); + + docsService.transform(doc); + + return { doc }; +} diff --git a/app/pages/docs/+route.ts b/app/pages/docs/+route.ts new file mode 100644 index 0000000..bbbd7c0 --- /dev/null +++ b/app/pages/docs/+route.ts @@ -0,0 +1,12 @@ +import type { PageContext } from "vike/types"; + +const routeRegex = /^\/docs\/(.*)$/; + +export function route(pageContext: PageContext) { + const match = pageContext.urlPathname.match(routeRegex); + if (!match) return false; + + const [, key] = match; + + return { routeParams: { key } }; +} diff --git a/app/pages/index/+Page.tsx b/app/pages/index/+Page.tsx new file mode 100644 index 0000000..ee586a9 --- /dev/null +++ b/app/pages/index/+Page.tsx @@ -0,0 +1,7 @@ +export default function Page() { + return ( +
    +

    My Vike app

    +
    + ); +} diff --git a/app/pages/index/Counter.tsx b/app/pages/index/Counter.tsx new file mode 100644 index 0000000..b44b3a3 --- /dev/null +++ b/app/pages/index/Counter.tsx @@ -0,0 +1,17 @@ +import React, { useState } from "react"; + +export function Counter() { + const [count, setCount] = useState(0); + + return ( + + ); +} diff --git a/app/pages/star-wars/@id/+Page.tsx b/app/pages/star-wars/@id/+Page.tsx new file mode 100644 index 0000000..6e50b0e --- /dev/null +++ b/app/pages/star-wars/@id/+Page.tsx @@ -0,0 +1,17 @@ +import React from "react"; +import { useData } from "vike-react/useData"; +import type { Data } from "./+data.js"; + +export default function Page() { + const movie = useData(); + return ( + <> +

    {movie.title}

    + Release Date: {movie.release_date} +
    + Director: {movie.director} +
    + Producer: {movie.producer} + + ); +} diff --git a/app/pages/star-wars/@id/+data.ts b/app/pages/star-wars/@id/+data.ts new file mode 100644 index 0000000..3b5a342 --- /dev/null +++ b/app/pages/star-wars/@id/+data.ts @@ -0,0 +1,32 @@ +// https://vike.dev/data + +import type { PageContextServer } from "vike/types"; +import type { MovieDetails } from "../types.js"; +import { useConfig } from "vike-react/useConfig"; + +export type Data = Awaited>; + +export const data = async (pageContext: PageContextServer) => { + // https://vike.dev/useConfig + const config = useConfig(); + + const response = await fetch(`https://brillout.github.io/star-wars/api/films/${pageContext.routeParams.id}.json`); + let movie = (await response.json()) as MovieDetails; + + config({ + // Set + title: movie.title, + }); + + // We remove data we don't need because the data is passed to + // the client; we should minimize what is sent over the network. + movie = minimize(movie); + + return movie; +}; + +function minimize(movie: MovieDetails): MovieDetails { + const { id, title, release_date, director, producer } = movie; + const minimizedMovie = { id, title, release_date, director, producer }; + return minimizedMovie; +} diff --git a/app/pages/star-wars/index/+Page.tsx b/app/pages/star-wars/index/+Page.tsx new file mode 100644 index 0000000..3c24a4e --- /dev/null +++ b/app/pages/star-wars/index/+Page.tsx @@ -0,0 +1,22 @@ +import React from "react"; +import { useData } from "vike-react/useData"; +import type { Data } from "./+data.js"; + +export default function Page() { + const movies = useData<Data>(); + return ( + <> + <h1>Star Wars Movies</h1> + <ol> + {movies.map(({ id, title, release_date }) => ( + <li key={id}> + <a href={`/star-wars/${id}`}>{title}</a> ({release_date}) + </li> + ))} + </ol> + <p> + Source: <a href="https://brillout.github.io/star-wars">brillout.github.io/star-wars</a>. + </p> + </> + ); +} diff --git a/app/pages/star-wars/index/+data.ts b/app/pages/star-wars/index/+data.ts new file mode 100644 index 0000000..73834ea --- /dev/null +++ b/app/pages/star-wars/index/+data.ts @@ -0,0 +1,32 @@ +// https://vike.dev/data + +import type { Movie, MovieDetails } from "../types.js"; +import { useConfig } from "vike-react/useConfig"; + +export type Data = Awaited<ReturnType<typeof data>>; + +export const data = async () => { + // https://vike.dev/useConfig + const config = useConfig(); + + const response = await fetch("https://brillout.github.io/star-wars/api/films.json"); + const moviesData = (await response.json()) as MovieDetails[]; + + config({ + // Set <title> + title: `${moviesData.length} Star Wars Movies`, + }); + + // We remove data we don't need because the data is passed to the client; we should + // minimize what is sent over the network. + const movies = minimize(moviesData); + + return movies; +}; + +function minimize(movies: MovieDetails[]): Movie[] { + return movies.map((movie) => { + const { title, release_date, id } = movie; + return { title, release_date, id }; + }); +} diff --git a/app/pages/star-wars/types.ts b/app/pages/star-wars/types.ts new file mode 100644 index 0000000..ffccdf5 --- /dev/null +++ b/app/pages/star-wars/types.ts @@ -0,0 +1,10 @@ +export type Movie = { + id: string; + title: string; + release_date: string; +}; + +export type MovieDetails = Movie & { + director: string; + producer: string; +}; diff --git a/app/pages/todo/+Page.tsx b/app/pages/todo/+Page.tsx new file mode 100644 index 0000000..674b784 --- /dev/null +++ b/app/pages/todo/+Page.tsx @@ -0,0 +1,14 @@ +import type { Data } from "./+data"; +import React from "react"; +import { useData } from "vike-react/useData"; +import { TodoList } from "./TodoList.js"; + +export default function Page() { + const data = useData<Data>(); + return ( + <> + <h1>To-do List</h1> + <TodoList initialTodoItems={data.todo} /> + </> + ); +} diff --git a/app/pages/todo/+config.ts b/app/pages/todo/+config.ts new file mode 100644 index 0000000..a668c0a --- /dev/null +++ b/app/pages/todo/+config.ts @@ -0,0 +1,3 @@ +export const config = { + prerender: false, +}; diff --git a/app/pages/todo/+data.ts b/app/pages/todo/+data.ts new file mode 100644 index 0000000..60954bf --- /dev/null +++ b/app/pages/todo/+data.ts @@ -0,0 +1,11 @@ +// https://vike.dev/data +import { todos } from "../../database/todoItems"; +import type { PageContextServer } from "vike/types"; + +export type Data = { + todo: { text: string }[]; +}; + +export default async function data(_pageContext: PageContextServer): Promise<Data> { + return { todo: todos }; +} diff --git a/app/pages/todo/TodoList.telefunc.ts b/app/pages/todo/TodoList.telefunc.ts new file mode 100644 index 0000000..abb5d74 --- /dev/null +++ b/app/pages/todo/TodoList.telefunc.ts @@ -0,0 +1,7 @@ +// We use Telefunc (https://telefunc.com) for data mutations. Being able to use Telefunc for fetching initial data is work-in-progress (https://vike.dev/data-fetching#tools). + +import { todos } from "../../database/todoItems"; + +export async function onNewTodo({ text }: { text: string }) { + todos.push({ text }); +} diff --git a/app/pages/todo/TodoList.tsx b/app/pages/todo/TodoList.tsx new file mode 100644 index 0000000..0b3483c --- /dev/null +++ b/app/pages/todo/TodoList.tsx @@ -0,0 +1,52 @@ +import { onNewTodo } from "./TodoList.telefunc"; +import React, { useState } from "react"; + +export function TodoList({ initialTodoItems }: { initialTodoItems: { text: string }[] }) { + const [todoItems, setTodoItems] = useState(initialTodoItems); + const [newTodo, setNewTodo] = useState(""); + return ( + <> + <ul> + {todoItems.map((todoItem, index) => ( + // biome-ignore lint: + <li key={index}>{todoItem.text}</li> + ))} + </ul> + <div> + <form + onSubmit={async (ev) => { + ev.preventDefault(); + + // Optimistic UI update + setTodoItems((prev) => [...prev, { text: newTodo }]); + try { + await onNewTodo({ text: newTodo }); + setNewTodo(""); + } catch (e) { + console.error(e); + // rollback + setTodoItems((prev) => prev.slice(0, -1)); + } + }} + > + <input + type="text" + onChange={(ev) => setNewTodo(ev.target.value)} + value={newTodo} + className={ + "bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-purple-500 focus:border-purple-500 w-full sm:w-auto p-2 mr-1 mb-1" + } + /> + <button + type="submit" + className={ + "text-white bg-purple-700 hover:bg-purple-800 focus:ring-2 focus:outline-hidden focus:ring-purple-300 font-medium rounded-lg text-sm w-full sm:w-auto p-2" + } + > + Add to-do + </button> + </form> + </div> + </> + ); +} diff --git a/app/pnpm-lock.yaml b/app/pnpm-lock.yaml new file mode 100644 index 0000000..1d582d4 --- /dev/null +++ b/app/pnpm-lock.yaml @@ -0,0 +1,5572 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@algolia/autocomplete-core': + specifier: ^1.18.1 + version: 1.18.1(@algolia/client-search@5.21.0)(algoliasearch@5.21.0)(search-insights@2.17.3) + '@fastify/middie': + specifier: ^9.0.3 + version: 9.0.3 + '@fastify/static': + specifier: ^8.1.1 + version: 8.1.1 + '@fontsource-variable/inter': + specifier: ^5.2.5 + version: 5.2.5 + '@fontsource-variable/lexend': + specifier: ^5.2.5 + version: 5.2.5 + '@headlessui/react': + specifier: ^2.2.0 + version: 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@markdoc/markdoc': + specifier: ^0.5.1 + version: 0.5.1(@types/react@19.0.10)(react@19.0.0) + '@sindresorhus/slugify': + specifier: ^2.2.1 + version: 2.2.1 + '@tailwindcss/typography': + specifier: ^0.5.16 + version: 0.5.16(tailwindcss@4.0.13) + '@universal-middleware/core': + specifier: ^0.4.4 + version: 0.4.4(fastify@5.2.1) + '@universal-middleware/fastify': + specifier: ^0.5.9 + version: 0.5.9(fastify@5.2.1) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4(vite@6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)) + clsx: + specifier: ^2.1.1 + version: 2.1.1 + fast-glob: + specifier: ^3.3.3 + version: 3.3.3 + fastify: + specifier: ^5.2.1 + version: 5.2.1 + flexsearch: + specifier: ^0.7.43 + version: 0.7.43 + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 + prism-react-renderer: + specifier: ^2.4.1 + version: 2.4.1(react@19.0.0) + prisma: + specifier: ^6.5.0 + version: 6.5.0(typescript@5.8.2) + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + react-highlight-words: + specifier: ^0.21.0 + version: 0.21.0(react@19.0.0) + simple-functional-loader: + specifier: ^1.2.1 + version: 1.2.1 + telefunc: + specifier: ^0.1.87 + version: 0.1.87(@babel/core@7.26.10)(@babel/parser@7.26.10)(@babel/types@7.26.10)(react-streaming@0.3.50(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + unplugin-fonts: + specifier: ^1.3.1 + version: 1.3.1(vite@6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)) + vike: + specifier: ^0.4.224 + version: 0.4.225(react-streaming@0.3.50(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)) + vike-react: + specifier: ^0.5.13 + version: 0.5.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(vike@0.4.225(react-streaming@0.3.50(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3))) + devDependencies: + '@eslint/js': + specifier: ^9.22.0 + version: 9.22.0 + '@tailwindcss/vite': + specifier: ^4.0.12 + version: 4.0.13(vite@6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)) + '@types/js-yaml': + specifier: ^4.0.9 + version: 4.0.9 + '@types/node': + specifier: ^18.19.76 + version: 18.19.80 + '@types/react': + specifier: ^19.0.10 + version: 19.0.10 + '@types/react-dom': + specifier: ^19.0.4 + version: 19.0.4(@types/react@19.0.10) + '@types/react-highlight-words': + specifier: ^0.20.0 + version: 0.20.0 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + eslint: + specifier: ^9.22.0 + version: 9.22.0(jiti@2.4.2) + eslint-config-prettier: + specifier: ^10.1.1 + version: 10.1.1(eslint@9.22.0(jiti@2.4.2)) + eslint-plugin-prettier: + specifier: ^5.2.3 + version: 5.2.3(eslint-config-prettier@10.1.1(eslint@9.22.0(jiti@2.4.2)))(eslint@9.22.0(jiti@2.4.2))(prettier@3.5.3) + eslint-plugin-react: + specifier: ^7.37.4 + version: 7.37.4(eslint@9.22.0(jiti@2.4.2)) + globals: + specifier: ^16.0.0 + version: 16.0.0 + prettier: + specifier: ^3.5.3 + version: 3.5.3 + tailwindcss: + specifier: ^4.0.12 + version: 4.0.13 + tsx: + specifier: ^4.19.3 + version: 4.19.3 + typescript: + specifier: ^5.8.2 + version: 5.8.2 + typescript-eslint: + specifier: ^8.26.0 + version: 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + vite: + specifier: ^6.2.1 + version: 6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3) + +packages: + + '@algolia/autocomplete-core@1.18.1': + resolution: {integrity: sha512-+lOAwRkvxTt24AXNu3pT0EfCEh1ZOQkKlrgFa0Ji2jxSbY2WW3gb1k39JBPyXcCLlivdxYPXREdg8ImAF2Nw9Q==} + + '@algolia/autocomplete-plugin-algolia-insights@1.18.1': + resolution: {integrity: sha512-zrl5trCnSHXkBRZwo2VPw4fN5zT3DowgFR6O2Qh0gTni8HB+aQltJYVwBrFeTvZHHFKNY9Cua4Y1KNsYiJ9Rdw==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-shared@1.18.1': + resolution: {integrity: sha512-vMKFYX5+SX+kIaJSMXOtj6zcMBhAWNyQJkfMrsuK38iJRTwemR23nzUE8qd3rHfWh6Iqgj89vDkf/CuOXDYllA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.21.0': + resolution: {integrity: sha512-I239aSmXa3pXDhp3AWGaIfesqJBNFA7drUM8SIfNxMIzvQXUnHRf4rW1o77QXLI/nIClNsb8KOLaB62gO9LnlQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.21.0': + resolution: {integrity: sha512-OxoUfeG9G4VE4gS7B4q65KkHzdGsQsDwxQfR5J9uKB8poSGuNlHJWsF3ABqCkc5VliAR0m8KMjsQ9o/kOpEGnQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.21.0': + resolution: {integrity: sha512-iHLgDQFyZNe9M16vipbx6FGOA8NoMswHrfom/QlCGoyh7ntjGvfMb+J2Ss8rRsAlOWluv8h923Ku3QVaB0oWDQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.21.0': + resolution: {integrity: sha512-y7XBO9Iwb75FLDl95AYcWSLIViJTpR5SUUCyKsYhpP9DgyUqWbISqDLXc96TS9shj+H+7VsTKA9cJK8NUfVN6g==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.21.0': + resolution: {integrity: sha512-6KU658lD9Tss4oCX6c/O15tNZxw7vR+WAUG95YtZzYG/KGJHTpy2uckqbMmC2cEK4a86FAq4pH5azSJ7cGMjuw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.21.0': + resolution: {integrity: sha512-pG6MyVh1v0X+uwrKHn3U+suHdgJ2C+gug+UGkNHfMELHMsEoWIAQhxMBOFg7hCnWBFjQnuq6qhM3X9X5QO3d9Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.21.0': + resolution: {integrity: sha512-nZfgJH4njBK98tFCmCW1VX/ExH4bNOl9DSboxeXGgvhoL0fG1+4DDr/mrLe21OggVCQqHwXBMh6fFInvBeyhiQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.21.0': + resolution: {integrity: sha512-k6MZxLbZphGN5uRri9J/krQQBjUrqNcScPh985XXEFXbSCRvOPKVtjjLdVjGVHXXPOQgKrIZHxIdRNbHS+wVuA==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.21.0': + resolution: {integrity: sha512-FiW5nnmyHvaGdorqLClw3PM6keXexAMiwbwJ9xzQr4LcNefLG3ln82NafRPgJO/z0dETAOKjds5aSmEFMiITHQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.21.0': + resolution: {integrity: sha512-+JXavbbliaLmah5QNgc/TDW/+r0ALa+rGhg5Y7+pF6GpNnzO0L+nlUaDNE8QbiJfz54F9BkwFUnJJeRJAuzTFw==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.21.0': + resolution: {integrity: sha512-Iw+Yj5hOmo/iixHS94vEAQ3zi5GPpJywhfxn1el/zWo4AvPIte/+1h9Ywgw/+3M7YBj4jgAkScxjxQCxzLBsjA==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.21.0': + resolution: {integrity: sha512-Z00SRLlIFj3SjYVfsd9Yd3kB3dUwQFAkQG18NunWP7cix2ezXpJqA+xAoEf9vc4QZHdxU3Gm8gHAtRiM2iVaTQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.21.0': + resolution: {integrity: sha512-WqU0VumUILrIeVYCTGZlyyZoC/tbvhiyPxfGRRO1cSjxN558bnJLlR2BvS0SJ5b75dRNK7HDvtXo2QoP9eLfiA==} + engines: {node: '>= 14.0.0'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.10': + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.10': + resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.10': + resolution: {integrity: sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.10': + resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.10': + resolution: {integrity: sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.10': + resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} + engines: {node: '>=6.9.0'} + + '@brillout/import@0.2.6': + resolution: {integrity: sha512-1GUTmADc8trUC1YSW2lp9r6PmwluMoEyHajnE1kxVdbKGD0wJOlq/DvTWMUqLtBDCnQR+n//qgMtz6HwA/lotA==} + + '@brillout/json-serializer@0.5.15': + resolution: {integrity: sha512-iLAyV1HNC3nG07ypBwCJohFrajY1HeZdfBBgGuRtMH/JPddgG9bPmoSI18A1RBx67vRmY6/8rgisjR5YfTvZHA==} + + '@brillout/picocolors@1.0.26': + resolution: {integrity: sha512-oJF92OEpzunaJyaEWXuS4PWY0k8JsqNO18kMf5hIwvsh+tyhbv+UwAnPPauSlO2eyvMSciui+YFKV9DEzTpmGA==} + + '@brillout/require-shim@0.1.2': + resolution: {integrity: sha512-3I4LRHnVZXoSAsEoni5mosq9l6eiJED58d9V954W4CIZ88AUfYBanWGBGbJG3NztaRTpFHEA6wB3Hn93BmmJdg==} + + '@brillout/vite-plugin-server-entry@0.6.3': + resolution: {integrity: sha512-uSbzC4d0xIBxnt8JbrZiUb0iylHsHXyDNIi1sYf7bnr4HY6FcNMnSTE2C5FLIH1pc0qQXnvZzdw6tn/jEGM/6A==} + + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.1': + resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.1': + resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.1': + resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.1': + resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.1': + resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.1': + resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.1': + resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.1': + resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.1': + resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.1': + resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.1': + resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.1': + resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.1': + resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.1': + resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.1': + resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.1': + resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.1': + resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.25.1': + resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.1': + resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.25.1': + resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.1': + resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.1': + resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.1': + resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.1': + resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.1': + resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.5.0': + resolution: {integrity: sha512-RoV8Xs9eNwiDvhv7M+xcL4PWyRyIXRY/FLp3buU4h1EYfdF7unWUy3dOjPqb3C7rMUewIcqwW850PgS8h1o1yg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.19.2': + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.1.0': + resolution: {integrity: sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.0': + resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.22.0': + resolution: {integrity: sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@fastify/accept-negotiator@2.0.1': + resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} + + '@fastify/ajv-compiler@4.0.2': + resolution: {integrity: sha512-Rkiu/8wIjpsf46Rr+Fitd3HRP+VsxUFDDeag0hs9L0ksfnwx2g7SPQQTFL0E8Qv+rfXzQOxBJnjUB9ITUDjfWQ==} + + '@fastify/error@4.1.0': + resolution: {integrity: sha512-KeFcciOr1eo/YvIXHP65S94jfEEqn1RxTRBT1aJaHxY5FK0/GDXYozsQMMWlZoHgi8i0s+YtrLsgj/JkUUjSkQ==} + + '@fastify/fast-json-stringify-compiler@5.0.2': + resolution: {integrity: sha512-YdR7gqlLg1xZAQa+SX4sMNzQHY5pC54fu9oC5aYSUqBhyn6fkLkrdtKlpVdCNPlwuUuXA1PjFTEmvMF6ZVXVGw==} + + '@fastify/forwarded@3.0.0': + resolution: {integrity: sha512-kJExsp4JCms7ipzg7SJ3y8DwmePaELHxKYtg+tZow+k0znUTf3cb+npgyqm8+ATZOdmfgfydIebPDWM172wfyA==} + + '@fastify/merge-json-schemas@0.2.1': + resolution: {integrity: sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==} + + '@fastify/middie@9.0.3': + resolution: {integrity: sha512-7OYovKXp9UKYeVMcjcFLMcSpoMkmcZmfnG+eAvtdiatN35W7c+r9y1dRfpA+pfFVNuHGGqI3W+vDTmjvcfLcMA==} + + '@fastify/proxy-addr@5.0.0': + resolution: {integrity: sha512-37qVVA1qZ5sgH7KpHkkC4z9SK6StIsIcOmpjvMPXNb3vx2GQxhZocogVYbr2PbbeLCQxYIPDok307xEvRZOzGA==} + + '@fastify/send@3.3.1': + resolution: {integrity: sha512-6pofeVwaHN+E/MAofCwDqkWUliE3i++jlD0VH/LOfU8TJlCkMUSgKvA9bawDdVXxjve7XrdYMyDmkiYaoGWEtA==} + + '@fastify/static@8.1.1': + resolution: {integrity: sha512-TW9eyVHJLytZNpBlSIqd0bl1giJkEaRaPZG+5AT3L/OBKq9U8D7g/OYmc2NPQZnzPURGhMt3IAWuyVkvd2nOkQ==} + + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@fontsource-variable/inter@5.2.5': + resolution: {integrity: sha512-TrWffUAFOnT8zroE9YmGybagoOgM/HjRqMQ8k9R0vVgXlnUh/vnpbGPAS/Caz1KIlOPnPGh6fvJbb7DHbFCncA==} + + '@fontsource-variable/lexend@5.2.5': + resolution: {integrity: sha512-DSu1iT7DAyt6Sebw/0NkrqXBmwo9iGYfvfczfTge52Rxgu3l5zKqnHr9vujOLKw62oGAio4MnMUywaSHqmjAvg==} + + '@headlessui/react@2.2.0': + resolution: {integrity: sha512-RzCEg+LXsuI7mHiSomsu/gBJSjpupm6A1qIZ5sWjd7JhARNlMiSA4kKfJpCKwU9tE+zMRterhhrP74PvfJrpXQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@lukeed/ms@2.0.2': + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} + + '@markdoc/markdoc@0.5.1': + resolution: {integrity: sha512-W2apYOglq0hOnvWbhE70yl6V9++FG+YPFKNHmgiSjv0HTmdJaMLt+NA1LMqoH5LasSiTI7R0yVc5ofjaFh39Pg==} + engines: {node: '>=14.7.0'} + peerDependencies: + '@types/react': '*' + react: '*' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@polka/url@1.0.0-next.28': + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + + '@prisma/config@6.5.0': + resolution: {integrity: sha512-sOH/2Go9Zer67DNFLZk6pYOHj+rumSb0VILgltkoxOjYnlLqUpHPAN826vnx8HigqnOCxj9LRhT6U7uLiIIWgw==} + + '@prisma/debug@6.5.0': + resolution: {integrity: sha512-fc/nusYBlJMzDmDepdUtH9aBsJrda2JNErP9AzuHbgUEQY0/9zQYZdNlXmKoIWENtio+qarPNe/+DQtrX5kMcQ==} + + '@prisma/engines-version@6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60': + resolution: {integrity: sha512-iK3EmiVGFDCmXjSpdsKGNqy9hOdLnvYBrJB61far/oP03hlIxrb04OWmDjNTwtmZ3UZdA5MCvI+f+3k2jPTflQ==} + + '@prisma/engines@6.5.0': + resolution: {integrity: sha512-FVPQYHgOllJklN9DUyujXvh3hFJCY0NX86sDmBErLvoZjy2OXGiZ5FNf3J/C4/RZZmCypZBYpBKEhx7b7rEsdw==} + + '@prisma/fetch-engine@6.5.0': + resolution: {integrity: sha512-3LhYA+FXP6pqY8FLHCjewyE8pGXXJ7BxZw2rhPq+CZAhvflVzq4K8Qly3OrmOkn6wGlz79nyLQdknyCG2HBTuA==} + + '@prisma/get-platform@6.5.0': + resolution: {integrity: sha512-xYcvyJwNMg2eDptBYFqFLUCfgi+wZLcj6HDMsj0Qw0irvauG4IKmkbywnqwok0B+k+W+p+jThM2DKTSmoPCkzw==} + + '@react-aria/focus@3.20.1': + resolution: {integrity: sha512-lgYs+sQ1TtBrAXnAdRBQrBo0/7o5H6IrfDxec1j+VRpcXL0xyk0xPq+m3lZp8typzIghqDgpnKkJ5Jf4OrzPIw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/interactions@3.24.1': + resolution: {integrity: sha512-OWEcIC6UQfWq4Td5Ptuh4PZQ4LHLJr/JL2jGYvuNL6EgL3bWvzPrRYIF/R64YbfVxIC7FeZpPSkS07sZ93/NoA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/ssr@3.9.7': + resolution: {integrity: sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/utils@3.28.1': + resolution: {integrity: sha512-mnHFF4YOVu9BRFQ1SZSKfPhg3z+lBRYoW5mLcYTQihbKhz48+I1sqRkP7ahMITr8ANH3nb34YaMME4XWmK2Mgg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-stately/flags@3.1.0': + resolution: {integrity: sha512-KSHOCxTFpBtxhIRcKwsD1YDTaNxFtCYuAUb0KEihc16QwqZViq4hasgPBs2gYm7fHRbw7WYzWKf6ZSo/+YsFlg==} + + '@react-stately/utils@3.10.5': + resolution: {integrity: sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-types/shared@3.28.0': + resolution: {integrity: sha512-9oMEYIDc3sk0G5rysnYvdNrkSg7B04yTKl50HHSZVbokeHpnU0yRmsDaWb9B/5RprcKj8XszEk5guBO8Sa/Q+Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@rollup/rollup-android-arm-eabi@4.35.0': + resolution: {integrity: sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.35.0': + resolution: {integrity: sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.35.0': + resolution: {integrity: sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.35.0': + resolution: {integrity: sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.35.0': + resolution: {integrity: sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.35.0': + resolution: {integrity: sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.35.0': + resolution: {integrity: sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.35.0': + resolution: {integrity: sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.35.0': + resolution: {integrity: sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.35.0': + resolution: {integrity: sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.35.0': + resolution: {integrity: sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.35.0': + resolution: {integrity: sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.35.0': + resolution: {integrity: sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.35.0': + resolution: {integrity: sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.35.0': + resolution: {integrity: sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.35.0': + resolution: {integrity: sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.35.0': + resolution: {integrity: sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.35.0': + resolution: {integrity: sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.35.0': + resolution: {integrity: sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==} + cpu: [x64] + os: [win32] + + '@sindresorhus/slugify@2.2.1': + resolution: {integrity: sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==} + engines: {node: '>=12'} + + '@sindresorhus/transliterate@1.6.0': + resolution: {integrity: sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==} + engines: {node: '>=12'} + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@tailwindcss/node@4.0.13': + resolution: {integrity: sha512-P9TmtE9Vew0vv5FwyD4bsg/dHHsIsAuUXkenuGUc5gm8fYgaxpdoxIKngCyEMEQxyCKR8PQY5V5VrrKNOx7exg==} + + '@tailwindcss/oxide-android-arm64@4.0.13': + resolution: {integrity: sha512-+9zmwaPQ8A9ycDcdb+hRkMn6NzsmZ4YJBsW5Xqq5EdOu9xlIgmuMuJauVzDPB5BSbIWfhPdZ+le8NeRZpl1coA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.0.13': + resolution: {integrity: sha512-Bj1QGlEJSjs/205CIRfb5/jeveOqzJ4pFMdRxu0gyiYWxBRyxsExXqaD+7162wnLP/EDKh6S1MC9E/1GwEhLtA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.0.13': + resolution: {integrity: sha512-lRTkxjTpMGXhLLM5GjZ0MtjPczMuhAo9j7PeSsaU6Imkm7W7RbrXfT8aP934kS7cBBV+HKN5U19Z0WWaORfb8Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.0.13': + resolution: {integrity: sha512-p/YLyKhs+xFibVeAPlpMGDVMKgjChgzs12VnDFaaqRSJoOz+uJgRSKiir2tn50e7Nm4YYw35q/DRBwpDBNo1MQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.13': + resolution: {integrity: sha512-Ua/5ydE/QOTX8jHuc7M9ICWnaLi6K2MV/r+Ws2OppsOjy8tdlPbqYainJJ6Kl7ofm524K+4Fk9CQITPzeIESPw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.0.13': + resolution: {integrity: sha512-/W1+Q6tBAVgZWh/bhfOHo4n7Ryh6E7zYj4bJd9SRbkPyLtRioyK3bi6RLuDj57sa7Amk/DeomSV9iycS0xqIPA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.0.13': + resolution: {integrity: sha512-GQj6TWevNxwsYw20FdT2r2d1f7uiRsF07iFvNYxPIvIyPEV74eZ0zgFEsAH1daK1OxPy+LXdZ4grV17P5tVzhQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.0.13': + resolution: {integrity: sha512-sQRH09faifF9w9WS6TKDWr1oLi4hoPx0EIWXZHQK/jcjarDpXGQ2DbF0KnALJCwWBxOIP/1nrmU01fZwwMzY3g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.0.13': + resolution: {integrity: sha512-Or1N8DIF3tP+LsloJp+UXLTIMMHMUcWXFhJLCsM4T7MzFzxkeReewRWXfk5mk137cdqVeUEH/R50xAhY1mOkTQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-win32-arm64-msvc@4.0.13': + resolution: {integrity: sha512-u2mQyqCFrr9vVTP6sfDRfGE6bhOX3/7rInehzxNhHX1HYRIx09H3sDdXzTxnZWKOjIg3qjFTCrYFUZckva5PIg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.0.13': + resolution: {integrity: sha512-sOEc4iCanp1Yqyeu9suQcEzfaUcHnqjBUgDg0ZXpjUMUwdSi37S1lu1RGoV1BYInvvGu3y3HHTmvsSfDhx2L8w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.0.13': + resolution: {integrity: sha512-pTH3Ex5zAWC9LbS+WsYAFmkXQW3NRjmvxkKJY3NP1x0KHBWjz0Q2uGtdGMJzsa0EwoZ7wq9RTbMH1UNPceCpWw==} + engines: {node: '>= 10'} + + '@tailwindcss/typography@0.5.16': + resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + '@tailwindcss/vite@4.0.13': + resolution: {integrity: sha512-0XTd/NoVUAktIDaA4MdXhve0QWYh7WlZg20EHCuBFR80F8FhbVkRX+AY5cjbUP/IO2itHzt0iHc0iSE5kBUMhQ==} + peerDependencies: + vite: ^5.2.0 || ^6 + + '@tanstack/react-virtual@3.13.3': + resolution: {integrity: sha512-khJmiDJCkklsDTvXxTZHfEa7H161e94eDKxKyXqg9/3LstIbRg4JWBxPD2/e3LKtklC5dxkoYzNllCMVR904FA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/virtual-core@3.13.3': + resolution: {integrity: sha512-9kfCeSG6zUx1I1iF4RKZrquNog3Eho1T6+LyJEDYpHjNNdDlRhXyqzTod5u6LCEBSeG0f2txkNjAq0tFbCJ4bA==} + + '@ts-morph/common@0.20.0': + resolution: {integrity: sha512-7uKjByfbPpwuzkstL3L5MQyuXPSKdoNG93Fmi2JoDcTf3pEP731JdRFAduRVkOs8oqxPsXKA+ScrWkdQ8t/I+Q==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/linkify-it@3.0.5': + resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} + + '@types/markdown-it@12.2.3': + resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/node@18.19.80': + resolution: {integrity: sha512-kEWeMwMeIvxYkeg1gTc01awpwLbfMRZXdIhwRcakd/KlK53jmRC26LqcbIt7fnAQTu5GzlnWmzA3H6+l1u6xxQ==} + + '@types/prismjs@1.26.5': + resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} + + '@types/react-dom@19.0.4': + resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react-highlight-words@0.20.0': + resolution: {integrity: sha512-Qm512TiOakvtNzHJ2+TNVHnLn5cJ2wLQV0+LrhuispVth6dRf5b8ydjq3Kc0thpZ7bz4s6RnG6meboAXHWRK+Q==} + + '@types/react@19.0.10': + resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} + + '@typescript-eslint/eslint-plugin@8.26.1': + resolution: {integrity: sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.26.1': + resolution: {integrity: sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.26.1': + resolution: {integrity: sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.26.1': + resolution: {integrity: sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.26.1': + resolution: {integrity: sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.26.1': + resolution: {integrity: sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.26.1': + resolution: {integrity: sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.26.1': + resolution: {integrity: sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@universal-middleware/core@0.4.4': + resolution: {integrity: sha512-mG++7fqwHY69SBDQA0MDi5SfroBh9Zu4dSftpQQcenQxr/vgDM/gmfw7Yh5n550ifc55ceKhysqUjlRsP+2qUQ==} + peerDependencies: + '@cloudflare/workers-types': ^4.20250224.0 + '@hattip/core': ^0.0.49 + '@webroute/route': ^0.8.0 + elysia: ^1.2.24 + fastify: ^5.2.1 + h3: ^1.15.1 + hono: ^4.7.2 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + '@hattip/core': + optional: true + '@webroute/route': + optional: true + elysia: + optional: true + fastify: + optional: true + h3: + optional: true + hono: + optional: true + + '@universal-middleware/express@0.4.8': + resolution: {integrity: sha512-dqgeOmko0X+hzrPvPeRBxZjg152xk684SjqvJAAvo7D40nxsSTNFv05ha5z5crzSMjFvuBLH6Iu8T1ifos6z8w==} + + '@universal-middleware/fastify@0.5.9': + resolution: {integrity: sha512-oiM4QKxmaiaEweIl/WxEdbN16xOq2JGkMwXi0n61Kb1HARU0rUhun+ZHJmzq9E9nmIC5b611flIsmOV52c4VtQ==} + + '@vitejs/plugin-react@4.3.4': + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + algoliasearch@5.21.0: + resolution: {integrity: sha512-hexLq2lSO1K5SW9j21Ubc+q9Ptx7dyRTY7se19U8lhIlVMLCNXWCyQ6C22p9ez8ccX0v7QVmwkl2l1CnuGoO2Q==} + engines: {node: '>= 14.0.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + avvio@9.1.0: + resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001704: + resolution: {integrity: sha512-+L2IgBbV6gXB4ETf0keSvLr7JUrRVbIaB/lrQ1+z8mRcQiisG5k+lG6O4n6Y5q6f5EuNfaYXKgymucphlEXQew==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + code-block-writer@12.0.0: + resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.116: + resolution: {integrity: sha512-mufxTCJzLBQVvSdZzX1s5YAuXsN1M4tTyYxOOL1TcSKtIzQ9rjIrm7yFK80rN5dwGTePgdoABDSHpuVtRQh0Zw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.25.1: + resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@10.1.1: + resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.2.3: + resolution: {integrity: sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-react@7.37.4: + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.22.0: + resolution: {integrity: sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-json-stringify@6.0.1: + resolution: {integrity: sha512-s7SJE83QKBZwg54dIbD5rCtzOBVD43V1ReWXXYqBgwCwHLYAAT0RQc/FmrQglXqWPpz6omtryJQOau5jI4Nrvg==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastify-plugin@5.0.1: + resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} + + fastify-raw-body@5.0.0: + resolution: {integrity: sha512-2qfoaQ3BQDhZ1gtbkKZd6n0kKxJISJGM6u/skD9ljdWItAscjXrtZ1lnjr7PavmXX9j4EyCPmBDiIsLn07d5vA==} + engines: {node: '>= 10'} + + fastify@5.2.1: + resolution: {integrity: sha512-rslrNBF67eg8/Gyn7P2URV8/6pz8kSAscFL4EThZJ8JBMaXacVdVE4hmUcnPNKERl5o/xTiBSLfdowBRhVF1WA==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-my-way@9.2.0: + resolution: {integrity: sha512-d3uCir8Hmg7W1Ywp8nKf2lJJYU9Nwinvo+1D39Dn09nz65UKXIxUh7j7K8zeWhxqe1WrkS7FJyON/Q/3lPoc6w==} + engines: {node: '>=14'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + flexsearch@0.7.43: + resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@11.0.1: + resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} + engines: {node: 20 || >=22} + hasBin: true + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.0.0: + resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + highlight-words-core@1.2.3: + resolution: {integrity: sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isbot-fast@1.2.0: + resolution: {integrity: sha512-twjuQzy2gKMDVfKGQyQqrx6Uy4opu/fiVUTTpdqtFsd7OQijIp5oXvb27n5EemYXaijh5fomndJt/SPRLsEdSg==} + engines: {node: '>=6.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + jackspeak@4.1.0: + resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} + engines: {node: 20 || >=22} + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-ref-resolver@2.0.1: + resolution: {integrity: sha512-HG0SIB9X4J8bwbxCbnd5FfPEbcXAJYTi1pBJeP/QPON+w8ovSME8iRG+ElHNxZNX2Qh6eYn1GdzJFS4cDFfx0Q==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + light-my-request@6.6.0: + resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} + + lightningcss-darwin-arm64@1.29.2: + resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.2: + resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.2: + resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.2: + resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.2: + resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.29.2: + resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.29.2: + resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.29.2: + resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.29.2: + resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.2: + resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.2: + resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} + engines: {node: '>= 12.0.0'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@11.0.2: + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + memoize-one@4.0.3: + resolution: {integrity: sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp@2.1.6: + resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} + engines: {node: '>=10'} + hasBin: true + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.9: + resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.6.0: + resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==} + hasBin: true + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + + prism-react-renderer@2.4.1: + resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} + peerDependencies: + react: '>=16.0.0' + + prisma@6.5.0: + resolution: {integrity: sha512-yUGXmWqv5F4PByMSNbYFxke/WbnyTLjnJ5bKr8fLkcnY7U5rU9rUTh/+Fja+gOrRxEgtCbCtca94IeITj4j/pg==} + engines: {node: '>=18.18'} + hasBin: true + peerDependencies: + typescript: '>=5.1.0' + peerDependenciesMeta: + typescript: + optional: true + + process-warning@4.0.1: + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + peerDependencies: + react: ^19.0.0 + + react-highlight-words@0.21.0: + resolution: {integrity: sha512-SdWEeU9fIINArEPO1rO5OxPyuhdEKZQhHzZZP1ie6UeXQf+CjycT1kWaB+9bwGcVbR0NowuHK3RqgqNg6bgBDQ==} + peerDependencies: + react: ^0.14.0 || ^15.0.0 || ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-streaming@0.3.50: + resolution: {integrity: sha512-BRjWzY83dtnjgFUCYM0H2J3iRuYruE++/AidXmjxRclTsz1O/zBdUVgjAO2uKb05y/zybskcKjmK/5xyMc1MSg==} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexparam@3.0.0: + resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} + engines: {node: '>=8'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + ret@0.5.0: + resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} + engines: {node: '>=10'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.35.0: + resolution: {integrity: sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-regex2@4.0.1: + resolution: {integrity: sha512-goqsB+bSlOmVX+CiFX2PFc1OV88j5jvBqIM+DgqrucHnUguAUNtiNOs+aTadq2NqsLQ+TQ3UEVG3gtSFcdlkCg==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + secure-json-parse@3.0.2: + resolution: {integrity: sha512-H6nS2o8bWfpFEV6U38sOSjS7bTbdgbCGU9wEM6W14P5H0QOsz94KCusifV44GpHDTu2nqZbuDNhTzu+mjDSw1w==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-functional-loader@1.2.1: + resolution: {integrity: sha512-GPDrxrQkE7ijm35QlfPFVp5hBHR6ZcaUq42TEDgf1U5iTL3IDLFvKAbHE/ODqpdfJJ7Xn4cr/slBn12jjNPkaQ==} + + sirv@3.0.1: + resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + engines: {node: '>=18'} + + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tailwindcss@4.0.13: + resolution: {integrity: sha512-gbvFrB0fOsTv/OugXWi2PtflJ4S6/ctu6Mmn3bCftmLY/6xRsQVEJPgIIpABwpZ52DpONkCA3bEj5b54MHxF2Q==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + telefunc@0.1.87: + resolution: {integrity: sha512-RAWMevttXBpDC8wRAP8Sfw8BcEfaO4qGHeWuETf98hmTq0R0Ln8aidBdtY9YhZItSEvAiA95zSa2HYg/SWkqeg==} + engines: {node: '>=12.19.0'} + peerDependencies: + '@babel/core': '>=7.0.0' + '@babel/parser': '>=7.0.0' + '@babel/types': '>=7.0.0' + react: '>=18.0.0' + react-streaming: '>=0.3.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@babel/parser': + optional: true + '@babel/types': + optional: true + react: + optional: true + react-streaming: + optional: true + + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + + tldts-core@6.1.84: + resolution: {integrity: sha512-NaQa1W76W2aCGjXybvnMYzGSM4x8fvG2AN/pla7qxcg0ZHbooOPhA8kctmOZUDfZyhDL27OGNbwAeig8P4p1vg==} + + tldts@6.1.84: + resolution: {integrity: sha512-aRGIbCIF3teodtUFAYSdQONVmDRy21REM3o6JnqWn5ZkQBJJ4gHxhw6OfwQ+WkSAi3ASamrS4N4nyazWx6uTYg==} + hasBin: true + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-morph@19.0.0: + resolution: {integrity: sha512-D6qcpiJdn46tUqV45vr5UGM2dnIEuTGNxVhg0sk5NX11orcouwj6i1bMqZIz2mZTZB1Hcgy7C3oEVhAT+f6mbQ==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.19.3: + resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.26.1: + resolution: {integrity: sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unplugin-fonts@1.3.1: + resolution: {integrity: sha512-GmaJWPAWH6lBI4fP8xKdbMZJwTgsnr8PGJOfQE52jlod8QkqSO4M529Nox2L8zYapjB5hox2wCu4N3c/LOal/A==} + peerDependencies: + '@nuxt/kit': ^3.0.0 + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + + unplugin@2.0.0-beta.1: + resolution: {integrity: sha512-2qzQo5LN2DmUZXkWDHvGKLF5BP0WN+KthD6aPnPJ8plRBIjv4lh5O07eYcSxgO2znNw9s4MNhEO1sB+JDllDbQ==} + engines: {node: '>=18.12.0'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vike-react@0.5.13: + resolution: {integrity: sha512-gk5YzLqc349uCSatIZLuLA3/ZtpjWHOjPk1jVyQROqbJ3l6kJbsST7u7ItblKuQr+C5TTcFnJ73Hhl8lSMdXxg==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + vike: '>=0.4.182' + + vike@0.4.225: + resolution: {integrity: sha512-p8rAj7O9aZcV3dduwFKd6Thg/olrK7I+2Gr52GFYBUjgEYy24dZUTQYc7L79/j5n5QeGN6Alknq7uSW6QwmB3w==} + engines: {node: '>=18.0.0'} + hasBin: true + peerDependencies: + react-streaming: '>=0.3.42' + vite: '>=5.1.0' + peerDependenciesMeta: + react-streaming: + optional: true + vite: + optional: true + + vite@6.2.1: + resolution: {integrity: sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@algolia/autocomplete-core@1.18.1(@algolia/client-search@5.21.0)(algoliasearch@5.21.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.18.1(@algolia/client-search@5.21.0)(algoliasearch@5.21.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.18.1(@algolia/client-search@5.21.0)(algoliasearch@5.21.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.18.1(@algolia/client-search@5.21.0)(algoliasearch@5.21.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.18.1(@algolia/client-search@5.21.0)(algoliasearch@5.21.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-shared@1.18.1(@algolia/client-search@5.21.0)(algoliasearch@5.21.0)': + dependencies: + '@algolia/client-search': 5.21.0 + algoliasearch: 5.21.0 + + '@algolia/client-abtesting@5.21.0': + dependencies: + '@algolia/client-common': 5.21.0 + '@algolia/requester-browser-xhr': 5.21.0 + '@algolia/requester-fetch': 5.21.0 + '@algolia/requester-node-http': 5.21.0 + + '@algolia/client-analytics@5.21.0': + dependencies: + '@algolia/client-common': 5.21.0 + '@algolia/requester-browser-xhr': 5.21.0 + '@algolia/requester-fetch': 5.21.0 + '@algolia/requester-node-http': 5.21.0 + + '@algolia/client-common@5.21.0': {} + + '@algolia/client-insights@5.21.0': + dependencies: + '@algolia/client-common': 5.21.0 + '@algolia/requester-browser-xhr': 5.21.0 + '@algolia/requester-fetch': 5.21.0 + '@algolia/requester-node-http': 5.21.0 + + '@algolia/client-personalization@5.21.0': + dependencies: + '@algolia/client-common': 5.21.0 + '@algolia/requester-browser-xhr': 5.21.0 + '@algolia/requester-fetch': 5.21.0 + '@algolia/requester-node-http': 5.21.0 + + '@algolia/client-query-suggestions@5.21.0': + dependencies: + '@algolia/client-common': 5.21.0 + '@algolia/requester-browser-xhr': 5.21.0 + '@algolia/requester-fetch': 5.21.0 + '@algolia/requester-node-http': 5.21.0 + + '@algolia/client-search@5.21.0': + dependencies: + '@algolia/client-common': 5.21.0 + '@algolia/requester-browser-xhr': 5.21.0 + '@algolia/requester-fetch': 5.21.0 + '@algolia/requester-node-http': 5.21.0 + + '@algolia/ingestion@1.21.0': + dependencies: + '@algolia/client-common': 5.21.0 + '@algolia/requester-browser-xhr': 5.21.0 + '@algolia/requester-fetch': 5.21.0 + '@algolia/requester-node-http': 5.21.0 + + '@algolia/monitoring@1.21.0': + dependencies: + '@algolia/client-common': 5.21.0 + '@algolia/requester-browser-xhr': 5.21.0 + '@algolia/requester-fetch': 5.21.0 + '@algolia/requester-node-http': 5.21.0 + + '@algolia/recommend@5.21.0': + dependencies: + '@algolia/client-common': 5.21.0 + '@algolia/requester-browser-xhr': 5.21.0 + '@algolia/requester-fetch': 5.21.0 + '@algolia/requester-node-http': 5.21.0 + + '@algolia/requester-browser-xhr@5.21.0': + dependencies: + '@algolia/client-common': 5.21.0 + + '@algolia/requester-fetch@5.21.0': + dependencies: + '@algolia/client-common': 5.21.0 + + '@algolia/requester-node-http@5.21.0': + dependencies: + '@algolia/client-common': 5.21.0 + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} + + '@babel/core@7.26.10': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.10 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helpers': 7.26.10 + '@babel/parser': 7.26.10 + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.10 + '@babel/types': 7.26.10 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.10': + dependencies: + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.10 + '@babel/types': 7.26.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.10': + dependencies: + '@babel/template': 7.26.9 + '@babel/types': 7.26.10 + + '@babel/parser@7.26.10': + dependencies: + '@babel/types': 7.26.10 + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/template@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 + + '@babel/traverse@7.26.10': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.10 + '@babel/parser': 7.26.10 + '@babel/template': 7.26.9 + '@babel/types': 7.26.10 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.10': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@brillout/import@0.2.6': {} + + '@brillout/json-serializer@0.5.15': {} + + '@brillout/picocolors@1.0.26': {} + + '@brillout/require-shim@0.1.2': {} + + '@brillout/vite-plugin-server-entry@0.6.3': + dependencies: + '@brillout/import': 0.2.6 + '@brillout/picocolors': 1.0.26 + + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/aix-ppc64@0.25.1': + optional: true + + '@esbuild/android-arm64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.25.1': + optional: true + + '@esbuild/android-arm@0.24.2': + optional: true + + '@esbuild/android-arm@0.25.1': + optional: true + + '@esbuild/android-x64@0.24.2': + optional: true + + '@esbuild/android-x64@0.25.1': + optional: true + + '@esbuild/darwin-arm64@0.24.2': + optional: true + + '@esbuild/darwin-arm64@0.25.1': + optional: true + + '@esbuild/darwin-x64@0.24.2': + optional: true + + '@esbuild/darwin-x64@0.25.1': + optional: true + + '@esbuild/freebsd-arm64@0.24.2': + optional: true + + '@esbuild/freebsd-arm64@0.25.1': + optional: true + + '@esbuild/freebsd-x64@0.24.2': + optional: true + + '@esbuild/freebsd-x64@0.25.1': + optional: true + + '@esbuild/linux-arm64@0.24.2': + optional: true + + '@esbuild/linux-arm64@0.25.1': + optional: true + + '@esbuild/linux-arm@0.24.2': + optional: true + + '@esbuild/linux-arm@0.25.1': + optional: true + + '@esbuild/linux-ia32@0.24.2': + optional: true + + '@esbuild/linux-ia32@0.25.1': + optional: true + + '@esbuild/linux-loong64@0.24.2': + optional: true + + '@esbuild/linux-loong64@0.25.1': + optional: true + + '@esbuild/linux-mips64el@0.24.2': + optional: true + + '@esbuild/linux-mips64el@0.25.1': + optional: true + + '@esbuild/linux-ppc64@0.24.2': + optional: true + + '@esbuild/linux-ppc64@0.25.1': + optional: true + + '@esbuild/linux-riscv64@0.24.2': + optional: true + + '@esbuild/linux-riscv64@0.25.1': + optional: true + + '@esbuild/linux-s390x@0.24.2': + optional: true + + '@esbuild/linux-s390x@0.25.1': + optional: true + + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/linux-x64@0.25.1': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.25.1': + optional: true + + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/netbsd-x64@0.25.1': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.25.1': + optional: true + + '@esbuild/openbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-x64@0.25.1': + optional: true + + '@esbuild/sunos-x64@0.24.2': + optional: true + + '@esbuild/sunos-x64@0.25.1': + optional: true + + '@esbuild/win32-arm64@0.24.2': + optional: true + + '@esbuild/win32-arm64@0.25.1': + optional: true + + '@esbuild/win32-ia32@0.24.2': + optional: true + + '@esbuild/win32-ia32@0.25.1': + optional: true + + '@esbuild/win32-x64@0.24.2': + optional: true + + '@esbuild/win32-x64@0.25.1': + optional: true + + '@eslint-community/eslint-utils@4.5.0(eslint@9.22.0(jiti@2.4.2))': + dependencies: + eslint: 9.22.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.19.2': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.1.0': {} + + '@eslint/core@0.12.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.0': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.22.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.7': + dependencies: + '@eslint/core': 0.12.0 + levn: 0.4.1 + + '@fastify/accept-negotiator@2.0.1': {} + + '@fastify/ajv-compiler@4.0.2': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + fast-uri: 3.0.6 + + '@fastify/error@4.1.0': {} + + '@fastify/fast-json-stringify-compiler@5.0.2': + dependencies: + fast-json-stringify: 6.0.1 + + '@fastify/forwarded@3.0.0': {} + + '@fastify/merge-json-schemas@0.2.1': + dependencies: + dequal: 2.0.3 + + '@fastify/middie@9.0.3': + dependencies: + '@fastify/error': 4.1.0 + fastify-plugin: 5.0.1 + path-to-regexp: 8.2.0 + reusify: 1.1.0 + + '@fastify/proxy-addr@5.0.0': + dependencies: + '@fastify/forwarded': 3.0.0 + ipaddr.js: 2.2.0 + + '@fastify/send@3.3.1': + dependencies: + '@lukeed/ms': 2.0.2 + escape-html: 1.0.3 + fast-decode-uri-component: 1.0.1 + http-errors: 2.0.0 + mime: 3.0.0 + + '@fastify/static@8.1.1': + dependencies: + '@fastify/accept-negotiator': 2.0.1 + '@fastify/send': 3.3.1 + content-disposition: 0.5.4 + fastify-plugin: 5.0.1 + fastq: 1.19.1 + glob: 11.0.1 + + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/dom': 1.6.13 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@floating-ui/react@0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@floating-ui/utils': 0.2.9 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.9': {} + + '@fontsource-variable/inter@5.2.5': {} + + '@fontsource-variable/lexend@5.2.5': {} + + '@headlessui/react@2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@react-aria/focus': 3.20.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@react-aria/interactions': 3.24.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tanstack/react-virtual': 3.13.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.2': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@lukeed/ms@2.0.2': {} + + '@markdoc/markdoc@0.5.1(@types/react@19.0.10)(react@19.0.0)': + optionalDependencies: + '@types/linkify-it': 3.0.5 + '@types/markdown-it': 12.2.3 + '@types/react': 19.0.10 + react: 19.0.0 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@pkgr/core@0.1.1': {} + + '@polka/url@1.0.0-next.28': {} + + '@prisma/config@6.5.0': + dependencies: + esbuild: 0.25.1 + esbuild-register: 3.6.0(esbuild@0.25.1) + transitivePeerDependencies: + - supports-color + + '@prisma/debug@6.5.0': {} + + '@prisma/engines-version@6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60': {} + + '@prisma/engines@6.5.0': + dependencies: + '@prisma/debug': 6.5.0 + '@prisma/engines-version': 6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60 + '@prisma/fetch-engine': 6.5.0 + '@prisma/get-platform': 6.5.0 + + '@prisma/fetch-engine@6.5.0': + dependencies: + '@prisma/debug': 6.5.0 + '@prisma/engines-version': 6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60 + '@prisma/get-platform': 6.5.0 + + '@prisma/get-platform@6.5.0': + dependencies: + '@prisma/debug': 6.5.0 + + '@react-aria/focus@3.20.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@react-aria/interactions': 3.24.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@react-aria/utils': 3.28.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@react-types/shared': 3.28.0(react@19.0.0) + '@swc/helpers': 0.5.15 + clsx: 2.1.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@react-aria/interactions@3.24.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@react-aria/ssr': 3.9.7(react@19.0.0) + '@react-aria/utils': 3.28.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@react-stately/flags': 3.1.0 + '@react-types/shared': 3.28.0(react@19.0.0) + '@swc/helpers': 0.5.15 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@react-aria/ssr@3.9.7(react@19.0.0)': + dependencies: + '@swc/helpers': 0.5.15 + react: 19.0.0 + + '@react-aria/utils@3.28.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@react-aria/ssr': 3.9.7(react@19.0.0) + '@react-stately/flags': 3.1.0 + '@react-stately/utils': 3.10.5(react@19.0.0) + '@react-types/shared': 3.28.0(react@19.0.0) + '@swc/helpers': 0.5.15 + clsx: 2.1.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@react-stately/flags@3.1.0': + dependencies: + '@swc/helpers': 0.5.15 + + '@react-stately/utils@3.10.5(react@19.0.0)': + dependencies: + '@swc/helpers': 0.5.15 + react: 19.0.0 + + '@react-types/shared@3.28.0(react@19.0.0)': + dependencies: + react: 19.0.0 + + '@rollup/rollup-android-arm-eabi@4.35.0': + optional: true + + '@rollup/rollup-android-arm64@4.35.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.35.0': + optional: true + + '@rollup/rollup-darwin-x64@4.35.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.35.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.35.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.35.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.35.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.35.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.35.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.35.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.35.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.35.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.35.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.35.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.35.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.35.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.35.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.35.0': + optional: true + + '@sindresorhus/slugify@2.2.1': + dependencies: + '@sindresorhus/transliterate': 1.6.0 + escape-string-regexp: 5.0.0 + + '@sindresorhus/transliterate@1.6.0': + dependencies: + escape-string-regexp: 5.0.0 + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.0.13': + dependencies: + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + tailwindcss: 4.0.13 + + '@tailwindcss/oxide-android-arm64@4.0.13': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.0.13': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.0.13': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.0.13': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.13': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.0.13': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.0.13': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.0.13': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.0.13': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.0.13': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.0.13': + optional: true + + '@tailwindcss/oxide@4.0.13': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.0.13 + '@tailwindcss/oxide-darwin-arm64': 4.0.13 + '@tailwindcss/oxide-darwin-x64': 4.0.13 + '@tailwindcss/oxide-freebsd-x64': 4.0.13 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.13 + '@tailwindcss/oxide-linux-arm64-gnu': 4.0.13 + '@tailwindcss/oxide-linux-arm64-musl': 4.0.13 + '@tailwindcss/oxide-linux-x64-gnu': 4.0.13 + '@tailwindcss/oxide-linux-x64-musl': 4.0.13 + '@tailwindcss/oxide-win32-arm64-msvc': 4.0.13 + '@tailwindcss/oxide-win32-x64-msvc': 4.0.13 + + '@tailwindcss/typography@0.5.16(tailwindcss@4.0.13)': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 4.0.13 + + '@tailwindcss/vite@4.0.13(vite@6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3))': + dependencies: + '@tailwindcss/node': 4.0.13 + '@tailwindcss/oxide': 4.0.13 + lightningcss: 1.29.2 + tailwindcss: 4.0.13 + vite: 6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3) + + '@tanstack/react-virtual@3.13.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@tanstack/virtual-core': 3.13.3 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + '@tanstack/virtual-core@3.13.3': {} + + '@ts-morph/common@0.20.0': + dependencies: + fast-glob: 3.3.3 + minimatch: 7.4.6 + mkdirp: 2.1.6 + path-browserify: 1.0.1 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.10 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.10 + + '@types/estree@1.0.6': {} + + '@types/js-yaml@4.0.9': {} + + '@types/json-schema@7.0.15': {} + + '@types/linkify-it@3.0.5': + optional: true + + '@types/markdown-it@12.2.3': + dependencies: + '@types/linkify-it': 3.0.5 + '@types/mdurl': 2.0.0 + optional: true + + '@types/mdurl@2.0.0': + optional: true + + '@types/node@18.19.80': + dependencies: + undici-types: 5.26.5 + + '@types/prismjs@1.26.5': {} + + '@types/react-dom@19.0.4(@types/react@19.0.10)': + dependencies: + '@types/react': 19.0.10 + + '@types/react-highlight-words@0.20.0': + dependencies: + '@types/react': 19.0.10 + + '@types/react@19.0.10': + dependencies: + csstype: 3.1.3 + + '@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.26.1 + '@typescript-eslint/type-utils': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.26.1 + eslint: 9.22.0(jiti@2.4.2) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.0.1(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.26.1 + '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.26.1 + debug: 4.4.0 + eslint: 9.22.0(jiti@2.4.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.26.1': + dependencies: + '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/visitor-keys': 8.26.1 + + '@typescript-eslint/type-utils@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)': + dependencies: + '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + debug: 4.4.0 + eslint: 9.22.0(jiti@2.4.2) + ts-api-utils: 2.0.1(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.26.1': {} + + '@typescript-eslint/typescript-estree@8.26.1(typescript@5.8.2)': + dependencies: + '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/visitor-keys': 8.26.1 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)': + dependencies: + '@eslint-community/eslint-utils': 4.5.0(eslint@9.22.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.26.1 + '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) + eslint: 9.22.0(jiti@2.4.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.26.1': + dependencies: + '@typescript-eslint/types': 8.26.1 + eslint-visitor-keys: 4.2.0 + + '@universal-middleware/core@0.4.4(fastify@5.2.1)': + dependencies: + regexparam: 3.0.0 + tough-cookie: 5.1.2 + optionalDependencies: + fastify: 5.2.1 + + '@universal-middleware/express@0.4.8(fastify@5.2.1)': + dependencies: + '@universal-middleware/core': 0.4.4(fastify@5.2.1) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + + '@universal-middleware/fastify@0.5.9(fastify@5.2.1)': + dependencies: + '@universal-middleware/core': 0.4.4(fastify@5.2.1) + '@universal-middleware/express': 0.4.8(fastify@5.2.1) + fastify-raw-body: 5.0.0 + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + + '@vitejs/plugin-react@4.3.4(vite@6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3))': + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3) + transitivePeerDependencies: + - supports-color + + abstract-logging@2.0.1: {} + + acorn-jsx@5.3.2(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + algoliasearch@5.21.0: + dependencies: + '@algolia/client-abtesting': 5.21.0 + '@algolia/client-analytics': 5.21.0 + '@algolia/client-common': 5.21.0 + '@algolia/client-insights': 5.21.0 + '@algolia/client-personalization': 5.21.0 + '@algolia/client-query-suggestions': 5.21.0 + '@algolia/client-search': 5.21.0 + '@algolia/ingestion': 1.21.0 + '@algolia/monitoring': 1.21.0 + '@algolia/recommend': 5.21.0 + '@algolia/requester-browser-xhr': 5.21.0 + '@algolia/requester-fetch': 5.21.0 + '@algolia/requester-node-http': 5.21.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + async-function@1.0.0: {} + + atomic-sleep@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + avvio@9.1.0: + dependencies: + '@fastify/error': 4.1.0 + fastq: 1.19.1 + + balanced-match@1.0.2: {} + + big.js@5.2.2: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001704 + electron-to-chromium: 1.5.116 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + + buffer-from@1.1.2: {} + + bytes@3.1.2: {} + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001704: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + clsx@2.1.1: {} + + code-block-writer@12.0.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + concat-map@0.0.1: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + convert-source-map@2.0.0: {} + + cookie@1.0.2: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + depd@2.0.0: {} + + dequal@2.0.3: {} + + detect-libc@2.0.3: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.116: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojis-list@3.0.0: {} + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + es-abstract@1.23.9: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-module-lexer@1.6.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild-register@3.6.0(esbuild@0.25.1): + dependencies: + debug: 4.4.0 + esbuild: 0.25.1 + transitivePeerDependencies: + - supports-color + + esbuild@0.24.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + + esbuild@0.25.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.1 + '@esbuild/android-arm': 0.25.1 + '@esbuild/android-arm64': 0.25.1 + '@esbuild/android-x64': 0.25.1 + '@esbuild/darwin-arm64': 0.25.1 + '@esbuild/darwin-x64': 0.25.1 + '@esbuild/freebsd-arm64': 0.25.1 + '@esbuild/freebsd-x64': 0.25.1 + '@esbuild/linux-arm': 0.25.1 + '@esbuild/linux-arm64': 0.25.1 + '@esbuild/linux-ia32': 0.25.1 + '@esbuild/linux-loong64': 0.25.1 + '@esbuild/linux-mips64el': 0.25.1 + '@esbuild/linux-ppc64': 0.25.1 + '@esbuild/linux-riscv64': 0.25.1 + '@esbuild/linux-s390x': 0.25.1 + '@esbuild/linux-x64': 0.25.1 + '@esbuild/netbsd-arm64': 0.25.1 + '@esbuild/netbsd-x64': 0.25.1 + '@esbuild/openbsd-arm64': 0.25.1 + '@esbuild/openbsd-x64': 0.25.1 + '@esbuild/sunos-x64': 0.25.1 + '@esbuild/win32-arm64': 0.25.1 + '@esbuild/win32-ia32': 0.25.1 + '@esbuild/win32-x64': 0.25.1 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@10.1.1(eslint@9.22.0(jiti@2.4.2)): + dependencies: + eslint: 9.22.0(jiti@2.4.2) + + eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.1.1(eslint@9.22.0(jiti@2.4.2)))(eslint@9.22.0(jiti@2.4.2))(prettier@3.5.3): + dependencies: + eslint: 9.22.0(jiti@2.4.2) + prettier: 3.5.3 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.2 + optionalDependencies: + eslint-config-prettier: 10.1.1(eslint@9.22.0(jiti@2.4.2)) + + eslint-plugin-react@7.37.4(eslint@9.22.0(jiti@2.4.2)): + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 9.22.0(jiti@2.4.2) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@8.3.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.22.0(jiti@2.4.2): + dependencies: + '@eslint-community/eslint-utils': 4.5.0(eslint@9.22.0(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.2 + '@eslint/config-helpers': 0.1.0 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.22.0 + '@eslint/plugin-kit': 0.2.7 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.2 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 4.2.0 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + fast-decode-uri-component@1.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-json-stringify@6.0.1: + dependencies: + '@fastify/merge-json-schemas': 0.2.1 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + fast-uri: 3.0.6 + json-schema-ref-resolver: 2.0.1 + rfdc: 1.4.1 + + fast-levenshtein@2.0.6: {} + + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + + fast-redact@3.5.0: {} + + fast-uri@3.0.6: {} + + fastify-plugin@5.0.1: {} + + fastify-raw-body@5.0.0: + dependencies: + fastify-plugin: 5.0.1 + raw-body: 3.0.0 + secure-json-parse: 2.7.0 + + fastify@5.2.1: + dependencies: + '@fastify/ajv-compiler': 4.0.2 + '@fastify/error': 4.1.0 + '@fastify/fast-json-stringify-compiler': 5.0.2 + '@fastify/proxy-addr': 5.0.0 + abstract-logging: 2.0.1 + avvio: 9.1.0 + fast-json-stringify: 6.0.1 + find-my-way: 9.2.0 + light-my-request: 6.6.0 + pino: 9.6.0 + process-warning: 4.0.1 + rfdc: 1.4.1 + secure-json-parse: 3.0.2 + semver: 7.7.1 + toad-cache: 3.7.0 + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-my-way@9.2.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 4.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + flexsearch@0.7.43: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@11.0.1: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.0 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + + globals@11.12.0: {} + + globals@14.0.0: {} + + globals@16.0.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + highlight-words-core@1.2.3: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + ipaddr.js@2.2.0: {} + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isbot-fast@1.2.0: {} + + isexe@2.0.0: {} + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + jackspeak@4.1.0: + dependencies: + '@isaacs/cliui': 8.0.2 + + jiti@2.4.2: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-ref-resolver@2.0.1: + dependencies: + dequal: 2.0.3 + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + light-my-request@6.6.0: + dependencies: + cookie: 1.0.2 + process-warning: 4.0.1 + set-cookie-parser: 2.7.1 + + lightningcss-darwin-arm64@1.29.2: + optional: true + + lightningcss-darwin-x64@1.29.2: + optional: true + + lightningcss-freebsd-x64@1.29.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.2: + optional: true + + lightningcss-linux-arm64-gnu@1.29.2: + optional: true + + lightningcss-linux-arm64-musl@1.29.2: + optional: true + + lightningcss-linux-x64-gnu@1.29.2: + optional: true + + lightningcss-linux-x64-musl@1.29.2: + optional: true + + lightningcss-win32-arm64-msvc@1.29.2: + optional: true + + lightningcss-win32-x64-msvc@1.29.2: + optional: true + + lightningcss@1.29.2: + dependencies: + detect-libc: 2.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.2 + lightningcss-darwin-x64: 1.29.2 + lightningcss-freebsd-x64: 1.29.2 + lightningcss-linux-arm-gnueabihf: 1.29.2 + lightningcss-linux-arm64-gnu: 1.29.2 + lightningcss-linux-arm64-musl: 1.29.2 + lightningcss-linux-x64-gnu: 1.29.2 + lightningcss-linux-x64-musl: 1.29.2 + lightningcss-win32-arm64-msvc: 1.29.2 + lightningcss-win32-x64-msvc: 1.29.2 + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.castarray@4.4.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.merge@4.6.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@11.0.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + math-intrinsics@1.1.0: {} + + memoize-one@4.0.3: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime@3.0.0: {} + + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@7.4.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + mkdirp@2.1.6: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + nanoid@3.3.9: {} + + natural-compare@1.4.0: {} + + node-releases@2.0.19: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + on-exit-leak-free@2.1.2: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.2 + minipass: 7.1.2 + + path-to-regexp@8.2.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-std-serializers@7.0.0: {} + + pino@9.6.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 4.0.1 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + + possible-typed-array-names@1.1.0: {} + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.3: + dependencies: + nanoid: 3.3.9 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.5.3: {} + + prism-react-renderer@2.4.1(react@19.0.0): + dependencies: + '@types/prismjs': 1.26.5 + clsx: 2.1.1 + react: 19.0.0 + + prisma@6.5.0(typescript@5.8.2): + dependencies: + '@prisma/config': 6.5.0 + '@prisma/engines': 6.5.0 + optionalDependencies: + fsevents: 2.3.3 + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + process-warning@4.0.1: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + quick-format-unescaped@4.0.4: {} + + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + + react-dom@19.0.0(react@19.0.0): + dependencies: + react: 19.0.0 + scheduler: 0.25.0 + + react-highlight-words@0.21.0(react@19.0.0): + dependencies: + highlight-words-core: 1.2.3 + memoize-one: 4.0.3 + react: 19.0.0 + + react-is@16.13.1: {} + + react-refresh@0.14.2: {} + + react-streaming@0.3.50(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@brillout/import': 0.2.6 + '@brillout/json-serializer': 0.5.15 + '@brillout/picocolors': 1.0.26 + isbot-fast: 1.2.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + + react@19.0.0: {} + + real-require@0.2.0: {} + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexparam@3.0.0: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + ret@0.5.0: {} + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rollup@4.35.0: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.35.0 + '@rollup/rollup-android-arm64': 4.35.0 + '@rollup/rollup-darwin-arm64': 4.35.0 + '@rollup/rollup-darwin-x64': 4.35.0 + '@rollup/rollup-freebsd-arm64': 4.35.0 + '@rollup/rollup-freebsd-x64': 4.35.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.35.0 + '@rollup/rollup-linux-arm-musleabihf': 4.35.0 + '@rollup/rollup-linux-arm64-gnu': 4.35.0 + '@rollup/rollup-linux-arm64-musl': 4.35.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.35.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.35.0 + '@rollup/rollup-linux-riscv64-gnu': 4.35.0 + '@rollup/rollup-linux-s390x-gnu': 4.35.0 + '@rollup/rollup-linux-x64-gnu': 4.35.0 + '@rollup/rollup-linux-x64-musl': 4.35.0 + '@rollup/rollup-win32-arm64-msvc': 4.35.0 + '@rollup/rollup-win32-ia32-msvc': 4.35.0 + '@rollup/rollup-win32-x64-msvc': 4.35.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-regex2@4.0.1: + dependencies: + ret: 0.5.0 + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + scheduler@0.25.0: {} + + search-insights@2.17.3: {} + + secure-json-parse@2.7.0: {} + + secure-json-parse@3.0.2: {} + + semver@6.3.1: {} + + semver@7.7.1: {} + + set-cookie-parser@2.7.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + simple-functional-loader@1.2.1: + dependencies: + loader-utils: 2.0.4 + + sirv@3.0.1: + dependencies: + '@polka/url': 1.0.0-next.28 + mrmime: 2.0.1 + totalist: 3.0.1 + + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + split2@4.2.0: {} + + statuses@2.0.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.9 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + synckit@0.9.2: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.8.1 + + tabbable@6.2.0: {} + + tailwindcss@4.0.13: {} + + tapable@2.2.1: {} + + telefunc@0.1.87(@babel/core@7.26.10)(@babel/parser@7.26.10)(@babel/types@7.26.10)(react-streaming@0.3.50(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0): + dependencies: + '@brillout/import': 0.2.6 + '@brillout/json-serializer': 0.5.15 + '@brillout/picocolors': 1.0.26 + '@brillout/vite-plugin-server-entry': 0.6.3 + es-module-lexer: 1.6.0 + ts-morph: 19.0.0 + optionalDependencies: + '@babel/core': 7.26.10 + '@babel/parser': 7.26.10 + '@babel/types': 7.26.10 + react: 19.0.0 + react-streaming: 0.3.50(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + + tldts-core@6.1.84: {} + + tldts@6.1.84: + dependencies: + tldts-core: 6.1.84 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toad-cache@3.7.0: {} + + toidentifier@1.0.1: {} + + totalist@3.0.1: {} + + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.84 + + ts-api-utils@2.0.1(typescript@5.8.2): + dependencies: + typescript: 5.8.2 + + ts-morph@19.0.0: + dependencies: + '@ts-morph/common': 0.20.0 + code-block-writer: 12.0.0 + + tslib@2.8.1: {} + + tsx@4.19.3: + dependencies: + esbuild: 0.25.1 + get-tsconfig: 4.10.0 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript-eslint@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2): + dependencies: + '@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/parser': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2) + eslint: 9.22.0(jiti@2.4.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + typescript@5.8.2: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@5.26.5: {} + + unpipe@1.0.0: {} + + unplugin-fonts@1.3.1(vite@6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)): + dependencies: + fast-glob: 3.3.3 + unplugin: 2.0.0-beta.1 + vite: 6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3) + + unplugin@2.0.0-beta.1: + dependencies: + acorn: 8.14.1 + webpack-virtual-modules: 0.6.2 + + update-browserslist-db@1.1.3(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + vike-react@0.5.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(vike@0.4.225(react-streaming@0.3.50(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3))): + dependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-streaming: 0.3.50(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + vike: 0.4.225(react-streaming@0.3.50(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)) + + vike@0.4.225(react-streaming@0.3.50(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(vite@6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)): + dependencies: + '@brillout/import': 0.2.6 + '@brillout/json-serializer': 0.5.15 + '@brillout/picocolors': 1.0.26 + '@brillout/require-shim': 0.1.2 + '@brillout/vite-plugin-server-entry': 0.6.3 + acorn: 8.14.1 + cac: 6.7.14 + es-module-lexer: 1.6.0 + esbuild: 0.24.2 + json5: 2.2.3 + picomatch: 4.0.2 + semver: 7.7.1 + sirv: 3.0.1 + source-map-support: 0.5.21 + tinyglobby: 0.2.12 + optionalDependencies: + react-streaming: 0.3.50(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + vite: 6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3) + + vite@6.2.1(@types/node@18.19.80)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3): + dependencies: + esbuild: 0.25.1 + postcss: 8.5.3 + rollup: 4.35.0 + optionalDependencies: + '@types/node': 18.19.80 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.2 + tsx: 4.19.3 + + webpack-virtual-modules@0.6.2: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + yallist@3.1.1: {} + + yocto-queue@0.1.0: {} diff --git a/app/prisma/schema.prisma b/app/prisma/schema.prisma new file mode 100644 index 0000000..ee282c7 --- /dev/null +++ b/app/prisma/schema.prisma @@ -0,0 +1,14 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? +// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} diff --git a/app/server/telefunc-handler.ts b/app/server/telefunc-handler.ts new file mode 100644 index 0000000..c6f252e --- /dev/null +++ b/app/server/telefunc-handler.ts @@ -0,0 +1,22 @@ +import { telefunc } from "telefunc"; +// TODO: stop using universal-middleware and directly integrate server middlewares instead. (Bati generates boilerplates that use universal-middleware https://github.com/magne4000/universal-middleware to make Bati's internal logic easier. This is temporary and will be removed soon.) +import type { Get, UniversalHandler } from "@universal-middleware/core"; + +export const telefuncHandler: Get<[], UniversalHandler> = () => async (request, context, runtime) => { + const httpResponse = await telefunc({ + url: request.url.toString(), + method: request.method, + body: await request.text(), + context: { + ...context, + ...runtime, + }, + }); + const { body, statusCode, contentType } = httpResponse; + return new Response(body, { + status: statusCode, + headers: { + "content-type": contentType, + }, + }); +}; diff --git a/app/server/vike-handler.ts b/app/server/vike-handler.ts new file mode 100644 index 0000000..5d1ae96 --- /dev/null +++ b/app/server/vike-handler.ts @@ -0,0 +1,18 @@ +/// <reference lib="webworker" /> +import { renderPage } from "vike/server"; +// TODO: stop using universal-middleware and directly integrate server middlewares instead. (Bati generates boilerplates that use universal-middleware https://github.com/magne4000/universal-middleware to make Bati's internal logic easier. This is temporary and will be removed soon.) +import type { Get, UniversalHandler } from "@universal-middleware/core"; + +export const vikeHandler: Get<[], UniversalHandler> = () => async (request, context, runtime) => { + const pageContextInit = { ...context, ...runtime, urlOriginal: request.url, headersOriginal: request.headers }; + const pageContext = await renderPage(pageContextInit); + const response = pageContext.httpResponse; + + const { readable, writable } = new TransformStream(); + response.pipe(writable); + + return new Response(readable, { + status: response.statusCode, + headers: response.headers, + }); +}; diff --git a/app/services/DocsService.ts b/app/services/DocsService.ts new file mode 100644 index 0000000..f9fca1c --- /dev/null +++ b/app/services/DocsService.ts @@ -0,0 +1,132 @@ +import type { Node } from "@markdoc/markdoc"; + +import { slugifyWithCounter } from "@sindresorhus/slugify"; +import { buildFlexSearch } from "./FlexSearchService"; +import Markdoc from "@markdoc/markdoc"; +import nodes from "@/markdoc/nodes"; +import tags from "@/markdoc/tags"; +import glob from "fast-glob"; +import path from "path"; +import fs from "fs"; + +export type FlexSearchData = { key: string; sections: DocSection[] }[]; + +type DocsCache = Map<string, DocData>; +type DocSection = [string, string | null, string[]]; +type DocData = { title: string; description: string; content: string; sections: DocSection[] }; +type DocExtension = "mdx" | "md"; + +class DocsService { + private static readonly DOCS_PATH = path.resolve("../../app/data"); + private static readonly DOCS_EXTS: DocExtension[] = ["mdx", "md"]; // Order matters + private static instance: DocsService; + + public search: ReturnType<typeof buildFlexSearch> = buildFlexSearch([]); + private slugify = slugifyWithCounter(); + private cache: DocsCache = new Map(); + + public static getInstance(): DocsService { + if (!DocsService.instance) { + DocsService.instance = new DocsService(); + } + + return DocsService.instance; + } + + private getFromCache(key: string): DocData | undefined { + return this.cache.get(key); + } + + private setToCache(key: string, value: DocData): void { + this.cache.set(key, value); + } + + private nodeToString(node: Node): string { + let string = ""; + + if (node.type === "text" && typeof node.attributes?.content === "string") { + string = node.attributes.content; + } + + if (node.children) { + for (const child of node.children) { + string += this.nodeToString(child); + } + } + + return string; + } + + private extractSections(node: Node, sections: DocSection[], isRoot = true) { + if (isRoot) { + this.slugify.reset(); + } + + if (["heading", "paragraph"].includes(node.type)) { + const content = this.nodeToString(node).trim(); + + if (node.type === "heading" && node.attributes.level <= 2) { + const hash = node.attributes?.id ?? this.slugify(content); + sections.push([content, hash, []]); + } else { + sections.at(-1)?.[2].push(content); + } + } else if (node.children) { + for (const child of node.children) { + this.extractSections(child, sections, false); + } + } + } + + public async fetchDocs() { + const docs = glob.sync(DocsService.DOCS_PATH + `/**/*.{${DocsService.DOCS_EXTS.join(",")}}`); + const data = docs.map((doc) => { + const content = fs.readFileSync(doc, "utf-8"); + const extension = path.extname(doc).slice(1) as DocExtension; + const key = doc + .replace(DocsService.DOCS_PATH, "") + .replace(`page.${extension}`, "") + .replace(`.${extension}`, "") + .replace(/\/$/g, ""); + + const ast = Markdoc.parse(content); + const title = ast.attributes?.frontmatter?.match(/^title:\s*(.*?)\s*$/m)?.[1]; + const description = ast.attributes?.frontmatter?.match(/^description:\s*(.*?)\s*$/m)?.[1]; + const sections: DocSection[] = [[title, null, []]]; + + this.extractSections(ast, sections); + this.setToCache(key, { title, description, content, sections }); + + return { key, sections }; + }); + + this.search = buildFlexSearch(data); + } + + public transform(doc: DocData) { + const ast = Markdoc.parse(doc.content); + const transformed = Markdoc.transform(ast, { nodes, tags, variables: {} }); + + return { + ...doc, + tags: transformed, + }; + } + + public async getDoc(namespace: "docs" | "certifications", key: string) { + try { + await this.fetchDocs(); + const doc = this.getFromCache(`/${namespace}/${key}`); + + if (!doc) { + throw new Error("Doc not found"); + } + + return doc; + } catch (error) { + return null; + } + } +} + +export const docsService = DocsService.getInstance(); diff --git a/app/services/FlexSearchService.ts b/app/services/FlexSearchService.ts new file mode 100644 index 0000000..577493f --- /dev/null +++ b/app/services/FlexSearchService.ts @@ -0,0 +1,56 @@ +import type { FlexSearchData } from "./DocsService"; + +import FlexSearch from "flexsearch"; + +interface SearchResult { + id: string; + doc: { + title: string; + pageTitle?: string; + }; +} + +export function buildFlexSearch(data: FlexSearchData) { + const sectionIndex = new FlexSearch.Document({ + tokenize: "full", + document: { + id: "url", + index: "content", + store: ["title", "pageTitle"], + }, + context: { + resolution: 9, + depth: 2, + bidirectional: true, + }, + }); + + for (const { key, sections } of data) { + for (const [title, hash, content] of sections) { + sectionIndex.add({ + url: key + (hash ? `#${hash}` : ""), + title, + content: [title, ...content].join("\n"), + pageTitle: hash ? sections[0][0] : undefined, + }); + } + } + + return function search(query: string) { + const result = sectionIndex.search<true>(query, 5, { + enrich: true, + }); + + if (result.length === 0) return []; + + return result[0].result.map((rawItem) => { + const item = rawItem as unknown as SearchResult; + + return { + url: item.id, + title: item.doc.title, + pageTitle: item.doc.pageTitle, + }; + }); + }; +} diff --git a/app/tsconfig.json b/app/tsconfig.json new file mode 100644 index 0000000..2eec5d4 --- /dev/null +++ b/app/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "module": "ESNext", + "noEmit": true, + "moduleResolution": "Bundler", + "target": "ES2022", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "types": ["vite/client", "vike-react"], + "jsx": "preserve", + "jsxImportSource": "react", + "baseUrl": "./", + "paths": { + "@/*": ["./*"], + "@syntax/*": ["./components/syntax/*"] + } + }, + "exclude": ["dist"] +} diff --git a/app/types.d.ts b/app/types.d.ts new file mode 100644 index 0000000..dbc7d38 --- /dev/null +++ b/app/types.d.ts @@ -0,0 +1 @@ +declare module "simple-functional-loader"; diff --git a/app/vite.config.ts b/app/vite.config.ts new file mode 100644 index 0000000..bd82e86 --- /dev/null +++ b/app/vite.config.ts @@ -0,0 +1,29 @@ +import tailwindcss from "@tailwindcss/vite"; +import Unfonts from "unplugin-fonts/vite"; +import { telefunc } from "telefunc/vite"; +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; +import vike from "vike/plugin"; + +export default defineConfig({ + plugins: [ + Unfonts({ + fontsource: { + families: ["Inter Variable", "Lexend Variable"], + }, + }), + vike({}), + react({}), + tailwindcss(), + telefunc(), + ], + build: { + target: "es2022", + }, + resolve: { + alias: { + "@syntax": __dirname + "/components/syntax", + "@": __dirname, + }, + }, +}); diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000..fcc08ae --- /dev/null +++ b/compose.yml @@ -0,0 +1,14 @@ +services: + memento-dev: + container_name: memento-dev + build: + context: . + dockerfile: pnpm.Dockerfile + env_file: + - .env + ports: + - "${PORT}:${PORT}" + - "${HMR_PORT}:${HMR_PORT}" + volumes: + - ./app:/app + restart: unless-stopped diff --git a/old/.docusaurus/DONT-EDIT-THIS-FOLDER b/old/.docusaurus/DONT-EDIT-THIS-FOLDER new file mode 100644 index 0000000..6c06ae8 --- /dev/null +++ b/old/.docusaurus/DONT-EDIT-THIS-FOLDER @@ -0,0 +1,5 @@ +This folder stores temp files that Docusaurus' client bundler accesses. + +DO NOT hand-modify files in this folder because they will be overwritten in the +next build. You can clear all build artifacts (including this folder) with the +`docusaurus clear` command. diff --git a/old/.docusaurus/client-modules.js b/old/.docusaurus/client-modules.js new file mode 100644 index 0000000..a4b2732 --- /dev/null +++ b/old/.docusaurus/client-modules.js @@ -0,0 +1,6 @@ +export default [ + require("/Users/jack/Projets/Perso/memento-dev/node_modules/.pnpm/infima@0.2.0-alpha.45/node_modules/infima/dist/css/default/default.css"), + require("/Users/jack/Projets/Perso/memento-dev/node_modules/.pnpm/@docusaurus+theme-classic@3.6.1_@types+react@18.3.3_react-dom@18.3.1_react@18.3.1__react@18.3.1_typescript@5.2.2/node_modules/@docusaurus/theme-classic/lib/prism-include-languages"), + require("/Users/jack/Projets/Perso/memento-dev/node_modules/.pnpm/@docusaurus+theme-classic@3.6.1_@types+react@18.3.3_react-dom@18.3.1_react@18.3.1__react@18.3.1_typescript@5.2.2/node_modules/@docusaurus/theme-classic/lib/nprogress"), + require("/Users/jack/Projets/Perso/memento-dev/src/css/custom.css"), +]; diff --git a/old/.docusaurus/codeTranslations.json b/old/.docusaurus/codeTranslations.json new file mode 100644 index 0000000..bdb46f7 --- /dev/null +++ b/old/.docusaurus/codeTranslations.json @@ -0,0 +1,82 @@ +{ + "theme.AnnouncementBar.closeButtonAriaLabel": "Fermer", + "theme.BackToTopButton.buttonAriaLabel": "Retour au début de la page", + "theme.CodeBlock.copied": "Copié", + "theme.CodeBlock.copy": "Copier", + "theme.CodeBlock.copyButtonAriaLabel": "Copier le code", + "theme.CodeBlock.wordWrapToggle": "Activer/désactiver le retour à la ligne", + "theme.DocSidebarItem.collapseCategoryAriaLabel": "Réduire la catégorie '{label}' de la barre latérale", + "theme.DocSidebarItem.expandCategoryAriaLabel": "Développer la catégorie '{label}' de la barre latérale", + "theme.ErrorPageContent.title": "Cette page a planté.", + "theme.ErrorPageContent.tryAgain": "Réessayer", + "theme.NavBar.navAriaLabel": "Main", + "theme.NotFound.p1": "Nous n'avons pas trouvé ce que vous recherchez.", + "theme.NotFound.p2": "Veuillez contacter le propriétaire du site qui vous a lié à l'URL d'origine et leur faire savoir que leur lien est cassé.", + "theme.NotFound.title": "Page introuvable", + "theme.TOCCollapsible.toggleButtonLabel": "Sur cette page", + "theme.admonition.caution": "attention", + "theme.admonition.danger": "danger", + "theme.admonition.info": "info", + "theme.admonition.note": "remarque", + "theme.admonition.tip": "astuce", + "theme.admonition.warning": "attention", + "theme.blog.archive.description": "Archive", + "theme.blog.archive.title": "Archive", + "theme.blog.author.noPosts": "This author has not written any posts yet.", + "theme.blog.author.pageTitle": "{authorName} - {nPosts}", + "theme.blog.authorsList.pageTitle": "Authors", + "theme.blog.authorsList.viewAll": "View All Authors", + "theme.blog.paginator.navAriaLabel": "Pagination de la liste des articles du blog", + "theme.blog.paginator.newerEntries": "Nouvelles entrées", + "theme.blog.paginator.olderEntries": "Anciennes entrées", + "theme.blog.post.paginator.navAriaLabel": "Pagination des articles du blog", + "theme.blog.post.paginator.newerPost": "Article plus récent", + "theme.blog.post.paginator.olderPost": "Article plus ancien", + "theme.blog.post.plurals": "Un article|{count} articles", + "theme.blog.post.readMore": "Lire plus", + "theme.blog.post.readMoreLabel": "En savoir plus sur {title}", + "theme.blog.post.readingTime.plurals": "Une minute de lecture|{readingTime} minutes de lecture", + "theme.blog.sidebar.navAriaLabel": "Navigation article de blog récent", + "theme.blog.tagTitle": "{nPosts} tagués avec « {tagName} »", + "theme.colorToggle.ariaLabel": "Basculer entre le mode sombre et clair (actuellement {mode})", + "theme.colorToggle.ariaLabel.mode.dark": "mode sombre", + "theme.colorToggle.ariaLabel.mode.light": "mode clair", + "theme.common.editThisPage": "Éditer cette page", + "theme.common.headingLinkTitle": "Lien direct vers {heading}", + "theme.common.skipToMainContent": "Aller au contenu principal", + "theme.contentVisibility.draftBanner.message": "This page is a draft. It will only be visible in dev and be excluded from the production build.", + "theme.contentVisibility.draftBanner.title": "Draft page", + "theme.contentVisibility.unlistedBanner.message": "Cette page n'est pas répertoriée. Les moteurs de recherche ne l'indexeront pas, et seuls les utilisateurs ayant un lien direct peuvent y accéder.", + "theme.contentVisibility.unlistedBanner.title": "Page non répertoriée", + "theme.docs.DocCard.categoryDescription.plurals": "1 élément|{count} éléments", + "theme.docs.breadcrumbs.home": "Page d'accueil", + "theme.docs.breadcrumbs.navAriaLabel": "Fil d'Ariane", + "theme.docs.paginator.navAriaLabel": "Pages de documentation", + "theme.docs.paginator.next": "Suivant", + "theme.docs.paginator.previous": "Précédent", + "theme.docs.sidebar.closeSidebarButtonAriaLabel": "Fermer la barre de navigation", + "theme.docs.sidebar.collapseButtonAriaLabel": "Réduire le menu latéral", + "theme.docs.sidebar.collapseButtonTitle": "Réduire le menu latéral", + "theme.docs.sidebar.expandButtonAriaLabel": "Déplier le menu latéral", + "theme.docs.sidebar.expandButtonTitle": "Déplier le menu latéral", + "theme.docs.sidebar.navAriaLabel": "Docs sidebar", + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": "Ouvrir/fermer la barre de navigation", + "theme.docs.tagDocListPageTitle": "{nDocsTagged} avec \"{tagName}\"", + "theme.docs.tagDocListPageTitle.nDocsTagged": "Un document tagué|{count} documents tagués", + "theme.docs.versionBadge.label": "Version: {versionLabel}", + "theme.docs.versions.latestVersionLinkLabel": "dernière version", + "theme.docs.versions.latestVersionSuggestionLabel": "Pour une documentation à jour, consultez la {latestVersionLink} ({versionLabel}).", + "theme.docs.versions.unmaintainedVersionLabel": "Ceci est la documentation de {siteTitle} {versionLabel}, qui n'est plus activement maintenue.", + "theme.docs.versions.unreleasedVersionLabel": "Ceci est la documentation de la prochaine version {versionLabel} de {siteTitle}.", + "theme.lastUpdated.atDate": " le {date}", + "theme.lastUpdated.byUser": " par {user}", + "theme.lastUpdated.lastUpdatedAtBy": "Dernière mise à jour{atDate}{byUser}", + "theme.navbar.mobileLanguageDropdown.label": "Langues", + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": "← Retour au menu principal", + "theme.navbar.mobileVersionsDropdown.label": "Versions", + "theme.tags.tagsListLabel": "Tags :", + "theme.tags.tagsPageLink": "Voir tous les tags", + "theme.tags.tagsPageTitle": "Tags", + "theme.unlistedContent.title": "Page non répertoriée", + "theme.unlistedContent.message": "Cette page n'est pas répertoriée. Les moteurs de recherche ne l'indexeront pas, et seuls les utilisateurs ayant un lien direct peuvent y accéder." +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-lunr-search/default/__plugin.json b/old/.docusaurus/docusaurus-lunr-search/default/__plugin.json new file mode 100644 index 0000000..f17ec96 --- /dev/null +++ b/old/.docusaurus/docusaurus-lunr-search/default/__plugin.json @@ -0,0 +1,4 @@ +{ + "name": "docusaurus-lunr-search", + "id": "default" +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/__plugin.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/__plugin.json new file mode 100644 index 0000000..3818ad0 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/__plugin.json @@ -0,0 +1,4 @@ +{ + "name": "docusaurus-plugin-content-docs", + "id": "default" +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/category-bases-de-donnees-fba.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/category-bases-de-donnees-fba.json new file mode 100644 index 0000000..cbfdf5b --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/category-bases-de-donnees-fba.json @@ -0,0 +1 @@ +{"categoryGeneratedIndex":{"title":"💽 Bases de données","slug":"/category/-bases-de-données","permalink":"/category/-bases-de-données","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Retours d'expériences","permalink":"/titres-professionnels/retours"},"next":{"title":"Modélisation avec Merise","permalink":"/ressources/bases-de-donnees/modelisation/merise"}}}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/category-frontend-4de.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/category-frontend-4de.json new file mode 100644 index 0000000..f7a5ffb --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/category-frontend-4de.json @@ -0,0 +1 @@ +{"categoryGeneratedIndex":{"title":"🌈 Frontend","slug":"/category/-frontend","permalink":"/category/-frontend","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Création du MCD","permalink":"/ressources/bases-de-donnees/modelisation/mcd"},"next":{"title":"Introduction à React","permalink":"/ressources/frontend/react/intro"}}}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/category-titres-professionnels-9da.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/category-titres-professionnels-9da.json new file mode 100644 index 0000000..c29c1ff --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/category-titres-professionnels-9da.json @@ -0,0 +1 @@ +{"categoryGeneratedIndex":{"title":"🎓 Titres professionnels","description":"Tu retrouveras ici l'ensemble des titres professionnels couverts par la plateforme Memento Dev.","slug":"/category/-titres-professionnels","permalink":"/category/-titres-professionnels","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Titres professionnels","permalink":"/glossaires/titres-professionnel"},"next":{"title":"Résumé","permalink":"/titres-professionnels/CDA/intro"}}}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/category-️-archives-fd2.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/category-️-archives-fd2.json new file mode 100644 index 0000000..0a8013b --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/category-️-archives-fd2.json @@ -0,0 +1 @@ +{"categoryGeneratedIndex":{"title":"🗃️ Archives","description":"Archives des différents référentiels arrivés à expiration.","slug":"/category/️-archives","permalink":"/category/️-archives","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"CP 8","permalink":"/titres-professionnels/DWWM/AT2/CP8"},"next":{"title":"Résumé","permalink":"/titres-professionnels/archives/DWWM/2018-2023/intro"}}}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/index-466.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/index-466.json new file mode 100644 index 0000000..68ae3fc --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/index-466.json @@ -0,0 +1 @@ +{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"📜 Préambule","href":"/intro","docId":"intro","unlisted":false},{"type":"category","label":"📖 Glossaires","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Titres professionnels","href":"/glossaires/titres-professionnel","docId":"glossaires/titres-professionnel","unlisted":false}]},{"type":"category","label":"🎓 Titres professionnels","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"🧑‍💻 CDA","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Résumé","href":"/titres-professionnels/CDA/intro","docId":"titres-professionnels/CDA/intro","unlisted":false},{"type":"category","label":"Activité Type 1","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CP 1","href":"/titres-professionnels/CDA/AT1/CP1","docId":"titres-professionnels/CDA/AT1/CP1","unlisted":false},{"type":"link","label":"CP 2","href":"/titres-professionnels/CDA/AT1/CP2","docId":"titres-professionnels/CDA/AT1/CP2","unlisted":false},{"type":"link","label":"CP 3","href":"/titres-professionnels/CDA/AT1/CP3","docId":"titres-professionnels/CDA/AT1/CP3","unlisted":false},{"type":"link","label":"CP 4","href":"/titres-professionnels/CDA/AT1/CP4","docId":"titres-professionnels/CDA/AT1/CP4","unlisted":false}]},{"type":"category","label":"Activité Type 2","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CP 5","href":"/titres-professionnels/CDA/AT2/CP5","docId":"titres-professionnels/CDA/AT2/CP5","unlisted":false},{"type":"link","label":"CP 6","href":"/titres-professionnels/CDA/AT2/CP6","docId":"titres-professionnels/CDA/AT2/CP6","unlisted":false},{"type":"link","label":"CP 7","href":"/titres-professionnels/CDA/AT2/CP7","docId":"titres-professionnels/CDA/AT2/CP7","unlisted":false},{"type":"link","label":"CP 8","href":"/titres-professionnels/CDA/AT2/CP8","docId":"titres-professionnels/CDA/AT2/CP8","unlisted":false}]},{"type":"category","label":"Activité Type 3","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CP 9","href":"/titres-professionnels/CDA/AT3/CP9","docId":"titres-professionnels/CDA/AT3/CP9","unlisted":false},{"type":"link","label":"CP 10","href":"/titres-professionnels/CDA/AT3/CP10","docId":"titres-professionnels/CDA/AT3/CP10","unlisted":false},{"type":"link","label":"CP 11","href":"/titres-professionnels/CDA/AT3/CP11","docId":"titres-professionnels/CDA/AT3/CP11","unlisted":false}]}]},{"type":"category","label":"🧑‍💻 DWWM","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Résumé","href":"/titres-professionnels/DWWM/intro","docId":"titres-professionnels/DWWM/intro","unlisted":false},{"type":"link","label":"La soutenance DWWM","href":"/titres-professionnels/DWWM/soutenance","docId":"titres-professionnels/DWWM/soutenance","unlisted":false},{"type":"category","label":"Activité Type 1","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CP 1","href":"/titres-professionnels/DWWM/AT1/CP1","docId":"titres-professionnels/DWWM/AT1/CP1","unlisted":false},{"type":"link","label":"CP 2","href":"/titres-professionnels/DWWM/AT1/CP2","docId":"titres-professionnels/DWWM/AT1/CP2","unlisted":false},{"type":"link","label":"CP 3","href":"/titres-professionnels/DWWM/AT1/CP3","docId":"titres-professionnels/DWWM/AT1/CP3","unlisted":false},{"type":"link","label":"CP 4","href":"/titres-professionnels/DWWM/AT1/CP4","docId":"titres-professionnels/DWWM/AT1/CP4","unlisted":false}]},{"type":"category","label":"Activité Type 2","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CP 5","href":"/titres-professionnels/DWWM/AT2/CP5","docId":"titres-professionnels/DWWM/AT2/CP5","unlisted":false},{"type":"link","label":"CP 6","href":"/titres-professionnels/DWWM/AT2/CP6","docId":"titres-professionnels/DWWM/AT2/CP6","unlisted":false},{"type":"link","label":"CP 7","href":"/titres-professionnels/DWWM/AT2/CP7","docId":"titres-professionnels/DWWM/AT2/CP7","unlisted":false},{"type":"link","label":"CP 8","href":"/titres-professionnels/DWWM/AT2/CP8","docId":"titres-professionnels/DWWM/AT2/CP8","unlisted":false}]}]},{"type":"category","label":"🗃️ Archives","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"DWWM","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"2018-2023","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Résumé","href":"/titres-professionnels/archives/DWWM/2018-2023/intro","docId":"titres-professionnels/archives/DWWM/2018-2023/intro","unlisted":false},{"type":"category","label":"AT1","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CP 1","href":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1","docId":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP1","unlisted":false},{"type":"link","label":"CP 2","href":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2","docId":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP2","unlisted":false},{"type":"link","label":"CP 3","href":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3","docId":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP3","unlisted":false},{"type":"link","label":"CP 4","href":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4","docId":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP4","unlisted":false}]},{"type":"category","label":"AT2","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"CP 5","href":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5","docId":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP5","unlisted":false},{"type":"link","label":"CP 6","href":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6","docId":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP6","unlisted":false},{"type":"link","label":"CP 7","href":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7","docId":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP7","unlisted":false},{"type":"link","label":"CP 8","href":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8","docId":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP8","unlisted":false}]}]}]}],"href":"/category/️-archives"},{"type":"link","label":"Se préparer pour un TP","href":"/titres-professionnels/se-preparer","docId":"titres-professionnels/se-preparer","unlisted":false},{"type":"link","label":"Retours d'expériences","href":"/titres-professionnels/retours","docId":"titres-professionnels/retours","unlisted":false}],"href":"/category/-titres-professionnels"},{"type":"category","label":"📁 Ressources","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"💽 Bases de données","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Modélisation","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Modélisation avec Merise","href":"/ressources/bases-de-donnees/modelisation/merise","docId":"ressources/bases-de-donnees/modelisation/merise","unlisted":false},{"type":"link","label":"Création du MCD","href":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","docId":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","unlisted":false},{"type":"link","label":"Création du MCD","href":"/ressources/bases-de-donnees/modelisation/mcd","docId":"ressources/bases-de-donnees/modelisation/mcd","unlisted":false}]}],"href":"/category/-bases-de-données"},{"type":"category","label":"🌈 Frontend","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"React","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction à React","href":"/ressources/frontend/react/intro","docId":"ressources/frontend/react/intro","unlisted":false},{"type":"link","label":"Initialisation","href":"/ressources/frontend/react/initialiser-un-projet-react","docId":"ressources/frontend/react/initialiser-un-projet-react","unlisted":false},{"type":"link","label":"Syntaxe JSX","href":"/ressources/frontend/react/syntaxe-jsx","docId":"ressources/frontend/react/syntaxe-jsx","unlisted":false},{"type":"link","label":"Premier composant","href":"/ressources/frontend/react/premier-composant","docId":"ressources/frontend/react/premier-composant","unlisted":false},{"type":"link","label":"State et cycle de vie","href":"/ressources/frontend/react/state-et-cycle-de-vie","docId":"ressources/frontend/react/state-et-cycle-de-vie","unlisted":false},{"type":"link","label":"Les hooks de React","href":"/ressources/frontend/react/hooks","docId":"ressources/frontend/react/hooks","unlisted":false},{"type":"link","label":"Le hook useContext de React","href":"/ressources/frontend/react/contextes","docId":"ressources/frontend/react/contextes","unlisted":false},{"type":"link","label":"Le hook useReducer de React","href":"/ressources/frontend/react/reducers","docId":"ressources/frontend/react/reducers","unlisted":false}]}],"href":"/category/-frontend"},{"type":"link","label":"🎥 Influenceurs et créateurs de contenu","href":"/ressources/influenceurs-et-createurs","docId":"ressources/influenceurs-et-createurs","unlisted":false}]},{"type":"link","label":"🤗 Soutiens et contributeurs","href":"/soutiens-et-contributeurs","docId":"soutiens-et-contributeurs","unlisted":false},{"type":"link","label":"🤝 Contribuer","href":"/contribuer","docId":"contribuer","unlisted":false}]},"docs":{"contribuer":{"id":"contribuer","title":"🤝 Contribuer","description":"Tu souhaites contribuer à Memento Dev ? C'est par ici !","sidebar":"tutorialSidebar"},"glossaires/titres-professionnel":{"id":"glossaires/titres-professionnel","title":"Titres professionnels","description":"Définitions des termes utilisés dans le cadre des titres professionnels.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"📜 Préambule","description":"Memento Dev, une plateforme open-source de partage de connaissances en développement !","sidebar":"tutorialSidebar"},"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees":{"id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","sidebar":"tutorialSidebar"},"ressources/bases-de-donnees/modelisation/mcd":{"id":"ressources/bases-de-donnees/modelisation/mcd","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","sidebar":"tutorialSidebar"},"ressources/bases-de-donnees/modelisation/merise":{"id":"ressources/bases-de-donnees/modelisation/merise","title":"Modélisation avec Merise","description":"Voyons ensemble comment on peut modéliser une base de données avec Merise !","sidebar":"tutorialSidebar"},"ressources/frontend/react/contextes":{"id":"ressources/frontend/react/contextes","title":"Le hook useContext de React","description":"Découvrez comment utiliser le hook useContext de React pour gérer les contextes dans vos applications.","sidebar":"tutorialSidebar"},"ressources/frontend/react/hooks":{"id":"ressources/frontend/react/hooks","title":"Les hooks de React","description":"Découvre les hooks de React, une fonctionnalité qui te permet de gérer le state et le cycle de vie de tes composants fonctionnels.","sidebar":"tutorialSidebar"},"ressources/frontend/react/initialiser-un-projet-react":{"id":"ressources/frontend/react/initialiser-un-projet-react","title":"Initialisation","description":"Initialisons un nouveau projet React, avec ou sans TypeScript.","sidebar":"tutorialSidebar"},"ressources/frontend/react/intro":{"id":"ressources/frontend/react/intro","title":"Introduction à React","description":"Parlons un peu de React, ce qu'il est, ce qu'il fait et pourquoi il est si populaire.","sidebar":"tutorialSidebar"},"ressources/frontend/react/premier-composant":{"id":"ressources/frontend/react/premier-composant","title":"Premier composant","description":"Voyons ensemble comment notre premier composant React !","sidebar":"tutorialSidebar"},"ressources/frontend/react/reducers":{"id":"ressources/frontend/react/reducers","title":"Le hook useReducer de React","description":"Découvrez comment utiliser le hook useReducer de React pour gérer l'état de vos composants de manière plus efficace.","sidebar":"tutorialSidebar"},"ressources/frontend/react/state-et-cycle-de-vie":{"id":"ressources/frontend/react/state-et-cycle-de-vie","title":"State et cycle de vie","description":"Voyons ensemble comment gérer le state et le cycle de vie d'un composant React !","sidebar":"tutorialSidebar"},"ressources/frontend/react/syntaxe-jsx":{"id":"ressources/frontend/react/syntaxe-jsx","title":"Syntaxe JSX","description":"Découvrons la syntaxe JSX, un langage de balisage utilisé par React pour décrire l'interface utilisateur.","sidebar":"tutorialSidebar"},"ressources/influenceurs-et-createurs":{"id":"ressources/influenceurs-et-createurs","title":"🎥 Influenceurs et créateurs de contenu","description":"Liste d'influenceurs et créateurs de contenu dans le domaine du développement.","sidebar":"tutorialSidebar"},"soutiens-et-contributeurs":{"id":"soutiens-et-contributeurs","title":"🤗 Soutiens et contributeurs","description":"Soutiens et contributeurs de la plateforme Memento Dev.","sidebar":"tutorialSidebar"},"titres-professionnels/archives/DWWM/2018-2023/AT1/CP1":{"id":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP1","title":"CP 1","description":"Synthèse de la CP 1 \"Maquetter une application\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","sidebar":"tutorialSidebar"},"titres-professionnels/archives/DWWM/2018-2023/AT1/CP2":{"id":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 1 \"Réaliser une interface utilisateur web statique et adaptable\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","sidebar":"tutorialSidebar"},"titres-professionnels/archives/DWWM/2018-2023/AT1/CP3":{"id":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Développer une interface utilisateur web dynamique\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","sidebar":"tutorialSidebar"},"titres-professionnels/archives/DWWM/2018-2023/AT1/CP4":{"id":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP4","title":"CP 4","description":"Synthèse de la CP 4 \"Réaliser une interface utilisateur avec une solution de gestion de contenu ou e-commerce\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","sidebar":"tutorialSidebar"},"titres-professionnels/archives/DWWM/2018-2023/AT2/CP5":{"id":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Créer une base de données\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","sidebar":"tutorialSidebar"},"titres-professionnels/archives/DWWM/2018-2023/AT2/CP6":{"id":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 5 \"Développer les composants d'accès aux données\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","sidebar":"tutorialSidebar"},"titres-professionnels/archives/DWWM/2018-2023/AT2/CP7":{"id":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP7","title":"CP 7","description":"Synthèse de la CP 7 \"Développer la partie back-end d'une application web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","sidebar":"tutorialSidebar"},"titres-professionnels/archives/DWWM/2018-2023/AT2/CP8":{"id":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP8","title":"CP 8","description":"Synthèse de la CP 8 \"Élaborer et mettre en œuvre des composants dans une application de gestion de contenu ou e-commerce\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","sidebar":"tutorialSidebar"},"titres-professionnels/archives/DWWM/2018-2023/intro":{"id":"titres-professionnels/archives/DWWM/2018-2023/intro","title":"Résumé","description":"Résumé du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, expiré depuis septembre 2023).","sidebar":"tutorialSidebar"},"titres-professionnels/CDA/AT1/CP1":{"id":"titres-professionnels/CDA/AT1/CP1","title":"CP 1","description":"Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","sidebar":"tutorialSidebar"},"titres-professionnels/CDA/AT1/CP2":{"id":"titres-professionnels/CDA/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 2 \"Développer des interfaces utilisateur\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","sidebar":"tutorialSidebar"},"titres-professionnels/CDA/AT1/CP3":{"id":"titres-professionnels/CDA/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Développer des composants métier\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","sidebar":"tutorialSidebar"},"titres-professionnels/CDA/AT1/CP4":{"id":"titres-professionnels/CDA/AT1/CP4","title":"CP 4","description":"Synthèse de la CP 4 \"Contribuer à la gestion d’un projet informatique\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","sidebar":"tutorialSidebar"},"titres-professionnels/CDA/AT2/CP5":{"id":"titres-professionnels/CDA/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Analyser les besoins et maquetter une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","sidebar":"tutorialSidebar"},"titres-professionnels/CDA/AT2/CP6":{"id":"titres-professionnels/CDA/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 6 \"Définir l’architecture logicielle d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","sidebar":"tutorialSidebar"},"titres-professionnels/CDA/AT2/CP7":{"id":"titres-professionnels/CDA/AT2/CP7","title":"CP 7","description":"Synthèse de la CP 7 \"Concevoir et mettre en place une base de données relationnelle\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","sidebar":"tutorialSidebar"},"titres-professionnels/CDA/AT2/CP8":{"id":"titres-professionnels/CDA/AT2/CP8","title":"CP 8","description":"Synthèse de la CP 8 \"Développer des composants d’accès aux données SQL et NoSQL\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","sidebar":"tutorialSidebar"},"titres-professionnels/CDA/AT3/CP10":{"id":"titres-professionnels/CDA/AT3/CP10","title":"CP 10","description":"Synthèse de la CP 10 \"Préparer et documenter le déploiement d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","sidebar":"tutorialSidebar"},"titres-professionnels/CDA/AT3/CP11":{"id":"titres-professionnels/CDA/AT3/CP11","title":"CP 11","description":"Synthèse de la CP 11 \"Contribuer à la mise en production dans une démarche DevOps\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","sidebar":"tutorialSidebar"},"titres-professionnels/CDA/AT3/CP9":{"id":"titres-professionnels/CDA/AT3/CP9","title":"CP 9","description":"Synthèse de la CP 9 \"Préparer et exécuter les plans de tests d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","sidebar":"tutorialSidebar"},"titres-professionnels/CDA/intro":{"id":"titres-professionnels/CDA/intro","title":"Résumé","description":"Résumé du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04, actif depuis décembre 2023).","sidebar":"tutorialSidebar"},"titres-professionnels/DWWM/AT1/CP1":{"id":"titres-professionnels/DWWM/AT1/CP1","title":"CP 1","description":"Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","sidebar":"tutorialSidebar"},"titres-professionnels/DWWM/AT1/CP2":{"id":"titres-professionnels/DWWM/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 2 \"Maquetter des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","sidebar":"tutorialSidebar"},"titres-professionnels/DWWM/AT1/CP3":{"id":"titres-professionnels/DWWM/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","sidebar":"tutorialSidebar"},"titres-professionnels/DWWM/AT1/CP4":{"id":"titres-professionnels/DWWM/AT1/CP4","title":"CP 4","description":"Synthèse de la CP 4 \"Développer la partie dynamique des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","sidebar":"tutorialSidebar"},"titres-professionnels/DWWM/AT2/CP5":{"id":"titres-professionnels/DWWM/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","sidebar":"tutorialSidebar"},"titres-professionnels/DWWM/AT2/CP6":{"id":"titres-professionnels/DWWM/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 6 \"Développer des composants d'accès aux données SQL et NoSQL\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","sidebar":"tutorialSidebar"},"titres-professionnels/DWWM/AT2/CP7":{"id":"titres-professionnels/DWWM/AT2/CP7","title":"CP 7","description":"Synthèse de la CP 7 \"Développer des composants métier coté serveur\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","sidebar":"tutorialSidebar"},"titres-professionnels/DWWM/AT2/CP8":{"id":"titres-professionnels/DWWM/AT2/CP8","title":"CP 8","description":"Synthèse de la CP 8 \"Documenter le déploiement d'une application dynamique web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","sidebar":"tutorialSidebar"},"titres-professionnels/DWWM/intro":{"id":"titres-professionnels/DWWM/intro","title":"Résumé","description":"Résumé du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04, actif depuis septembre 2023).","sidebar":"tutorialSidebar"},"titres-professionnels/DWWM/soutenance":{"id":"titres-professionnels/DWWM/soutenance","title":"La soutenance DWWM","description":"Tu prépares un TP DWWM et tu te demandes à quoi t'attendre pour la soutenance ? Voici quelques conseils pour te préparer efficacement.","sidebar":"tutorialSidebar"},"titres-professionnels/retours":{"id":"titres-professionnels/retours","title":"Retours d'expériences","description":"Découvre les témoignages de candidats et jury sur leur soutenance de titre professionnel : leurs ressentis avant, pendant et après leur passage devant le jury.","sidebar":"tutorialSidebar"},"titres-professionnels/se-preparer":{"id":"titres-professionnels/se-preparer","title":"Se préparer pour un TP","description":"Tu prépares un titre professionnel et tu te demandes comment bien t'y préparer ? Jette donc un oeil !","sidebar":"tutorialSidebar"}}}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-accessibilite-a1d.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-accessibilite-a1d.json new file mode 100644 index 0000000..552c027 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-accessibilite-a1d.json @@ -0,0 +1 @@ +{"tag":{"label":"Accessibilité","permalink":"/tags/accessibilite","allTagsPath":"/tags","count":3,"items":[{"id":"titres-professionnels/DWWM/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 2 \"Maquetter des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP2"},{"id":"titres-professionnels/DWWM/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP3"},{"id":"titres-professionnels/DWWM/AT1/CP4","title":"CP 4","description":"Synthèse de la CP 4 \"Développer la partie dynamique des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP4"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-architecture-02f.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-architecture-02f.json new file mode 100644 index 0000000..2820e5e --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-architecture-02f.json @@ -0,0 +1 @@ +{"tag":{"label":"Architecture","permalink":"/tags/architecture","allTagsPath":"/tags","count":1,"items":[{"id":"titres-professionnels/DWWM/AT2/CP7","title":"CP 7","description":"Synthèse de la CP 7 \"Développer des composants métier coté serveur\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP7"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-b9f.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-b9f.json new file mode 100644 index 0000000..1686fa6 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-b9f.json @@ -0,0 +1 @@ +{"tags":[{"label":"Conception","permalink":"/tags/conception","count":4},{"label":"Modélisation","permalink":"/tags/modelisation","count":4},{"label":"Base de données","permalink":"/tags/base-de-donnees","count":5},{"label":"Merise","permalink":"/tags/merise","count":4},{"label":"Dictionnaire de Données","permalink":"/tags/dictionnaire-de-donnees","count":4},{"label":"Modèle Conceptuel de Données (MCD)","permalink":"/tags/modele-conceptuel-de-donnees-mcd","count":4},{"label":"Modèle Logique de Données (MLD)","permalink":"/tags/modele-logique-de-donnees-mld","count":4},{"label":"Modèle Relationnel de Données (MRD)","permalink":"/tags/modele-relationnel-de-donnees-mrd","count":4},{"label":"Modèle Physique de Données (MPD)","permalink":"/tags/modele-physique-de-donnees-mpd","count":4},{"label":"SQL","permalink":"/tags/sql","count":5},{"label":"DWWM","permalink":"/tags/dwwm","count":12},{"label":"CDA","permalink":"/tags/cda","count":14},{"label":"Frontend","permalink":"/tags/frontend","count":8},{"label":"React","permalink":"/tags/react","count":8},{"label":"JavaScript/TypeScript","permalink":"/tags/java-script-type-script","count":9},{"label":"Bibliothèque","permalink":"/tags/bibliotheque","count":8},{"label":"Interface utilisateur (UI)","permalink":"/tags/interface-utilisateur-ui","count":8},{"label":"Vite","permalink":"/tags/vite","count":1},{"label":"Vike","permalink":"/tags/vike","count":1},{"label":"SSR","permalink":"/tags/ssr","count":1},{"label":"SSG","permalink":"/tags/ssg","count":1},{"label":"CSR","permalink":"/tags/csr","count":1},{"label":"Environnement de développement","permalink":"/tags/environnement-de-developpement","count":2},{"label":"Eco-conception","permalink":"/tags/eco-conception","count":3},{"label":"Accessibilité","permalink":"/tags/accessibilite","count":3},{"label":"SEO/Référencement naturel","permalink":"/tags/seo-referencement-naturel","count":3},{"label":"Maquettage","permalink":"/tags/maquettage","count":1},{"label":"Wireframe","permalink":"/tags/wireframe","count":1},{"label":"Zoning","permalink":"/tags/zoning","count":1},{"label":"Front-end","permalink":"/tags/front-end","count":3},{"label":"Intégration","permalink":"/tags/integration","count":1},{"label":"Responsive","permalink":"/tags/responsive","count":1},{"label":"HTML","permalink":"/tags/html","count":1},{"label":"CSS","permalink":"/tags/css","count":1},{"label":"Déploiement","permalink":"/tags/deploiement","count":2},{"label":"Reverse Proxy","permalink":"/tags/reverse-proxy","count":2},{"label":"Serveur web","permalink":"/tags/serveur-web","count":2},{"label":"Back-end","permalink":"/tags/back-end","count":4},{"label":"ORM/ODM","permalink":"/tags/orm-odm","count":1},{"label":"Sécurité","permalink":"/tags/securite","count":2},{"label":"Chiffrement","permalink":"/tags/chiffrement","count":1},{"label":"Hachage","permalink":"/tags/hachage","count":1},{"label":"Architecture","permalink":"/tags/architecture","count":1},{"label":"Design Pattern","permalink":"/tags/design-pattern","count":1},{"label":"Tests","permalink":"/tags/tests","count":1}]} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-back-end-7fe.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-back-end-7fe.json new file mode 100644 index 0000000..700ec80 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-back-end-7fe.json @@ -0,0 +1 @@ +{"tag":{"label":"Back-end","permalink":"/tags/back-end","allTagsPath":"/tags","count":4,"items":[{"id":"titres-professionnels/DWWM/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP5"},{"id":"titres-professionnels/DWWM/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 6 \"Développer des composants d'accès aux données SQL et NoSQL\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP6"},{"id":"titres-professionnels/DWWM/AT2/CP7","title":"CP 7","description":"Synthèse de la CP 7 \"Développer des composants métier coté serveur\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP7"},{"id":"titres-professionnels/DWWM/AT2/CP8","title":"CP 8","description":"Synthèse de la CP 8 \"Documenter le déploiement d'une application dynamique web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP8"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-base-de-donnees-6c5.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-base-de-donnees-6c5.json new file mode 100644 index 0000000..fbf0b01 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-base-de-donnees-6c5.json @@ -0,0 +1 @@ +{"tag":{"label":"Base de données","permalink":"/tags/base-de-donnees","allTagsPath":"/tags","count":5,"items":[{"id":"titres-professionnels/DWWM/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP5"},{"id":"titres-professionnels/DWWM/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 6 \"Développer des composants d'accès aux données SQL et NoSQL\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP6"},{"id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"},{"id":"ressources/bases-de-donnees/modelisation/mcd","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/mcd"},{"id":"ressources/bases-de-donnees/modelisation/merise","title":"Modélisation avec Merise","description":"Voyons ensemble comment on peut modéliser une base de données avec Merise !","permalink":"/ressources/bases-de-donnees/modelisation/merise"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-bibliotheque-7e0.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-bibliotheque-7e0.json new file mode 100644 index 0000000..2552018 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-bibliotheque-7e0.json @@ -0,0 +1 @@ +{"tag":{"label":"Bibliothèque","permalink":"/tags/bibliotheque","allTagsPath":"/tags","count":8,"items":[{"id":"ressources/frontend/react/initialiser-un-projet-react","title":"Initialisation","description":"Initialisons un nouveau projet React, avec ou sans TypeScript.","permalink":"/ressources/frontend/react/initialiser-un-projet-react"},{"id":"ressources/frontend/react/intro","title":"Introduction à React","description":"Parlons un peu de React, ce qu'il est, ce qu'il fait et pourquoi il est si populaire.","permalink":"/ressources/frontend/react/intro"},{"id":"ressources/frontend/react/contextes","title":"Le hook useContext de React","description":"Découvrez comment utiliser le hook useContext de React pour gérer les contextes dans vos applications.","permalink":"/ressources/frontend/react/contextes"},{"id":"ressources/frontend/react/reducers","title":"Le hook useReducer de React","description":"Découvrez comment utiliser le hook useReducer de React pour gérer l'état de vos composants de manière plus efficace.","permalink":"/ressources/frontend/react/reducers"},{"id":"ressources/frontend/react/hooks","title":"Les hooks de React","description":"Découvre les hooks de React, une fonctionnalité qui te permet de gérer le state et le cycle de vie de tes composants fonctionnels.","permalink":"/ressources/frontend/react/hooks"},{"id":"ressources/frontend/react/premier-composant","title":"Premier composant","description":"Voyons ensemble comment notre premier composant React !","permalink":"/ressources/frontend/react/premier-composant"},{"id":"ressources/frontend/react/state-et-cycle-de-vie","title":"State et cycle de vie","description":"Voyons ensemble comment gérer le state et le cycle de vie d'un composant React !","permalink":"/ressources/frontend/react/state-et-cycle-de-vie"},{"id":"ressources/frontend/react/syntaxe-jsx","title":"Syntaxe JSX","description":"Découvrons la syntaxe JSX, un langage de balisage utilisé par React pour décrire l'interface utilisateur.","permalink":"/ressources/frontend/react/syntaxe-jsx"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-cda-a60.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-cda-a60.json new file mode 100644 index 0000000..dd0fc56 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-cda-a60.json @@ -0,0 +1 @@ +{"tag":{"label":"CDA","permalink":"/tags/cda","allTagsPath":"/tags","count":14,"items":[{"id":"titres-professionnels/CDA/AT1/CP1","title":"CP 1","description":"Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","permalink":"/titres-professionnels/CDA/AT1/CP1"},{"id":"titres-professionnels/CDA/AT3/CP10","title":"CP 10","description":"Synthèse de la CP 10 \"Préparer et documenter le déploiement d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","permalink":"/titres-professionnels/CDA/AT3/CP10"},{"id":"titres-professionnels/CDA/AT3/CP11","title":"CP 11","description":"Synthèse de la CP 11 \"Contribuer à la mise en production dans une démarche DevOps\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","permalink":"/titres-professionnels/CDA/AT3/CP11"},{"id":"titres-professionnels/CDA/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 2 \"Développer des interfaces utilisateur\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","permalink":"/titres-professionnels/CDA/AT1/CP2"},{"id":"titres-professionnels/CDA/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Développer des composants métier\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","permalink":"/titres-professionnels/CDA/AT1/CP3"},{"id":"titres-professionnels/CDA/AT1/CP4","title":"CP 4","description":"Synthèse de la CP 4 \"Contribuer à la gestion d’un projet informatique\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","permalink":"/titres-professionnels/CDA/AT1/CP4"},{"id":"titres-professionnels/CDA/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Analyser les besoins et maquetter une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","permalink":"/titres-professionnels/CDA/AT2/CP5"},{"id":"titres-professionnels/CDA/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 6 \"Définir l’architecture logicielle d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","permalink":"/titres-professionnels/CDA/AT2/CP6"},{"id":"titres-professionnels/CDA/AT2/CP7","title":"CP 7","description":"Synthèse de la CP 7 \"Concevoir et mettre en place une base de données relationnelle\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","permalink":"/titres-professionnels/CDA/AT2/CP7"},{"id":"titres-professionnels/CDA/AT2/CP8","title":"CP 8","description":"Synthèse de la CP 8 \"Développer des composants d’accès aux données SQL et NoSQL\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","permalink":"/titres-professionnels/CDA/AT2/CP8"},{"id":"titres-professionnels/CDA/AT3/CP9","title":"CP 9","description":"Synthèse de la CP 9 \"Préparer et exécuter les plans de tests d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","permalink":"/titres-professionnels/CDA/AT3/CP9"},{"id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"},{"id":"ressources/bases-de-donnees/modelisation/mcd","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/mcd"},{"id":"titres-professionnels/CDA/intro","title":"Résumé","description":"Résumé du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04, actif depuis décembre 2023).","permalink":"/titres-professionnels/CDA/intro"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-chiffrement-d68.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-chiffrement-d68.json new file mode 100644 index 0000000..59cbce8 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-chiffrement-d68.json @@ -0,0 +1 @@ +{"tag":{"label":"Chiffrement","permalink":"/tags/chiffrement","allTagsPath":"/tags","count":1,"items":[{"id":"titres-professionnels/DWWM/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 6 \"Développer des composants d'accès aux données SQL et NoSQL\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP6"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-conception-113.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-conception-113.json new file mode 100644 index 0000000..84f7ed8 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-conception-113.json @@ -0,0 +1 @@ +{"tag":{"label":"Conception","permalink":"/tags/conception","allTagsPath":"/tags","count":4,"items":[{"id":"titres-professionnels/DWWM/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP5"},{"id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"},{"id":"ressources/bases-de-donnees/modelisation/mcd","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/mcd"},{"id":"ressources/bases-de-donnees/modelisation/merise","title":"Modélisation avec Merise","description":"Voyons ensemble comment on peut modéliser une base de données avec Merise !","permalink":"/ressources/bases-de-donnees/modelisation/merise"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-csr-5ca.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-csr-5ca.json new file mode 100644 index 0000000..3e30e78 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-csr-5ca.json @@ -0,0 +1 @@ +{"tag":{"label":"CSR","permalink":"/tags/csr","allTagsPath":"/tags","count":1,"items":[{"id":"ressources/frontend/react/initialiser-un-projet-react","title":"Initialisation","description":"Initialisons un nouveau projet React, avec ou sans TypeScript.","permalink":"/ressources/frontend/react/initialiser-un-projet-react"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-css-369.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-css-369.json new file mode 100644 index 0000000..f1251eb --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-css-369.json @@ -0,0 +1 @@ +{"tag":{"label":"CSS","permalink":"/tags/css","allTagsPath":"/tags","count":1,"items":[{"id":"titres-professionnels/DWWM/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP3"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-deploiement-fb0.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-deploiement-fb0.json new file mode 100644 index 0000000..23e1cca --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-deploiement-fb0.json @@ -0,0 +1 @@ +{"tag":{"label":"Déploiement","permalink":"/tags/deploiement","allTagsPath":"/tags","count":2,"items":[{"id":"titres-professionnels/DWWM/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP3"},{"id":"titres-professionnels/DWWM/AT2/CP8","title":"CP 8","description":"Synthèse de la CP 8 \"Documenter le déploiement d'une application dynamique web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP8"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-design-pattern-4d2.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-design-pattern-4d2.json new file mode 100644 index 0000000..34bdf20 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-design-pattern-4d2.json @@ -0,0 +1 @@ +{"tag":{"label":"Design Pattern","permalink":"/tags/design-pattern","allTagsPath":"/tags","count":1,"items":[{"id":"titres-professionnels/DWWM/AT2/CP7","title":"CP 7","description":"Synthèse de la CP 7 \"Développer des composants métier coté serveur\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP7"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-dictionnaire-de-donnees-6f4.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-dictionnaire-de-donnees-6f4.json new file mode 100644 index 0000000..798ea7b --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-dictionnaire-de-donnees-6f4.json @@ -0,0 +1 @@ +{"tag":{"label":"Dictionnaire de Données","permalink":"/tags/dictionnaire-de-donnees","allTagsPath":"/tags","count":4,"items":[{"id":"titres-professionnels/DWWM/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP5"},{"id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"},{"id":"ressources/bases-de-donnees/modelisation/mcd","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/mcd"},{"id":"ressources/bases-de-donnees/modelisation/merise","title":"Modélisation avec Merise","description":"Voyons ensemble comment on peut modéliser une base de données avec Merise !","permalink":"/ressources/bases-de-donnees/modelisation/merise"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-dwwm-ea7.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-dwwm-ea7.json new file mode 100644 index 0000000..8e028b7 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-dwwm-ea7.json @@ -0,0 +1 @@ +{"tag":{"label":"DWWM","permalink":"/tags/dwwm","allTagsPath":"/tags","count":12,"items":[{"id":"titres-professionnels/DWWM/AT1/CP1","title":"CP 1","description":"Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP1"},{"id":"titres-professionnels/DWWM/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 2 \"Maquetter des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP2"},{"id":"titres-professionnels/DWWM/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP3"},{"id":"titres-professionnels/DWWM/AT1/CP4","title":"CP 4","description":"Synthèse de la CP 4 \"Développer la partie dynamique des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP4"},{"id":"titres-professionnels/DWWM/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP5"},{"id":"titres-professionnels/DWWM/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 6 \"Développer des composants d'accès aux données SQL et NoSQL\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP6"},{"id":"titres-professionnels/DWWM/AT2/CP7","title":"CP 7","description":"Synthèse de la CP 7 \"Développer des composants métier coté serveur\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP7"},{"id":"titres-professionnels/DWWM/AT2/CP8","title":"CP 8","description":"Synthèse de la CP 8 \"Documenter le déploiement d'une application dynamique web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP8"},{"id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"},{"id":"ressources/bases-de-donnees/modelisation/mcd","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/mcd"},{"id":"ressources/bases-de-donnees/modelisation/merise","title":"Modélisation avec Merise","description":"Voyons ensemble comment on peut modéliser une base de données avec Merise !","permalink":"/ressources/bases-de-donnees/modelisation/merise"},{"id":"titres-professionnels/DWWM/intro","title":"Résumé","description":"Résumé du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04, actif depuis septembre 2023).","permalink":"/titres-professionnels/DWWM/intro"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-eco-conception-ad6.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-eco-conception-ad6.json new file mode 100644 index 0000000..59604a6 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-eco-conception-ad6.json @@ -0,0 +1 @@ +{"tag":{"label":"Eco-conception","permalink":"/tags/eco-conception","allTagsPath":"/tags","count":3,"items":[{"id":"titres-professionnels/DWWM/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 2 \"Maquetter des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP2"},{"id":"titres-professionnels/DWWM/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP3"},{"id":"titres-professionnels/DWWM/AT1/CP4","title":"CP 4","description":"Synthèse de la CP 4 \"Développer la partie dynamique des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP4"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-environnement-de-developpement-91b.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-environnement-de-developpement-91b.json new file mode 100644 index 0000000..49c827d --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-environnement-de-developpement-91b.json @@ -0,0 +1 @@ +{"tag":{"label":"Environnement de développement","permalink":"/tags/environnement-de-developpement","allTagsPath":"/tags","count":2,"items":[{"id":"titres-professionnels/CDA/AT1/CP1","title":"CP 1","description":"Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","permalink":"/titres-professionnels/CDA/AT1/CP1"},{"id":"titres-professionnels/DWWM/AT1/CP1","title":"CP 1","description":"Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP1"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-front-end-b92.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-front-end-b92.json new file mode 100644 index 0000000..c0a15f2 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-front-end-b92.json @@ -0,0 +1 @@ +{"tag":{"label":"Front-end","permalink":"/tags/front-end","allTagsPath":"/tags","count":3,"items":[{"id":"titres-professionnels/DWWM/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 2 \"Maquetter des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP2"},{"id":"titres-professionnels/DWWM/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP3"},{"id":"titres-professionnels/DWWM/AT1/CP4","title":"CP 4","description":"Synthèse de la CP 4 \"Développer la partie dynamique des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP4"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-frontend-a9a.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-frontend-a9a.json new file mode 100644 index 0000000..88e654f --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-frontend-a9a.json @@ -0,0 +1 @@ +{"tag":{"label":"Frontend","permalink":"/tags/frontend","allTagsPath":"/tags","count":8,"items":[{"id":"ressources/frontend/react/initialiser-un-projet-react","title":"Initialisation","description":"Initialisons un nouveau projet React, avec ou sans TypeScript.","permalink":"/ressources/frontend/react/initialiser-un-projet-react"},{"id":"ressources/frontend/react/intro","title":"Introduction à React","description":"Parlons un peu de React, ce qu'il est, ce qu'il fait et pourquoi il est si populaire.","permalink":"/ressources/frontend/react/intro"},{"id":"ressources/frontend/react/contextes","title":"Le hook useContext de React","description":"Découvrez comment utiliser le hook useContext de React pour gérer les contextes dans vos applications.","permalink":"/ressources/frontend/react/contextes"},{"id":"ressources/frontend/react/reducers","title":"Le hook useReducer de React","description":"Découvrez comment utiliser le hook useReducer de React pour gérer l'état de vos composants de manière plus efficace.","permalink":"/ressources/frontend/react/reducers"},{"id":"ressources/frontend/react/hooks","title":"Les hooks de React","description":"Découvre les hooks de React, une fonctionnalité qui te permet de gérer le state et le cycle de vie de tes composants fonctionnels.","permalink":"/ressources/frontend/react/hooks"},{"id":"ressources/frontend/react/premier-composant","title":"Premier composant","description":"Voyons ensemble comment notre premier composant React !","permalink":"/ressources/frontend/react/premier-composant"},{"id":"ressources/frontend/react/state-et-cycle-de-vie","title":"State et cycle de vie","description":"Voyons ensemble comment gérer le state et le cycle de vie d'un composant React !","permalink":"/ressources/frontend/react/state-et-cycle-de-vie"},{"id":"ressources/frontend/react/syntaxe-jsx","title":"Syntaxe JSX","description":"Découvrons la syntaxe JSX, un langage de balisage utilisé par React pour décrire l'interface utilisateur.","permalink":"/ressources/frontend/react/syntaxe-jsx"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-hachage-a9b.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-hachage-a9b.json new file mode 100644 index 0000000..1c72f8b --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-hachage-a9b.json @@ -0,0 +1 @@ +{"tag":{"label":"Hachage","permalink":"/tags/hachage","allTagsPath":"/tags","count":1,"items":[{"id":"titres-professionnels/DWWM/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 6 \"Développer des composants d'accès aux données SQL et NoSQL\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP6"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-html-ea7.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-html-ea7.json new file mode 100644 index 0000000..97d8d6e --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-html-ea7.json @@ -0,0 +1 @@ +{"tag":{"label":"HTML","permalink":"/tags/html","allTagsPath":"/tags","count":1,"items":[{"id":"titres-professionnels/DWWM/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP3"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-integration-c39.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-integration-c39.json new file mode 100644 index 0000000..125702b --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-integration-c39.json @@ -0,0 +1 @@ +{"tag":{"label":"Intégration","permalink":"/tags/integration","allTagsPath":"/tags","count":1,"items":[{"id":"titres-professionnels/DWWM/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP3"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-interface-utilisateur-ui-bec.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-interface-utilisateur-ui-bec.json new file mode 100644 index 0000000..0711e19 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-interface-utilisateur-ui-bec.json @@ -0,0 +1 @@ +{"tag":{"label":"Interface utilisateur (UI)","permalink":"/tags/interface-utilisateur-ui","allTagsPath":"/tags","count":8,"items":[{"id":"ressources/frontend/react/initialiser-un-projet-react","title":"Initialisation","description":"Initialisons un nouveau projet React, avec ou sans TypeScript.","permalink":"/ressources/frontend/react/initialiser-un-projet-react"},{"id":"ressources/frontend/react/intro","title":"Introduction à React","description":"Parlons un peu de React, ce qu'il est, ce qu'il fait et pourquoi il est si populaire.","permalink":"/ressources/frontend/react/intro"},{"id":"ressources/frontend/react/contextes","title":"Le hook useContext de React","description":"Découvrez comment utiliser le hook useContext de React pour gérer les contextes dans vos applications.","permalink":"/ressources/frontend/react/contextes"},{"id":"ressources/frontend/react/reducers","title":"Le hook useReducer de React","description":"Découvrez comment utiliser le hook useReducer de React pour gérer l'état de vos composants de manière plus efficace.","permalink":"/ressources/frontend/react/reducers"},{"id":"ressources/frontend/react/hooks","title":"Les hooks de React","description":"Découvre les hooks de React, une fonctionnalité qui te permet de gérer le state et le cycle de vie de tes composants fonctionnels.","permalink":"/ressources/frontend/react/hooks"},{"id":"ressources/frontend/react/premier-composant","title":"Premier composant","description":"Voyons ensemble comment notre premier composant React !","permalink":"/ressources/frontend/react/premier-composant"},{"id":"ressources/frontend/react/state-et-cycle-de-vie","title":"State et cycle de vie","description":"Voyons ensemble comment gérer le state et le cycle de vie d'un composant React !","permalink":"/ressources/frontend/react/state-et-cycle-de-vie"},{"id":"ressources/frontend/react/syntaxe-jsx","title":"Syntaxe JSX","description":"Découvrons la syntaxe JSX, un langage de balisage utilisé par React pour décrire l'interface utilisateur.","permalink":"/ressources/frontend/react/syntaxe-jsx"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-java-script-type-script-4ed.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-java-script-type-script-4ed.json new file mode 100644 index 0000000..dd67e99 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-java-script-type-script-4ed.json @@ -0,0 +1 @@ +{"tag":{"label":"JavaScript/TypeScript","permalink":"/tags/java-script-type-script","allTagsPath":"/tags","count":9,"items":[{"id":"titres-professionnels/DWWM/AT1/CP4","title":"CP 4","description":"Synthèse de la CP 4 \"Développer la partie dynamique des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP4"},{"id":"ressources/frontend/react/initialiser-un-projet-react","title":"Initialisation","description":"Initialisons un nouveau projet React, avec ou sans TypeScript.","permalink":"/ressources/frontend/react/initialiser-un-projet-react"},{"id":"ressources/frontend/react/intro","title":"Introduction à React","description":"Parlons un peu de React, ce qu'il est, ce qu'il fait et pourquoi il est si populaire.","permalink":"/ressources/frontend/react/intro"},{"id":"ressources/frontend/react/contextes","title":"Le hook useContext de React","description":"Découvrez comment utiliser le hook useContext de React pour gérer les contextes dans vos applications.","permalink":"/ressources/frontend/react/contextes"},{"id":"ressources/frontend/react/reducers","title":"Le hook useReducer de React","description":"Découvrez comment utiliser le hook useReducer de React pour gérer l'état de vos composants de manière plus efficace.","permalink":"/ressources/frontend/react/reducers"},{"id":"ressources/frontend/react/hooks","title":"Les hooks de React","description":"Découvre les hooks de React, une fonctionnalité qui te permet de gérer le state et le cycle de vie de tes composants fonctionnels.","permalink":"/ressources/frontend/react/hooks"},{"id":"ressources/frontend/react/premier-composant","title":"Premier composant","description":"Voyons ensemble comment notre premier composant React !","permalink":"/ressources/frontend/react/premier-composant"},{"id":"ressources/frontend/react/state-et-cycle-de-vie","title":"State et cycle de vie","description":"Voyons ensemble comment gérer le state et le cycle de vie d'un composant React !","permalink":"/ressources/frontend/react/state-et-cycle-de-vie"},{"id":"ressources/frontend/react/syntaxe-jsx","title":"Syntaxe JSX","description":"Découvrons la syntaxe JSX, un langage de balisage utilisé par React pour décrire l'interface utilisateur.","permalink":"/ressources/frontend/react/syntaxe-jsx"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-maquettage-4e5.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-maquettage-4e5.json new file mode 100644 index 0000000..86e295d --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-maquettage-4e5.json @@ -0,0 +1 @@ +{"tag":{"label":"Maquettage","permalink":"/tags/maquettage","allTagsPath":"/tags","count":1,"items":[{"id":"titres-professionnels/DWWM/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 2 \"Maquetter des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP2"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-merise-88f.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-merise-88f.json new file mode 100644 index 0000000..374bedc --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-merise-88f.json @@ -0,0 +1 @@ +{"tag":{"label":"Merise","permalink":"/tags/merise","allTagsPath":"/tags","count":4,"items":[{"id":"titres-professionnels/DWWM/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP5"},{"id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"},{"id":"ressources/bases-de-donnees/modelisation/mcd","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/mcd"},{"id":"ressources/bases-de-donnees/modelisation/merise","title":"Modélisation avec Merise","description":"Voyons ensemble comment on peut modéliser une base de données avec Merise !","permalink":"/ressources/bases-de-donnees/modelisation/merise"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modele-conceptuel-de-donnees-mcd-4e2.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modele-conceptuel-de-donnees-mcd-4e2.json new file mode 100644 index 0000000..752a881 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modele-conceptuel-de-donnees-mcd-4e2.json @@ -0,0 +1 @@ +{"tag":{"label":"Modèle Conceptuel de Données (MCD)","permalink":"/tags/modele-conceptuel-de-donnees-mcd","allTagsPath":"/tags","count":4,"items":[{"id":"titres-professionnels/DWWM/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP5"},{"id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"},{"id":"ressources/bases-de-donnees/modelisation/mcd","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/mcd"},{"id":"ressources/bases-de-donnees/modelisation/merise","title":"Modélisation avec Merise","description":"Voyons ensemble comment on peut modéliser une base de données avec Merise !","permalink":"/ressources/bases-de-donnees/modelisation/merise"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modele-logique-de-donnees-mld-b5b.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modele-logique-de-donnees-mld-b5b.json new file mode 100644 index 0000000..177386b --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modele-logique-de-donnees-mld-b5b.json @@ -0,0 +1 @@ +{"tag":{"label":"Modèle Logique de Données (MLD)","permalink":"/tags/modele-logique-de-donnees-mld","allTagsPath":"/tags","count":4,"items":[{"id":"titres-professionnels/DWWM/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP5"},{"id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"},{"id":"ressources/bases-de-donnees/modelisation/mcd","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/mcd"},{"id":"ressources/bases-de-donnees/modelisation/merise","title":"Modélisation avec Merise","description":"Voyons ensemble comment on peut modéliser une base de données avec Merise !","permalink":"/ressources/bases-de-donnees/modelisation/merise"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modele-physique-de-donnees-mpd-715.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modele-physique-de-donnees-mpd-715.json new file mode 100644 index 0000000..0477efa --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modele-physique-de-donnees-mpd-715.json @@ -0,0 +1 @@ +{"tag":{"label":"Modèle Physique de Données (MPD)","permalink":"/tags/modele-physique-de-donnees-mpd","allTagsPath":"/tags","count":4,"items":[{"id":"titres-professionnels/DWWM/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP5"},{"id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"},{"id":"ressources/bases-de-donnees/modelisation/mcd","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/mcd"},{"id":"ressources/bases-de-donnees/modelisation/merise","title":"Modélisation avec Merise","description":"Voyons ensemble comment on peut modéliser une base de données avec Merise !","permalink":"/ressources/bases-de-donnees/modelisation/merise"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modele-relationnel-de-donnees-mrd-c20.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modele-relationnel-de-donnees-mrd-c20.json new file mode 100644 index 0000000..e49278d --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modele-relationnel-de-donnees-mrd-c20.json @@ -0,0 +1 @@ +{"tag":{"label":"Modèle Relationnel de Données (MRD)","permalink":"/tags/modele-relationnel-de-donnees-mrd","allTagsPath":"/tags","count":4,"items":[{"id":"titres-professionnels/DWWM/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP5"},{"id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"},{"id":"ressources/bases-de-donnees/modelisation/mcd","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/mcd"},{"id":"ressources/bases-de-donnees/modelisation/merise","title":"Modélisation avec Merise","description":"Voyons ensemble comment on peut modéliser une base de données avec Merise !","permalink":"/ressources/bases-de-donnees/modelisation/merise"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modelisation-8ee.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modelisation-8ee.json new file mode 100644 index 0000000..6261e3e --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-modelisation-8ee.json @@ -0,0 +1 @@ +{"tag":{"label":"Modélisation","permalink":"/tags/modelisation","allTagsPath":"/tags","count":4,"items":[{"id":"titres-professionnels/DWWM/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP5"},{"id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"},{"id":"ressources/bases-de-donnees/modelisation/mcd","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/mcd"},{"id":"ressources/bases-de-donnees/modelisation/merise","title":"Modélisation avec Merise","description":"Voyons ensemble comment on peut modéliser une base de données avec Merise !","permalink":"/ressources/bases-de-donnees/modelisation/merise"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-orm-odm-4b7.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-orm-odm-4b7.json new file mode 100644 index 0000000..405ed48 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-orm-odm-4b7.json @@ -0,0 +1 @@ +{"tag":{"label":"ORM/ODM","permalink":"/tags/orm-odm","allTagsPath":"/tags","count":1,"items":[{"id":"titres-professionnels/DWWM/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 6 \"Développer des composants d'accès aux données SQL et NoSQL\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP6"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-react-df3.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-react-df3.json new file mode 100644 index 0000000..2c4dc49 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-react-df3.json @@ -0,0 +1 @@ +{"tag":{"label":"React","permalink":"/tags/react","allTagsPath":"/tags","count":8,"items":[{"id":"ressources/frontend/react/initialiser-un-projet-react","title":"Initialisation","description":"Initialisons un nouveau projet React, avec ou sans TypeScript.","permalink":"/ressources/frontend/react/initialiser-un-projet-react"},{"id":"ressources/frontend/react/intro","title":"Introduction à React","description":"Parlons un peu de React, ce qu'il est, ce qu'il fait et pourquoi il est si populaire.","permalink":"/ressources/frontend/react/intro"},{"id":"ressources/frontend/react/contextes","title":"Le hook useContext de React","description":"Découvrez comment utiliser le hook useContext de React pour gérer les contextes dans vos applications.","permalink":"/ressources/frontend/react/contextes"},{"id":"ressources/frontend/react/reducers","title":"Le hook useReducer de React","description":"Découvrez comment utiliser le hook useReducer de React pour gérer l'état de vos composants de manière plus efficace.","permalink":"/ressources/frontend/react/reducers"},{"id":"ressources/frontend/react/hooks","title":"Les hooks de React","description":"Découvre les hooks de React, une fonctionnalité qui te permet de gérer le state et le cycle de vie de tes composants fonctionnels.","permalink":"/ressources/frontend/react/hooks"},{"id":"ressources/frontend/react/premier-composant","title":"Premier composant","description":"Voyons ensemble comment notre premier composant React !","permalink":"/ressources/frontend/react/premier-composant"},{"id":"ressources/frontend/react/state-et-cycle-de-vie","title":"State et cycle de vie","description":"Voyons ensemble comment gérer le state et le cycle de vie d'un composant React !","permalink":"/ressources/frontend/react/state-et-cycle-de-vie"},{"id":"ressources/frontend/react/syntaxe-jsx","title":"Syntaxe JSX","description":"Découvrons la syntaxe JSX, un langage de balisage utilisé par React pour décrire l'interface utilisateur.","permalink":"/ressources/frontend/react/syntaxe-jsx"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-responsive-3f9.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-responsive-3f9.json new file mode 100644 index 0000000..f12b0e5 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-responsive-3f9.json @@ -0,0 +1 @@ +{"tag":{"label":"Responsive","permalink":"/tags/responsive","allTagsPath":"/tags","count":1,"items":[{"id":"titres-professionnels/DWWM/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP3"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-reverse-proxy-c23.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-reverse-proxy-c23.json new file mode 100644 index 0000000..31ea6aa --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-reverse-proxy-c23.json @@ -0,0 +1 @@ +{"tag":{"label":"Reverse Proxy","permalink":"/tags/reverse-proxy","allTagsPath":"/tags","count":2,"items":[{"id":"titres-professionnels/DWWM/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP3"},{"id":"titres-professionnels/DWWM/AT2/CP8","title":"CP 8","description":"Synthèse de la CP 8 \"Documenter le déploiement d'une application dynamique web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP8"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-securite-b35.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-securite-b35.json new file mode 100644 index 0000000..ce406e5 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-securite-b35.json @@ -0,0 +1 @@ +{"tag":{"label":"Sécurité","permalink":"/tags/securite","allTagsPath":"/tags","count":2,"items":[{"id":"titres-professionnels/DWWM/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 6 \"Développer des composants d'accès aux données SQL et NoSQL\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP6"},{"id":"titres-professionnels/DWWM/AT2/CP7","title":"CP 7","description":"Synthèse de la CP 7 \"Développer des composants métier coté serveur\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP7"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-seo-referencement-naturel-192.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-seo-referencement-naturel-192.json new file mode 100644 index 0000000..390ba2f --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-seo-referencement-naturel-192.json @@ -0,0 +1 @@ +{"tag":{"label":"SEO/Référencement naturel","permalink":"/tags/seo-referencement-naturel","allTagsPath":"/tags","count":3,"items":[{"id":"titres-professionnels/DWWM/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 2 \"Maquetter des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP2"},{"id":"titres-professionnels/DWWM/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP3"},{"id":"titres-professionnels/DWWM/AT1/CP4","title":"CP 4","description":"Synthèse de la CP 4 \"Développer la partie dynamique des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP4"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-serveur-web-fe0.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-serveur-web-fe0.json new file mode 100644 index 0000000..673b742 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-serveur-web-fe0.json @@ -0,0 +1 @@ +{"tag":{"label":"Serveur web","permalink":"/tags/serveur-web","allTagsPath":"/tags","count":2,"items":[{"id":"titres-professionnels/DWWM/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP3"},{"id":"titres-professionnels/DWWM/AT2/CP8","title":"CP 8","description":"Synthèse de la CP 8 \"Documenter le déploiement d'une application dynamique web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP8"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-sql-d44.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-sql-d44.json new file mode 100644 index 0000000..0b18f88 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-sql-d44.json @@ -0,0 +1 @@ +{"tag":{"label":"SQL","permalink":"/tags/sql","allTagsPath":"/tags","count":5,"items":[{"id":"titres-professionnels/DWWM/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP5"},{"id":"titres-professionnels/DWWM/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 6 \"Développer des composants d'accès aux données SQL et NoSQL\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP6"},{"id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"},{"id":"ressources/bases-de-donnees/modelisation/mcd","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","permalink":"/ressources/bases-de-donnees/modelisation/mcd"},{"id":"ressources/bases-de-donnees/modelisation/merise","title":"Modélisation avec Merise","description":"Voyons ensemble comment on peut modéliser une base de données avec Merise !","permalink":"/ressources/bases-de-donnees/modelisation/merise"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-ssg-04a.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-ssg-04a.json new file mode 100644 index 0000000..4f23ce7 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-ssg-04a.json @@ -0,0 +1 @@ +{"tag":{"label":"SSG","permalink":"/tags/ssg","allTagsPath":"/tags","count":1,"items":[{"id":"ressources/frontend/react/initialiser-un-projet-react","title":"Initialisation","description":"Initialisons un nouveau projet React, avec ou sans TypeScript.","permalink":"/ressources/frontend/react/initialiser-un-projet-react"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-ssr-9fe.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-ssr-9fe.json new file mode 100644 index 0000000..c8573cf --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-ssr-9fe.json @@ -0,0 +1 @@ +{"tag":{"label":"SSR","permalink":"/tags/ssr","allTagsPath":"/tags","count":1,"items":[{"id":"ressources/frontend/react/initialiser-un-projet-react","title":"Initialisation","description":"Initialisons un nouveau projet React, avec ou sans TypeScript.","permalink":"/ressources/frontend/react/initialiser-un-projet-react"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-tests-694.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-tests-694.json new file mode 100644 index 0000000..35dfacc --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-tests-694.json @@ -0,0 +1 @@ +{"tag":{"label":"Tests","permalink":"/tags/tests","allTagsPath":"/tags","count":1,"items":[{"id":"titres-professionnels/DWWM/AT2/CP7","title":"CP 7","description":"Synthèse de la CP 7 \"Développer des composants métier coté serveur\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT2/CP7"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-vike-d66.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-vike-d66.json new file mode 100644 index 0000000..010bbef --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-vike-d66.json @@ -0,0 +1 @@ +{"tag":{"label":"Vike","permalink":"/tags/vike","allTagsPath":"/tags","count":1,"items":[{"id":"ressources/frontend/react/initialiser-un-projet-react","title":"Initialisation","description":"Initialisons un nouveau projet React, avec ou sans TypeScript.","permalink":"/ressources/frontend/react/initialiser-un-projet-react"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-vite-893.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-vite-893.json new file mode 100644 index 0000000..6c7b405 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-vite-893.json @@ -0,0 +1 @@ +{"tag":{"label":"Vite","permalink":"/tags/vite","allTagsPath":"/tags","count":1,"items":[{"id":"ressources/frontend/react/initialiser-un-projet-react","title":"Initialisation","description":"Initialisons un nouveau projet React, avec ou sans TypeScript.","permalink":"/ressources/frontend/react/initialiser-un-projet-react"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-wireframe-020.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-wireframe-020.json new file mode 100644 index 0000000..0de5713 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-wireframe-020.json @@ -0,0 +1 @@ +{"tag":{"label":"Wireframe","permalink":"/tags/wireframe","allTagsPath":"/tags","count":1,"items":[{"id":"titres-professionnels/DWWM/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 2 \"Maquetter des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP2"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-zoning-463.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-zoning-463.json new file mode 100644 index 0000000..4c60c5c --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/p/tags-zoning-463.json @@ -0,0 +1 @@ +{"tag":{"label":"Zoning","permalink":"/tags/zoning","allTagsPath":"/tags","count":1,"items":[{"id":"titres-professionnels/DWWM/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 2 \"Maquetter des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","permalink":"/titres-professionnels/DWWM/AT1/CP2"}],"unlisted":false}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-contribuer-mdx-70e.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-contribuer-mdx-70e.json new file mode 100644 index 0000000..0ae337b --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-contribuer-mdx-70e.json @@ -0,0 +1,24 @@ +{ + "id": "contribuer", + "title": "🤝 Contribuer", + "description": "Tu souhaites contribuer à Memento Dev ? C'est par ici !", + "source": "@site/docs/contribuer.mdx", + "sourceDirName": ".", + "slug": "/contribuer", + "permalink": "/contribuer", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/contribuer.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 99999, + "frontMatter": { + "sidebar_position": 99999, + "description": "Tu souhaites contribuer à Memento Dev ? C'est par ici !" + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "🤗 Soutiens et contributeurs", + "permalink": "/soutiens-et-contributeurs" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-glossaires-titres-professionnel-mdx-ed4.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-glossaires-titres-professionnel-mdx-ed4.json new file mode 100644 index 0000000..7ec6bf9 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-glossaires-titres-professionnel-mdx-ed4.json @@ -0,0 +1,29 @@ +{ + "id": "glossaires/titres-professionnel", + "title": "Titres professionnels", + "description": "Définitions des termes utilisés dans le cadre des titres professionnels.", + "source": "@site/docs/glossaires/titres-professionnel.mdx", + "sourceDirName": "glossaires", + "slug": "/glossaires/titres-professionnel", + "permalink": "/glossaires/titres-professionnel", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/glossaires/titres-professionnel.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1, + "title": "Titres professionnels", + "description": "Définitions des termes utilisés dans le cadre des titres professionnels." + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "📜 Préambule", + "permalink": "/intro" + }, + "next": { + "title": "🎓 Titres professionnels", + "permalink": "/category/-titres-professionnels" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-intro-mdx-f84.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-intro-mdx-f84.json new file mode 100644 index 0000000..c3cc522 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-intro-mdx-f84.json @@ -0,0 +1,24 @@ +{ + "id": "intro", + "title": "📜 Préambule", + "description": "Memento Dev, une plateforme open-source de partage de connaissances en développement !", + "source": "@site/docs/intro.mdx", + "sourceDirName": ".", + "slug": "/intro", + "permalink": "/intro", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/intro.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1, + "description": "Memento Dev, une plateforme open-source de partage de connaissances en développement !" + }, + "sidebar": "tutorialSidebar", + "next": { + "title": "Titres professionnels", + "permalink": "/glossaires/titres-professionnel" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-bases-de-donnees-modelisation-dictionnaire-de-donnees-mdx-f25.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-bases-de-donnees-modelisation-dictionnaire-de-donnees-mdx-f25.json new file mode 100644 index 0000000..0c3db15 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-bases-de-donnees-modelisation-dictionnaire-de-donnees-mdx-f25.json @@ -0,0 +1,104 @@ +{ + "id": "ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees", + "title": "Création du MCD", + "description": "Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.", + "source": "@site/docs/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees.mdx", + "sourceDirName": "ressources/bases-de-donnees/modelisation", + "slug": "/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees", + "permalink": "/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees.mdx", + "tags": [ + { + "inline": true, + "label": "Conception", + "permalink": "/tags/conception" + }, + { + "inline": true, + "label": "Modélisation", + "permalink": "/tags/modelisation" + }, + { + "inline": true, + "label": "Base de données", + "permalink": "/tags/base-de-donnees" + }, + { + "inline": true, + "label": "Merise", + "permalink": "/tags/merise" + }, + { + "inline": true, + "label": "Dictionnaire de Données", + "permalink": "/tags/dictionnaire-de-donnees" + }, + { + "inline": true, + "label": "Modèle Conceptuel de Données (MCD)", + "permalink": "/tags/modele-conceptuel-de-donnees-mcd" + }, + { + "inline": true, + "label": "Modèle Logique de Données (MLD)", + "permalink": "/tags/modele-logique-de-donnees-mld" + }, + { + "inline": true, + "label": "Modèle Relationnel de Données (MRD)", + "permalink": "/tags/modele-relationnel-de-donnees-mrd" + }, + { + "inline": true, + "label": "Modèle Physique de Données (MPD)", + "permalink": "/tags/modele-physique-de-donnees-mpd" + }, + { + "inline": true, + "label": "SQL", + "permalink": "/tags/sql" + }, + { + "inline": true, + "label": "DWWM", + "permalink": "/tags/dwwm" + }, + { + "inline": true, + "label": "CDA", + "permalink": "/tags/cda" + } + ], + "version": "current", + "sidebarPosition": 3, + "frontMatter": { + "sidebar_position": 3, + "title": "Création du MCD", + "description": "Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.", + "tags": [ + "Conception", + "Modélisation", + "Base de données", + "Merise", + "Dictionnaire de Données", + "Modèle Conceptuel de Données (MCD)", + "Modèle Logique de Données (MLD)", + "Modèle Relationnel de Données (MRD)", + "Modèle Physique de Données (MPD)", + "SQL", + "DWWM", + "CDA" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Modélisation avec Merise", + "permalink": "/ressources/bases-de-donnees/modelisation/merise" + }, + "next": { + "title": "Création du MCD", + "permalink": "/ressources/bases-de-donnees/modelisation/mcd" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-bases-de-donnees-modelisation-mcd-mdx-bb4.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-bases-de-donnees-modelisation-mcd-mdx-bb4.json new file mode 100644 index 0000000..7fab1ca --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-bases-de-donnees-modelisation-mcd-mdx-bb4.json @@ -0,0 +1,104 @@ +{ + "id": "ressources/bases-de-donnees/modelisation/mcd", + "title": "Création du MCD", + "description": "Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.", + "source": "@site/docs/ressources/bases-de-donnees/modelisation/mcd.mdx", + "sourceDirName": "ressources/bases-de-donnees/modelisation", + "slug": "/ressources/bases-de-donnees/modelisation/mcd", + "permalink": "/ressources/bases-de-donnees/modelisation/mcd", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/bases-de-donnees/modelisation/mcd.mdx", + "tags": [ + { + "inline": true, + "label": "Conception", + "permalink": "/tags/conception" + }, + { + "inline": true, + "label": "Modélisation", + "permalink": "/tags/modelisation" + }, + { + "inline": true, + "label": "Base de données", + "permalink": "/tags/base-de-donnees" + }, + { + "inline": true, + "label": "Merise", + "permalink": "/tags/merise" + }, + { + "inline": true, + "label": "Dictionnaire de Données", + "permalink": "/tags/dictionnaire-de-donnees" + }, + { + "inline": true, + "label": "Modèle Conceptuel de Données (MCD)", + "permalink": "/tags/modele-conceptuel-de-donnees-mcd" + }, + { + "inline": true, + "label": "Modèle Logique de Données (MLD)", + "permalink": "/tags/modele-logique-de-donnees-mld" + }, + { + "inline": true, + "label": "Modèle Relationnel de Données (MRD)", + "permalink": "/tags/modele-relationnel-de-donnees-mrd" + }, + { + "inline": true, + "label": "Modèle Physique de Données (MPD)", + "permalink": "/tags/modele-physique-de-donnees-mpd" + }, + { + "inline": true, + "label": "SQL", + "permalink": "/tags/sql" + }, + { + "inline": true, + "label": "DWWM", + "permalink": "/tags/dwwm" + }, + { + "inline": true, + "label": "CDA", + "permalink": "/tags/cda" + } + ], + "version": "current", + "sidebarPosition": 3, + "frontMatter": { + "sidebar_position": 3, + "title": "Création du MCD", + "description": "Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.", + "tags": [ + "Conception", + "Modélisation", + "Base de données", + "Merise", + "Dictionnaire de Données", + "Modèle Conceptuel de Données (MCD)", + "Modèle Logique de Données (MLD)", + "Modèle Relationnel de Données (MRD)", + "Modèle Physique de Données (MPD)", + "SQL", + "DWWM", + "CDA" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Création du MCD", + "permalink": "/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees" + }, + "next": { + "title": "🌈 Frontend", + "permalink": "/category/-frontend" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-bases-de-donnees-modelisation-merise-mdx-5d6.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-bases-de-donnees-modelisation-merise-mdx-5d6.json new file mode 100644 index 0000000..b876859 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-bases-de-donnees-modelisation-merise-mdx-5d6.json @@ -0,0 +1,98 @@ +{ + "id": "ressources/bases-de-donnees/modelisation/merise", + "title": "Modélisation avec Merise", + "description": "Voyons ensemble comment on peut modéliser une base de données avec Merise !", + "source": "@site/docs/ressources/bases-de-donnees/modelisation/merise.mdx", + "sourceDirName": "ressources/bases-de-donnees/modelisation", + "slug": "/ressources/bases-de-donnees/modelisation/merise", + "permalink": "/ressources/bases-de-donnees/modelisation/merise", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/bases-de-donnees/modelisation/merise.mdx", + "tags": [ + { + "inline": true, + "label": "Conception", + "permalink": "/tags/conception" + }, + { + "inline": true, + "label": "Modélisation", + "permalink": "/tags/modelisation" + }, + { + "inline": true, + "label": "Base de données", + "permalink": "/tags/base-de-donnees" + }, + { + "inline": true, + "label": "Merise", + "permalink": "/tags/merise" + }, + { + "inline": true, + "label": "Dictionnaire de Données", + "permalink": "/tags/dictionnaire-de-donnees" + }, + { + "inline": true, + "label": "Modèle Conceptuel de Données (MCD)", + "permalink": "/tags/modele-conceptuel-de-donnees-mcd" + }, + { + "inline": true, + "label": "Modèle Logique de Données (MLD)", + "permalink": "/tags/modele-logique-de-donnees-mld" + }, + { + "inline": true, + "label": "Modèle Relationnel de Données (MRD)", + "permalink": "/tags/modele-relationnel-de-donnees-mrd" + }, + { + "inline": true, + "label": "Modèle Physique de Données (MPD)", + "permalink": "/tags/modele-physique-de-donnees-mpd" + }, + { + "inline": true, + "label": "SQL", + "permalink": "/tags/sql" + }, + { + "inline": true, + "label": "DWWM", + "permalink": "/tags/dwwm" + } + ], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1, + "title": "Modélisation avec Merise", + "description": "Voyons ensemble comment on peut modéliser une base de données avec Merise !", + "tags": [ + "Conception", + "Modélisation", + "Base de données", + "Merise", + "Dictionnaire de Données", + "Modèle Conceptuel de Données (MCD)", + "Modèle Logique de Données (MLD)", + "Modèle Relationnel de Données (MRD)", + "Modèle Physique de Données (MPD)", + "SQL", + "DWWM" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "💽 Bases de données", + "permalink": "/category/-bases-de-données" + }, + "next": { + "title": "Création du MCD", + "permalink": "/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-contextes-mdx-cbc.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-contextes-mdx-cbc.json new file mode 100644 index 0000000..295afbe --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-contextes-mdx-cbc.json @@ -0,0 +1,62 @@ +{ + "id": "ressources/frontend/react/contextes", + "title": "Le hook useContext de React", + "description": "Découvrez comment utiliser le hook useContext de React pour gérer les contextes dans vos applications.", + "source": "@site/docs/ressources/frontend/react/contextes.mdx", + "sourceDirName": "ressources/frontend/react", + "slug": "/ressources/frontend/react/contextes", + "permalink": "/ressources/frontend/react/contextes", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/contextes.mdx", + "tags": [ + { + "inline": true, + "label": "Frontend", + "permalink": "/tags/frontend" + }, + { + "inline": true, + "label": "React", + "permalink": "/tags/react" + }, + { + "inline": true, + "label": "JavaScript/TypeScript", + "permalink": "/tags/java-script-type-script" + }, + { + "inline": true, + "label": "Bibliothèque", + "permalink": "/tags/bibliotheque" + }, + { + "inline": true, + "label": "Interface utilisateur (UI)", + "permalink": "/tags/interface-utilisateur-ui" + } + ], + "version": "current", + "sidebarPosition": 7, + "frontMatter": { + "sidebar_position": 7, + "title": "Le hook useContext de React", + "description": "Découvrez comment utiliser le hook useContext de React pour gérer les contextes dans vos applications.", + "tags": [ + "Frontend", + "React", + "JavaScript/TypeScript", + "Bibliothèque", + "Interface utilisateur (UI)" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Les hooks de React", + "permalink": "/ressources/frontend/react/hooks" + }, + "next": { + "title": "Le hook useReducer de React", + "permalink": "/ressources/frontend/react/reducers" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-hooks-mdx-d19.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-hooks-mdx-d19.json new file mode 100644 index 0000000..bc1fe2d --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-hooks-mdx-d19.json @@ -0,0 +1,62 @@ +{ + "id": "ressources/frontend/react/hooks", + "title": "Les hooks de React", + "description": "Découvre les hooks de React, une fonctionnalité qui te permet de gérer le state et le cycle de vie de tes composants fonctionnels.", + "source": "@site/docs/ressources/frontend/react/hooks.mdx", + "sourceDirName": "ressources/frontend/react", + "slug": "/ressources/frontend/react/hooks", + "permalink": "/ressources/frontend/react/hooks", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/hooks.mdx", + "tags": [ + { + "inline": true, + "label": "Frontend", + "permalink": "/tags/frontend" + }, + { + "inline": true, + "label": "React", + "permalink": "/tags/react" + }, + { + "inline": true, + "label": "JavaScript/TypeScript", + "permalink": "/tags/java-script-type-script" + }, + { + "inline": true, + "label": "Bibliothèque", + "permalink": "/tags/bibliotheque" + }, + { + "inline": true, + "label": "Interface utilisateur (UI)", + "permalink": "/tags/interface-utilisateur-ui" + } + ], + "version": "current", + "sidebarPosition": 6, + "frontMatter": { + "sidebar_position": 6, + "title": "Les hooks de React", + "description": "Découvre les hooks de React, une fonctionnalité qui te permet de gérer le state et le cycle de vie de tes composants fonctionnels.", + "tags": [ + "Frontend", + "React", + "JavaScript/TypeScript", + "Bibliothèque", + "Interface utilisateur (UI)" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "State et cycle de vie", + "permalink": "/ressources/frontend/react/state-et-cycle-de-vie" + }, + "next": { + "title": "Le hook useContext de React", + "permalink": "/ressources/frontend/react/contextes" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-initialiser-un-projet-react-mdx-be7.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-initialiser-un-projet-react-mdx-be7.json new file mode 100644 index 0000000..a9298aa --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-initialiser-un-projet-react-mdx-be7.json @@ -0,0 +1,92 @@ +{ + "id": "ressources/frontend/react/initialiser-un-projet-react", + "title": "Initialisation", + "description": "Initialisons un nouveau projet React, avec ou sans TypeScript.", + "source": "@site/docs/ressources/frontend/react/initialiser-un-projet-react.mdx", + "sourceDirName": "ressources/frontend/react", + "slug": "/ressources/frontend/react/initialiser-un-projet-react", + "permalink": "/ressources/frontend/react/initialiser-un-projet-react", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/initialiser-un-projet-react.mdx", + "tags": [ + { + "inline": true, + "label": "Frontend", + "permalink": "/tags/frontend" + }, + { + "inline": true, + "label": "React", + "permalink": "/tags/react" + }, + { + "inline": true, + "label": "JavaScript/TypeScript", + "permalink": "/tags/java-script-type-script" + }, + { + "inline": true, + "label": "Bibliothèque", + "permalink": "/tags/bibliotheque" + }, + { + "inline": true, + "label": "Interface utilisateur (UI)", + "permalink": "/tags/interface-utilisateur-ui" + }, + { + "inline": true, + "label": "Vite", + "permalink": "/tags/vite" + }, + { + "inline": true, + "label": "Vike", + "permalink": "/tags/vike" + }, + { + "inline": true, + "label": "SSR", + "permalink": "/tags/ssr" + }, + { + "inline": true, + "label": "SSG", + "permalink": "/tags/ssg" + }, + { + "inline": true, + "label": "CSR", + "permalink": "/tags/csr" + } + ], + "version": "current", + "sidebarPosition": 2, + "frontMatter": { + "sidebar_position": 2, + "title": "Initialisation", + "description": "Initialisons un nouveau projet React, avec ou sans TypeScript.", + "tags": [ + "Frontend", + "React", + "JavaScript/TypeScript", + "Bibliothèque", + "Interface utilisateur (UI)", + "Vite", + "Vike", + "SSR", + "SSG", + "CSR" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Introduction à React", + "permalink": "/ressources/frontend/react/intro" + }, + "next": { + "title": "Syntaxe JSX", + "permalink": "/ressources/frontend/react/syntaxe-jsx" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-intro-mdx-f04.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-intro-mdx-f04.json new file mode 100644 index 0000000..864f19e --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-intro-mdx-f04.json @@ -0,0 +1,62 @@ +{ + "id": "ressources/frontend/react/intro", + "title": "Introduction à React", + "description": "Parlons un peu de React, ce qu'il est, ce qu'il fait et pourquoi il est si populaire.", + "source": "@site/docs/ressources/frontend/react/intro.mdx", + "sourceDirName": "ressources/frontend/react", + "slug": "/ressources/frontend/react/intro", + "permalink": "/ressources/frontend/react/intro", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/intro.mdx", + "tags": [ + { + "inline": true, + "label": "Frontend", + "permalink": "/tags/frontend" + }, + { + "inline": true, + "label": "React", + "permalink": "/tags/react" + }, + { + "inline": true, + "label": "JavaScript/TypeScript", + "permalink": "/tags/java-script-type-script" + }, + { + "inline": true, + "label": "Bibliothèque", + "permalink": "/tags/bibliotheque" + }, + { + "inline": true, + "label": "Interface utilisateur (UI)", + "permalink": "/tags/interface-utilisateur-ui" + } + ], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1, + "title": "Introduction à React", + "description": "Parlons un peu de React, ce qu'il est, ce qu'il fait et pourquoi il est si populaire.", + "tags": [ + "Frontend", + "React", + "JavaScript/TypeScript", + "Bibliothèque", + "Interface utilisateur (UI)" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "🌈 Frontend", + "permalink": "/category/-frontend" + }, + "next": { + "title": "Initialisation", + "permalink": "/ressources/frontend/react/initialiser-un-projet-react" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-premier-composant-mdx-b78.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-premier-composant-mdx-b78.json new file mode 100644 index 0000000..b866610 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-premier-composant-mdx-b78.json @@ -0,0 +1,62 @@ +{ + "id": "ressources/frontend/react/premier-composant", + "title": "Premier composant", + "description": "Voyons ensemble comment notre premier composant React !", + "source": "@site/docs/ressources/frontend/react/premier-composant.mdx", + "sourceDirName": "ressources/frontend/react", + "slug": "/ressources/frontend/react/premier-composant", + "permalink": "/ressources/frontend/react/premier-composant", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/premier-composant.mdx", + "tags": [ + { + "inline": true, + "label": "Frontend", + "permalink": "/tags/frontend" + }, + { + "inline": true, + "label": "React", + "permalink": "/tags/react" + }, + { + "inline": true, + "label": "JavaScript/TypeScript", + "permalink": "/tags/java-script-type-script" + }, + { + "inline": true, + "label": "Bibliothèque", + "permalink": "/tags/bibliotheque" + }, + { + "inline": true, + "label": "Interface utilisateur (UI)", + "permalink": "/tags/interface-utilisateur-ui" + } + ], + "version": "current", + "sidebarPosition": 4, + "frontMatter": { + "sidebar_position": 4, + "title": "Premier composant", + "description": "Voyons ensemble comment notre premier composant React !", + "tags": [ + "Frontend", + "React", + "JavaScript/TypeScript", + "Bibliothèque", + "Interface utilisateur (UI)" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Syntaxe JSX", + "permalink": "/ressources/frontend/react/syntaxe-jsx" + }, + "next": { + "title": "State et cycle de vie", + "permalink": "/ressources/frontend/react/state-et-cycle-de-vie" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-reducers-mdx-68b.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-reducers-mdx-68b.json new file mode 100644 index 0000000..c21cf03 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-reducers-mdx-68b.json @@ -0,0 +1,62 @@ +{ + "id": "ressources/frontend/react/reducers", + "title": "Le hook useReducer de React", + "description": "Découvrez comment utiliser le hook useReducer de React pour gérer l'état de vos composants de manière plus efficace.", + "source": "@site/docs/ressources/frontend/react/reducers.mdx", + "sourceDirName": "ressources/frontend/react", + "slug": "/ressources/frontend/react/reducers", + "permalink": "/ressources/frontend/react/reducers", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/reducers.mdx", + "tags": [ + { + "inline": true, + "label": "Frontend", + "permalink": "/tags/frontend" + }, + { + "inline": true, + "label": "React", + "permalink": "/tags/react" + }, + { + "inline": true, + "label": "JavaScript/TypeScript", + "permalink": "/tags/java-script-type-script" + }, + { + "inline": true, + "label": "Bibliothèque", + "permalink": "/tags/bibliotheque" + }, + { + "inline": true, + "label": "Interface utilisateur (UI)", + "permalink": "/tags/interface-utilisateur-ui" + } + ], + "version": "current", + "sidebarPosition": 8, + "frontMatter": { + "sidebar_position": 8, + "title": "Le hook useReducer de React", + "description": "Découvrez comment utiliser le hook useReducer de React pour gérer l'état de vos composants de manière plus efficace.", + "tags": [ + "Frontend", + "React", + "JavaScript/TypeScript", + "Bibliothèque", + "Interface utilisateur (UI)" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Le hook useContext de React", + "permalink": "/ressources/frontend/react/contextes" + }, + "next": { + "title": "🎥 Influenceurs et créateurs de contenu", + "permalink": "/ressources/influenceurs-et-createurs" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-state-et-cycle-de-vie-mdx-719.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-state-et-cycle-de-vie-mdx-719.json new file mode 100644 index 0000000..2373153 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-state-et-cycle-de-vie-mdx-719.json @@ -0,0 +1,62 @@ +{ + "id": "ressources/frontend/react/state-et-cycle-de-vie", + "title": "State et cycle de vie", + "description": "Voyons ensemble comment gérer le state et le cycle de vie d'un composant React !", + "source": "@site/docs/ressources/frontend/react/state-et-cycle-de-vie.mdx", + "sourceDirName": "ressources/frontend/react", + "slug": "/ressources/frontend/react/state-et-cycle-de-vie", + "permalink": "/ressources/frontend/react/state-et-cycle-de-vie", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/state-et-cycle-de-vie.mdx", + "tags": [ + { + "inline": true, + "label": "Frontend", + "permalink": "/tags/frontend" + }, + { + "inline": true, + "label": "React", + "permalink": "/tags/react" + }, + { + "inline": true, + "label": "JavaScript/TypeScript", + "permalink": "/tags/java-script-type-script" + }, + { + "inline": true, + "label": "Bibliothèque", + "permalink": "/tags/bibliotheque" + }, + { + "inline": true, + "label": "Interface utilisateur (UI)", + "permalink": "/tags/interface-utilisateur-ui" + } + ], + "version": "current", + "sidebarPosition": 5, + "frontMatter": { + "sidebar_position": 5, + "title": "State et cycle de vie", + "description": "Voyons ensemble comment gérer le state et le cycle de vie d'un composant React !", + "tags": [ + "Frontend", + "React", + "JavaScript/TypeScript", + "Bibliothèque", + "Interface utilisateur (UI)" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Premier composant", + "permalink": "/ressources/frontend/react/premier-composant" + }, + "next": { + "title": "Les hooks de React", + "permalink": "/ressources/frontend/react/hooks" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-syntaxe-jsx-mdx-e94.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-syntaxe-jsx-mdx-e94.json new file mode 100644 index 0000000..adb6cd5 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-frontend-react-syntaxe-jsx-mdx-e94.json @@ -0,0 +1,62 @@ +{ + "id": "ressources/frontend/react/syntaxe-jsx", + "title": "Syntaxe JSX", + "description": "Découvrons la syntaxe JSX, un langage de balisage utilisé par React pour décrire l'interface utilisateur.", + "source": "@site/docs/ressources/frontend/react/syntaxe-jsx.mdx", + "sourceDirName": "ressources/frontend/react", + "slug": "/ressources/frontend/react/syntaxe-jsx", + "permalink": "/ressources/frontend/react/syntaxe-jsx", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/syntaxe-jsx.mdx", + "tags": [ + { + "inline": true, + "label": "Frontend", + "permalink": "/tags/frontend" + }, + { + "inline": true, + "label": "React", + "permalink": "/tags/react" + }, + { + "inline": true, + "label": "JavaScript/TypeScript", + "permalink": "/tags/java-script-type-script" + }, + { + "inline": true, + "label": "Bibliothèque", + "permalink": "/tags/bibliotheque" + }, + { + "inline": true, + "label": "Interface utilisateur (UI)", + "permalink": "/tags/interface-utilisateur-ui" + } + ], + "version": "current", + "sidebarPosition": 3, + "frontMatter": { + "sidebar_position": 3, + "title": "Syntaxe JSX", + "description": "Découvrons la syntaxe JSX, un langage de balisage utilisé par React pour décrire l'interface utilisateur.", + "tags": [ + "Frontend", + "React", + "JavaScript/TypeScript", + "Bibliothèque", + "Interface utilisateur (UI)" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Initialisation", + "permalink": "/ressources/frontend/react/initialiser-un-projet-react" + }, + "next": { + "title": "Premier composant", + "permalink": "/ressources/frontend/react/premier-composant" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-influenceurs-et-createurs-mdx-eae.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-influenceurs-et-createurs-mdx-eae.json new file mode 100644 index 0000000..63c8e88 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-ressources-influenceurs-et-createurs-mdx-eae.json @@ -0,0 +1,29 @@ +{ + "id": "ressources/influenceurs-et-createurs", + "title": "🎥 Influenceurs et créateurs de contenu", + "description": "Liste d'influenceurs et créateurs de contenu dans le domaine du développement.", + "source": "@site/docs/ressources/influenceurs-et-createurs.mdx", + "sourceDirName": "ressources", + "slug": "/ressources/influenceurs-et-createurs", + "permalink": "/ressources/influenceurs-et-createurs", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/influenceurs-et-createurs.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1, + "title": "🎥 Influenceurs et créateurs de contenu", + "description": "Liste d'influenceurs et créateurs de contenu dans le domaine du développement." + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Le hook useReducer de React", + "permalink": "/ressources/frontend/react/reducers" + }, + "next": { + "title": "🤗 Soutiens et contributeurs", + "permalink": "/soutiens-et-contributeurs" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-soutiens-et-contributeurs-mdx-d64.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-soutiens-et-contributeurs-mdx-d64.json new file mode 100644 index 0000000..9a441e2 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-soutiens-et-contributeurs-mdx-d64.json @@ -0,0 +1,28 @@ +{ + "id": "soutiens-et-contributeurs", + "title": "🤗 Soutiens et contributeurs", + "description": "Soutiens et contributeurs de la plateforme Memento Dev.", + "source": "@site/docs/soutiens-et-contributeurs.mdx", + "sourceDirName": ".", + "slug": "/soutiens-et-contributeurs", + "permalink": "/soutiens-et-contributeurs", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/soutiens-et-contributeurs.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 99998, + "frontMatter": { + "sidebar_position": 99998, + "description": "Soutiens et contributeurs de la plateforme Memento Dev." + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "🎥 Influenceurs et créateurs de contenu", + "permalink": "/ressources/influenceurs-et-createurs" + }, + "next": { + "title": "🤝 Contribuer", + "permalink": "/contribuer" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-1-cp-1-mdx-fff.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-1-cp-1-mdx-fff.json new file mode 100644 index 0000000..5472334 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-1-cp-1-mdx-fff.json @@ -0,0 +1,29 @@ +{ + "id": "titres-professionnels/archives/DWWM/2018-2023/AT1/CP1", + "title": "CP 1", + "description": "Synthèse de la CP 1 \"Maquetter une application\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).", + "source": "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1.mdx", + "sourceDirName": "titres-professionnels/archives/DWWM/2018-2023/AT1", + "slug": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1, + "title": "CP 1", + "description": "Synthèse de la CP 1 \"Maquetter une application\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Résumé", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/intro" + }, + "next": { + "title": "CP 2", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-1-cp-2-mdx-0eb.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-1-cp-2-mdx-0eb.json new file mode 100644 index 0000000..2e6ca8b --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-1-cp-2-mdx-0eb.json @@ -0,0 +1,29 @@ +{ + "id": "titres-professionnels/archives/DWWM/2018-2023/AT1/CP2", + "title": "CP 2", + "description": "Synthèse de la CP 1 \"Réaliser une interface utilisateur web statique et adaptable\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).", + "source": "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2.mdx", + "sourceDirName": "titres-professionnels/archives/DWWM/2018-2023/AT1", + "slug": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 2, + "frontMatter": { + "sidebar_position": 2, + "title": "CP 2", + "description": "Synthèse de la CP 1 \"Réaliser une interface utilisateur web statique et adaptable\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 1", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1" + }, + "next": { + "title": "CP 3", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-1-cp-3-mdx-675.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-1-cp-3-mdx-675.json new file mode 100644 index 0000000..51f7c72 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-1-cp-3-mdx-675.json @@ -0,0 +1,29 @@ +{ + "id": "titres-professionnels/archives/DWWM/2018-2023/AT1/CP3", + "title": "CP 3", + "description": "Synthèse de la CP 3 \"Développer une interface utilisateur web dynamique\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).", + "source": "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3.mdx", + "sourceDirName": "titres-professionnels/archives/DWWM/2018-2023/AT1", + "slug": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 3, + "frontMatter": { + "sidebar_position": 3, + "title": "CP 3", + "description": "Synthèse de la CP 3 \"Développer une interface utilisateur web dynamique\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 2", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2" + }, + "next": { + "title": "CP 4", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-1-cp-4-mdx-af6.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-1-cp-4-mdx-af6.json new file mode 100644 index 0000000..f747220 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-1-cp-4-mdx-af6.json @@ -0,0 +1,29 @@ +{ + "id": "titres-professionnels/archives/DWWM/2018-2023/AT1/CP4", + "title": "CP 4", + "description": "Synthèse de la CP 4 \"Réaliser une interface utilisateur avec une solution de gestion de contenu ou e-commerce\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).", + "source": "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4.mdx", + "sourceDirName": "titres-professionnels/archives/DWWM/2018-2023/AT1", + "slug": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 4, + "frontMatter": { + "sidebar_position": 4, + "title": "CP 4", + "description": "Synthèse de la CP 4 \"Réaliser une interface utilisateur avec une solution de gestion de contenu ou e-commerce\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 3", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3" + }, + "next": { + "title": "CP 5", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-2-cp-5-mdx-bbc.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-2-cp-5-mdx-bbc.json new file mode 100644 index 0000000..a0b7822 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-2-cp-5-mdx-bbc.json @@ -0,0 +1,29 @@ +{ + "id": "titres-professionnels/archives/DWWM/2018-2023/AT2/CP5", + "title": "CP 5", + "description": "Synthèse de la CP 5 \"Créer une base de données\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).", + "source": "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5.mdx", + "sourceDirName": "titres-professionnels/archives/DWWM/2018-2023/AT2", + "slug": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 5, + "frontMatter": { + "sidebar_position": 5, + "title": "CP 5", + "description": "Synthèse de la CP 5 \"Créer une base de données\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 4", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4" + }, + "next": { + "title": "CP 6", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-2-cp-6-mdx-dc9.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-2-cp-6-mdx-dc9.json new file mode 100644 index 0000000..f330a5c --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-2-cp-6-mdx-dc9.json @@ -0,0 +1,29 @@ +{ + "id": "titres-professionnels/archives/DWWM/2018-2023/AT2/CP6", + "title": "CP 6", + "description": "Synthèse de la CP 5 \"Développer les composants d'accès aux données\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).", + "source": "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6.mdx", + "sourceDirName": "titres-professionnels/archives/DWWM/2018-2023/AT2", + "slug": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 6, + "frontMatter": { + "sidebar_position": 6, + "title": "CP 6", + "description": "Synthèse de la CP 5 \"Développer les composants d'accès aux données\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 5", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5" + }, + "next": { + "title": "CP 7", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-2-cp-7-mdx-b3f.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-2-cp-7-mdx-b3f.json new file mode 100644 index 0000000..d91c946 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-2-cp-7-mdx-b3f.json @@ -0,0 +1,29 @@ +{ + "id": "titres-professionnels/archives/DWWM/2018-2023/AT2/CP7", + "title": "CP 7", + "description": "Synthèse de la CP 7 \"Développer la partie back-end d'une application web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).", + "source": "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7.mdx", + "sourceDirName": "titres-professionnels/archives/DWWM/2018-2023/AT2", + "slug": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 7, + "frontMatter": { + "sidebar_position": 7, + "title": "CP 7", + "description": "Synthèse de la CP 7 \"Développer la partie back-end d'une application web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 6", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6" + }, + "next": { + "title": "CP 8", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-2-cp-8-mdx-85e.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-2-cp-8-mdx-85e.json new file mode 100644 index 0000000..3993444 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-at-2-cp-8-mdx-85e.json @@ -0,0 +1,29 @@ +{ + "id": "titres-professionnels/archives/DWWM/2018-2023/AT2/CP8", + "title": "CP 8", + "description": "Synthèse de la CP 8 \"Élaborer et mettre en œuvre des composants dans une application de gestion de contenu ou e-commerce\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).", + "source": "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8.mdx", + "sourceDirName": "titres-professionnels/archives/DWWM/2018-2023/AT2", + "slug": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 8, + "frontMatter": { + "sidebar_position": 8, + "title": "CP 8", + "description": "Synthèse de la CP 8 \"Élaborer et mettre en œuvre des composants dans une application de gestion de contenu ou e-commerce\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 7", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7" + }, + "next": { + "title": "Se préparer pour un TP", + "permalink": "/titres-professionnels/se-preparer" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-intro-mdx-710.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-intro-mdx-710.json new file mode 100644 index 0000000..8322874 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-archives-dwwm-2018-2023-intro-mdx-710.json @@ -0,0 +1,29 @@ +{ + "id": "titres-professionnels/archives/DWWM/2018-2023/intro", + "title": "Résumé", + "description": "Résumé du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, expiré depuis septembre 2023).", + "source": "@site/docs/titres-professionnels/archives/DWWM/2018-2023/intro.mdx", + "sourceDirName": "titres-professionnels/archives/DWWM/2018-2023", + "slug": "/titres-professionnels/archives/DWWM/2018-2023/intro", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/intro", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/intro.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1, + "title": "Résumé", + "description": "Résumé du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, expiré depuis septembre 2023)." + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "🗃️ Archives", + "permalink": "/category/️-archives" + }, + "next": { + "title": "CP 1", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-1-cp-1-mdx-cca.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-1-cp-1-mdx-cca.json new file mode 100644 index 0000000..7d08365 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-1-cp-1-mdx-cca.json @@ -0,0 +1,44 @@ +{ + "id": "titres-professionnels/CDA/AT1/CP1", + "title": "CP 1", + "description": "Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "source": "@site/docs/titres-professionnels/CDA/AT1/CP1.mdx", + "sourceDirName": "titres-professionnels/CDA/AT1", + "slug": "/titres-professionnels/CDA/AT1/CP1", + "permalink": "/titres-professionnels/CDA/AT1/CP1", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT1/CP1.mdx", + "tags": [ + { + "inline": true, + "label": "CDA", + "permalink": "/tags/cda" + }, + { + "inline": true, + "label": "Environnement de développement", + "permalink": "/tags/environnement-de-developpement" + } + ], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1, + "title": "CP 1", + "description": "Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "tags": [ + "CDA", + "Environnement de développement" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Résumé", + "permalink": "/titres-professionnels/CDA/intro" + }, + "next": { + "title": "CP 2", + "permalink": "/titres-professionnels/CDA/AT1/CP2" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-1-cp-2-mdx-fe2.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-1-cp-2-mdx-fe2.json new file mode 100644 index 0000000..e6ca972 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-1-cp-2-mdx-fe2.json @@ -0,0 +1,38 @@ +{ + "id": "titres-professionnels/CDA/AT1/CP2", + "title": "CP 2", + "description": "Synthèse de la CP 2 \"Développer des interfaces utilisateur\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "source": "@site/docs/titres-professionnels/CDA/AT1/CP2.mdx", + "sourceDirName": "titres-professionnels/CDA/AT1", + "slug": "/titres-professionnels/CDA/AT1/CP2", + "permalink": "/titres-professionnels/CDA/AT1/CP2", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT1/CP2.mdx", + "tags": [ + { + "inline": true, + "label": "CDA", + "permalink": "/tags/cda" + } + ], + "version": "current", + "sidebarPosition": 2, + "frontMatter": { + "sidebar_position": 2, + "title": "CP 2", + "description": "Synthèse de la CP 2 \"Développer des interfaces utilisateur\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "tags": [ + "CDA" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 1", + "permalink": "/titres-professionnels/CDA/AT1/CP1" + }, + "next": { + "title": "CP 3", + "permalink": "/titres-professionnels/CDA/AT1/CP3" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-1-cp-3-mdx-829.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-1-cp-3-mdx-829.json new file mode 100644 index 0000000..26e621f --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-1-cp-3-mdx-829.json @@ -0,0 +1,38 @@ +{ + "id": "titres-professionnels/CDA/AT1/CP3", + "title": "CP 3", + "description": "Synthèse de la CP 3 \"Développer des composants métier\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "source": "@site/docs/titres-professionnels/CDA/AT1/CP3.mdx", + "sourceDirName": "titres-professionnels/CDA/AT1", + "slug": "/titres-professionnels/CDA/AT1/CP3", + "permalink": "/titres-professionnels/CDA/AT1/CP3", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT1/CP3.mdx", + "tags": [ + { + "inline": true, + "label": "CDA", + "permalink": "/tags/cda" + } + ], + "version": "current", + "sidebarPosition": 3, + "frontMatter": { + "sidebar_position": 3, + "title": "CP 3", + "description": "Synthèse de la CP 3 \"Développer des composants métier\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "tags": [ + "CDA" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 2", + "permalink": "/titres-professionnels/CDA/AT1/CP2" + }, + "next": { + "title": "CP 4", + "permalink": "/titres-professionnels/CDA/AT1/CP4" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-1-cp-4-mdx-910.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-1-cp-4-mdx-910.json new file mode 100644 index 0000000..e03f9b7 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-1-cp-4-mdx-910.json @@ -0,0 +1,38 @@ +{ + "id": "titres-professionnels/CDA/AT1/CP4", + "title": "CP 4", + "description": "Synthèse de la CP 4 \"Contribuer à la gestion d’un projet informatique\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "source": "@site/docs/titres-professionnels/CDA/AT1/CP4.mdx", + "sourceDirName": "titres-professionnels/CDA/AT1", + "slug": "/titres-professionnels/CDA/AT1/CP4", + "permalink": "/titres-professionnels/CDA/AT1/CP4", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT1/CP4.mdx", + "tags": [ + { + "inline": true, + "label": "CDA", + "permalink": "/tags/cda" + } + ], + "version": "current", + "sidebarPosition": 4, + "frontMatter": { + "sidebar_position": 4, + "title": "CP 4", + "description": "Synthèse de la CP 4 \"Contribuer à la gestion d’un projet informatique\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "tags": [ + "CDA" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 3", + "permalink": "/titres-professionnels/CDA/AT1/CP3" + }, + "next": { + "title": "CP 5", + "permalink": "/titres-professionnels/CDA/AT2/CP5" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-2-cp-5-mdx-518.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-2-cp-5-mdx-518.json new file mode 100644 index 0000000..5ab8cda --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-2-cp-5-mdx-518.json @@ -0,0 +1,38 @@ +{ + "id": "titres-professionnels/CDA/AT2/CP5", + "title": "CP 5", + "description": "Synthèse de la CP 5 \"Analyser les besoins et maquetter une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "source": "@site/docs/titres-professionnels/CDA/AT2/CP5.mdx", + "sourceDirName": "titres-professionnels/CDA/AT2", + "slug": "/titres-professionnels/CDA/AT2/CP5", + "permalink": "/titres-professionnels/CDA/AT2/CP5", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT2/CP5.mdx", + "tags": [ + { + "inline": true, + "label": "CDA", + "permalink": "/tags/cda" + } + ], + "version": "current", + "sidebarPosition": 5, + "frontMatter": { + "sidebar_position": 5, + "title": "CP 5", + "description": "Synthèse de la CP 5 \"Analyser les besoins et maquetter une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "tags": [ + "CDA" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 4", + "permalink": "/titres-professionnels/CDA/AT1/CP4" + }, + "next": { + "title": "CP 6", + "permalink": "/titres-professionnels/CDA/AT2/CP6" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-2-cp-6-mdx-061.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-2-cp-6-mdx-061.json new file mode 100644 index 0000000..32c3b99 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-2-cp-6-mdx-061.json @@ -0,0 +1,38 @@ +{ + "id": "titres-professionnels/CDA/AT2/CP6", + "title": "CP 6", + "description": "Synthèse de la CP 6 \"Définir l’architecture logicielle d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "source": "@site/docs/titres-professionnels/CDA/AT2/CP6.mdx", + "sourceDirName": "titres-professionnels/CDA/AT2", + "slug": "/titres-professionnels/CDA/AT2/CP6", + "permalink": "/titres-professionnels/CDA/AT2/CP6", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT2/CP6.mdx", + "tags": [ + { + "inline": true, + "label": "CDA", + "permalink": "/tags/cda" + } + ], + "version": "current", + "sidebarPosition": 6, + "frontMatter": { + "sidebar_position": 6, + "title": "CP 6", + "description": "Synthèse de la CP 6 \"Définir l’architecture logicielle d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "tags": [ + "CDA" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 5", + "permalink": "/titres-professionnels/CDA/AT2/CP5" + }, + "next": { + "title": "CP 7", + "permalink": "/titres-professionnels/CDA/AT2/CP7" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-2-cp-7-mdx-2b6.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-2-cp-7-mdx-2b6.json new file mode 100644 index 0000000..1522b9d --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-2-cp-7-mdx-2b6.json @@ -0,0 +1,38 @@ +{ + "id": "titres-professionnels/CDA/AT2/CP7", + "title": "CP 7", + "description": "Synthèse de la CP 7 \"Concevoir et mettre en place une base de données relationnelle\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "source": "@site/docs/titres-professionnels/CDA/AT2/CP7.mdx", + "sourceDirName": "titres-professionnels/CDA/AT2", + "slug": "/titres-professionnels/CDA/AT2/CP7", + "permalink": "/titres-professionnels/CDA/AT2/CP7", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT2/CP7.mdx", + "tags": [ + { + "inline": true, + "label": "CDA", + "permalink": "/tags/cda" + } + ], + "version": "current", + "sidebarPosition": 7, + "frontMatter": { + "sidebar_position": 7, + "title": "CP 7", + "description": "Synthèse de la CP 7 \"Concevoir et mettre en place une base de données relationnelle\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "tags": [ + "CDA" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 6", + "permalink": "/titres-professionnels/CDA/AT2/CP6" + }, + "next": { + "title": "CP 8", + "permalink": "/titres-professionnels/CDA/AT2/CP8" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-2-cp-8-mdx-c00.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-2-cp-8-mdx-c00.json new file mode 100644 index 0000000..1042bc5 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-2-cp-8-mdx-c00.json @@ -0,0 +1,38 @@ +{ + "id": "titres-professionnels/CDA/AT2/CP8", + "title": "CP 8", + "description": "Synthèse de la CP 8 \"Développer des composants d’accès aux données SQL et NoSQL\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "source": "@site/docs/titres-professionnels/CDA/AT2/CP8.mdx", + "sourceDirName": "titres-professionnels/CDA/AT2", + "slug": "/titres-professionnels/CDA/AT2/CP8", + "permalink": "/titres-professionnels/CDA/AT2/CP8", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT2/CP8.mdx", + "tags": [ + { + "inline": true, + "label": "CDA", + "permalink": "/tags/cda" + } + ], + "version": "current", + "sidebarPosition": 8, + "frontMatter": { + "sidebar_position": 8, + "title": "CP 8", + "description": "Synthèse de la CP 8 \"Développer des composants d’accès aux données SQL et NoSQL\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "tags": [ + "CDA" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 7", + "permalink": "/titres-professionnels/CDA/AT2/CP7" + }, + "next": { + "title": "CP 9", + "permalink": "/titres-professionnels/CDA/AT3/CP9" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-3-cp-10-mdx-e45.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-3-cp-10-mdx-e45.json new file mode 100644 index 0000000..b5f4ac8 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-3-cp-10-mdx-e45.json @@ -0,0 +1,38 @@ +{ + "id": "titres-professionnels/CDA/AT3/CP10", + "title": "CP 10", + "description": "Synthèse de la CP 10 \"Préparer et documenter le déploiement d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "source": "@site/docs/titres-professionnels/CDA/AT3/CP10.mdx", + "sourceDirName": "titres-professionnels/CDA/AT3", + "slug": "/titres-professionnels/CDA/AT3/CP10", + "permalink": "/titres-professionnels/CDA/AT3/CP10", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT3/CP10.mdx", + "tags": [ + { + "inline": true, + "label": "CDA", + "permalink": "/tags/cda" + } + ], + "version": "current", + "sidebarPosition": 10, + "frontMatter": { + "sidebar_position": 10, + "title": "CP 10", + "description": "Synthèse de la CP 10 \"Préparer et documenter le déploiement d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "tags": [ + "CDA" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 9", + "permalink": "/titres-professionnels/CDA/AT3/CP9" + }, + "next": { + "title": "CP 11", + "permalink": "/titres-professionnels/CDA/AT3/CP11" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-3-cp-11-mdx-56a.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-3-cp-11-mdx-56a.json new file mode 100644 index 0000000..552c83b --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-3-cp-11-mdx-56a.json @@ -0,0 +1,38 @@ +{ + "id": "titres-professionnels/CDA/AT3/CP11", + "title": "CP 11", + "description": "Synthèse de la CP 11 \"Contribuer à la mise en production dans une démarche DevOps\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "source": "@site/docs/titres-professionnels/CDA/AT3/CP11.mdx", + "sourceDirName": "titres-professionnels/CDA/AT3", + "slug": "/titres-professionnels/CDA/AT3/CP11", + "permalink": "/titres-professionnels/CDA/AT3/CP11", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT3/CP11.mdx", + "tags": [ + { + "inline": true, + "label": "CDA", + "permalink": "/tags/cda" + } + ], + "version": "current", + "sidebarPosition": 11, + "frontMatter": { + "sidebar_position": 11, + "title": "CP 11", + "description": "Synthèse de la CP 11 \"Contribuer à la mise en production dans une démarche DevOps\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "tags": [ + "CDA" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 10", + "permalink": "/titres-professionnels/CDA/AT3/CP10" + }, + "next": { + "title": "Résumé", + "permalink": "/titres-professionnels/DWWM/intro" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-3-cp-9-mdx-5a4.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-3-cp-9-mdx-5a4.json new file mode 100644 index 0000000..62501dc --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-at-3-cp-9-mdx-5a4.json @@ -0,0 +1,38 @@ +{ + "id": "titres-professionnels/CDA/AT3/CP9", + "title": "CP 9", + "description": "Synthèse de la CP 9 \"Préparer et exécuter les plans de tests d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "source": "@site/docs/titres-professionnels/CDA/AT3/CP9.mdx", + "sourceDirName": "titres-professionnels/CDA/AT3", + "slug": "/titres-professionnels/CDA/AT3/CP9", + "permalink": "/titres-professionnels/CDA/AT3/CP9", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT3/CP9.mdx", + "tags": [ + { + "inline": true, + "label": "CDA", + "permalink": "/tags/cda" + } + ], + "version": "current", + "sidebarPosition": 9, + "frontMatter": { + "sidebar_position": 9, + "title": "CP 9", + "description": "Synthèse de la CP 9 \"Préparer et exécuter les plans de tests d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).", + "tags": [ + "CDA" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 8", + "permalink": "/titres-professionnels/CDA/AT2/CP8" + }, + "next": { + "title": "CP 10", + "permalink": "/titres-professionnels/CDA/AT3/CP10" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-intro-mdx-dbc.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-intro-mdx-dbc.json new file mode 100644 index 0000000..8501ed9 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-cda-intro-mdx-dbc.json @@ -0,0 +1,38 @@ +{ + "id": "titres-professionnels/CDA/intro", + "title": "Résumé", + "description": "Résumé du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04, actif depuis décembre 2023).", + "source": "@site/docs/titres-professionnels/CDA/intro.mdx", + "sourceDirName": "titres-professionnels/CDA", + "slug": "/titres-professionnels/CDA/intro", + "permalink": "/titres-professionnels/CDA/intro", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/intro.mdx", + "tags": [ + { + "inline": true, + "label": "CDA", + "permalink": "/tags/cda" + } + ], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1, + "title": "Résumé", + "description": "Résumé du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04, actif depuis décembre 2023).", + "tags": [ + "CDA" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "🎓 Titres professionnels", + "permalink": "/category/-titres-professionnels" + }, + "next": { + "title": "CP 1", + "permalink": "/titres-professionnels/CDA/AT1/CP1" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-1-cp-1-mdx-00e.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-1-cp-1-mdx-00e.json new file mode 100644 index 0000000..4a94841 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-1-cp-1-mdx-00e.json @@ -0,0 +1,44 @@ +{ + "id": "titres-professionnels/DWWM/AT1/CP1", + "title": "CP 1", + "description": "Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "source": "@site/docs/titres-professionnels/DWWM/AT1/CP1.mdx", + "sourceDirName": "titres-professionnels/DWWM/AT1", + "slug": "/titres-professionnels/DWWM/AT1/CP1", + "permalink": "/titres-professionnels/DWWM/AT1/CP1", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT1/CP1.mdx", + "tags": [ + { + "inline": true, + "label": "DWWM", + "permalink": "/tags/dwwm" + }, + { + "inline": true, + "label": "Environnement de développement", + "permalink": "/tags/environnement-de-developpement" + } + ], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1, + "title": "CP 1", + "description": "Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "tags": [ + "DWWM", + "Environnement de développement" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "La soutenance DWWM", + "permalink": "/titres-professionnels/DWWM/soutenance" + }, + "next": { + "title": "CP 2", + "permalink": "/titres-professionnels/DWWM/AT1/CP2" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-1-cp-2-mdx-3c4.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-1-cp-2-mdx-3c4.json new file mode 100644 index 0000000..a8a7250 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-1-cp-2-mdx-3c4.json @@ -0,0 +1,80 @@ +{ + "id": "titres-professionnels/DWWM/AT1/CP2", + "title": "CP 2", + "description": "Synthèse de la CP 2 \"Maquetter des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "source": "@site/docs/titres-professionnels/DWWM/AT1/CP2.mdx", + "sourceDirName": "titres-professionnels/DWWM/AT1", + "slug": "/titres-professionnels/DWWM/AT1/CP2", + "permalink": "/titres-professionnels/DWWM/AT1/CP2", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT1/CP2.mdx", + "tags": [ + { + "inline": true, + "label": "DWWM", + "permalink": "/tags/dwwm" + }, + { + "inline": true, + "label": "Eco-conception", + "permalink": "/tags/eco-conception" + }, + { + "inline": true, + "label": "Accessibilité", + "permalink": "/tags/accessibilite" + }, + { + "inline": true, + "label": "SEO/Référencement naturel", + "permalink": "/tags/seo-referencement-naturel" + }, + { + "inline": true, + "label": "Maquettage", + "permalink": "/tags/maquettage" + }, + { + "inline": true, + "label": "Wireframe", + "permalink": "/tags/wireframe" + }, + { + "inline": true, + "label": "Zoning", + "permalink": "/tags/zoning" + }, + { + "inline": true, + "label": "Front-end", + "permalink": "/tags/front-end" + } + ], + "version": "current", + "sidebarPosition": 2, + "frontMatter": { + "sidebar_position": 2, + "title": "CP 2", + "description": "Synthèse de la CP 2 \"Maquetter des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "tags": [ + "DWWM", + "Eco-conception", + "Accessibilité", + "SEO/Référencement naturel", + "Maquettage", + "Wireframe", + "Zoning", + "Front-end" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 1", + "permalink": "/titres-professionnels/DWWM/AT1/CP1" + }, + "next": { + "title": "CP 3", + "permalink": "/titres-professionnels/DWWM/AT1/CP3" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-1-cp-3-mdx-9bc.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-1-cp-3-mdx-9bc.json new file mode 100644 index 0000000..b4a79ee --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-1-cp-3-mdx-9bc.json @@ -0,0 +1,104 @@ +{ + "id": "titres-professionnels/DWWM/AT1/CP3", + "title": "CP 3", + "description": "Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "source": "@site/docs/titres-professionnels/DWWM/AT1/CP3.mdx", + "sourceDirName": "titres-professionnels/DWWM/AT1", + "slug": "/titres-professionnels/DWWM/AT1/CP3", + "permalink": "/titres-professionnels/DWWM/AT1/CP3", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT1/CP3.mdx", + "tags": [ + { + "inline": true, + "label": "DWWM", + "permalink": "/tags/dwwm" + }, + { + "inline": true, + "label": "Intégration", + "permalink": "/tags/integration" + }, + { + "inline": true, + "label": "Responsive", + "permalink": "/tags/responsive" + }, + { + "inline": true, + "label": "HTML", + "permalink": "/tags/html" + }, + { + "inline": true, + "label": "CSS", + "permalink": "/tags/css" + }, + { + "inline": true, + "label": "Accessibilité", + "permalink": "/tags/accessibilite" + }, + { + "inline": true, + "label": "Éco-conception", + "permalink": "/tags/eco-conception" + }, + { + "inline": true, + "label": "SEO/Référencement naturel", + "permalink": "/tags/seo-referencement-naturel" + }, + { + "inline": true, + "label": "Déploiement", + "permalink": "/tags/deploiement" + }, + { + "inline": true, + "label": "Reverse Proxy", + "permalink": "/tags/reverse-proxy" + }, + { + "inline": true, + "label": "Front-end", + "permalink": "/tags/front-end" + }, + { + "inline": true, + "label": "Serveur web", + "permalink": "/tags/serveur-web" + } + ], + "version": "current", + "sidebarPosition": 3, + "frontMatter": { + "sidebar_position": 3, + "title": "CP 3", + "description": "Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "tags": [ + "DWWM", + "Intégration", + "Responsive", + "HTML", + "CSS", + "Accessibilité", + "Éco-conception", + "SEO/Référencement naturel", + "Déploiement", + "Reverse Proxy", + "Front-end", + "Serveur web" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 2", + "permalink": "/titres-professionnels/DWWM/AT1/CP2" + }, + "next": { + "title": "CP 4", + "permalink": "/titres-professionnels/DWWM/AT1/CP4" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-1-cp-4-mdx-0c9.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-1-cp-4-mdx-0c9.json new file mode 100644 index 0000000..bcc46dd --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-1-cp-4-mdx-0c9.json @@ -0,0 +1,68 @@ +{ + "id": "titres-professionnels/DWWM/AT1/CP4", + "title": "CP 4", + "description": "Synthèse de la CP 4 \"Développer la partie dynamique des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "source": "@site/docs/titres-professionnels/DWWM/AT1/CP4.mdx", + "sourceDirName": "titres-professionnels/DWWM/AT1", + "slug": "/titres-professionnels/DWWM/AT1/CP4", + "permalink": "/titres-professionnels/DWWM/AT1/CP4", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT1/CP4.mdx", + "tags": [ + { + "inline": true, + "label": "DWWM", + "permalink": "/tags/dwwm" + }, + { + "inline": true, + "label": "JavaScript/TypeScript", + "permalink": "/tags/java-script-type-script" + }, + { + "inline": true, + "label": "Front-end", + "permalink": "/tags/front-end" + }, + { + "inline": true, + "label": "Eco-conception", + "permalink": "/tags/eco-conception" + }, + { + "inline": true, + "label": "Accessibilité", + "permalink": "/tags/accessibilite" + }, + { + "inline": true, + "label": "SEO/Référencement naturel", + "permalink": "/tags/seo-referencement-naturel" + } + ], + "version": "current", + "sidebarPosition": 4, + "frontMatter": { + "sidebar_position": 4, + "title": "CP 4", + "description": "Synthèse de la CP 4 \"Développer la partie dynamique des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "tags": [ + "DWWM", + "JavaScript/TypeScript", + "Front-end", + "Eco-conception", + "Accessibilité", + "SEO/Référencement naturel" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 3", + "permalink": "/titres-professionnels/DWWM/AT1/CP3" + }, + "next": { + "title": "CP 5", + "permalink": "/titres-professionnels/DWWM/AT2/CP5" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-2-cp-5-mdx-f21.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-2-cp-5-mdx-f21.json new file mode 100644 index 0000000..17092de --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-2-cp-5-mdx-f21.json @@ -0,0 +1,104 @@ +{ + "id": "titres-professionnels/DWWM/AT2/CP5", + "title": "CP 5", + "description": "Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "source": "@site/docs/titres-professionnels/DWWM/AT2/CP5.mdx", + "sourceDirName": "titres-professionnels/DWWM/AT2", + "slug": "/titres-professionnels/DWWM/AT2/CP5", + "permalink": "/titres-professionnels/DWWM/AT2/CP5", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT2/CP5.mdx", + "tags": [ + { + "inline": true, + "label": "DWWM", + "permalink": "/tags/dwwm" + }, + { + "inline": true, + "label": "Conception", + "permalink": "/tags/conception" + }, + { + "inline": true, + "label": "Modélisation", + "permalink": "/tags/modelisation" + }, + { + "inline": true, + "label": "Base de données", + "permalink": "/tags/base-de-donnees" + }, + { + "inline": true, + "label": "Merise", + "permalink": "/tags/merise" + }, + { + "inline": true, + "label": "Dictionnaire de Données", + "permalink": "/tags/dictionnaire-de-donnees" + }, + { + "inline": true, + "label": "Modèle Conceptuel de Données (MCD)", + "permalink": "/tags/modele-conceptuel-de-donnees-mcd" + }, + { + "inline": true, + "label": "Modèle Logique de Données (MLD)", + "permalink": "/tags/modele-logique-de-donnees-mld" + }, + { + "inline": true, + "label": "Modèle Relationnel de Données (MRD)", + "permalink": "/tags/modele-relationnel-de-donnees-mrd" + }, + { + "inline": true, + "label": "Modèle Physique de Données (MPD)", + "permalink": "/tags/modele-physique-de-donnees-mpd" + }, + { + "inline": true, + "label": "SQL", + "permalink": "/tags/sql" + }, + { + "inline": true, + "label": "Back-end", + "permalink": "/tags/back-end" + } + ], + "version": "current", + "sidebarPosition": 5, + "frontMatter": { + "sidebar_position": 5, + "title": "CP 5", + "description": "Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "tags": [ + "DWWM", + "Conception", + "Modélisation", + "Base de données", + "Merise", + "Dictionnaire de Données", + "Modèle Conceptuel de Données (MCD)", + "Modèle Logique de Données (MLD)", + "Modèle Relationnel de Données (MRD)", + "Modèle Physique de Données (MPD)", + "SQL", + "Back-end" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 4", + "permalink": "/titres-professionnels/DWWM/AT1/CP4" + }, + "next": { + "title": "CP 6", + "permalink": "/titres-professionnels/DWWM/AT2/CP6" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-2-cp-6-mdx-626.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-2-cp-6-mdx-626.json new file mode 100644 index 0000000..ac353c6 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-2-cp-6-mdx-626.json @@ -0,0 +1,80 @@ +{ + "id": "titres-professionnels/DWWM/AT2/CP6", + "title": "CP 6", + "description": "Synthèse de la CP 6 \"Développer des composants d'accès aux données SQL et NoSQL\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "source": "@site/docs/titres-professionnels/DWWM/AT2/CP6.mdx", + "sourceDirName": "titres-professionnels/DWWM/AT2", + "slug": "/titres-professionnels/DWWM/AT2/CP6", + "permalink": "/titres-professionnels/DWWM/AT2/CP6", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT2/CP6.mdx", + "tags": [ + { + "inline": true, + "label": "DWWM", + "permalink": "/tags/dwwm" + }, + { + "inline": true, + "label": "Base de données", + "permalink": "/tags/base-de-donnees" + }, + { + "inline": true, + "label": "SQL", + "permalink": "/tags/sql" + }, + { + "inline": true, + "label": "Back-end", + "permalink": "/tags/back-end" + }, + { + "inline": true, + "label": "ORM/ODM", + "permalink": "/tags/orm-odm" + }, + { + "inline": true, + "label": "Sécurité", + "permalink": "/tags/securite" + }, + { + "inline": true, + "label": "Chiffrement", + "permalink": "/tags/chiffrement" + }, + { + "inline": true, + "label": "Hachage", + "permalink": "/tags/hachage" + } + ], + "version": "current", + "sidebarPosition": 6, + "frontMatter": { + "sidebar_position": 6, + "title": "CP 6", + "description": "Synthèse de la CP 6 \"Développer des composants d'accès aux données SQL et NoSQL\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "tags": [ + "DWWM", + "Base de données", + "SQL", + "Back-end", + "ORM/ODM", + "Sécurité", + "Chiffrement", + "Hachage" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 5", + "permalink": "/titres-professionnels/DWWM/AT2/CP5" + }, + "next": { + "title": "CP 7", + "permalink": "/titres-professionnels/DWWM/AT2/CP7" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-2-cp-7-mdx-4bf.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-2-cp-7-mdx-4bf.json new file mode 100644 index 0000000..63fcb92 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-2-cp-7-mdx-4bf.json @@ -0,0 +1,68 @@ +{ + "id": "titres-professionnels/DWWM/AT2/CP7", + "title": "CP 7", + "description": "Synthèse de la CP 7 \"Développer des composants métier coté serveur\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "source": "@site/docs/titres-professionnels/DWWM/AT2/CP7.mdx", + "sourceDirName": "titres-professionnels/DWWM/AT2", + "slug": "/titres-professionnels/DWWM/AT2/CP7", + "permalink": "/titres-professionnels/DWWM/AT2/CP7", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT2/CP7.mdx", + "tags": [ + { + "inline": true, + "label": "DWWM", + "permalink": "/tags/dwwm" + }, + { + "inline": true, + "label": "Architecture", + "permalink": "/tags/architecture" + }, + { + "inline": true, + "label": "Design Pattern", + "permalink": "/tags/design-pattern" + }, + { + "inline": true, + "label": "Back-end", + "permalink": "/tags/back-end" + }, + { + "inline": true, + "label": "Sécurité", + "permalink": "/tags/securite" + }, + { + "inline": true, + "label": "Tests", + "permalink": "/tags/tests" + } + ], + "version": "current", + "sidebarPosition": 7, + "frontMatter": { + "sidebar_position": 7, + "title": "CP 7", + "description": "Synthèse de la CP 7 \"Développer des composants métier coté serveur\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "tags": [ + "DWWM", + "Architecture", + "Design Pattern", + "Back-end", + "Sécurité", + "Tests" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 6", + "permalink": "/titres-professionnels/DWWM/AT2/CP6" + }, + "next": { + "title": "CP 8", + "permalink": "/titres-professionnels/DWWM/AT2/CP8" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-2-cp-8-mdx-807.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-2-cp-8-mdx-807.json new file mode 100644 index 0000000..21fb807 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-at-2-cp-8-mdx-807.json @@ -0,0 +1,62 @@ +{ + "id": "titres-professionnels/DWWM/AT2/CP8", + "title": "CP 8", + "description": "Synthèse de la CP 8 \"Documenter le déploiement d'une application dynamique web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "source": "@site/docs/titres-professionnels/DWWM/AT2/CP8.mdx", + "sourceDirName": "titres-professionnels/DWWM/AT2", + "slug": "/titres-professionnels/DWWM/AT2/CP8", + "permalink": "/titres-professionnels/DWWM/AT2/CP8", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT2/CP8.mdx", + "tags": [ + { + "inline": true, + "label": "DWWM", + "permalink": "/tags/dwwm" + }, + { + "inline": true, + "label": "Déploiement", + "permalink": "/tags/deploiement" + }, + { + "inline": true, + "label": "Back-end", + "permalink": "/tags/back-end" + }, + { + "inline": true, + "label": "Reverse Proxy", + "permalink": "/tags/reverse-proxy" + }, + { + "inline": true, + "label": "Serveur web", + "permalink": "/tags/serveur-web" + } + ], + "version": "current", + "sidebarPosition": 8, + "frontMatter": { + "sidebar_position": 8, + "title": "CP 8", + "description": "Synthèse de la CP 8 \"Documenter le déploiement d'une application dynamique web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).", + "tags": [ + "DWWM", + "Déploiement", + "Back-end", + "Reverse Proxy", + "Serveur web" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 7", + "permalink": "/titres-professionnels/DWWM/AT2/CP7" + }, + "next": { + "title": "🗃️ Archives", + "permalink": "/category/️-archives" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-intro-mdx-1f0.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-intro-mdx-1f0.json new file mode 100644 index 0000000..d77051b --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-intro-mdx-1f0.json @@ -0,0 +1,38 @@ +{ + "id": "titres-professionnels/DWWM/intro", + "title": "Résumé", + "description": "Résumé du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04, actif depuis septembre 2023).", + "source": "@site/docs/titres-professionnels/DWWM/intro.mdx", + "sourceDirName": "titres-professionnels/DWWM", + "slug": "/titres-professionnels/DWWM/intro", + "permalink": "/titres-professionnels/DWWM/intro", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/intro.mdx", + "tags": [ + { + "inline": true, + "label": "DWWM", + "permalink": "/tags/dwwm" + } + ], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1, + "title": "Résumé", + "description": "Résumé du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04, actif depuis septembre 2023).", + "tags": [ + "DWWM" + ] + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 11", + "permalink": "/titres-professionnels/CDA/AT3/CP11" + }, + "next": { + "title": "La soutenance DWWM", + "permalink": "/titres-professionnels/DWWM/soutenance" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-soutenance-mdx-b38.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-soutenance-mdx-b38.json new file mode 100644 index 0000000..bbcd140 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-dwwm-soutenance-mdx-b38.json @@ -0,0 +1,29 @@ +{ + "id": "titres-professionnels/DWWM/soutenance", + "title": "La soutenance DWWM", + "description": "Tu prépares un TP DWWM et tu te demandes à quoi t'attendre pour la soutenance ? Voici quelques conseils pour te préparer efficacement.", + "source": "@site/docs/titres-professionnels/DWWM/soutenance.mdx", + "sourceDirName": "titres-professionnels/DWWM", + "slug": "/titres-professionnels/DWWM/soutenance", + "permalink": "/titres-professionnels/DWWM/soutenance", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/soutenance.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 2, + "frontMatter": { + "sidebar_position": 2, + "title": "La soutenance DWWM", + "description": "Tu prépares un TP DWWM et tu te demandes à quoi t'attendre pour la soutenance ? Voici quelques conseils pour te préparer efficacement." + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Résumé", + "permalink": "/titres-professionnels/DWWM/intro" + }, + "next": { + "title": "CP 1", + "permalink": "/titres-professionnels/DWWM/AT1/CP1" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-retours-mdx-0ee.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-retours-mdx-0ee.json new file mode 100644 index 0000000..2acd976 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-retours-mdx-0ee.json @@ -0,0 +1,29 @@ +{ + "id": "titres-professionnels/retours", + "title": "Retours d'expériences", + "description": "Découvre les témoignages de candidats et jury sur leur soutenance de titre professionnel : leurs ressentis avant, pendant et après leur passage devant le jury.", + "source": "@site/docs/titres-professionnels/retours.mdx", + "sourceDirName": "titres-professionnels", + "slug": "/titres-professionnels/retours", + "permalink": "/titres-professionnels/retours", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/retours.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 99999, + "frontMatter": { + "sidebar_position": 99999, + "title": "Retours d'expériences", + "description": "Découvre les témoignages de candidats et jury sur leur soutenance de titre professionnel : leurs ressentis avant, pendant et après leur passage devant le jury." + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Se préparer pour un TP", + "permalink": "/titres-professionnels/se-preparer" + }, + "next": { + "title": "💽 Bases de données", + "permalink": "/category/-bases-de-données" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-se-preparer-mdx-c72.json b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-se-preparer-mdx-c72.json new file mode 100644 index 0000000..4dc2cc4 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-titres-professionnels-se-preparer-mdx-c72.json @@ -0,0 +1,29 @@ +{ + "id": "titres-professionnels/se-preparer", + "title": "Se préparer pour un TP", + "description": "Tu prépares un titre professionnel et tu te demandes comment bien t'y préparer ? Jette donc un oeil !", + "source": "@site/docs/titres-professionnels/se-preparer.mdx", + "sourceDirName": "titres-professionnels", + "slug": "/titres-professionnels/se-preparer", + "permalink": "/titres-professionnels/se-preparer", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/se-preparer.mdx", + "tags": [], + "version": "current", + "sidebarPosition": 9999, + "frontMatter": { + "sidebar_position": 9999, + "title": "Se préparer pour un TP", + "description": "Tu prépares un titre professionnel et tu te demandes comment bien t'y préparer ? Jette donc un oeil !" + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "CP 8", + "permalink": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8" + }, + "next": { + "title": "Retours d'expériences", + "permalink": "/titres-professionnels/retours" + } +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-pages/default/__plugin.json b/old/.docusaurus/docusaurus-plugin-content-pages/default/__plugin.json new file mode 100644 index 0000000..b141f71 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-pages/default/__plugin.json @@ -0,0 +1,4 @@ +{ + "name": "docusaurus-plugin-content-pages", + "id": "default" +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-content-pages/default/site-src-pages-markdown-page-md-393.json b/old/.docusaurus/docusaurus-plugin-content-pages/default/site-src-pages-markdown-page-md-393.json new file mode 100644 index 0000000..152a2bc --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-content-pages/default/site-src-pages-markdown-page-md-393.json @@ -0,0 +1,11 @@ +{ + "type": "mdx", + "permalink": "/markdown-page", + "source": "@site/src/pages/markdown-page.md", + "title": "Markdown page example", + "description": "You don't need React to write simple standalone pages.", + "frontMatter": { + "title": "Markdown page example" + }, + "unlisted": false +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-debug/default/__plugin.json b/old/.docusaurus/docusaurus-plugin-debug/default/__plugin.json new file mode 100644 index 0000000..21c2cfd --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-debug/default/__plugin.json @@ -0,0 +1,4 @@ +{ + "name": "docusaurus-plugin-debug", + "id": "default" +} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus-plugin-debug/default/p/docusaurus-debug-content-0d5.json b/old/.docusaurus/docusaurus-plugin-debug/default/p/docusaurus-debug-content-0d5.json new file mode 100644 index 0000000..c871466 --- /dev/null +++ b/old/.docusaurus/docusaurus-plugin-debug/default/p/docusaurus-debug-content-0d5.json @@ -0,0 +1 @@ +{"allContent":{"docusaurus-plugin-content-docs":{"default":{"loadedVersions":[{"versionName":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","path":"/","tagsPath":"/tags","editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs","editUrlLocalized":"https://github.com/preparation-tp/memento-dev/tree/main/i18n/fr/docusaurus-plugin-content-docs/current","isLast":true,"routePriority":-1,"sidebarFilePath":"/Users/jack/Projets/Perso/memento-dev/sidebars.ts","contentPath":"/Users/jack/Projets/Perso/memento-dev/docs","contentPathLocalized":"/Users/jack/Projets/Perso/memento-dev/i18n/fr/docusaurus-plugin-content-docs/current","docs":[{"id":"contribuer","title":"🤝 Contribuer","description":"Tu souhaites contribuer à Memento Dev ? C'est par ici !","source":"@site/docs/contribuer.mdx","sourceDirName":".","slug":"/contribuer","permalink":"/contribuer","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/contribuer.mdx","tags":[],"version":"current","sidebarPosition":99999,"frontMatter":{"sidebar_position":99999,"description":"Tu souhaites contribuer à Memento Dev ? C'est par ici !"},"sidebar":"tutorialSidebar","previous":{"title":"🤗 Soutiens et contributeurs","permalink":"/soutiens-et-contributeurs"}},{"id":"glossaires/titres-professionnel","title":"Titres professionnels","description":"Définitions des termes utilisés dans le cadre des titres professionnels.","source":"@site/docs/glossaires/titres-professionnel.mdx","sourceDirName":"glossaires","slug":"/glossaires/titres-professionnel","permalink":"/glossaires/titres-professionnel","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/glossaires/titres-professionnel.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Titres professionnels","description":"Définitions des termes utilisés dans le cadre des titres professionnels."},"sidebar":"tutorialSidebar","previous":{"title":"📜 Préambule","permalink":"/intro"},"next":{"title":"🎓 Titres professionnels","permalink":"/category/-titres-professionnels"}},{"id":"intro","title":"📜 Préambule","description":"Memento Dev, une plateforme open-source de partage de connaissances en développement !","source":"@site/docs/intro.mdx","sourceDirName":".","slug":"/intro","permalink":"/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/intro.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"description":"Memento Dev, une plateforme open-source de partage de connaissances en développement !"},"sidebar":"tutorialSidebar","next":{"title":"Titres professionnels","permalink":"/glossaires/titres-professionnel"}},{"id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","source":"@site/docs/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees.mdx","sourceDirName":"ressources/bases-de-donnees/modelisation","slug":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees.mdx","tags":[{"inline":true,"label":"Conception","permalink":"/tags/conception"},{"inline":true,"label":"Modélisation","permalink":"/tags/modelisation"},{"inline":true,"label":"Base de données","permalink":"/tags/base-de-donnees"},{"inline":true,"label":"Merise","permalink":"/tags/merise"},{"inline":true,"label":"Dictionnaire de Données","permalink":"/tags/dictionnaire-de-donnees"},{"inline":true,"label":"Modèle Conceptuel de Données (MCD)","permalink":"/tags/modele-conceptuel-de-donnees-mcd"},{"inline":true,"label":"Modèle Logique de Données (MLD)","permalink":"/tags/modele-logique-de-donnees-mld"},{"inline":true,"label":"Modèle Relationnel de Données (MRD)","permalink":"/tags/modele-relationnel-de-donnees-mrd"},{"inline":true,"label":"Modèle Physique de Données (MPD)","permalink":"/tags/modele-physique-de-donnees-mpd"},{"inline":true,"label":"SQL","permalink":"/tags/sql"},{"inline":true,"label":"DWWM","permalink":"/tags/dwwm"},{"inline":true,"label":"CDA","permalink":"/tags/cda"}],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","tags":["Conception","Modélisation","Base de données","Merise","Dictionnaire de Données","Modèle Conceptuel de Données (MCD)","Modèle Logique de Données (MLD)","Modèle Relationnel de Données (MRD)","Modèle Physique de Données (MPD)","SQL","DWWM","CDA"]},"sidebar":"tutorialSidebar","previous":{"title":"Modélisation avec Merise","permalink":"/ressources/bases-de-donnees/modelisation/merise"},"next":{"title":"Création du MCD","permalink":"/ressources/bases-de-donnees/modelisation/mcd"}},{"id":"ressources/bases-de-donnees/modelisation/mcd","title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","source":"@site/docs/ressources/bases-de-donnees/modelisation/mcd.mdx","sourceDirName":"ressources/bases-de-donnees/modelisation","slug":"/ressources/bases-de-donnees/modelisation/mcd","permalink":"/ressources/bases-de-donnees/modelisation/mcd","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/bases-de-donnees/modelisation/mcd.mdx","tags":[{"inline":true,"label":"Conception","permalink":"/tags/conception"},{"inline":true,"label":"Modélisation","permalink":"/tags/modelisation"},{"inline":true,"label":"Base de données","permalink":"/tags/base-de-donnees"},{"inline":true,"label":"Merise","permalink":"/tags/merise"},{"inline":true,"label":"Dictionnaire de Données","permalink":"/tags/dictionnaire-de-donnees"},{"inline":true,"label":"Modèle Conceptuel de Données (MCD)","permalink":"/tags/modele-conceptuel-de-donnees-mcd"},{"inline":true,"label":"Modèle Logique de Données (MLD)","permalink":"/tags/modele-logique-de-donnees-mld"},{"inline":true,"label":"Modèle Relationnel de Données (MRD)","permalink":"/tags/modele-relationnel-de-donnees-mrd"},{"inline":true,"label":"Modèle Physique de Données (MPD)","permalink":"/tags/modele-physique-de-donnees-mpd"},{"inline":true,"label":"SQL","permalink":"/tags/sql"},{"inline":true,"label":"DWWM","permalink":"/tags/dwwm"},{"inline":true,"label":"CDA","permalink":"/tags/cda"}],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"Création du MCD","description":"Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données.","tags":["Conception","Modélisation","Base de données","Merise","Dictionnaire de Données","Modèle Conceptuel de Données (MCD)","Modèle Logique de Données (MLD)","Modèle Relationnel de Données (MRD)","Modèle Physique de Données (MPD)","SQL","DWWM","CDA"]},"sidebar":"tutorialSidebar","previous":{"title":"Création du MCD","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"},"next":{"title":"🌈 Frontend","permalink":"/category/-frontend"}},{"id":"ressources/bases-de-donnees/modelisation/merise","title":"Modélisation avec Merise","description":"Voyons ensemble comment on peut modéliser une base de données avec Merise !","source":"@site/docs/ressources/bases-de-donnees/modelisation/merise.mdx","sourceDirName":"ressources/bases-de-donnees/modelisation","slug":"/ressources/bases-de-donnees/modelisation/merise","permalink":"/ressources/bases-de-donnees/modelisation/merise","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/bases-de-donnees/modelisation/merise.mdx","tags":[{"inline":true,"label":"Conception","permalink":"/tags/conception"},{"inline":true,"label":"Modélisation","permalink":"/tags/modelisation"},{"inline":true,"label":"Base de données","permalink":"/tags/base-de-donnees"},{"inline":true,"label":"Merise","permalink":"/tags/merise"},{"inline":true,"label":"Dictionnaire de Données","permalink":"/tags/dictionnaire-de-donnees"},{"inline":true,"label":"Modèle Conceptuel de Données (MCD)","permalink":"/tags/modele-conceptuel-de-donnees-mcd"},{"inline":true,"label":"Modèle Logique de Données (MLD)","permalink":"/tags/modele-logique-de-donnees-mld"},{"inline":true,"label":"Modèle Relationnel de Données (MRD)","permalink":"/tags/modele-relationnel-de-donnees-mrd"},{"inline":true,"label":"Modèle Physique de Données (MPD)","permalink":"/tags/modele-physique-de-donnees-mpd"},{"inline":true,"label":"SQL","permalink":"/tags/sql"},{"inline":true,"label":"DWWM","permalink":"/tags/dwwm"}],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Modélisation avec Merise","description":"Voyons ensemble comment on peut modéliser une base de données avec Merise !","tags":["Conception","Modélisation","Base de données","Merise","Dictionnaire de Données","Modèle Conceptuel de Données (MCD)","Modèle Logique de Données (MLD)","Modèle Relationnel de Données (MRD)","Modèle Physique de Données (MPD)","SQL","DWWM"]},"sidebar":"tutorialSidebar","previous":{"title":"💽 Bases de données","permalink":"/category/-bases-de-données"},"next":{"title":"Création du MCD","permalink":"/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"}},{"id":"ressources/frontend/react/contextes","title":"Le hook useContext de React","description":"Découvrez comment utiliser le hook useContext de React pour gérer les contextes dans vos applications.","source":"@site/docs/ressources/frontend/react/contextes.mdx","sourceDirName":"ressources/frontend/react","slug":"/ressources/frontend/react/contextes","permalink":"/ressources/frontend/react/contextes","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/contextes.mdx","tags":[{"inline":true,"label":"Frontend","permalink":"/tags/frontend"},{"inline":true,"label":"React","permalink":"/tags/react"},{"inline":true,"label":"JavaScript/TypeScript","permalink":"/tags/java-script-type-script"},{"inline":true,"label":"Bibliothèque","permalink":"/tags/bibliotheque"},{"inline":true,"label":"Interface utilisateur (UI)","permalink":"/tags/interface-utilisateur-ui"}],"version":"current","sidebarPosition":7,"frontMatter":{"sidebar_position":7,"title":"Le hook useContext de React","description":"Découvrez comment utiliser le hook useContext de React pour gérer les contextes dans vos applications.","tags":["Frontend","React","JavaScript/TypeScript","Bibliothèque","Interface utilisateur (UI)"]},"sidebar":"tutorialSidebar","previous":{"title":"Les hooks de React","permalink":"/ressources/frontend/react/hooks"},"next":{"title":"Le hook useReducer de React","permalink":"/ressources/frontend/react/reducers"}},{"id":"ressources/frontend/react/hooks","title":"Les hooks de React","description":"Découvre les hooks de React, une fonctionnalité qui te permet de gérer le state et le cycle de vie de tes composants fonctionnels.","source":"@site/docs/ressources/frontend/react/hooks.mdx","sourceDirName":"ressources/frontend/react","slug":"/ressources/frontend/react/hooks","permalink":"/ressources/frontend/react/hooks","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/hooks.mdx","tags":[{"inline":true,"label":"Frontend","permalink":"/tags/frontend"},{"inline":true,"label":"React","permalink":"/tags/react"},{"inline":true,"label":"JavaScript/TypeScript","permalink":"/tags/java-script-type-script"},{"inline":true,"label":"Bibliothèque","permalink":"/tags/bibliotheque"},{"inline":true,"label":"Interface utilisateur (UI)","permalink":"/tags/interface-utilisateur-ui"}],"version":"current","sidebarPosition":6,"frontMatter":{"sidebar_position":6,"title":"Les hooks de React","description":"Découvre les hooks de React, une fonctionnalité qui te permet de gérer le state et le cycle de vie de tes composants fonctionnels.","tags":["Frontend","React","JavaScript/TypeScript","Bibliothèque","Interface utilisateur (UI)"]},"sidebar":"tutorialSidebar","previous":{"title":"State et cycle de vie","permalink":"/ressources/frontend/react/state-et-cycle-de-vie"},"next":{"title":"Le hook useContext de React","permalink":"/ressources/frontend/react/contextes"}},{"id":"ressources/frontend/react/initialiser-un-projet-react","title":"Initialisation","description":"Initialisons un nouveau projet React, avec ou sans TypeScript.","source":"@site/docs/ressources/frontend/react/initialiser-un-projet-react.mdx","sourceDirName":"ressources/frontend/react","slug":"/ressources/frontend/react/initialiser-un-projet-react","permalink":"/ressources/frontend/react/initialiser-un-projet-react","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/initialiser-un-projet-react.mdx","tags":[{"inline":true,"label":"Frontend","permalink":"/tags/frontend"},{"inline":true,"label":"React","permalink":"/tags/react"},{"inline":true,"label":"JavaScript/TypeScript","permalink":"/tags/java-script-type-script"},{"inline":true,"label":"Bibliothèque","permalink":"/tags/bibliotheque"},{"inline":true,"label":"Interface utilisateur (UI)","permalink":"/tags/interface-utilisateur-ui"},{"inline":true,"label":"Vite","permalink":"/tags/vite"},{"inline":true,"label":"Vike","permalink":"/tags/vike"},{"inline":true,"label":"SSR","permalink":"/tags/ssr"},{"inline":true,"label":"SSG","permalink":"/tags/ssg"},{"inline":true,"label":"CSR","permalink":"/tags/csr"}],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"Initialisation","description":"Initialisons un nouveau projet React, avec ou sans TypeScript.","tags":["Frontend","React","JavaScript/TypeScript","Bibliothèque","Interface utilisateur (UI)","Vite","Vike","SSR","SSG","CSR"]},"sidebar":"tutorialSidebar","previous":{"title":"Introduction à React","permalink":"/ressources/frontend/react/intro"},"next":{"title":"Syntaxe JSX","permalink":"/ressources/frontend/react/syntaxe-jsx"}},{"id":"ressources/frontend/react/intro","title":"Introduction à React","description":"Parlons un peu de React, ce qu'il est, ce qu'il fait et pourquoi il est si populaire.","source":"@site/docs/ressources/frontend/react/intro.mdx","sourceDirName":"ressources/frontend/react","slug":"/ressources/frontend/react/intro","permalink":"/ressources/frontend/react/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/intro.mdx","tags":[{"inline":true,"label":"Frontend","permalink":"/tags/frontend"},{"inline":true,"label":"React","permalink":"/tags/react"},{"inline":true,"label":"JavaScript/TypeScript","permalink":"/tags/java-script-type-script"},{"inline":true,"label":"Bibliothèque","permalink":"/tags/bibliotheque"},{"inline":true,"label":"Interface utilisateur (UI)","permalink":"/tags/interface-utilisateur-ui"}],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Introduction à React","description":"Parlons un peu de React, ce qu'il est, ce qu'il fait et pourquoi il est si populaire.","tags":["Frontend","React","JavaScript/TypeScript","Bibliothèque","Interface utilisateur (UI)"]},"sidebar":"tutorialSidebar","previous":{"title":"🌈 Frontend","permalink":"/category/-frontend"},"next":{"title":"Initialisation","permalink":"/ressources/frontend/react/initialiser-un-projet-react"}},{"id":"ressources/frontend/react/premier-composant","title":"Premier composant","description":"Voyons ensemble comment notre premier composant React !","source":"@site/docs/ressources/frontend/react/premier-composant.mdx","sourceDirName":"ressources/frontend/react","slug":"/ressources/frontend/react/premier-composant","permalink":"/ressources/frontend/react/premier-composant","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/premier-composant.mdx","tags":[{"inline":true,"label":"Frontend","permalink":"/tags/frontend"},{"inline":true,"label":"React","permalink":"/tags/react"},{"inline":true,"label":"JavaScript/TypeScript","permalink":"/tags/java-script-type-script"},{"inline":true,"label":"Bibliothèque","permalink":"/tags/bibliotheque"},{"inline":true,"label":"Interface utilisateur (UI)","permalink":"/tags/interface-utilisateur-ui"}],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4,"title":"Premier composant","description":"Voyons ensemble comment notre premier composant React !","tags":["Frontend","React","JavaScript/TypeScript","Bibliothèque","Interface utilisateur (UI)"]},"sidebar":"tutorialSidebar","previous":{"title":"Syntaxe JSX","permalink":"/ressources/frontend/react/syntaxe-jsx"},"next":{"title":"State et cycle de vie","permalink":"/ressources/frontend/react/state-et-cycle-de-vie"}},{"id":"ressources/frontend/react/reducers","title":"Le hook useReducer de React","description":"Découvrez comment utiliser le hook useReducer de React pour gérer l'état de vos composants de manière plus efficace.","source":"@site/docs/ressources/frontend/react/reducers.mdx","sourceDirName":"ressources/frontend/react","slug":"/ressources/frontend/react/reducers","permalink":"/ressources/frontend/react/reducers","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/reducers.mdx","tags":[{"inline":true,"label":"Frontend","permalink":"/tags/frontend"},{"inline":true,"label":"React","permalink":"/tags/react"},{"inline":true,"label":"JavaScript/TypeScript","permalink":"/tags/java-script-type-script"},{"inline":true,"label":"Bibliothèque","permalink":"/tags/bibliotheque"},{"inline":true,"label":"Interface utilisateur (UI)","permalink":"/tags/interface-utilisateur-ui"}],"version":"current","sidebarPosition":8,"frontMatter":{"sidebar_position":8,"title":"Le hook useReducer de React","description":"Découvrez comment utiliser le hook useReducer de React pour gérer l'état de vos composants de manière plus efficace.","tags":["Frontend","React","JavaScript/TypeScript","Bibliothèque","Interface utilisateur (UI)"]},"sidebar":"tutorialSidebar","previous":{"title":"Le hook useContext de React","permalink":"/ressources/frontend/react/contextes"},"next":{"title":"🎥 Influenceurs et créateurs de contenu","permalink":"/ressources/influenceurs-et-createurs"}},{"id":"ressources/frontend/react/state-et-cycle-de-vie","title":"State et cycle de vie","description":"Voyons ensemble comment gérer le state et le cycle de vie d'un composant React !","source":"@site/docs/ressources/frontend/react/state-et-cycle-de-vie.mdx","sourceDirName":"ressources/frontend/react","slug":"/ressources/frontend/react/state-et-cycle-de-vie","permalink":"/ressources/frontend/react/state-et-cycle-de-vie","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/state-et-cycle-de-vie.mdx","tags":[{"inline":true,"label":"Frontend","permalink":"/tags/frontend"},{"inline":true,"label":"React","permalink":"/tags/react"},{"inline":true,"label":"JavaScript/TypeScript","permalink":"/tags/java-script-type-script"},{"inline":true,"label":"Bibliothèque","permalink":"/tags/bibliotheque"},{"inline":true,"label":"Interface utilisateur (UI)","permalink":"/tags/interface-utilisateur-ui"}],"version":"current","sidebarPosition":5,"frontMatter":{"sidebar_position":5,"title":"State et cycle de vie","description":"Voyons ensemble comment gérer le state et le cycle de vie d'un composant React !","tags":["Frontend","React","JavaScript/TypeScript","Bibliothèque","Interface utilisateur (UI)"]},"sidebar":"tutorialSidebar","previous":{"title":"Premier composant","permalink":"/ressources/frontend/react/premier-composant"},"next":{"title":"Les hooks de React","permalink":"/ressources/frontend/react/hooks"}},{"id":"ressources/frontend/react/syntaxe-jsx","title":"Syntaxe JSX","description":"Découvrons la syntaxe JSX, un langage de balisage utilisé par React pour décrire l'interface utilisateur.","source":"@site/docs/ressources/frontend/react/syntaxe-jsx.mdx","sourceDirName":"ressources/frontend/react","slug":"/ressources/frontend/react/syntaxe-jsx","permalink":"/ressources/frontend/react/syntaxe-jsx","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/frontend/react/syntaxe-jsx.mdx","tags":[{"inline":true,"label":"Frontend","permalink":"/tags/frontend"},{"inline":true,"label":"React","permalink":"/tags/react"},{"inline":true,"label":"JavaScript/TypeScript","permalink":"/tags/java-script-type-script"},{"inline":true,"label":"Bibliothèque","permalink":"/tags/bibliotheque"},{"inline":true,"label":"Interface utilisateur (UI)","permalink":"/tags/interface-utilisateur-ui"}],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"Syntaxe JSX","description":"Découvrons la syntaxe JSX, un langage de balisage utilisé par React pour décrire l'interface utilisateur.","tags":["Frontend","React","JavaScript/TypeScript","Bibliothèque","Interface utilisateur (UI)"]},"sidebar":"tutorialSidebar","previous":{"title":"Initialisation","permalink":"/ressources/frontend/react/initialiser-un-projet-react"},"next":{"title":"Premier composant","permalink":"/ressources/frontend/react/premier-composant"}},{"id":"ressources/influenceurs-et-createurs","title":"🎥 Influenceurs et créateurs de contenu","description":"Liste d'influenceurs et créateurs de contenu dans le domaine du développement.","source":"@site/docs/ressources/influenceurs-et-createurs.mdx","sourceDirName":"ressources","slug":"/ressources/influenceurs-et-createurs","permalink":"/ressources/influenceurs-et-createurs","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/ressources/influenceurs-et-createurs.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"🎥 Influenceurs et créateurs de contenu","description":"Liste d'influenceurs et créateurs de contenu dans le domaine du développement."},"sidebar":"tutorialSidebar","previous":{"title":"Le hook useReducer de React","permalink":"/ressources/frontend/react/reducers"},"next":{"title":"🤗 Soutiens et contributeurs","permalink":"/soutiens-et-contributeurs"}},{"id":"soutiens-et-contributeurs","title":"🤗 Soutiens et contributeurs","description":"Soutiens et contributeurs de la plateforme Memento Dev.","source":"@site/docs/soutiens-et-contributeurs.mdx","sourceDirName":".","slug":"/soutiens-et-contributeurs","permalink":"/soutiens-et-contributeurs","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/soutiens-et-contributeurs.mdx","tags":[],"version":"current","sidebarPosition":99998,"frontMatter":{"sidebar_position":99998,"description":"Soutiens et contributeurs de la plateforme Memento Dev."},"sidebar":"tutorialSidebar","previous":{"title":"🎥 Influenceurs et créateurs de contenu","permalink":"/ressources/influenceurs-et-createurs"},"next":{"title":"🤝 Contribuer","permalink":"/contribuer"}},{"id":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP1","title":"CP 1","description":"Synthèse de la CP 1 \"Maquetter une application\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","source":"@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1.mdx","sourceDirName":"titres-professionnels/archives/DWWM/2018-2023/AT1","slug":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"CP 1","description":"Synthèse de la CP 1 \"Maquetter une application\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)."},"sidebar":"tutorialSidebar","previous":{"title":"Résumé","permalink":"/titres-professionnels/archives/DWWM/2018-2023/intro"},"next":{"title":"CP 2","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2"}},{"id":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 1 \"Réaliser une interface utilisateur web statique et adaptable\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","source":"@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2.mdx","sourceDirName":"titres-professionnels/archives/DWWM/2018-2023/AT1","slug":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"CP 2","description":"Synthèse de la CP 1 \"Réaliser une interface utilisateur web statique et adaptable\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)."},"sidebar":"tutorialSidebar","previous":{"title":"CP 1","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1"},"next":{"title":"CP 3","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3"}},{"id":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Développer une interface utilisateur web dynamique\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","source":"@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3.mdx","sourceDirName":"titres-professionnels/archives/DWWM/2018-2023/AT1","slug":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3.mdx","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"CP 3","description":"Synthèse de la CP 3 \"Développer une interface utilisateur web dynamique\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)."},"sidebar":"tutorialSidebar","previous":{"title":"CP 2","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2"},"next":{"title":"CP 4","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4"}},{"id":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP4","title":"CP 4","description":"Synthèse de la CP 4 \"Réaliser une interface utilisateur avec une solution de gestion de contenu ou e-commerce\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","source":"@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4.mdx","sourceDirName":"titres-professionnels/archives/DWWM/2018-2023/AT1","slug":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4.mdx","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4,"title":"CP 4","description":"Synthèse de la CP 4 \"Réaliser une interface utilisateur avec une solution de gestion de contenu ou e-commerce\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)."},"sidebar":"tutorialSidebar","previous":{"title":"CP 3","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3"},"next":{"title":"CP 5","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5"}},{"id":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Créer une base de données\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","source":"@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5.mdx","sourceDirName":"titres-professionnels/archives/DWWM/2018-2023/AT2","slug":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5.mdx","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"sidebar_position":5,"title":"CP 5","description":"Synthèse de la CP 5 \"Créer une base de données\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)."},"sidebar":"tutorialSidebar","previous":{"title":"CP 4","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4"},"next":{"title":"CP 6","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6"}},{"id":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 5 \"Développer les composants d'accès aux données\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","source":"@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6.mdx","sourceDirName":"titres-professionnels/archives/DWWM/2018-2023/AT2","slug":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6.mdx","tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"sidebar_position":6,"title":"CP 6","description":"Synthèse de la CP 5 \"Développer les composants d'accès aux données\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)."},"sidebar":"tutorialSidebar","previous":{"title":"CP 5","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5"},"next":{"title":"CP 7","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7"}},{"id":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP7","title":"CP 7","description":"Synthèse de la CP 7 \"Développer la partie back-end d'une application web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","source":"@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7.mdx","sourceDirName":"titres-professionnels/archives/DWWM/2018-2023/AT2","slug":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7.mdx","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"sidebar_position":7,"title":"CP 7","description":"Synthèse de la CP 7 \"Développer la partie back-end d'une application web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)."},"sidebar":"tutorialSidebar","previous":{"title":"CP 6","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6"},"next":{"title":"CP 8","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8"}},{"id":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP8","title":"CP 8","description":"Synthèse de la CP 8 \"Élaborer et mettre en œuvre des composants dans une application de gestion de contenu ou e-commerce\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré).","source":"@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8.mdx","sourceDirName":"titres-professionnels/archives/DWWM/2018-2023/AT2","slug":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8.mdx","tags":[],"version":"current","sidebarPosition":8,"frontMatter":{"sidebar_position":8,"title":"CP 8","description":"Synthèse de la CP 8 \"Élaborer et mettre en œuvre des composants dans une application de gestion de contenu ou e-commerce\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)."},"sidebar":"tutorialSidebar","previous":{"title":"CP 7","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7"},"next":{"title":"Se préparer pour un TP","permalink":"/titres-professionnels/se-preparer"}},{"id":"titres-professionnels/archives/DWWM/2018-2023/intro","title":"Résumé","description":"Résumé du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, expiré depuis septembre 2023).","source":"@site/docs/titres-professionnels/archives/DWWM/2018-2023/intro.mdx","sourceDirName":"titres-professionnels/archives/DWWM/2018-2023","slug":"/titres-professionnels/archives/DWWM/2018-2023/intro","permalink":"/titres-professionnels/archives/DWWM/2018-2023/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/archives/DWWM/2018-2023/intro.mdx","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Résumé","description":"Résumé du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, expiré depuis septembre 2023)."},"sidebar":"tutorialSidebar","previous":{"title":"🗃️ Archives","permalink":"/category/️-archives"},"next":{"title":"CP 1","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1"}},{"id":"titres-professionnels/CDA/AT1/CP1","title":"CP 1","description":"Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","source":"@site/docs/titres-professionnels/CDA/AT1/CP1.mdx","sourceDirName":"titres-professionnels/CDA/AT1","slug":"/titres-professionnels/CDA/AT1/CP1","permalink":"/titres-professionnels/CDA/AT1/CP1","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT1/CP1.mdx","tags":[{"inline":true,"label":"CDA","permalink":"/tags/cda"},{"inline":true,"label":"Environnement de développement","permalink":"/tags/environnement-de-developpement"}],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"CP 1","description":"Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","tags":["CDA","Environnement de développement"]},"sidebar":"tutorialSidebar","previous":{"title":"Résumé","permalink":"/titres-professionnels/CDA/intro"},"next":{"title":"CP 2","permalink":"/titres-professionnels/CDA/AT1/CP2"}},{"id":"titres-professionnels/CDA/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 2 \"Développer des interfaces utilisateur\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","source":"@site/docs/titres-professionnels/CDA/AT1/CP2.mdx","sourceDirName":"titres-professionnels/CDA/AT1","slug":"/titres-professionnels/CDA/AT1/CP2","permalink":"/titres-professionnels/CDA/AT1/CP2","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT1/CP2.mdx","tags":[{"inline":true,"label":"CDA","permalink":"/tags/cda"}],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"CP 2","description":"Synthèse de la CP 2 \"Développer des interfaces utilisateur\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","tags":["CDA"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 1","permalink":"/titres-professionnels/CDA/AT1/CP1"},"next":{"title":"CP 3","permalink":"/titres-professionnels/CDA/AT1/CP3"}},{"id":"titres-professionnels/CDA/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Développer des composants métier\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","source":"@site/docs/titres-professionnels/CDA/AT1/CP3.mdx","sourceDirName":"titres-professionnels/CDA/AT1","slug":"/titres-professionnels/CDA/AT1/CP3","permalink":"/titres-professionnels/CDA/AT1/CP3","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT1/CP3.mdx","tags":[{"inline":true,"label":"CDA","permalink":"/tags/cda"}],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"CP 3","description":"Synthèse de la CP 3 \"Développer des composants métier\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","tags":["CDA"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 2","permalink":"/titres-professionnels/CDA/AT1/CP2"},"next":{"title":"CP 4","permalink":"/titres-professionnels/CDA/AT1/CP4"}},{"id":"titres-professionnels/CDA/AT1/CP4","title":"CP 4","description":"Synthèse de la CP 4 \"Contribuer à la gestion d’un projet informatique\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","source":"@site/docs/titres-professionnels/CDA/AT1/CP4.mdx","sourceDirName":"titres-professionnels/CDA/AT1","slug":"/titres-professionnels/CDA/AT1/CP4","permalink":"/titres-professionnels/CDA/AT1/CP4","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT1/CP4.mdx","tags":[{"inline":true,"label":"CDA","permalink":"/tags/cda"}],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4,"title":"CP 4","description":"Synthèse de la CP 4 \"Contribuer à la gestion d’un projet informatique\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","tags":["CDA"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 3","permalink":"/titres-professionnels/CDA/AT1/CP3"},"next":{"title":"CP 5","permalink":"/titres-professionnels/CDA/AT2/CP5"}},{"id":"titres-professionnels/CDA/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Analyser les besoins et maquetter une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","source":"@site/docs/titres-professionnels/CDA/AT2/CP5.mdx","sourceDirName":"titres-professionnels/CDA/AT2","slug":"/titres-professionnels/CDA/AT2/CP5","permalink":"/titres-professionnels/CDA/AT2/CP5","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT2/CP5.mdx","tags":[{"inline":true,"label":"CDA","permalink":"/tags/cda"}],"version":"current","sidebarPosition":5,"frontMatter":{"sidebar_position":5,"title":"CP 5","description":"Synthèse de la CP 5 \"Analyser les besoins et maquetter une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","tags":["CDA"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 4","permalink":"/titres-professionnels/CDA/AT1/CP4"},"next":{"title":"CP 6","permalink":"/titres-professionnels/CDA/AT2/CP6"}},{"id":"titres-professionnels/CDA/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 6 \"Définir l’architecture logicielle d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","source":"@site/docs/titres-professionnels/CDA/AT2/CP6.mdx","sourceDirName":"titres-professionnels/CDA/AT2","slug":"/titres-professionnels/CDA/AT2/CP6","permalink":"/titres-professionnels/CDA/AT2/CP6","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT2/CP6.mdx","tags":[{"inline":true,"label":"CDA","permalink":"/tags/cda"}],"version":"current","sidebarPosition":6,"frontMatter":{"sidebar_position":6,"title":"CP 6","description":"Synthèse de la CP 6 \"Définir l’architecture logicielle d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","tags":["CDA"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 5","permalink":"/titres-professionnels/CDA/AT2/CP5"},"next":{"title":"CP 7","permalink":"/titres-professionnels/CDA/AT2/CP7"}},{"id":"titres-professionnels/CDA/AT2/CP7","title":"CP 7","description":"Synthèse de la CP 7 \"Concevoir et mettre en place une base de données relationnelle\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","source":"@site/docs/titres-professionnels/CDA/AT2/CP7.mdx","sourceDirName":"titres-professionnels/CDA/AT2","slug":"/titres-professionnels/CDA/AT2/CP7","permalink":"/titres-professionnels/CDA/AT2/CP7","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT2/CP7.mdx","tags":[{"inline":true,"label":"CDA","permalink":"/tags/cda"}],"version":"current","sidebarPosition":7,"frontMatter":{"sidebar_position":7,"title":"CP 7","description":"Synthèse de la CP 7 \"Concevoir et mettre en place une base de données relationnelle\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","tags":["CDA"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 6","permalink":"/titres-professionnels/CDA/AT2/CP6"},"next":{"title":"CP 8","permalink":"/titres-professionnels/CDA/AT2/CP8"}},{"id":"titres-professionnels/CDA/AT2/CP8","title":"CP 8","description":"Synthèse de la CP 8 \"Développer des composants d’accès aux données SQL et NoSQL\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","source":"@site/docs/titres-professionnels/CDA/AT2/CP8.mdx","sourceDirName":"titres-professionnels/CDA/AT2","slug":"/titres-professionnels/CDA/AT2/CP8","permalink":"/titres-professionnels/CDA/AT2/CP8","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT2/CP8.mdx","tags":[{"inline":true,"label":"CDA","permalink":"/tags/cda"}],"version":"current","sidebarPosition":8,"frontMatter":{"sidebar_position":8,"title":"CP 8","description":"Synthèse de la CP 8 \"Développer des composants d’accès aux données SQL et NoSQL\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","tags":["CDA"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 7","permalink":"/titres-professionnels/CDA/AT2/CP7"},"next":{"title":"CP 9","permalink":"/titres-professionnels/CDA/AT3/CP9"}},{"id":"titres-professionnels/CDA/AT3/CP10","title":"CP 10","description":"Synthèse de la CP 10 \"Préparer et documenter le déploiement d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","source":"@site/docs/titres-professionnels/CDA/AT3/CP10.mdx","sourceDirName":"titres-professionnels/CDA/AT3","slug":"/titres-professionnels/CDA/AT3/CP10","permalink":"/titres-professionnels/CDA/AT3/CP10","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT3/CP10.mdx","tags":[{"inline":true,"label":"CDA","permalink":"/tags/cda"}],"version":"current","sidebarPosition":10,"frontMatter":{"sidebar_position":10,"title":"CP 10","description":"Synthèse de la CP 10 \"Préparer et documenter le déploiement d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","tags":["CDA"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 9","permalink":"/titres-professionnels/CDA/AT3/CP9"},"next":{"title":"CP 11","permalink":"/titres-professionnels/CDA/AT3/CP11"}},{"id":"titres-professionnels/CDA/AT3/CP11","title":"CP 11","description":"Synthèse de la CP 11 \"Contribuer à la mise en production dans une démarche DevOps\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","source":"@site/docs/titres-professionnels/CDA/AT3/CP11.mdx","sourceDirName":"titres-professionnels/CDA/AT3","slug":"/titres-professionnels/CDA/AT3/CP11","permalink":"/titres-professionnels/CDA/AT3/CP11","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT3/CP11.mdx","tags":[{"inline":true,"label":"CDA","permalink":"/tags/cda"}],"version":"current","sidebarPosition":11,"frontMatter":{"sidebar_position":11,"title":"CP 11","description":"Synthèse de la CP 11 \"Contribuer à la mise en production dans une démarche DevOps\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","tags":["CDA"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 10","permalink":"/titres-professionnels/CDA/AT3/CP10"},"next":{"title":"Résumé","permalink":"/titres-professionnels/DWWM/intro"}},{"id":"titres-professionnels/CDA/AT3/CP9","title":"CP 9","description":"Synthèse de la CP 9 \"Préparer et exécuter les plans de tests d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","source":"@site/docs/titres-professionnels/CDA/AT3/CP9.mdx","sourceDirName":"titres-professionnels/CDA/AT3","slug":"/titres-professionnels/CDA/AT3/CP9","permalink":"/titres-professionnels/CDA/AT3/CP9","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/AT3/CP9.mdx","tags":[{"inline":true,"label":"CDA","permalink":"/tags/cda"}],"version":"current","sidebarPosition":9,"frontMatter":{"sidebar_position":9,"title":"CP 9","description":"Synthèse de la CP 9 \"Préparer et exécuter les plans de tests d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04).","tags":["CDA"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 8","permalink":"/titres-professionnels/CDA/AT2/CP8"},"next":{"title":"CP 10","permalink":"/titres-professionnels/CDA/AT3/CP10"}},{"id":"titres-professionnels/CDA/intro","title":"Résumé","description":"Résumé du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04, actif depuis décembre 2023).","source":"@site/docs/titres-professionnels/CDA/intro.mdx","sourceDirName":"titres-professionnels/CDA","slug":"/titres-professionnels/CDA/intro","permalink":"/titres-professionnels/CDA/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/CDA/intro.mdx","tags":[{"inline":true,"label":"CDA","permalink":"/tags/cda"}],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Résumé","description":"Résumé du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04, actif depuis décembre 2023).","tags":["CDA"]},"sidebar":"tutorialSidebar","previous":{"title":"🎓 Titres professionnels","permalink":"/category/-titres-professionnels"},"next":{"title":"CP 1","permalink":"/titres-professionnels/CDA/AT1/CP1"}},{"id":"titres-professionnels/DWWM/AT1/CP1","title":"CP 1","description":"Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","source":"@site/docs/titres-professionnels/DWWM/AT1/CP1.mdx","sourceDirName":"titres-professionnels/DWWM/AT1","slug":"/titres-professionnels/DWWM/AT1/CP1","permalink":"/titres-professionnels/DWWM/AT1/CP1","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT1/CP1.mdx","tags":[{"inline":true,"label":"DWWM","permalink":"/tags/dwwm"},{"inline":true,"label":"Environnement de développement","permalink":"/tags/environnement-de-developpement"}],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"CP 1","description":"Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","tags":["DWWM","Environnement de développement"]},"sidebar":"tutorialSidebar","previous":{"title":"La soutenance DWWM","permalink":"/titres-professionnels/DWWM/soutenance"},"next":{"title":"CP 2","permalink":"/titres-professionnels/DWWM/AT1/CP2"}},{"id":"titres-professionnels/DWWM/AT1/CP2","title":"CP 2","description":"Synthèse de la CP 2 \"Maquetter des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","source":"@site/docs/titres-professionnels/DWWM/AT1/CP2.mdx","sourceDirName":"titres-professionnels/DWWM/AT1","slug":"/titres-professionnels/DWWM/AT1/CP2","permalink":"/titres-professionnels/DWWM/AT1/CP2","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT1/CP2.mdx","tags":[{"inline":true,"label":"DWWM","permalink":"/tags/dwwm"},{"inline":true,"label":"Eco-conception","permalink":"/tags/eco-conception"},{"inline":true,"label":"Accessibilité","permalink":"/tags/accessibilite"},{"inline":true,"label":"SEO/Référencement naturel","permalink":"/tags/seo-referencement-naturel"},{"inline":true,"label":"Maquettage","permalink":"/tags/maquettage"},{"inline":true,"label":"Wireframe","permalink":"/tags/wireframe"},{"inline":true,"label":"Zoning","permalink":"/tags/zoning"},{"inline":true,"label":"Front-end","permalink":"/tags/front-end"}],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"CP 2","description":"Synthèse de la CP 2 \"Maquetter des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","tags":["DWWM","Eco-conception","Accessibilité","SEO/Référencement naturel","Maquettage","Wireframe","Zoning","Front-end"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 1","permalink":"/titres-professionnels/DWWM/AT1/CP1"},"next":{"title":"CP 3","permalink":"/titres-professionnels/DWWM/AT1/CP3"}},{"id":"titres-professionnels/DWWM/AT1/CP3","title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","source":"@site/docs/titres-professionnels/DWWM/AT1/CP3.mdx","sourceDirName":"titres-professionnels/DWWM/AT1","slug":"/titres-professionnels/DWWM/AT1/CP3","permalink":"/titres-professionnels/DWWM/AT1/CP3","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT1/CP3.mdx","tags":[{"inline":true,"label":"DWWM","permalink":"/tags/dwwm"},{"inline":true,"label":"Intégration","permalink":"/tags/integration"},{"inline":true,"label":"Responsive","permalink":"/tags/responsive"},{"inline":true,"label":"HTML","permalink":"/tags/html"},{"inline":true,"label":"CSS","permalink":"/tags/css"},{"inline":true,"label":"Accessibilité","permalink":"/tags/accessibilite"},{"inline":true,"label":"Éco-conception","permalink":"/tags/eco-conception"},{"inline":true,"label":"SEO/Référencement naturel","permalink":"/tags/seo-referencement-naturel"},{"inline":true,"label":"Déploiement","permalink":"/tags/deploiement"},{"inline":true,"label":"Reverse Proxy","permalink":"/tags/reverse-proxy"},{"inline":true,"label":"Front-end","permalink":"/tags/front-end"},{"inline":true,"label":"Serveur web","permalink":"/tags/serveur-web"}],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"CP 3","description":"Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","tags":["DWWM","Intégration","Responsive","HTML","CSS","Accessibilité","Éco-conception","SEO/Référencement naturel","Déploiement","Reverse Proxy","Front-end","Serveur web"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 2","permalink":"/titres-professionnels/DWWM/AT1/CP2"},"next":{"title":"CP 4","permalink":"/titres-professionnels/DWWM/AT1/CP4"}},{"id":"titres-professionnels/DWWM/AT1/CP4","title":"CP 4","description":"Synthèse de la CP 4 \"Développer la partie dynamique des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","source":"@site/docs/titres-professionnels/DWWM/AT1/CP4.mdx","sourceDirName":"titres-professionnels/DWWM/AT1","slug":"/titres-professionnels/DWWM/AT1/CP4","permalink":"/titres-professionnels/DWWM/AT1/CP4","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT1/CP4.mdx","tags":[{"inline":true,"label":"DWWM","permalink":"/tags/dwwm"},{"inline":true,"label":"JavaScript/TypeScript","permalink":"/tags/java-script-type-script"},{"inline":true,"label":"Front-end","permalink":"/tags/front-end"},{"inline":true,"label":"Eco-conception","permalink":"/tags/eco-conception"},{"inline":true,"label":"Accessibilité","permalink":"/tags/accessibilite"},{"inline":true,"label":"SEO/Référencement naturel","permalink":"/tags/seo-referencement-naturel"}],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4,"title":"CP 4","description":"Synthèse de la CP 4 \"Développer la partie dynamique des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","tags":["DWWM","JavaScript/TypeScript","Front-end","Eco-conception","Accessibilité","SEO/Référencement naturel"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 3","permalink":"/titres-professionnels/DWWM/AT1/CP3"},"next":{"title":"CP 5","permalink":"/titres-professionnels/DWWM/AT2/CP5"}},{"id":"titres-professionnels/DWWM/AT2/CP5","title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","source":"@site/docs/titres-professionnels/DWWM/AT2/CP5.mdx","sourceDirName":"titres-professionnels/DWWM/AT2","slug":"/titres-professionnels/DWWM/AT2/CP5","permalink":"/titres-professionnels/DWWM/AT2/CP5","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT2/CP5.mdx","tags":[{"inline":true,"label":"DWWM","permalink":"/tags/dwwm"},{"inline":true,"label":"Conception","permalink":"/tags/conception"},{"inline":true,"label":"Modélisation","permalink":"/tags/modelisation"},{"inline":true,"label":"Base de données","permalink":"/tags/base-de-donnees"},{"inline":true,"label":"Merise","permalink":"/tags/merise"},{"inline":true,"label":"Dictionnaire de Données","permalink":"/tags/dictionnaire-de-donnees"},{"inline":true,"label":"Modèle Conceptuel de Données (MCD)","permalink":"/tags/modele-conceptuel-de-donnees-mcd"},{"inline":true,"label":"Modèle Logique de Données (MLD)","permalink":"/tags/modele-logique-de-donnees-mld"},{"inline":true,"label":"Modèle Relationnel de Données (MRD)","permalink":"/tags/modele-relationnel-de-donnees-mrd"},{"inline":true,"label":"Modèle Physique de Données (MPD)","permalink":"/tags/modele-physique-de-donnees-mpd"},{"inline":true,"label":"SQL","permalink":"/tags/sql"},{"inline":true,"label":"Back-end","permalink":"/tags/back-end"}],"version":"current","sidebarPosition":5,"frontMatter":{"sidebar_position":5,"title":"CP 5","description":"Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","tags":["DWWM","Conception","Modélisation","Base de données","Merise","Dictionnaire de Données","Modèle Conceptuel de Données (MCD)","Modèle Logique de Données (MLD)","Modèle Relationnel de Données (MRD)","Modèle Physique de Données (MPD)","SQL","Back-end"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 4","permalink":"/titres-professionnels/DWWM/AT1/CP4"},"next":{"title":"CP 6","permalink":"/titres-professionnels/DWWM/AT2/CP6"}},{"id":"titres-professionnels/DWWM/AT2/CP6","title":"CP 6","description":"Synthèse de la CP 6 \"Développer des composants d'accès aux données SQL et NoSQL\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","source":"@site/docs/titres-professionnels/DWWM/AT2/CP6.mdx","sourceDirName":"titres-professionnels/DWWM/AT2","slug":"/titres-professionnels/DWWM/AT2/CP6","permalink":"/titres-professionnels/DWWM/AT2/CP6","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT2/CP6.mdx","tags":[{"inline":true,"label":"DWWM","permalink":"/tags/dwwm"},{"inline":true,"label":"Base de données","permalink":"/tags/base-de-donnees"},{"inline":true,"label":"SQL","permalink":"/tags/sql"},{"inline":true,"label":"Back-end","permalink":"/tags/back-end"},{"inline":true,"label":"ORM/ODM","permalink":"/tags/orm-odm"},{"inline":true,"label":"Sécurité","permalink":"/tags/securite"},{"inline":true,"label":"Chiffrement","permalink":"/tags/chiffrement"},{"inline":true,"label":"Hachage","permalink":"/tags/hachage"}],"version":"current","sidebarPosition":6,"frontMatter":{"sidebar_position":6,"title":"CP 6","description":"Synthèse de la CP 6 \"Développer des composants d'accès aux données SQL et NoSQL\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","tags":["DWWM","Base de données","SQL","Back-end","ORM/ODM","Sécurité","Chiffrement","Hachage"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 5","permalink":"/titres-professionnels/DWWM/AT2/CP5"},"next":{"title":"CP 7","permalink":"/titres-professionnels/DWWM/AT2/CP7"}},{"id":"titres-professionnels/DWWM/AT2/CP7","title":"CP 7","description":"Synthèse de la CP 7 \"Développer des composants métier coté serveur\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","source":"@site/docs/titres-professionnels/DWWM/AT2/CP7.mdx","sourceDirName":"titres-professionnels/DWWM/AT2","slug":"/titres-professionnels/DWWM/AT2/CP7","permalink":"/titres-professionnels/DWWM/AT2/CP7","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT2/CP7.mdx","tags":[{"inline":true,"label":"DWWM","permalink":"/tags/dwwm"},{"inline":true,"label":"Architecture","permalink":"/tags/architecture"},{"inline":true,"label":"Design Pattern","permalink":"/tags/design-pattern"},{"inline":true,"label":"Back-end","permalink":"/tags/back-end"},{"inline":true,"label":"Sécurité","permalink":"/tags/securite"},{"inline":true,"label":"Tests","permalink":"/tags/tests"}],"version":"current","sidebarPosition":7,"frontMatter":{"sidebar_position":7,"title":"CP 7","description":"Synthèse de la CP 7 \"Développer des composants métier coté serveur\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","tags":["DWWM","Architecture","Design Pattern","Back-end","Sécurité","Tests"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 6","permalink":"/titres-professionnels/DWWM/AT2/CP6"},"next":{"title":"CP 8","permalink":"/titres-professionnels/DWWM/AT2/CP8"}},{"id":"titres-professionnels/DWWM/AT2/CP8","title":"CP 8","description":"Synthèse de la CP 8 \"Documenter le déploiement d'une application dynamique web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","source":"@site/docs/titres-professionnels/DWWM/AT2/CP8.mdx","sourceDirName":"titres-professionnels/DWWM/AT2","slug":"/titres-professionnels/DWWM/AT2/CP8","permalink":"/titres-professionnels/DWWM/AT2/CP8","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/AT2/CP8.mdx","tags":[{"inline":true,"label":"DWWM","permalink":"/tags/dwwm"},{"inline":true,"label":"Déploiement","permalink":"/tags/deploiement"},{"inline":true,"label":"Back-end","permalink":"/tags/back-end"},{"inline":true,"label":"Reverse Proxy","permalink":"/tags/reverse-proxy"},{"inline":true,"label":"Serveur web","permalink":"/tags/serveur-web"}],"version":"current","sidebarPosition":8,"frontMatter":{"sidebar_position":8,"title":"CP 8","description":"Synthèse de la CP 8 \"Documenter le déploiement d'une application dynamique web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04).","tags":["DWWM","Déploiement","Back-end","Reverse Proxy","Serveur web"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 7","permalink":"/titres-professionnels/DWWM/AT2/CP7"},"next":{"title":"🗃️ Archives","permalink":"/category/️-archives"}},{"id":"titres-professionnels/DWWM/intro","title":"Résumé","description":"Résumé du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04, actif depuis septembre 2023).","source":"@site/docs/titres-professionnels/DWWM/intro.mdx","sourceDirName":"titres-professionnels/DWWM","slug":"/titres-professionnels/DWWM/intro","permalink":"/titres-professionnels/DWWM/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/intro.mdx","tags":[{"inline":true,"label":"DWWM","permalink":"/tags/dwwm"}],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1,"title":"Résumé","description":"Résumé du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04, actif depuis septembre 2023).","tags":["DWWM"]},"sidebar":"tutorialSidebar","previous":{"title":"CP 11","permalink":"/titres-professionnels/CDA/AT3/CP11"},"next":{"title":"La soutenance DWWM","permalink":"/titres-professionnels/DWWM/soutenance"}},{"id":"titres-professionnels/DWWM/soutenance","title":"La soutenance DWWM","description":"Tu prépares un TP DWWM et tu te demandes à quoi t'attendre pour la soutenance ? Voici quelques conseils pour te préparer efficacement.","source":"@site/docs/titres-professionnels/DWWM/soutenance.mdx","sourceDirName":"titres-professionnels/DWWM","slug":"/titres-professionnels/DWWM/soutenance","permalink":"/titres-professionnels/DWWM/soutenance","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/DWWM/soutenance.mdx","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2,"title":"La soutenance DWWM","description":"Tu prépares un TP DWWM et tu te demandes à quoi t'attendre pour la soutenance ? Voici quelques conseils pour te préparer efficacement."},"sidebar":"tutorialSidebar","previous":{"title":"Résumé","permalink":"/titres-professionnels/DWWM/intro"},"next":{"title":"CP 1","permalink":"/titres-professionnels/DWWM/AT1/CP1"}},{"id":"titres-professionnels/retours","title":"Retours d'expériences","description":"Découvre les témoignages de candidats et jury sur leur soutenance de titre professionnel : leurs ressentis avant, pendant et après leur passage devant le jury.","source":"@site/docs/titres-professionnels/retours.mdx","sourceDirName":"titres-professionnels","slug":"/titres-professionnels/retours","permalink":"/titres-professionnels/retours","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/retours.mdx","tags":[],"version":"current","sidebarPosition":99999,"frontMatter":{"sidebar_position":99999,"title":"Retours d'expériences","description":"Découvre les témoignages de candidats et jury sur leur soutenance de titre professionnel : leurs ressentis avant, pendant et après leur passage devant le jury."},"sidebar":"tutorialSidebar","previous":{"title":"Se préparer pour un TP","permalink":"/titres-professionnels/se-preparer"},"next":{"title":"💽 Bases de données","permalink":"/category/-bases-de-données"}},{"id":"titres-professionnels/se-preparer","title":"Se préparer pour un TP","description":"Tu prépares un titre professionnel et tu te demandes comment bien t'y préparer ? Jette donc un oeil !","source":"@site/docs/titres-professionnels/se-preparer.mdx","sourceDirName":"titres-professionnels","slug":"/titres-professionnels/se-preparer","permalink":"/titres-professionnels/se-preparer","draft":false,"unlisted":false,"editUrl":"https://github.com/preparation-tp/memento-dev/tree/main/docs/titres-professionnels/se-preparer.mdx","tags":[],"version":"current","sidebarPosition":9999,"frontMatter":{"sidebar_position":9999,"title":"Se préparer pour un TP","description":"Tu prépares un titre professionnel et tu te demandes comment bien t'y préparer ? Jette donc un oeil !"},"sidebar":"tutorialSidebar","previous":{"title":"CP 8","permalink":"/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8"},"next":{"title":"Retours d'expériences","permalink":"/titres-professionnels/retours"}}],"drafts":[],"sidebars":{"tutorialSidebar":[{"type":"doc","id":"intro"},{"type":"category","label":"📖 Glossaires","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"glossaires/titres-professionnel"}]},{"type":"category","label":"🎓 Titres professionnels","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"🧑‍💻 CDA","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"titres-professionnels/CDA/intro"},{"type":"category","label":"Activité Type 1","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"titres-professionnels/CDA/AT1/CP1"},{"type":"doc","id":"titres-professionnels/CDA/AT1/CP2"},{"type":"doc","id":"titres-professionnels/CDA/AT1/CP3"},{"type":"doc","id":"titres-professionnels/CDA/AT1/CP4"}]},{"type":"category","label":"Activité Type 2","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"titres-professionnels/CDA/AT2/CP5"},{"type":"doc","id":"titres-professionnels/CDA/AT2/CP6"},{"type":"doc","id":"titres-professionnels/CDA/AT2/CP7"},{"type":"doc","id":"titres-professionnels/CDA/AT2/CP8"}]},{"type":"category","label":"Activité Type 3","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"titres-professionnels/CDA/AT3/CP9"},{"type":"doc","id":"titres-professionnels/CDA/AT3/CP10"},{"type":"doc","id":"titres-professionnels/CDA/AT3/CP11"}]}]},{"type":"category","label":"🧑‍💻 DWWM","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"titres-professionnels/DWWM/intro"},{"type":"doc","id":"titres-professionnels/DWWM/soutenance"},{"type":"category","label":"Activité Type 1","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"titres-professionnels/DWWM/AT1/CP1"},{"type":"doc","id":"titres-professionnels/DWWM/AT1/CP2"},{"type":"doc","id":"titres-professionnels/DWWM/AT1/CP3"},{"type":"doc","id":"titres-professionnels/DWWM/AT1/CP4"}]},{"type":"category","label":"Activité Type 2","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"titres-professionnels/DWWM/AT2/CP5"},{"type":"doc","id":"titres-professionnels/DWWM/AT2/CP6"},{"type":"doc","id":"titres-professionnels/DWWM/AT2/CP7"},{"type":"doc","id":"titres-professionnels/DWWM/AT2/CP8"}]}]},{"type":"category","label":"🗃️ Archives","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"DWWM","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"2018-2023","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"titres-professionnels/archives/DWWM/2018-2023/intro"},{"type":"category","label":"AT1","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP1"},{"type":"doc","id":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP2"},{"type":"doc","id":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP3"},{"type":"doc","id":"titres-professionnels/archives/DWWM/2018-2023/AT1/CP4"}]},{"type":"category","label":"AT2","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP5"},{"type":"doc","id":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP6"},{"type":"doc","id":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP7"},{"type":"doc","id":"titres-professionnels/archives/DWWM/2018-2023/AT2/CP8"}]}]}]}],"link":{"type":"generated-index","description":"Archives des différents référentiels arrivés à expiration.","slug":"/category/️-archives","permalink":"/category/️-archives"}},{"type":"doc","id":"titres-professionnels/se-preparer"},{"type":"doc","id":"titres-professionnels/retours"}],"link":{"type":"generated-index","description":"Tu retrouveras ici l'ensemble des titres professionnels couverts par la plateforme Memento Dev.","slug":"/category/-titres-professionnels","permalink":"/category/-titres-professionnels"}},{"type":"category","label":"📁 Ressources","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"💽 Bases de données","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Modélisation","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"ressources/bases-de-donnees/modelisation/merise"},{"type":"doc","id":"ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees"},{"type":"doc","id":"ressources/bases-de-donnees/modelisation/mcd"}]}],"link":{"type":"generated-index","slug":"/category/-bases-de-données","permalink":"/category/-bases-de-données"}},{"type":"category","label":"🌈 Frontend","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"React","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"ressources/frontend/react/intro"},{"type":"doc","id":"ressources/frontend/react/initialiser-un-projet-react"},{"type":"doc","id":"ressources/frontend/react/syntaxe-jsx"},{"type":"doc","id":"ressources/frontend/react/premier-composant"},{"type":"doc","id":"ressources/frontend/react/state-et-cycle-de-vie"},{"type":"doc","id":"ressources/frontend/react/hooks"},{"type":"doc","id":"ressources/frontend/react/contextes"},{"type":"doc","id":"ressources/frontend/react/reducers"}]}],"link":{"type":"generated-index","slug":"/category/-frontend","permalink":"/category/-frontend"}},{"type":"doc","id":"ressources/influenceurs-et-createurs"}]},{"type":"doc","id":"soutiens-et-contributeurs"},{"type":"doc","id":"contribuer"}]}}]}},"docusaurus-plugin-content-pages":{"default":[{"type":"jsx","permalink":"/","source":"@site/src/pages/index.tsx"},{"type":"mdx","permalink":"/markdown-page","source":"@site/src/pages/markdown-page.md","title":"Markdown page example","description":"You don't need React to write simple standalone pages.","frontMatter":{"title":"Markdown page example"},"unlisted":false},{"type":"jsx","permalink":"/mentions-legales","source":"@site/src/pages/mentions-legales.tsx"}]},"docusaurus-plugin-debug":{},"docusaurus-theme-classic":{},"docusaurus-tailwindcss":{},"docusaurus-lunr-search":{},"docusaurus-plugin-sitemap":{},"docusaurus-theme-mermaid":{},"docusaurus-bootstrap-plugin":{},"docusaurus-mdx-fallback-plugin":{}}} \ No newline at end of file diff --git a/old/.docusaurus/docusaurus.config.mjs b/old/.docusaurus/docusaurus.config.mjs new file mode 100644 index 0000000..2d5530a --- /dev/null +++ b/old/.docusaurus/docusaurus.config.mjs @@ -0,0 +1,632 @@ +/* + * AUTOGENERATED - DON'T EDIT + * Your edits in this file will be overwritten in the next build! + * Modify the docusaurus.config.js file at your site's root instead. + */ +export default { + "title": "Memento Dev", + "tagline": "Souviens-toi que tu développeras.", + "favicon": "img/favicon.webp", + "url": "https://memento-dev.fr", + "baseUrl": "/", + "organizationName": "preparation-tp", + "projectName": "memento-dev", + "onBrokenLinks": "throw", + "onBrokenMarkdownLinks": "warn", + "scripts": [ + { + "src": "https://cloud.umami.is/script.js", + "async": true, + "defer": true, + "data-website-id": "ba70261e-d145-4dd1-b0e8-27cbf4927b74" + } + ], + "markdown": { + "mermaid": true, + "format": "mdx", + "mdx1Compat": { + "comments": true, + "admonitions": true, + "headingIds": true + }, + "anchors": { + "maintainCase": false + } + }, + "themes": [ + "@docusaurus/theme-mermaid" + ], + "i18n": { + "defaultLocale": "fr", + "locales": [ + "fr" + ], + "path": "i18n", + "localeConfigs": {} + }, + "plugins": [ + [ + "@docusaurus/plugin-pwa", + { + "debug": false, + "offlineModeActivationStrategies": [ + "appInstalled", + "standalone", + "queryString" + ], + "pwaHead": [ + { + "tagName": "link", + "rel": "icon", + "href": "/img/favicon.webp" + }, + { + "tagName": "link", + "rel": "manifest", + "href": "/manifest.json" + }, + { + "tagName": "meta", + "name": "theme-color", + "content": "#7c3aed" + }, + { + "tagName": "meta", + "name": "apple-mobile-web-app-capable", + "content": "yes" + }, + { + "tagName": "meta", + "name": "apple-mobile-web-app-status-bar-style", + "content": "#242526" + }, + { + "tagName": "link", + "rel": "apple-touch-icon", + "href": "/img/favicon.webp" + }, + { + "tagName": "link", + "rel": "mask-icon", + "href": "/img/favicon.webp", + "color": "#7c3aed" + }, + { + "tagName": "meta", + "name": "msapplication-TileImage", + "content": "/img/favicon.webp" + }, + { + "tagName": "meta", + "name": "msapplication-TileColor", + "content": "#7c3aed" + } + ] + } + ], + null, + [ + "/Users/jack/Projets/Perso/memento-dev/node_modules/.pnpm/docusaurus-lunr-search@3.4.0_@docusaurus+core@3.6.1_@mdx-js+react@3.0.1_@types+react@18.3.3_r_qkss22oxrb6lqvbuqsivdrac7q/node_modules/docusaurus-lunr-search/src/index.js", + { + "languages": [ + "fr" + ] + } + ], + [ + "@docusaurus/plugin-sitemap", + { + "lastmod": "date", + "changefreq": "weekly", + "priority": 0.5, + "ignorePatterns": [ + "/tags/**" + ], + "filename": "sitemap.xml", + "id": "sitemap" + } + ] + ], + "presets": [ + [ + "classic", + { + "docs": { + "sidebarPath": "./sidebars.ts", + "editUrl": "https://github.com/preparation-tp/memento-dev/tree/main/", + "admonitions": { + "keywords": [ + "quote", + "example" + ], + "extendDefaults": true + }, + "routeBasePath": "/", + "tagsBasePath": "tags" + }, + "blog": false, + "theme": { + "customCss": "./src/css/custom.css" + } + } + ] + ], + "themeConfig": { + "image": "img/docusaurus-social-card.jpg", + "mermaid": { + "theme": { + "light": "neutral", + "dark": "dark" + }, + "options": {} + }, + "navbar": { + "style": "dark", + "title": "Memento Dev", + "logo": { + "alt": "Logo Memento Dev", + "src": "img/logo.webp" + }, + "items": [ + { + "type": "docSidebar", + "sidebarId": "tutorialSidebar", + "position": "left", + "label": "Documentation" + }, + { + "position": "left", + "label": "Ressources", + "items": [ + { + "label": "Préambule", + "to": "/intro" + }, + { + "label": "Front-end", + "to": "/category/-frontend" + }, + { + "label": "Bases de données", + "to": "/category/-bases-de-données" + } + ] + }, + { + "position": "left", + "label": "Titres professionnels", + "items": [ + { + "label": "CDA", + "to": "/titres-professionnels/CDA/intro" + }, + { + "label": "DWWM", + "to": "/titres-professionnels/DWWM/intro" + }, + { + "label": "Se préparer", + "to": "/titres-professionnels/se-preparer" + }, + { + "label": "Retours d'expériences", + "to": "/titres-professionnels/retours" + }, + { + "label": "Archives", + "to": "/category/%EF%B8%8F-archives" + } + ] + }, + { + "href": "https://github.com/preparation-tp/memento-dev", + "label": "GitHub", + "position": "right" + } + ], + "hideOnScroll": false + }, + "footer": { + "style": "dark", + "links": [ + { + "title": "Ressources", + "items": [ + { + "label": "Préambule", + "to": "/intro" + }, + { + "label": "Front-end", + "to": "/category/-frontend" + }, + { + "label": "Bases de données", + "to": "/category/-bases-de-données" + } + ] + }, + { + "title": "Titres professionnels", + "items": [ + { + "label": "CDA", + "to": "/titres-professionnels/CDA/intro" + }, + { + "label": "DWWM", + "to": "/titres-professionnels/DWWM/intro" + }, + { + "label": "Se préparer", + "to": "/titres-professionnels/se-preparer" + }, + { + "label": "Retours d'expériences", + "to": "/titres-professionnels/retours" + }, + { + "label": "Archives", + "to": "/category/%EF%B8%8F-archives" + } + ] + }, + { + "title": "Memento Dev", + "items": [ + { + "label": "Mentions légales", + "to": "/mentions-legales" + }, + { + "label": "Contribuer", + "to": "/contribuer" + }, + { + "label": "GitHub", + "href": "https://github.com/preparation-tp/memento-dev" + } + ] + } + ], + "copyright": "<span className=\"text-white/70\">\n Créé avec ❤️ par\n <a\n className=\"transition-colors hover:text-white hover:no-underline\"\n href=\"https://gauthierdaniels.fr\"\n target=\"_blank\"\n >\n Gauthier Daniels\n </a>\n </span>" + }, + "prism": { + "theme": { + "plain": { + "backgroundColor": "hsl(230, 1%, 98%)", + "color": "hsl(230, 8%, 24%)" + }, + "styles": [ + { + "types": [ + "comment", + "prolog", + "cdata" + ], + "style": { + "color": "hsl(230, 4%, 64%)" + } + }, + { + "types": [ + "doctype", + "punctuation", + "entity" + ], + "style": { + "color": "hsl(230, 8%, 24%)" + } + }, + { + "types": [ + "attr-name", + "class-name", + "boolean", + "constant", + "number", + "atrule" + ], + "style": { + "color": "hsl(35, 99%, 36%)" + } + }, + { + "types": [ + "keyword" + ], + "style": { + "color": "hsl(301, 63%, 40%)" + } + }, + { + "types": [ + "property", + "tag", + "symbol", + "deleted", + "important" + ], + "style": { + "color": "hsl(5, 74%, 59%)" + } + }, + { + "types": [ + "selector", + "string", + "char", + "builtin", + "inserted", + "regex", + "attr-value", + "punctuation" + ], + "style": { + "color": "hsl(119, 34%, 47%)" + } + }, + { + "types": [ + "variable", + "operator", + "function" + ], + "style": { + "color": "hsl(221, 87%, 60%)" + } + }, + { + "types": [ + "url" + ], + "style": { + "color": "hsl(198, 99%, 37%)" + } + }, + { + "types": [ + "deleted" + ], + "style": { + "textDecorationLine": "line-through" + } + }, + { + "types": [ + "inserted" + ], + "style": { + "textDecorationLine": "underline" + } + }, + { + "types": [ + "italic" + ], + "style": { + "fontStyle": "italic" + } + }, + { + "types": [ + "important", + "bold" + ], + "style": { + "fontWeight": "bold" + } + }, + { + "types": [ + "important" + ], + "style": { + "color": "hsl(230, 8%, 24%)" + } + } + ] + }, + "darkTheme": { + "plain": { + "backgroundColor": "hsl(220, 13%, 18%)", + "color": "hsl(220, 14%, 71%)", + "textShadow": "0 1px rgba(0, 0, 0, 0.3)" + }, + "styles": [ + { + "types": [ + "comment", + "prolog", + "cdata" + ], + "style": { + "color": "hsl(220, 10%, 40%)" + } + }, + { + "types": [ + "doctype", + "punctuation", + "entity" + ], + "style": { + "color": "hsl(220, 14%, 71%)" + } + }, + { + "types": [ + "attr-name", + "class-name", + "maybe-class-name", + "boolean", + "constant", + "number", + "atrule" + ], + "style": { + "color": "hsl(29, 54%, 61%)" + } + }, + { + "types": [ + "keyword" + ], + "style": { + "color": "hsl(286, 60%, 67%)" + } + }, + { + "types": [ + "property", + "tag", + "symbol", + "deleted", + "important" + ], + "style": { + "color": "hsl(355, 65%, 65%)" + } + }, + { + "types": [ + "selector", + "string", + "char", + "builtin", + "inserted", + "regex", + "attr-value" + ], + "style": { + "color": "hsl(95, 38%, 62%)" + } + }, + { + "types": [ + "variable", + "operator", + "function" + ], + "style": { + "color": "hsl(207, 82%, 66%)" + } + }, + { + "types": [ + "url" + ], + "style": { + "color": "hsl(187, 47%, 55%)" + } + }, + { + "types": [ + "deleted" + ], + "style": { + "textDecorationLine": "line-through" + } + }, + { + "types": [ + "inserted" + ], + "style": { + "textDecorationLine": "underline" + } + }, + { + "types": [ + "italic" + ], + "style": { + "fontStyle": "italic" + } + }, + { + "types": [ + "important", + "bold" + ], + "style": { + "fontWeight": "bold" + } + }, + { + "types": [ + "important" + ], + "style": { + "color": "hsl(220, 14%, 71%)" + } + } + ] + }, + "additionalLanguages": [ + "php", + "nginx", + "bash" + ], + "magicComments": [ + { + "className": "theme-code-block-highlighted-line", + "line": "highlight-next-line", + "block": { + "start": "highlight-start", + "end": "highlight-end" + } + } + ] + }, + "colorMode": { + "defaultMode": "light", + "disableSwitch": false, + "respectPrefersColorScheme": false + }, + "docs": { + "versionPersistence": "localStorage", + "sidebar": { + "hideable": false, + "autoCollapseCategories": false + } + }, + "blog": { + "sidebar": { + "groupByYear": true + } + }, + "metadata": [], + "tableOfContents": { + "minHeadingLevel": 2, + "maxHeadingLevel": 3 + } + }, + "baseUrlIssueBanner": true, + "future": { + "experimental_faster": { + "swcJsLoader": false, + "swcJsMinimizer": false, + "swcHtmlMinimizer": false, + "lightningCssMinimizer": false, + "mdxCrossCompilerCache": false, + "rspackBundler": false + }, + "experimental_storage": { + "type": "localStorage", + "namespace": false + }, + "experimental_router": "browser" + }, + "onBrokenAnchors": "warn", + "onDuplicateRoutes": "warn", + "staticDirectories": [ + "static" + ], + "customFields": {}, + "headTags": [], + "stylesheets": [], + "clientModules": [], + "titleDelimiter": "|", + "noIndex": false +}; diff --git a/old/.docusaurus/globalData.json b/old/.docusaurus/globalData.json new file mode 100644 index 0000000..867f1fd --- /dev/null +++ b/old/.docusaurus/globalData.json @@ -0,0 +1,301 @@ +{ + "docusaurus-plugin-content-docs": { + "default": { + "path": "/", + "versions": [ + { + "name": "current", + "label": "Next", + "isLast": true, + "path": "/", + "mainDocId": "intro", + "docs": [ + { + "id": "contribuer", + "path": "/contribuer", + "sidebar": "tutorialSidebar" + }, + { + "id": "glossaires/titres-professionnel", + "path": "/glossaires/titres-professionnel", + "sidebar": "tutorialSidebar" + }, + { + "id": "intro", + "path": "/intro", + "sidebar": "tutorialSidebar" + }, + { + "id": "ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees", + "path": "/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees", + "sidebar": "tutorialSidebar" + }, + { + "id": "ressources/bases-de-donnees/modelisation/mcd", + "path": "/ressources/bases-de-donnees/modelisation/mcd", + "sidebar": "tutorialSidebar" + }, + { + "id": "ressources/bases-de-donnees/modelisation/merise", + "path": "/ressources/bases-de-donnees/modelisation/merise", + "sidebar": "tutorialSidebar" + }, + { + "id": "ressources/frontend/react/contextes", + "path": "/ressources/frontend/react/contextes", + "sidebar": "tutorialSidebar" + }, + { + "id": "ressources/frontend/react/hooks", + "path": "/ressources/frontend/react/hooks", + "sidebar": "tutorialSidebar" + }, + { + "id": "ressources/frontend/react/initialiser-un-projet-react", + "path": "/ressources/frontend/react/initialiser-un-projet-react", + "sidebar": "tutorialSidebar" + }, + { + "id": "ressources/frontend/react/intro", + "path": "/ressources/frontend/react/intro", + "sidebar": "tutorialSidebar" + }, + { + "id": "ressources/frontend/react/premier-composant", + "path": "/ressources/frontend/react/premier-composant", + "sidebar": "tutorialSidebar" + }, + { + "id": "ressources/frontend/react/reducers", + "path": "/ressources/frontend/react/reducers", + "sidebar": "tutorialSidebar" + }, + { + "id": "ressources/frontend/react/state-et-cycle-de-vie", + "path": "/ressources/frontend/react/state-et-cycle-de-vie", + "sidebar": "tutorialSidebar" + }, + { + "id": "ressources/frontend/react/syntaxe-jsx", + "path": "/ressources/frontend/react/syntaxe-jsx", + "sidebar": "tutorialSidebar" + }, + { + "id": "ressources/influenceurs-et-createurs", + "path": "/ressources/influenceurs-et-createurs", + "sidebar": "tutorialSidebar" + }, + { + "id": "soutiens-et-contributeurs", + "path": "/soutiens-et-contributeurs", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/archives/DWWM/2018-2023/AT1/CP1", + "path": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/archives/DWWM/2018-2023/AT1/CP2", + "path": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/archives/DWWM/2018-2023/AT1/CP3", + "path": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/archives/DWWM/2018-2023/AT1/CP4", + "path": "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/archives/DWWM/2018-2023/AT2/CP5", + "path": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/archives/DWWM/2018-2023/AT2/CP6", + "path": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/archives/DWWM/2018-2023/AT2/CP7", + "path": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/archives/DWWM/2018-2023/AT2/CP8", + "path": "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/archives/DWWM/2018-2023/intro", + "path": "/titres-professionnels/archives/DWWM/2018-2023/intro", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/CDA/AT1/CP1", + "path": "/titres-professionnels/CDA/AT1/CP1", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/CDA/AT1/CP2", + "path": "/titres-professionnels/CDA/AT1/CP2", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/CDA/AT1/CP3", + "path": "/titres-professionnels/CDA/AT1/CP3", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/CDA/AT1/CP4", + "path": "/titres-professionnels/CDA/AT1/CP4", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/CDA/AT2/CP5", + "path": "/titres-professionnels/CDA/AT2/CP5", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/CDA/AT2/CP6", + "path": "/titres-professionnels/CDA/AT2/CP6", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/CDA/AT2/CP7", + "path": "/titres-professionnels/CDA/AT2/CP7", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/CDA/AT2/CP8", + "path": "/titres-professionnels/CDA/AT2/CP8", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/CDA/AT3/CP10", + "path": "/titres-professionnels/CDA/AT3/CP10", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/CDA/AT3/CP11", + "path": "/titres-professionnels/CDA/AT3/CP11", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/CDA/AT3/CP9", + "path": "/titres-professionnels/CDA/AT3/CP9", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/CDA/intro", + "path": "/titres-professionnels/CDA/intro", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/DWWM/AT1/CP1", + "path": "/titres-professionnels/DWWM/AT1/CP1", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/DWWM/AT1/CP2", + "path": "/titres-professionnels/DWWM/AT1/CP2", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/DWWM/AT1/CP3", + "path": "/titres-professionnels/DWWM/AT1/CP3", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/DWWM/AT1/CP4", + "path": "/titres-professionnels/DWWM/AT1/CP4", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/DWWM/AT2/CP5", + "path": "/titres-professionnels/DWWM/AT2/CP5", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/DWWM/AT2/CP6", + "path": "/titres-professionnels/DWWM/AT2/CP6", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/DWWM/AT2/CP7", + "path": "/titres-professionnels/DWWM/AT2/CP7", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/DWWM/AT2/CP8", + "path": "/titres-professionnels/DWWM/AT2/CP8", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/DWWM/intro", + "path": "/titres-professionnels/DWWM/intro", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/DWWM/soutenance", + "path": "/titres-professionnels/DWWM/soutenance", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/retours", + "path": "/titres-professionnels/retours", + "sidebar": "tutorialSidebar" + }, + { + "id": "titres-professionnels/se-preparer", + "path": "/titres-professionnels/se-preparer", + "sidebar": "tutorialSidebar" + }, + { + "id": "/category/-titres-professionnels", + "path": "/category/-titres-professionnels", + "sidebar": "tutorialSidebar" + }, + { + "id": "/category/️-archives", + "path": "/category/️-archives", + "sidebar": "tutorialSidebar" + }, + { + "id": "/category/-bases-de-données", + "path": "/category/-bases-de-données", + "sidebar": "tutorialSidebar" + }, + { + "id": "/category/-frontend", + "path": "/category/-frontend", + "sidebar": "tutorialSidebar" + } + ], + "draftIds": [], + "sidebars": { + "tutorialSidebar": { + "link": { + "path": "/intro", + "label": "intro" + } + } + } + } + ], + "breadcrumbs": true + } + }, + "docusaurus-lunr-search": { + "default": { + "fileNames": { + "searchDoc": "search-doc-1737111693310.json", + "lunrIndex": "lunr-index-1737111693310.json" + } + } + } +} \ No newline at end of file diff --git a/old/.docusaurus/i18n.json b/old/.docusaurus/i18n.json new file mode 100644 index 0000000..98c1c5f --- /dev/null +++ b/old/.docusaurus/i18n.json @@ -0,0 +1,17 @@ +{ + "defaultLocale": "fr", + "locales": [ + "fr" + ], + "path": "i18n", + "currentLocale": "fr", + "localeConfigs": { + "fr": { + "label": "Français", + "direction": "ltr", + "htmlLang": "fr", + "calendar": "gregory", + "path": "fr" + } + } +} \ No newline at end of file diff --git a/old/.docusaurus/lunr.client.js b/old/.docusaurus/lunr.client.js new file mode 100644 index 0000000..8cc9e1e --- /dev/null +++ b/old/.docusaurus/lunr.client.js @@ -0,0 +1,7 @@ +// THIS FILE IS AUTOGENERATED +// DO NOT EDIT THIS FILE! + +import * as lunr from "lunr"; +require("lunr-languages/lunr.stemmer.support")(lunr); +require("lunr-languages/lunr.fr")(lunr); +export default lunr; diff --git a/old/.docusaurus/registry.js b/old/.docusaurus/registry.js new file mode 100644 index 0000000..8551de4 --- /dev/null +++ b/old/.docusaurus/registry.js @@ -0,0 +1,123 @@ +export default { + "__comp---site-src-pages-index-tsx-1-df-d3e": [() => import(/* webpackChunkName: "__comp---site-src-pages-index-tsx-1-df-d3e" */ "@site/src/pages/index.tsx"), "@site/src/pages/index.tsx", require.resolveWeak("@site/src/pages/index.tsx")], + "__comp---site-src-pages-mentions-legales-tsx-9-a-7-a7b": [() => import(/* webpackChunkName: "__comp---site-src-pages-mentions-legales-tsx-9-a-7-a7b" */ "@site/src/pages/mentions-legales.tsx"), "@site/src/pages/mentions-legales.tsx", require.resolveWeak("@site/src/pages/mentions-legales.tsx")], + "__comp---theme-debug-config-23-a-2ff": [() => import(/* webpackChunkName: "__comp---theme-debug-config-23-a-2ff" */ "@theme/DebugConfig"), "@theme/DebugConfig", require.resolveWeak("@theme/DebugConfig")], + "__comp---theme-debug-contentba-8-ce7": [() => import(/* webpackChunkName: "__comp---theme-debug-contentba-8-ce7" */ "@theme/DebugContent"), "@theme/DebugContent", require.resolveWeak("@theme/DebugContent")], + "__comp---theme-debug-global-dataede-0fa": [() => import(/* webpackChunkName: "__comp---theme-debug-global-dataede-0fa" */ "@theme/DebugGlobalData"), "@theme/DebugGlobalData", require.resolveWeak("@theme/DebugGlobalData")], + "__comp---theme-debug-registry-679-501": [() => import(/* webpackChunkName: "__comp---theme-debug-registry-679-501" */ "@theme/DebugRegistry"), "@theme/DebugRegistry", require.resolveWeak("@theme/DebugRegistry")], + "__comp---theme-debug-routes-946-699": [() => import(/* webpackChunkName: "__comp---theme-debug-routes-946-699" */ "@theme/DebugRoutes"), "@theme/DebugRoutes", require.resolveWeak("@theme/DebugRoutes")], + "__comp---theme-debug-site-metadata-68-e-3d4": [() => import(/* webpackChunkName: "__comp---theme-debug-site-metadata-68-e-3d4" */ "@theme/DebugSiteMetadata"), "@theme/DebugSiteMetadata", require.resolveWeak("@theme/DebugSiteMetadata")], + "__comp---theme-doc-category-generated-index-page-14-e-640": [() => import(/* webpackChunkName: "__comp---theme-doc-category-generated-index-page-14-e-640" */ "@theme/DocCategoryGeneratedIndexPage"), "@theme/DocCategoryGeneratedIndexPage", require.resolveWeak("@theme/DocCategoryGeneratedIndexPage")], + "__comp---theme-doc-item-178-a40": [() => import(/* webpackChunkName: "__comp---theme-doc-item-178-a40" */ "@theme/DocItem"), "@theme/DocItem", require.resolveWeak("@theme/DocItem")], + "__comp---theme-doc-roota-94-67a": [() => import(/* webpackChunkName: "__comp---theme-doc-roota-94-67a" */ "@theme/DocRoot"), "@theme/DocRoot", require.resolveWeak("@theme/DocRoot")], + "__comp---theme-doc-tag-doc-list-pagedf-2-9f0": [() => import(/* webpackChunkName: "__comp---theme-doc-tag-doc-list-pagedf-2-9f0" */ "@theme/DocTagDocListPage"), "@theme/DocTagDocListPage", require.resolveWeak("@theme/DocTagDocListPage")], + "__comp---theme-doc-tags-list-page-372-89e": [() => import(/* webpackChunkName: "__comp---theme-doc-tags-list-page-372-89e" */ "@theme/DocTagsListPage"), "@theme/DocTagsListPage", require.resolveWeak("@theme/DocTagsListPage")], + "__comp---theme-doc-version-roota-7-b-5de": [() => import(/* webpackChunkName: "__comp---theme-doc-version-roota-7-b-5de" */ "@theme/DocVersionRoot"), "@theme/DocVersionRoot", require.resolveWeak("@theme/DocVersionRoot")], + "__comp---theme-docs-root-5-e-9-0b6": [() => import(/* webpackChunkName: "__comp---theme-docs-root-5-e-9-0b6" */ "@theme/DocsRoot"), "@theme/DocsRoot", require.resolveWeak("@theme/DocsRoot")], + "__comp---theme-mdx-page-1-f-3-b90": [() => import(/* webpackChunkName: "__comp---theme-mdx-page-1-f-3-b90" */ "@theme/MDXPage"), "@theme/MDXPage", require.resolveWeak("@theme/MDXPage")], + "__props---22-d-307": [() => import(/* webpackChunkName: "__props---22-d-307" */ "@generated/docusaurus-plugin-content-docs/default/p/index-466.json"), "@generated/docusaurus-plugin-content-docs/default/p/index-466.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/index-466.json")], + "__props---category-️-archivesa-58-2d1": [() => import(/* webpackChunkName: "__props---category-️-archivesa-58-2d1" */ "@generated/docusaurus-plugin-content-docs/default/p/category-️-archives-fd2.json"), "@generated/docusaurus-plugin-content-docs/default/p/category-️-archives-fd2.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/category-️-archives-fd2.json")], + "__props---category-bases-de-donnees-594-09a": [() => import(/* webpackChunkName: "__props---category-bases-de-donnees-594-09a" */ "@generated/docusaurus-plugin-content-docs/default/p/category-bases-de-donnees-fba.json"), "@generated/docusaurus-plugin-content-docs/default/p/category-bases-de-donnees-fba.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/category-bases-de-donnees-fba.json")], + "__props---category-frontende-7-c-d9b": [() => import(/* webpackChunkName: "__props---category-frontende-7-c-d9b" */ "@generated/docusaurus-plugin-content-docs/default/p/category-frontend-4de.json"), "@generated/docusaurus-plugin-content-docs/default/p/category-frontend-4de.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/category-frontend-4de.json")], + "__props---category-titres-professionnels-34-e-166": [() => import(/* webpackChunkName: "__props---category-titres-professionnels-34-e-166" */ "@generated/docusaurus-plugin-content-docs/default/p/category-titres-professionnels-9da.json"), "@generated/docusaurus-plugin-content-docs/default/p/category-titres-professionnels-9da.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/category-titres-professionnels-9da.json")], + "__props---docusaurus-debug-content-3-c-0-be2": [() => import(/* webpackChunkName: "__props---docusaurus-debug-content-3-c-0-be2" */ "@generated/docusaurus-plugin-debug/default/p/docusaurus-debug-content-0d5.json"), "@generated/docusaurus-plugin-debug/default/p/docusaurus-debug-content-0d5.json", require.resolveWeak("@generated/docusaurus-plugin-debug/default/p/docusaurus-debug-content-0d5.json")], + "__props---tags-59-a-1ee": [() => import(/* webpackChunkName: "__props---tags-59-a-1ee" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-b9f.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-b9f.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-b9f.json")], + "__props---tags-accessibilitec-01-132": [() => import(/* webpackChunkName: "__props---tags-accessibilitec-01-132" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-accessibilite-a1d.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-accessibilite-a1d.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-accessibilite-a1d.json")], + "__props---tags-architecturefcc-51f": [() => import(/* webpackChunkName: "__props---tags-architecturefcc-51f" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-architecture-02f.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-architecture-02f.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-architecture-02f.json")], + "__props---tags-back-end-5-f-5-395": [() => import(/* webpackChunkName: "__props---tags-back-end-5-f-5-395" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-back-end-7fe.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-back-end-7fe.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-back-end-7fe.json")], + "__props---tags-base-de-donnees-9-a-4-250": [() => import(/* webpackChunkName: "__props---tags-base-de-donnees-9-a-4-250" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-base-de-donnees-6c5.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-base-de-donnees-6c5.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-base-de-donnees-6c5.json")], + "__props---tags-bibliothequecc-2-2f9": [() => import(/* webpackChunkName: "__props---tags-bibliothequecc-2-2f9" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-bibliotheque-7e0.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-bibliotheque-7e0.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-bibliotheque-7e0.json")], + "__props---tags-cdad-81-162": [() => import(/* webpackChunkName: "__props---tags-cdad-81-162" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-cda-a60.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-cda-a60.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-cda-a60.json")], + "__props---tags-chiffrement-43-a-a9c": [() => import(/* webpackChunkName: "__props---tags-chiffrement-43-a-a9c" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-chiffrement-d68.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-chiffrement-d68.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-chiffrement-d68.json")], + "__props---tags-conceptionf-5-c-23e": [() => import(/* webpackChunkName: "__props---tags-conceptionf-5-c-23e" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-conception-113.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-conception-113.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-conception-113.json")], + "__props---tags-csrb-2-c-2de": [() => import(/* webpackChunkName: "__props---tags-csrb-2-c-2de" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-csr-5ca.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-csr-5ca.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-csr-5ca.json")], + "__props---tags-css-11-b-7f7": [() => import(/* webpackChunkName: "__props---tags-css-11-b-7f7" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-css-369.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-css-369.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-css-369.json")], + "__props---tags-deploiement-91-a-084": [() => import(/* webpackChunkName: "__props---tags-deploiement-91-a-084" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-deploiement-fb0.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-deploiement-fb0.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-deploiement-fb0.json")], + "__props---tags-design-pattern-791-edb": [() => import(/* webpackChunkName: "__props---tags-design-pattern-791-edb" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-design-pattern-4d2.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-design-pattern-4d2.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-design-pattern-4d2.json")], + "__props---tags-dictionnaire-de-donneesc-86-e42": [() => import(/* webpackChunkName: "__props---tags-dictionnaire-de-donneesc-86-e42" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-dictionnaire-de-donnees-6f4.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-dictionnaire-de-donnees-6f4.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-dictionnaire-de-donnees-6f4.json")], + "__props---tags-dwwm-04-a-406": [() => import(/* webpackChunkName: "__props---tags-dwwm-04-a-406" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-dwwm-ea7.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-dwwm-ea7.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-dwwm-ea7.json")], + "__props---tags-eco-conception-14-e-d59": [() => import(/* webpackChunkName: "__props---tags-eco-conception-14-e-d59" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-eco-conception-ad6.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-eco-conception-ad6.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-eco-conception-ad6.json")], + "__props---tags-environnement-de-developpementb-2-b-38a": [() => import(/* webpackChunkName: "__props---tags-environnement-de-developpementb-2-b-38a" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-environnement-de-developpement-91b.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-environnement-de-developpement-91b.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-environnement-de-developpement-91b.json")], + "__props---tags-front-end-027-83b": [() => import(/* webpackChunkName: "__props---tags-front-end-027-83b" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-front-end-b92.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-front-end-b92.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-front-end-b92.json")], + "__props---tags-frontend-905-d0c": [() => import(/* webpackChunkName: "__props---tags-frontend-905-d0c" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-frontend-a9a.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-frontend-a9a.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-frontend-a9a.json")], + "__props---tags-hachage-0-bb-eec": [() => import(/* webpackChunkName: "__props---tags-hachage-0-bb-eec" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-hachage-a9b.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-hachage-a9b.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-hachage-a9b.json")], + "__props---tags-html-5-e-7-70a": [() => import(/* webpackChunkName: "__props---tags-html-5-e-7-70a" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-html-ea7.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-html-ea7.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-html-ea7.json")], + "__props---tags-integrationca-0-9dd": [() => import(/* webpackChunkName: "__props---tags-integrationca-0-9dd" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-integration-c39.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-integration-c39.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-integration-c39.json")], + "__props---tags-interface-utilisateur-uiee-1-c7b": [() => import(/* webpackChunkName: "__props---tags-interface-utilisateur-uiee-1-c7b" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-interface-utilisateur-ui-bec.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-interface-utilisateur-ui-bec.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-interface-utilisateur-ui-bec.json")], + "__props---tags-java-script-type-scriptb-5-c-f71": [() => import(/* webpackChunkName: "__props---tags-java-script-type-scriptb-5-c-f71" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-java-script-type-script-4ed.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-java-script-type-script-4ed.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-java-script-type-script-4ed.json")], + "__props---tags-maquettageaf-8-bb5": [() => import(/* webpackChunkName: "__props---tags-maquettageaf-8-bb5" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-maquettage-4e5.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-maquettage-4e5.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-maquettage-4e5.json")], + "__props---tags-merise-683-55b": [() => import(/* webpackChunkName: "__props---tags-merise-683-55b" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-merise-88f.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-merise-88f.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-merise-88f.json")], + "__props---tags-modele-conceptuel-de-donnees-mcde-6-f-b6a": [() => import(/* webpackChunkName: "__props---tags-modele-conceptuel-de-donnees-mcde-6-f-b6a" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-modele-conceptuel-de-donnees-mcd-4e2.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-modele-conceptuel-de-donnees-mcd-4e2.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-modele-conceptuel-de-donnees-mcd-4e2.json")], + "__props---tags-modele-logique-de-donnees-mldf-9-f-bbc": [() => import(/* webpackChunkName: "__props---tags-modele-logique-de-donnees-mldf-9-f-bbc" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-modele-logique-de-donnees-mld-b5b.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-modele-logique-de-donnees-mld-b5b.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-modele-logique-de-donnees-mld-b5b.json")], + "__props---tags-modele-physique-de-donnees-mpdd-29-dea": [() => import(/* webpackChunkName: "__props---tags-modele-physique-de-donnees-mpdd-29-dea" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-modele-physique-de-donnees-mpd-715.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-modele-physique-de-donnees-mpd-715.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-modele-physique-de-donnees-mpd-715.json")], + "__props---tags-modele-relationnel-de-donnees-mrdeca-43f": [() => import(/* webpackChunkName: "__props---tags-modele-relationnel-de-donnees-mrdeca-43f" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-modele-relationnel-de-donnees-mrd-c20.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-modele-relationnel-de-donnees-mrd-c20.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-modele-relationnel-de-donnees-mrd-c20.json")], + "__props---tags-modelisationd-3-d-7aa": [() => import(/* webpackChunkName: "__props---tags-modelisationd-3-d-7aa" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-modelisation-8ee.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-modelisation-8ee.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-modelisation-8ee.json")], + "__props---tags-orm-odm-154-6a3": [() => import(/* webpackChunkName: "__props---tags-orm-odm-154-6a3" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-orm-odm-4b7.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-orm-odm-4b7.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-orm-odm-4b7.json")], + "__props---tags-react-1-ed-b1f": [() => import(/* webpackChunkName: "__props---tags-react-1-ed-b1f" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-react-df3.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-react-df3.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-react-df3.json")], + "__props---tags-responsive-87-c-668": [() => import(/* webpackChunkName: "__props---tags-responsive-87-c-668" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-responsive-3f9.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-responsive-3f9.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-responsive-3f9.json")], + "__props---tags-reverse-proxy-554-4e7": [() => import(/* webpackChunkName: "__props---tags-reverse-proxy-554-4e7" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-reverse-proxy-c23.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-reverse-proxy-c23.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-reverse-proxy-c23.json")], + "__props---tags-securiteb-96-9b1": [() => import(/* webpackChunkName: "__props---tags-securiteb-96-9b1" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-securite-b35.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-securite-b35.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-securite-b35.json")], + "__props---tags-seo-referencement-naturelb-90-ae7": [() => import(/* webpackChunkName: "__props---tags-seo-referencement-naturelb-90-ae7" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-seo-referencement-naturel-192.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-seo-referencement-naturel-192.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-seo-referencement-naturel-192.json")], + "__props---tags-serveur-web-56-b-5f0": [() => import(/* webpackChunkName: "__props---tags-serveur-web-56-b-5f0" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-serveur-web-fe0.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-serveur-web-fe0.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-serveur-web-fe0.json")], + "__props---tags-sqlf-8-c-bbb": [() => import(/* webpackChunkName: "__props---tags-sqlf-8-c-bbb" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-sql-d44.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-sql-d44.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-sql-d44.json")], + "__props---tags-ssgaa-3-815": [() => import(/* webpackChunkName: "__props---tags-ssgaa-3-815" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-ssg-04a.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-ssg-04a.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-ssg-04a.json")], + "__props---tags-ssr-7-ac-191": [() => import(/* webpackChunkName: "__props---tags-ssr-7-ac-191" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-ssr-9fe.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-ssr-9fe.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-ssr-9fe.json")], + "__props---tags-tests-149-d5f": [() => import(/* webpackChunkName: "__props---tags-tests-149-d5f" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-tests-694.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-tests-694.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-tests-694.json")], + "__props---tags-vike-595-bae": [() => import(/* webpackChunkName: "__props---tags-vike-595-bae" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-vike-d66.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-vike-d66.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-vike-d66.json")], + "__props---tags-viteca-1-e67": [() => import(/* webpackChunkName: "__props---tags-viteca-1-e67" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-vite-893.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-vite-893.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-vite-893.json")], + "__props---tags-wireframed-93-029": [() => import(/* webpackChunkName: "__props---tags-wireframed-93-029" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-wireframe-020.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-wireframe-020.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-wireframe-020.json")], + "__props---tags-zoningc-45-595": [() => import(/* webpackChunkName: "__props---tags-zoningc-45-595" */ "@generated/docusaurus-plugin-content-docs/default/p/tags-zoning-463.json"), "@generated/docusaurus-plugin-content-docs/default/p/tags-zoning-463.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/tags-zoning-463.json")], + "config---mentions-legales-5-e-9-a45": [() => import(/* webpackChunkName: "config---mentions-legales-5-e-9-a45" */ "@generated/docusaurus.config"), "@generated/docusaurus.config", require.resolveWeak("@generated/docusaurus.config")], + "content---contribuer-70-e-e3b": [() => import(/* webpackChunkName: "content---contribuer-70-e-e3b" */ "@site/docs/contribuer.mdx"), "@site/docs/contribuer.mdx", require.resolveWeak("@site/docs/contribuer.mdx")], + "content---glossaires-titres-professionneled-4-7b6": [() => import(/* webpackChunkName: "content---glossaires-titres-professionneled-4-7b6" */ "@site/docs/glossaires/titres-professionnel.mdx"), "@site/docs/glossaires/titres-professionnel.mdx", require.resolveWeak("@site/docs/glossaires/titres-professionnel.mdx")], + "content---introf-84-e9e": [() => import(/* webpackChunkName: "content---introf-84-e9e" */ "@site/docs/intro.mdx"), "@site/docs/intro.mdx", require.resolveWeak("@site/docs/intro.mdx")], + "content---markdown-page-393-028": [() => import(/* webpackChunkName: "content---markdown-page-393-028" */ "@site/src/pages/markdown-page.md"), "@site/src/pages/markdown-page.md", require.resolveWeak("@site/src/pages/markdown-page.md")], + "content---ressources-bases-de-donnees-modelisation-dictionnaire-de-donneesf-25-ccb": [() => import(/* webpackChunkName: "content---ressources-bases-de-donnees-modelisation-dictionnaire-de-donneesf-25-ccb" */ "@site/docs/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees.mdx"), "@site/docs/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees.mdx", require.resolveWeak("@site/docs/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees.mdx")], + "content---ressources-bases-de-donnees-modelisation-mcdbb-4-f22": [() => import(/* webpackChunkName: "content---ressources-bases-de-donnees-modelisation-mcdbb-4-f22" */ "@site/docs/ressources/bases-de-donnees/modelisation/mcd.mdx"), "@site/docs/ressources/bases-de-donnees/modelisation/mcd.mdx", require.resolveWeak("@site/docs/ressources/bases-de-donnees/modelisation/mcd.mdx")], + "content---ressources-bases-de-donnees-modelisation-merise-5-d-6-70a": [() => import(/* webpackChunkName: "content---ressources-bases-de-donnees-modelisation-merise-5-d-6-70a" */ "@site/docs/ressources/bases-de-donnees/modelisation/merise.mdx"), "@site/docs/ressources/bases-de-donnees/modelisation/merise.mdx", require.resolveWeak("@site/docs/ressources/bases-de-donnees/modelisation/merise.mdx")], + "content---ressources-frontend-react-contextescbc-1d1": [() => import(/* webpackChunkName: "content---ressources-frontend-react-contextescbc-1d1" */ "@site/docs/ressources/frontend/react/contextes.mdx"), "@site/docs/ressources/frontend/react/contextes.mdx", require.resolveWeak("@site/docs/ressources/frontend/react/contextes.mdx")], + "content---ressources-frontend-react-hooksd-19-abd": [() => import(/* webpackChunkName: "content---ressources-frontend-react-hooksd-19-abd" */ "@site/docs/ressources/frontend/react/hooks.mdx"), "@site/docs/ressources/frontend/react/hooks.mdx", require.resolveWeak("@site/docs/ressources/frontend/react/hooks.mdx")], + "content---ressources-frontend-react-initialiser-un-projet-reactbe-7-144": [() => import(/* webpackChunkName: "content---ressources-frontend-react-initialiser-un-projet-reactbe-7-144" */ "@site/docs/ressources/frontend/react/initialiser-un-projet-react.mdx"), "@site/docs/ressources/frontend/react/initialiser-un-projet-react.mdx", require.resolveWeak("@site/docs/ressources/frontend/react/initialiser-un-projet-react.mdx")], + "content---ressources-frontend-react-introf-04-d81": [() => import(/* webpackChunkName: "content---ressources-frontend-react-introf-04-d81" */ "@site/docs/ressources/frontend/react/intro.mdx"), "@site/docs/ressources/frontend/react/intro.mdx", require.resolveWeak("@site/docs/ressources/frontend/react/intro.mdx")], + "content---ressources-frontend-react-premier-composantb-78-d84": [() => import(/* webpackChunkName: "content---ressources-frontend-react-premier-composantb-78-d84" */ "@site/docs/ressources/frontend/react/premier-composant.mdx"), "@site/docs/ressources/frontend/react/premier-composant.mdx", require.resolveWeak("@site/docs/ressources/frontend/react/premier-composant.mdx")], + "content---ressources-frontend-react-reducers-68-b-603": [() => import(/* webpackChunkName: "content---ressources-frontend-react-reducers-68-b-603" */ "@site/docs/ressources/frontend/react/reducers.mdx"), "@site/docs/ressources/frontend/react/reducers.mdx", require.resolveWeak("@site/docs/ressources/frontend/react/reducers.mdx")], + "content---ressources-frontend-react-state-et-cycle-de-vie-719-b2a": [() => import(/* webpackChunkName: "content---ressources-frontend-react-state-et-cycle-de-vie-719-b2a" */ "@site/docs/ressources/frontend/react/state-et-cycle-de-vie.mdx"), "@site/docs/ressources/frontend/react/state-et-cycle-de-vie.mdx", require.resolveWeak("@site/docs/ressources/frontend/react/state-et-cycle-de-vie.mdx")], + "content---ressources-frontend-react-syntaxe-jsxe-94-59c": [() => import(/* webpackChunkName: "content---ressources-frontend-react-syntaxe-jsxe-94-59c" */ "@site/docs/ressources/frontend/react/syntaxe-jsx.mdx"), "@site/docs/ressources/frontend/react/syntaxe-jsx.mdx", require.resolveWeak("@site/docs/ressources/frontend/react/syntaxe-jsx.mdx")], + "content---ressources-influenceurs-et-createurseae-d03": [() => import(/* webpackChunkName: "content---ressources-influenceurs-et-createurseae-d03" */ "@site/docs/ressources/influenceurs-et-createurs.mdx"), "@site/docs/ressources/influenceurs-et-createurs.mdx", require.resolveWeak("@site/docs/ressources/influenceurs-et-createurs.mdx")], + "content---soutiens-et-contributeursd-64-5c8": [() => import(/* webpackChunkName: "content---soutiens-et-contributeursd-64-5c8" */ "@site/docs/soutiens-et-contributeurs.mdx"), "@site/docs/soutiens-et-contributeurs.mdx", require.resolveWeak("@site/docs/soutiens-et-contributeurs.mdx")], + "content---titres-professionnels-archives-dwwm-2018-2023-at-1-cp-1-fff-ab0": [() => import(/* webpackChunkName: "content---titres-professionnels-archives-dwwm-2018-2023-at-1-cp-1-fff-ab0" */ "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1.mdx"), "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1.mdx", require.resolveWeak("@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1.mdx")], + "content---titres-professionnels-archives-dwwm-2018-2023-at-1-cp-20-eb-17a": [() => import(/* webpackChunkName: "content---titres-professionnels-archives-dwwm-2018-2023-at-1-cp-20-eb-17a" */ "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2.mdx"), "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2.mdx", require.resolveWeak("@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2.mdx")], + "content---titres-professionnels-archives-dwwm-2018-2023-at-1-cp-3675-bb7": [() => import(/* webpackChunkName: "content---titres-professionnels-archives-dwwm-2018-2023-at-1-cp-3675-bb7" */ "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3.mdx"), "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3.mdx", require.resolveWeak("@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3.mdx")], + "content---titres-professionnels-archives-dwwm-2018-2023-at-1-cp-4-af-6-4ac": [() => import(/* webpackChunkName: "content---titres-professionnels-archives-dwwm-2018-2023-at-1-cp-4-af-6-4ac" */ "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4.mdx"), "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4.mdx", require.resolveWeak("@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4.mdx")], + "content---titres-professionnels-archives-dwwm-2018-2023-at-2-cp-5-bbc-1d4": [() => import(/* webpackChunkName: "content---titres-professionnels-archives-dwwm-2018-2023-at-2-cp-5-bbc-1d4" */ "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5.mdx"), "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5.mdx", require.resolveWeak("@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5.mdx")], + "content---titres-professionnels-archives-dwwm-2018-2023-at-2-cp-6-dc-9-6e9": [() => import(/* webpackChunkName: "content---titres-professionnels-archives-dwwm-2018-2023-at-2-cp-6-dc-9-6e9" */ "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6.mdx"), "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6.mdx", require.resolveWeak("@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6.mdx")], + "content---titres-professionnels-archives-dwwm-2018-2023-at-2-cp-7-b-3-f-d90": [() => import(/* webpackChunkName: "content---titres-professionnels-archives-dwwm-2018-2023-at-2-cp-7-b-3-f-d90" */ "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7.mdx"), "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7.mdx", require.resolveWeak("@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7.mdx")], + "content---titres-professionnels-archives-dwwm-2018-2023-at-2-cp-885-e-e5e": [() => import(/* webpackChunkName: "content---titres-professionnels-archives-dwwm-2018-2023-at-2-cp-885-e-e5e" */ "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8.mdx"), "@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8.mdx", require.resolveWeak("@site/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8.mdx")], + "content---titres-professionnels-archives-dwwm-2018-2023-intro-710-d42": [() => import(/* webpackChunkName: "content---titres-professionnels-archives-dwwm-2018-2023-intro-710-d42" */ "@site/docs/titres-professionnels/archives/DWWM/2018-2023/intro.mdx"), "@site/docs/titres-professionnels/archives/DWWM/2018-2023/intro.mdx", require.resolveWeak("@site/docs/titres-professionnels/archives/DWWM/2018-2023/intro.mdx")], + "content---titres-professionnels-cda-at-1-cp-1-cca-4f6": [() => import(/* webpackChunkName: "content---titres-professionnels-cda-at-1-cp-1-cca-4f6" */ "@site/docs/titres-professionnels/CDA/AT1/CP1.mdx"), "@site/docs/titres-professionnels/CDA/AT1/CP1.mdx", require.resolveWeak("@site/docs/titres-professionnels/CDA/AT1/CP1.mdx")], + "content---titres-professionnels-cda-at-1-cp-2-fe-2-287": [() => import(/* webpackChunkName: "content---titres-professionnels-cda-at-1-cp-2-fe-2-287" */ "@site/docs/titres-professionnels/CDA/AT1/CP2.mdx"), "@site/docs/titres-professionnels/CDA/AT1/CP2.mdx", require.resolveWeak("@site/docs/titres-professionnels/CDA/AT1/CP2.mdx")], + "content---titres-professionnels-cda-at-1-cp-3829-266": [() => import(/* webpackChunkName: "content---titres-professionnels-cda-at-1-cp-3829-266" */ "@site/docs/titres-professionnels/CDA/AT1/CP3.mdx"), "@site/docs/titres-professionnels/CDA/AT1/CP3.mdx", require.resolveWeak("@site/docs/titres-professionnels/CDA/AT1/CP3.mdx")], + "content---titres-professionnels-cda-at-1-cp-4910-237": [() => import(/* webpackChunkName: "content---titres-professionnels-cda-at-1-cp-4910-237" */ "@site/docs/titres-professionnels/CDA/AT1/CP4.mdx"), "@site/docs/titres-professionnels/CDA/AT1/CP4.mdx", require.resolveWeak("@site/docs/titres-professionnels/CDA/AT1/CP4.mdx")], + "content---titres-professionnels-cda-at-2-cp-5518-6b8": [() => import(/* webpackChunkName: "content---titres-professionnels-cda-at-2-cp-5518-6b8" */ "@site/docs/titres-professionnels/CDA/AT2/CP5.mdx"), "@site/docs/titres-professionnels/CDA/AT2/CP5.mdx", require.resolveWeak("@site/docs/titres-professionnels/CDA/AT2/CP5.mdx")], + "content---titres-professionnels-cda-at-2-cp-6061-cec": [() => import(/* webpackChunkName: "content---titres-professionnels-cda-at-2-cp-6061-cec" */ "@site/docs/titres-professionnels/CDA/AT2/CP6.mdx"), "@site/docs/titres-professionnels/CDA/AT2/CP6.mdx", require.resolveWeak("@site/docs/titres-professionnels/CDA/AT2/CP6.mdx")], + "content---titres-professionnels-cda-at-2-cp-72-b-6-bf7": [() => import(/* webpackChunkName: "content---titres-professionnels-cda-at-2-cp-72-b-6-bf7" */ "@site/docs/titres-professionnels/CDA/AT2/CP7.mdx"), "@site/docs/titres-professionnels/CDA/AT2/CP7.mdx", require.resolveWeak("@site/docs/titres-professionnels/CDA/AT2/CP7.mdx")], + "content---titres-professionnels-cda-at-2-cp-8-c-00-e72": [() => import(/* webpackChunkName: "content---titres-professionnels-cda-at-2-cp-8-c-00-e72" */ "@site/docs/titres-professionnels/CDA/AT2/CP8.mdx"), "@site/docs/titres-professionnels/CDA/AT2/CP8.mdx", require.resolveWeak("@site/docs/titres-professionnels/CDA/AT2/CP8.mdx")], + "content---titres-professionnels-cda-at-3-cp-10-e-45-c69": [() => import(/* webpackChunkName: "content---titres-professionnels-cda-at-3-cp-10-e-45-c69" */ "@site/docs/titres-professionnels/CDA/AT3/CP10.mdx"), "@site/docs/titres-professionnels/CDA/AT3/CP10.mdx", require.resolveWeak("@site/docs/titres-professionnels/CDA/AT3/CP10.mdx")], + "content---titres-professionnels-cda-at-3-cp-1156-a-9a1": [() => import(/* webpackChunkName: "content---titres-professionnels-cda-at-3-cp-1156-a-9a1" */ "@site/docs/titres-professionnels/CDA/AT3/CP11.mdx"), "@site/docs/titres-professionnels/CDA/AT3/CP11.mdx", require.resolveWeak("@site/docs/titres-professionnels/CDA/AT3/CP11.mdx")], + "content---titres-professionnels-cda-at-3-cp-95-a-4-85f": [() => import(/* webpackChunkName: "content---titres-professionnels-cda-at-3-cp-95-a-4-85f" */ "@site/docs/titres-professionnels/CDA/AT3/CP9.mdx"), "@site/docs/titres-professionnels/CDA/AT3/CP9.mdx", require.resolveWeak("@site/docs/titres-professionnels/CDA/AT3/CP9.mdx")], + "content---titres-professionnels-cda-introdbc-d34": [() => import(/* webpackChunkName: "content---titres-professionnels-cda-introdbc-d34" */ "@site/docs/titres-professionnels/CDA/intro.mdx"), "@site/docs/titres-professionnels/CDA/intro.mdx", require.resolveWeak("@site/docs/titres-professionnels/CDA/intro.mdx")], + "content---titres-professionnels-dwwm-at-1-cp-100-e-c3e": [() => import(/* webpackChunkName: "content---titres-professionnels-dwwm-at-1-cp-100-e-c3e" */ "@site/docs/titres-professionnels/DWWM/AT1/CP1.mdx"), "@site/docs/titres-professionnels/DWWM/AT1/CP1.mdx", require.resolveWeak("@site/docs/titres-professionnels/DWWM/AT1/CP1.mdx")], + "content---titres-professionnels-dwwm-at-1-cp-23-c-4-eb6": [() => import(/* webpackChunkName: "content---titres-professionnels-dwwm-at-1-cp-23-c-4-eb6" */ "@site/docs/titres-professionnels/DWWM/AT1/CP2.mdx"), "@site/docs/titres-professionnels/DWWM/AT1/CP2.mdx", require.resolveWeak("@site/docs/titres-professionnels/DWWM/AT1/CP2.mdx")], + "content---titres-professionnels-dwwm-at-1-cp-39-bc-21f": [() => import(/* webpackChunkName: "content---titres-professionnels-dwwm-at-1-cp-39-bc-21f" */ "@site/docs/titres-professionnels/DWWM/AT1/CP3.mdx"), "@site/docs/titres-professionnels/DWWM/AT1/CP3.mdx", require.resolveWeak("@site/docs/titres-professionnels/DWWM/AT1/CP3.mdx")], + "content---titres-professionnels-dwwm-at-1-cp-40-c-9-cb4": [() => import(/* webpackChunkName: "content---titres-professionnels-dwwm-at-1-cp-40-c-9-cb4" */ "@site/docs/titres-professionnels/DWWM/AT1/CP4.mdx"), "@site/docs/titres-professionnels/DWWM/AT1/CP4.mdx", require.resolveWeak("@site/docs/titres-professionnels/DWWM/AT1/CP4.mdx")], + "content---titres-professionnels-dwwm-at-2-cp-5-f-21-e87": [() => import(/* webpackChunkName: "content---titres-professionnels-dwwm-at-2-cp-5-f-21-e87" */ "@site/docs/titres-professionnels/DWWM/AT2/CP5.mdx"), "@site/docs/titres-professionnels/DWWM/AT2/CP5.mdx", require.resolveWeak("@site/docs/titres-professionnels/DWWM/AT2/CP5.mdx")], + "content---titres-professionnels-dwwm-at-2-cp-6626-c70": [() => import(/* webpackChunkName: "content---titres-professionnels-dwwm-at-2-cp-6626-c70" */ "@site/docs/titres-professionnels/DWWM/AT2/CP6.mdx"), "@site/docs/titres-professionnels/DWWM/AT2/CP6.mdx", require.resolveWeak("@site/docs/titres-professionnels/DWWM/AT2/CP6.mdx")], + "content---titres-professionnels-dwwm-at-2-cp-74-bf-eae": [() => import(/* webpackChunkName: "content---titres-professionnels-dwwm-at-2-cp-74-bf-eae" */ "@site/docs/titres-professionnels/DWWM/AT2/CP7.mdx"), "@site/docs/titres-professionnels/DWWM/AT2/CP7.mdx", require.resolveWeak("@site/docs/titres-professionnels/DWWM/AT2/CP7.mdx")], + "content---titres-professionnels-dwwm-at-2-cp-8807-dd0": [() => import(/* webpackChunkName: "content---titres-professionnels-dwwm-at-2-cp-8807-dd0" */ "@site/docs/titres-professionnels/DWWM/AT2/CP8.mdx"), "@site/docs/titres-professionnels/DWWM/AT2/CP8.mdx", require.resolveWeak("@site/docs/titres-professionnels/DWWM/AT2/CP8.mdx")], + "content---titres-professionnels-dwwm-intro-1-f-0-adb": [() => import(/* webpackChunkName: "content---titres-professionnels-dwwm-intro-1-f-0-adb" */ "@site/docs/titres-professionnels/DWWM/intro.mdx"), "@site/docs/titres-professionnels/DWWM/intro.mdx", require.resolveWeak("@site/docs/titres-professionnels/DWWM/intro.mdx")], + "content---titres-professionnels-dwwm-soutenanceb-38-5d2": [() => import(/* webpackChunkName: "content---titres-professionnels-dwwm-soutenanceb-38-5d2" */ "@site/docs/titres-professionnels/DWWM/soutenance.mdx"), "@site/docs/titres-professionnels/DWWM/soutenance.mdx", require.resolveWeak("@site/docs/titres-professionnels/DWWM/soutenance.mdx")], + "content---titres-professionnels-retours-0-ee-37c": [() => import(/* webpackChunkName: "content---titres-professionnels-retours-0-ee-37c" */ "@site/docs/titres-professionnels/retours.mdx"), "@site/docs/titres-professionnels/retours.mdx", require.resolveWeak("@site/docs/titres-professionnels/retours.mdx")], + "content---titres-professionnels-se-preparerc-72-72d": [() => import(/* webpackChunkName: "content---titres-professionnels-se-preparerc-72-72d" */ "@site/docs/titres-professionnels/se-preparer.mdx"), "@site/docs/titres-professionnels/se-preparer.mdx", require.resolveWeak("@site/docs/titres-professionnels/se-preparer.mdx")], + "plugin---aba-d70": [() => import(/* webpackChunkName: "plugin---aba-d70" */ "@generated/docusaurus-plugin-content-docs/default/__plugin.json"), "@generated/docusaurus-plugin-content-docs/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/__plugin.json")], + "plugin---docusaurus-debugb-38-ad3": [() => import(/* webpackChunkName: "plugin---docusaurus-debugb-38-ad3" */ "@generated/docusaurus-plugin-debug/default/__plugin.json"), "@generated/docusaurus-plugin-debug/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-debug/default/__plugin.json")], + "plugin---markdown-pagea-74-7b5": [() => import(/* webpackChunkName: "plugin---markdown-pagea-74-7b5" */ "@generated/docusaurus-plugin-content-pages/default/__plugin.json"), "@generated/docusaurus-plugin-content-pages/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-content-pages/default/__plugin.json")],}; diff --git a/old/.docusaurus/routes.js b/old/.docusaurus/routes.js new file mode 100644 index 0000000..56abf48 --- /dev/null +++ b/old/.docusaurus/routes.js @@ -0,0 +1,625 @@ +import React from 'react'; +import ComponentCreator from '@docusaurus/ComponentCreator'; + +export default [ + { + path: '/__docusaurus/debug', + component: ComponentCreator('/__docusaurus/debug', '5ff'), + exact: true + }, + { + path: '/__docusaurus/debug/config', + component: ComponentCreator('/__docusaurus/debug/config', '5ba'), + exact: true + }, + { + path: '/__docusaurus/debug/content', + component: ComponentCreator('/__docusaurus/debug/content', 'a2b'), + exact: true + }, + { + path: '/__docusaurus/debug/globalData', + component: ComponentCreator('/__docusaurus/debug/globalData', 'c3c'), + exact: true + }, + { + path: '/__docusaurus/debug/metadata', + component: ComponentCreator('/__docusaurus/debug/metadata', '156'), + exact: true + }, + { + path: '/__docusaurus/debug/registry', + component: ComponentCreator('/__docusaurus/debug/registry', '88c'), + exact: true + }, + { + path: '/__docusaurus/debug/routes', + component: ComponentCreator('/__docusaurus/debug/routes', '000'), + exact: true + }, + { + path: '/markdown-page', + component: ComponentCreator('/markdown-page', '3d7'), + exact: true + }, + { + path: '/mentions-legales', + component: ComponentCreator('/mentions-legales', '3be'), + exact: true + }, + { + path: '/', + component: ComponentCreator('/', 'e5f'), + exact: true + }, + { + path: '/', + component: ComponentCreator('/', 'd0f'), + routes: [ + { + path: '/', + component: ComponentCreator('/', 'd1d'), + routes: [ + { + path: '/tags', + component: ComponentCreator('/tags', 'ce1'), + exact: true + }, + { + path: '/tags/accessibilite', + component: ComponentCreator('/tags/accessibilite', '2ae'), + exact: true + }, + { + path: '/tags/architecture', + component: ComponentCreator('/tags/architecture', '851'), + exact: true + }, + { + path: '/tags/back-end', + component: ComponentCreator('/tags/back-end', '6ff'), + exact: true + }, + { + path: '/tags/base-de-donnees', + component: ComponentCreator('/tags/base-de-donnees', 'c03'), + exact: true + }, + { + path: '/tags/bibliotheque', + component: ComponentCreator('/tags/bibliotheque', 'ea9'), + exact: true + }, + { + path: '/tags/cda', + component: ComponentCreator('/tags/cda', '0a1'), + exact: true + }, + { + path: '/tags/chiffrement', + component: ComponentCreator('/tags/chiffrement', '2b5'), + exact: true + }, + { + path: '/tags/conception', + component: ComponentCreator('/tags/conception', '41f'), + exact: true + }, + { + path: '/tags/csr', + component: ComponentCreator('/tags/csr', 'ff7'), + exact: true + }, + { + path: '/tags/css', + component: ComponentCreator('/tags/css', '7e4'), + exact: true + }, + { + path: '/tags/deploiement', + component: ComponentCreator('/tags/deploiement', '1fd'), + exact: true + }, + { + path: '/tags/design-pattern', + component: ComponentCreator('/tags/design-pattern', '902'), + exact: true + }, + { + path: '/tags/dictionnaire-de-donnees', + component: ComponentCreator('/tags/dictionnaire-de-donnees', 'f5a'), + exact: true + }, + { + path: '/tags/dwwm', + component: ComponentCreator('/tags/dwwm', 'f4f'), + exact: true + }, + { + path: '/tags/eco-conception', + component: ComponentCreator('/tags/eco-conception', '273'), + exact: true + }, + { + path: '/tags/environnement-de-developpement', + component: ComponentCreator('/tags/environnement-de-developpement', '3cd'), + exact: true + }, + { + path: '/tags/front-end', + component: ComponentCreator('/tags/front-end', 'c2a'), + exact: true + }, + { + path: '/tags/frontend', + component: ComponentCreator('/tags/frontend', '1d6'), + exact: true + }, + { + path: '/tags/hachage', + component: ComponentCreator('/tags/hachage', 'ee1'), + exact: true + }, + { + path: '/tags/html', + component: ComponentCreator('/tags/html', '548'), + exact: true + }, + { + path: '/tags/integration', + component: ComponentCreator('/tags/integration', '75a'), + exact: true + }, + { + path: '/tags/interface-utilisateur-ui', + component: ComponentCreator('/tags/interface-utilisateur-ui', 'e38'), + exact: true + }, + { + path: '/tags/java-script-type-script', + component: ComponentCreator('/tags/java-script-type-script', 'c31'), + exact: true + }, + { + path: '/tags/maquettage', + component: ComponentCreator('/tags/maquettage', 'e6b'), + exact: true + }, + { + path: '/tags/merise', + component: ComponentCreator('/tags/merise', 'ccf'), + exact: true + }, + { + path: '/tags/modele-conceptuel-de-donnees-mcd', + component: ComponentCreator('/tags/modele-conceptuel-de-donnees-mcd', 'ebd'), + exact: true + }, + { + path: '/tags/modele-logique-de-donnees-mld', + component: ComponentCreator('/tags/modele-logique-de-donnees-mld', '20f'), + exact: true + }, + { + path: '/tags/modele-physique-de-donnees-mpd', + component: ComponentCreator('/tags/modele-physique-de-donnees-mpd', 'cd9'), + exact: true + }, + { + path: '/tags/modele-relationnel-de-donnees-mrd', + component: ComponentCreator('/tags/modele-relationnel-de-donnees-mrd', '865'), + exact: true + }, + { + path: '/tags/modelisation', + component: ComponentCreator('/tags/modelisation', '141'), + exact: true + }, + { + path: '/tags/orm-odm', + component: ComponentCreator('/tags/orm-odm', '523'), + exact: true + }, + { + path: '/tags/react', + component: ComponentCreator('/tags/react', '79a'), + exact: true + }, + { + path: '/tags/responsive', + component: ComponentCreator('/tags/responsive', 'cac'), + exact: true + }, + { + path: '/tags/reverse-proxy', + component: ComponentCreator('/tags/reverse-proxy', 'c72'), + exact: true + }, + { + path: '/tags/securite', + component: ComponentCreator('/tags/securite', '6b3'), + exact: true + }, + { + path: '/tags/seo-referencement-naturel', + component: ComponentCreator('/tags/seo-referencement-naturel', 'ab8'), + exact: true + }, + { + path: '/tags/serveur-web', + component: ComponentCreator('/tags/serveur-web', 'ab3'), + exact: true + }, + { + path: '/tags/sql', + component: ComponentCreator('/tags/sql', 'b91'), + exact: true + }, + { + path: '/tags/ssg', + component: ComponentCreator('/tags/ssg', '845'), + exact: true + }, + { + path: '/tags/ssr', + component: ComponentCreator('/tags/ssr', '292'), + exact: true + }, + { + path: '/tags/tests', + component: ComponentCreator('/tags/tests', '924'), + exact: true + }, + { + path: '/tags/vike', + component: ComponentCreator('/tags/vike', 'c29'), + exact: true + }, + { + path: '/tags/vite', + component: ComponentCreator('/tags/vite', '8b4'), + exact: true + }, + { + path: '/tags/wireframe', + component: ComponentCreator('/tags/wireframe', '9fd'), + exact: true + }, + { + path: '/tags/zoning', + component: ComponentCreator('/tags/zoning', '487'), + exact: true + }, + { + path: '/', + component: ComponentCreator('/', '8ab'), + routes: [ + { + path: '/category/️-archives', + component: ComponentCreator('/category/️-archives', '0da'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/category/-bases-de-données', + component: ComponentCreator('/category/-bases-de-données', '2fa'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/category/-frontend', + component: ComponentCreator('/category/-frontend', '08c'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/category/-titres-professionnels', + component: ComponentCreator('/category/-titres-professionnels', '6c2'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/contribuer', + component: ComponentCreator('/contribuer', 'dda'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/glossaires/titres-professionnel', + component: ComponentCreator('/glossaires/titres-professionnel', '04c'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/intro', + component: ComponentCreator('/intro', '6da'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees', + component: ComponentCreator('/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees', '098'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/ressources/bases-de-donnees/modelisation/mcd', + component: ComponentCreator('/ressources/bases-de-donnees/modelisation/mcd', '985'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/ressources/bases-de-donnees/modelisation/merise', + component: ComponentCreator('/ressources/bases-de-donnees/modelisation/merise', '524'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/ressources/frontend/react/contextes', + component: ComponentCreator('/ressources/frontend/react/contextes', '0b2'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/ressources/frontend/react/hooks', + component: ComponentCreator('/ressources/frontend/react/hooks', 'f45'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/ressources/frontend/react/initialiser-un-projet-react', + component: ComponentCreator('/ressources/frontend/react/initialiser-un-projet-react', '993'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/ressources/frontend/react/intro', + component: ComponentCreator('/ressources/frontend/react/intro', '821'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/ressources/frontend/react/premier-composant', + component: ComponentCreator('/ressources/frontend/react/premier-composant', '797'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/ressources/frontend/react/reducers', + component: ComponentCreator('/ressources/frontend/react/reducers', 'c34'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/ressources/frontend/react/state-et-cycle-de-vie', + component: ComponentCreator('/ressources/frontend/react/state-et-cycle-de-vie', 'b0b'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/ressources/frontend/react/syntaxe-jsx', + component: ComponentCreator('/ressources/frontend/react/syntaxe-jsx', '5c3'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/ressources/influenceurs-et-createurs', + component: ComponentCreator('/ressources/influenceurs-et-createurs', '21b'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/soutiens-et-contributeurs', + component: ComponentCreator('/soutiens-et-contributeurs', '50d'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1', + component: ComponentCreator('/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1', '523'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2', + component: ComponentCreator('/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2', 'ddc'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3', + component: ComponentCreator('/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3', '274'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4', + component: ComponentCreator('/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4', '54e'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5', + component: ComponentCreator('/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5', 'a1d'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6', + component: ComponentCreator('/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6', 'b0b'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7', + component: ComponentCreator('/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7', '6cd'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8', + component: ComponentCreator('/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8', '1d0'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/archives/DWWM/2018-2023/intro', + component: ComponentCreator('/titres-professionnels/archives/DWWM/2018-2023/intro', '736'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/CDA/AT1/CP1', + component: ComponentCreator('/titres-professionnels/CDA/AT1/CP1', 'e53'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/CDA/AT1/CP2', + component: ComponentCreator('/titres-professionnels/CDA/AT1/CP2', 'dcf'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/CDA/AT1/CP3', + component: ComponentCreator('/titres-professionnels/CDA/AT1/CP3', 'd1e'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/CDA/AT1/CP4', + component: ComponentCreator('/titres-professionnels/CDA/AT1/CP4', 'e7b'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/CDA/AT2/CP5', + component: ComponentCreator('/titres-professionnels/CDA/AT2/CP5', 'ef6'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/CDA/AT2/CP6', + component: ComponentCreator('/titres-professionnels/CDA/AT2/CP6', '581'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/CDA/AT2/CP7', + component: ComponentCreator('/titres-professionnels/CDA/AT2/CP7', '01b'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/CDA/AT2/CP8', + component: ComponentCreator('/titres-professionnels/CDA/AT2/CP8', '16a'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/CDA/AT3/CP10', + component: ComponentCreator('/titres-professionnels/CDA/AT3/CP10', 'a1d'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/CDA/AT3/CP11', + component: ComponentCreator('/titres-professionnels/CDA/AT3/CP11', '806'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/CDA/AT3/CP9', + component: ComponentCreator('/titres-professionnels/CDA/AT3/CP9', '965'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/CDA/intro', + component: ComponentCreator('/titres-professionnels/CDA/intro', '8d3'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/DWWM/AT1/CP1', + component: ComponentCreator('/titres-professionnels/DWWM/AT1/CP1', '724'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/DWWM/AT1/CP2', + component: ComponentCreator('/titres-professionnels/DWWM/AT1/CP2', '38b'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/DWWM/AT1/CP3', + component: ComponentCreator('/titres-professionnels/DWWM/AT1/CP3', '8c7'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/DWWM/AT1/CP4', + component: ComponentCreator('/titres-professionnels/DWWM/AT1/CP4', 'b07'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/DWWM/AT2/CP5', + component: ComponentCreator('/titres-professionnels/DWWM/AT2/CP5', '6e9'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/DWWM/AT2/CP6', + component: ComponentCreator('/titres-professionnels/DWWM/AT2/CP6', 'aaa'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/DWWM/AT2/CP7', + component: ComponentCreator('/titres-professionnels/DWWM/AT2/CP7', '737'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/DWWM/AT2/CP8', + component: ComponentCreator('/titres-professionnels/DWWM/AT2/CP8', 'c43'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/DWWM/intro', + component: ComponentCreator('/titres-professionnels/DWWM/intro', '9b8'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/DWWM/soutenance', + component: ComponentCreator('/titres-professionnels/DWWM/soutenance', 'fb8'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/retours', + component: ComponentCreator('/titres-professionnels/retours', 'd84'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/titres-professionnels/se-preparer', + component: ComponentCreator('/titres-professionnels/se-preparer', 'e8a'), + exact: true, + sidebar: "tutorialSidebar" + } + ] + } + ] + } + ] + }, + { + path: '*', + component: ComponentCreator('*'), + }, +]; diff --git a/old/.docusaurus/routesChunkNames.json b/old/.docusaurus/routesChunkNames.json new file mode 100644 index 0000000..5655e3b --- /dev/null +++ b/old/.docusaurus/routesChunkNames.json @@ -0,0 +1,475 @@ +{ + "/__docusaurus/debug-5ff": { + "__comp": "__comp---theme-debug-config-23-a-2ff", + "__context": { + "plugin": "plugin---docusaurus-debugb-38-ad3" + } + }, + "/__docusaurus/debug/config-5ba": { + "__comp": "__comp---theme-debug-config-23-a-2ff", + "__context": { + "plugin": "plugin---docusaurus-debugb-38-ad3" + } + }, + "/__docusaurus/debug/content-a2b": { + "__comp": "__comp---theme-debug-contentba-8-ce7", + "__context": { + "plugin": "plugin---docusaurus-debugb-38-ad3" + }, + "__props": "__props---docusaurus-debug-content-3-c-0-be2" + }, + "/__docusaurus/debug/globalData-c3c": { + "__comp": "__comp---theme-debug-global-dataede-0fa", + "__context": { + "plugin": "plugin---docusaurus-debugb-38-ad3" + } + }, + "/__docusaurus/debug/metadata-156": { + "__comp": "__comp---theme-debug-site-metadata-68-e-3d4", + "__context": { + "plugin": "plugin---docusaurus-debugb-38-ad3" + } + }, + "/__docusaurus/debug/registry-88c": { + "__comp": "__comp---theme-debug-registry-679-501", + "__context": { + "plugin": "plugin---docusaurus-debugb-38-ad3" + } + }, + "/__docusaurus/debug/routes-000": { + "__comp": "__comp---theme-debug-routes-946-699", + "__context": { + "plugin": "plugin---docusaurus-debugb-38-ad3" + } + }, + "/markdown-page-3d7": { + "__comp": "__comp---theme-mdx-page-1-f-3-b90", + "__context": { + "plugin": "plugin---markdown-pagea-74-7b5" + }, + "content": "content---markdown-page-393-028" + }, + "/mentions-legales-3be": { + "__comp": "__comp---site-src-pages-mentions-legales-tsx-9-a-7-a7b", + "__context": { + "plugin": "plugin---markdown-pagea-74-7b5" + }, + "config": "config---mentions-legales-5-e-9-a45" + }, + "/-e5f": { + "__comp": "__comp---site-src-pages-index-tsx-1-df-d3e", + "__context": { + "plugin": "plugin---markdown-pagea-74-7b5" + }, + "config": "config---mentions-legales-5-e-9-a45" + }, + "/-d0f": { + "__comp": "__comp---theme-docs-root-5-e-9-0b6", + "__context": { + "plugin": "plugin---aba-d70" + } + }, + "/-d1d": { + "__comp": "__comp---theme-doc-version-roota-7-b-5de", + "__props": "__props---22-d-307" + }, + "/tags-ce1": { + "__comp": "__comp---theme-doc-tags-list-page-372-89e", + "__props": "__props---tags-59-a-1ee" + }, + "/tags/accessibilite-2ae": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-accessibilitec-01-132" + }, + "/tags/architecture-851": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-architecturefcc-51f" + }, + "/tags/back-end-6ff": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-back-end-5-f-5-395" + }, + "/tags/base-de-donnees-c03": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-base-de-donnees-9-a-4-250" + }, + "/tags/bibliotheque-ea9": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-bibliothequecc-2-2f9" + }, + "/tags/cda-0a1": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-cdad-81-162" + }, + "/tags/chiffrement-2b5": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-chiffrement-43-a-a9c" + }, + "/tags/conception-41f": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-conceptionf-5-c-23e" + }, + "/tags/csr-ff7": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-csrb-2-c-2de" + }, + "/tags/css-7e4": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-css-11-b-7f7" + }, + "/tags/deploiement-1fd": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-deploiement-91-a-084" + }, + "/tags/design-pattern-902": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-design-pattern-791-edb" + }, + "/tags/dictionnaire-de-donnees-f5a": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-dictionnaire-de-donneesc-86-e42" + }, + "/tags/dwwm-f4f": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-dwwm-04-a-406" + }, + "/tags/eco-conception-273": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-eco-conception-14-e-d59" + }, + "/tags/environnement-de-developpement-3cd": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-environnement-de-developpementb-2-b-38a" + }, + "/tags/front-end-c2a": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-front-end-027-83b" + }, + "/tags/frontend-1d6": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-frontend-905-d0c" + }, + "/tags/hachage-ee1": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-hachage-0-bb-eec" + }, + "/tags/html-548": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-html-5-e-7-70a" + }, + "/tags/integration-75a": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-integrationca-0-9dd" + }, + "/tags/interface-utilisateur-ui-e38": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-interface-utilisateur-uiee-1-c7b" + }, + "/tags/java-script-type-script-c31": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-java-script-type-scriptb-5-c-f71" + }, + "/tags/maquettage-e6b": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-maquettageaf-8-bb5" + }, + "/tags/merise-ccf": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-merise-683-55b" + }, + "/tags/modele-conceptuel-de-donnees-mcd-ebd": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-modele-conceptuel-de-donnees-mcde-6-f-b6a" + }, + "/tags/modele-logique-de-donnees-mld-20f": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-modele-logique-de-donnees-mldf-9-f-bbc" + }, + "/tags/modele-physique-de-donnees-mpd-cd9": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-modele-physique-de-donnees-mpdd-29-dea" + }, + "/tags/modele-relationnel-de-donnees-mrd-865": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-modele-relationnel-de-donnees-mrdeca-43f" + }, + "/tags/modelisation-141": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-modelisationd-3-d-7aa" + }, + "/tags/orm-odm-523": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-orm-odm-154-6a3" + }, + "/tags/react-79a": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-react-1-ed-b1f" + }, + "/tags/responsive-cac": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-responsive-87-c-668" + }, + "/tags/reverse-proxy-c72": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-reverse-proxy-554-4e7" + }, + "/tags/securite-6b3": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-securiteb-96-9b1" + }, + "/tags/seo-referencement-naturel-ab8": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-seo-referencement-naturelb-90-ae7" + }, + "/tags/serveur-web-ab3": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-serveur-web-56-b-5f0" + }, + "/tags/sql-b91": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-sqlf-8-c-bbb" + }, + "/tags/ssg-845": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-ssgaa-3-815" + }, + "/tags/ssr-292": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-ssr-7-ac-191" + }, + "/tags/tests-924": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-tests-149-d5f" + }, + "/tags/vike-c29": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-vike-595-bae" + }, + "/tags/vite-8b4": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-viteca-1-e67" + }, + "/tags/wireframe-9fd": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-wireframed-93-029" + }, + "/tags/zoning-487": { + "__comp": "__comp---theme-doc-tag-doc-list-pagedf-2-9f0", + "__props": "__props---tags-zoningc-45-595" + }, + "/-8ab": { + "__comp": "__comp---theme-doc-roota-94-67a" + }, + "/category/️-archives-0da": { + "__comp": "__comp---theme-doc-category-generated-index-page-14-e-640", + "__props": "__props---category-️-archivesa-58-2d1" + }, + "/category/-bases-de-données-2fa": { + "__comp": "__comp---theme-doc-category-generated-index-page-14-e-640", + "__props": "__props---category-bases-de-donnees-594-09a" + }, + "/category/-frontend-08c": { + "__comp": "__comp---theme-doc-category-generated-index-page-14-e-640", + "__props": "__props---category-frontende-7-c-d9b" + }, + "/category/-titres-professionnels-6c2": { + "__comp": "__comp---theme-doc-category-generated-index-page-14-e-640", + "__props": "__props---category-titres-professionnels-34-e-166" + }, + "/contribuer-dda": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---contribuer-70-e-e3b" + }, + "/glossaires/titres-professionnel-04c": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---glossaires-titres-professionneled-4-7b6" + }, + "/intro-6da": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---introf-84-e9e" + }, + "/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees-098": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---ressources-bases-de-donnees-modelisation-dictionnaire-de-donneesf-25-ccb" + }, + "/ressources/bases-de-donnees/modelisation/mcd-985": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---ressources-bases-de-donnees-modelisation-mcdbb-4-f22" + }, + "/ressources/bases-de-donnees/modelisation/merise-524": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---ressources-bases-de-donnees-modelisation-merise-5-d-6-70a" + }, + "/ressources/frontend/react/contextes-0b2": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---ressources-frontend-react-contextescbc-1d1" + }, + "/ressources/frontend/react/hooks-f45": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---ressources-frontend-react-hooksd-19-abd" + }, + "/ressources/frontend/react/initialiser-un-projet-react-993": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---ressources-frontend-react-initialiser-un-projet-reactbe-7-144" + }, + "/ressources/frontend/react/intro-821": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---ressources-frontend-react-introf-04-d81" + }, + "/ressources/frontend/react/premier-composant-797": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---ressources-frontend-react-premier-composantb-78-d84" + }, + "/ressources/frontend/react/reducers-c34": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---ressources-frontend-react-reducers-68-b-603" + }, + "/ressources/frontend/react/state-et-cycle-de-vie-b0b": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---ressources-frontend-react-state-et-cycle-de-vie-719-b2a" + }, + "/ressources/frontend/react/syntaxe-jsx-5c3": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---ressources-frontend-react-syntaxe-jsxe-94-59c" + }, + "/ressources/influenceurs-et-createurs-21b": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---ressources-influenceurs-et-createurseae-d03" + }, + "/soutiens-et-contributeurs-50d": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---soutiens-et-contributeursd-64-5c8" + }, + "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1-523": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-archives-dwwm-2018-2023-at-1-cp-1-fff-ab0" + }, + "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2-ddc": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-archives-dwwm-2018-2023-at-1-cp-20-eb-17a" + }, + "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3-274": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-archives-dwwm-2018-2023-at-1-cp-3675-bb7" + }, + "/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4-54e": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-archives-dwwm-2018-2023-at-1-cp-4-af-6-4ac" + }, + "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5-a1d": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-archives-dwwm-2018-2023-at-2-cp-5-bbc-1d4" + }, + "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6-b0b": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-archives-dwwm-2018-2023-at-2-cp-6-dc-9-6e9" + }, + "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7-6cd": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-archives-dwwm-2018-2023-at-2-cp-7-b-3-f-d90" + }, + "/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8-1d0": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-archives-dwwm-2018-2023-at-2-cp-885-e-e5e" + }, + "/titres-professionnels/archives/DWWM/2018-2023/intro-736": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-archives-dwwm-2018-2023-intro-710-d42" + }, + "/titres-professionnels/CDA/AT1/CP1-e53": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-cda-at-1-cp-1-cca-4f6" + }, + "/titres-professionnels/CDA/AT1/CP2-dcf": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-cda-at-1-cp-2-fe-2-287" + }, + "/titres-professionnels/CDA/AT1/CP3-d1e": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-cda-at-1-cp-3829-266" + }, + "/titres-professionnels/CDA/AT1/CP4-e7b": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-cda-at-1-cp-4910-237" + }, + "/titres-professionnels/CDA/AT2/CP5-ef6": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-cda-at-2-cp-5518-6b8" + }, + "/titres-professionnels/CDA/AT2/CP6-581": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-cda-at-2-cp-6061-cec" + }, + "/titres-professionnels/CDA/AT2/CP7-01b": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-cda-at-2-cp-72-b-6-bf7" + }, + "/titres-professionnels/CDA/AT2/CP8-16a": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-cda-at-2-cp-8-c-00-e72" + }, + "/titres-professionnels/CDA/AT3/CP10-a1d": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-cda-at-3-cp-10-e-45-c69" + }, + "/titres-professionnels/CDA/AT3/CP11-806": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-cda-at-3-cp-1156-a-9a1" + }, + "/titres-professionnels/CDA/AT3/CP9-965": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-cda-at-3-cp-95-a-4-85f" + }, + "/titres-professionnels/CDA/intro-8d3": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-cda-introdbc-d34" + }, + "/titres-professionnels/DWWM/AT1/CP1-724": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-dwwm-at-1-cp-100-e-c3e" + }, + "/titres-professionnels/DWWM/AT1/CP2-38b": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-dwwm-at-1-cp-23-c-4-eb6" + }, + "/titres-professionnels/DWWM/AT1/CP3-8c7": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-dwwm-at-1-cp-39-bc-21f" + }, + "/titres-professionnels/DWWM/AT1/CP4-b07": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-dwwm-at-1-cp-40-c-9-cb4" + }, + "/titres-professionnels/DWWM/AT2/CP5-6e9": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-dwwm-at-2-cp-5-f-21-e87" + }, + "/titres-professionnels/DWWM/AT2/CP6-aaa": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-dwwm-at-2-cp-6626-c70" + }, + "/titres-professionnels/DWWM/AT2/CP7-737": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-dwwm-at-2-cp-74-bf-eae" + }, + "/titres-professionnels/DWWM/AT2/CP8-c43": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-dwwm-at-2-cp-8807-dd0" + }, + "/titres-professionnels/DWWM/intro-9b8": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-dwwm-intro-1-f-0-adb" + }, + "/titres-professionnels/DWWM/soutenance-fb8": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-dwwm-soutenanceb-38-5d2" + }, + "/titres-professionnels/retours-d84": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-retours-0-ee-37c" + }, + "/titres-professionnels/se-preparer-e8a": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---titres-professionnels-se-preparerc-72-72d" + } +} \ No newline at end of file diff --git a/old/.docusaurus/site-metadata.json b/old/.docusaurus/site-metadata.json new file mode 100644 index 0000000..f7e19a4 --- /dev/null +++ b/old/.docusaurus/site-metadata.json @@ -0,0 +1,44 @@ +{ + "docusaurusVersion": "3.6.1", + "siteVersion": "0.0.1", + "pluginVersions": { + "docusaurus-plugin-content-docs": { + "type": "package", + "name": "@docusaurus/plugin-content-docs", + "version": "3.6.1" + }, + "docusaurus-plugin-content-pages": { + "type": "package", + "name": "@docusaurus/plugin-content-pages", + "version": "3.6.1" + }, + "docusaurus-plugin-debug": { + "type": "package", + "name": "@docusaurus/plugin-debug", + "version": "3.6.1" + }, + "docusaurus-theme-classic": { + "type": "package", + "name": "@docusaurus/theme-classic", + "version": "3.6.1" + }, + "docusaurus-tailwindcss": { + "type": "local" + }, + "docusaurus-lunr-search": { + "type": "package", + "name": "docusaurus-lunr-search", + "version": "3.4.0" + }, + "docusaurus-plugin-sitemap": { + "type": "package", + "name": "@docusaurus/plugin-sitemap", + "version": "3.6.1" + }, + "docusaurus-theme-mermaid": { + "type": "package", + "name": "@docusaurus/theme-mermaid", + "version": "3.6.1" + } + } +} \ No newline at end of file diff --git a/old/.docusaurus/site-storage.json b/old/.docusaurus/site-storage.json new file mode 100644 index 0000000..c769c71 --- /dev/null +++ b/old/.docusaurus/site-storage.json @@ -0,0 +1,4 @@ +{ + "type": "localStorage", + "namespace": "" +} \ No newline at end of file diff --git a/old/.github/workflows/deploy.yml b/old/.github/workflows/deploy.yml new file mode 100644 index 0000000..578d0d8 --- /dev/null +++ b/old/.github/workflows/deploy.yml @@ -0,0 +1,61 @@ +name: Deploy Docusaurus to VPS + +on: + push: + branches: + - main + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup SSH + run: | + mkdir -p ~/.ssh + echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519 + chmod 600 ~/.ssh/id_ed25519 + ssh-keyscan -H ${{ secrets.VPS_HOST }} >> ~/.ssh/known_hosts + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 22 + + - name: Install pnpm + run: corepack enable && corepack prepare pnpm@latest --activate + + - name: Install dependencies + run: pnpm install + + - name: Build Docusaurus + run: pnpm run build + + - name: Install rsync + run: sudo apt-get install -y rsync + + - name: Deploy to VPS + env: + VPS_HOST: ${{ secrets.VPS_HOST }} + VPS_USER: ${{ secrets.VPS_USER }} + VPS_DEPLOY_PATH: ${{ secrets.VPS_DEPLOY_PATH }} + run: | + rsync -avz -q --delete -e "ssh -i ~/.ssh/id_ed25519" ./ $VPS_USER@$VPS_HOST:$VPS_DEPLOY_PATH --exclude=node_module --exclude=.git + + - name: Install dependencies on server + env: + VPS_HOST: ${{ secrets.VPS_HOST }} + VPS_USER: ${{ secrets.VPS_USER }} + VPS_DEPLOY_PATH: ${{ secrets.VPS_DEPLOY_PATH }} + run: | + ssh -i ~/.ssh/id_ed25519 $VPS_USER@$VPS_HOST "source /home/debian/.nvm/nvm.sh && cd $VPS_DEPLOY_PATH && pnpm install" + + - name: Restart Docusaurus server + env: + VPS_HOST: ${{ secrets.VPS_HOST }} + VPS_USER: ${{ secrets.VPS_USER }} + run: | + ssh -i ~/.ssh/id_ed25519 $VPS_USER@$VPS_HOST "source /home/debian/.nvm/nvm.sh && pm2 restart 8" diff --git a/old/.prettierignore b/old/.prettierignore new file mode 100644 index 0000000..3121819 --- /dev/null +++ b/old/.prettierignore @@ -0,0 +1,2 @@ +**/*.mdx +**/*.md \ No newline at end of file diff --git a/old/.vscode/settings.json b/old/.vscode/settings.json new file mode 100644 index 0000000..23830fb --- /dev/null +++ b/old/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "git.ignoreLimitWarning": true +} diff --git a/old/LICENCE-Dicosaurus b/old/LICENCE-Dicosaurus new file mode 100644 index 0000000..87cbf53 --- /dev/null +++ b/old/LICENCE-Dicosaurus @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Facebook, Inc. and its affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/old/LICENCE-Memento-Dev b/old/LICENCE-Memento-Dev new file mode 100644 index 0000000..7e591e0 --- /dev/null +++ b/old/LICENCE-Memento-Dev @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Gauthier Daniels + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/old/README.md b/old/README.md new file mode 100644 index 0000000..c820e24 --- /dev/null +++ b/old/README.md @@ -0,0 +1,28 @@ +# Memento Dev + +This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. + +## Website + +The website is available at [memento-dev.fr](https://memento-dev.fr/). + +### Installation + +``` +$ pnpm install +``` + +### Local Development + +``` +$ pnpm start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. + +### Licences + +Both of Dicosaurus and this project's documentation are under the [MIT license](https://opensource.org/licenses/MIT). + +- [Docusaurus license](./LICENCE-Dicosaurus) +- [Memento Dev license](./LICENCE-Memento-Dev) \ No newline at end of file diff --git a/old/babel.config.js b/old/babel.config.js new file mode 100644 index 0000000..e00595d --- /dev/null +++ b/old/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/old/docs/contribuer.mdx b/old/docs/contribuer.mdx new file mode 100644 index 0000000..afb896e --- /dev/null +++ b/old/docs/contribuer.mdx @@ -0,0 +1,147 @@ +--- +sidebar_position: 99999 +description: "Tu souhaites contribuer à Memento Dev ? C'est par ici !" +--- + +# 🤝 Contribuer + +## 👋 Avant toute chose + +**Memento Dev** est, à l'instar du [**MDN Web Docs**](https://developer.mozilla.org/en-US/) et feu **Le Site du Zéro**, +une ressourcerie en ligne destinée aux développeuses et développeurs _(de près comme de loin)_. +Notre objectif est simple : partager de courts guides qui synthétisent les concepts, les bonnes pratiques et les outils du développement web. + +L'idée n'est pas de réinventer la roue ni de proposer une énième école en ligne. +Le partage et l'entraide sont les maîtres-mots de ce projet ❤️ + +Si toi aussi tu souhaites partager tes connaissances, tes astuces et pourquoi pas tes erreurs, tu es le bienvenu ! + +## 📝 Comment contribuer ? + +De manière générale, tu peux contribuer de plusieurs manières : + +- en proposant des corrections ou des améliorations sur les contenus existants ; +- en rédigeant de nouveaux guides ; +- en proposant des idées de guides ; +- en partageant des ressources utiles ; +- en signalant des erreurs ou des liens morts. + +## 📜 Directives de rédaction + +Cette ressourcerie n'est pas un lieu de débat ni un espace publicitaire. +Il est par conséquent important de respecter les règles suivantes : + +- **Soyez concis** : les guides doivent être courts et aller à l'essentiel ; +- **Soyez clair** : évitez le jargon et les termes techniques inutiles _(ou expliquez-les)_ ; +- **Soyez précis** : vérifiez vos sources et vos informations ; +- **Soyez pédagogue** : expliquez les concepts comme si vous vous adressiez à un enfant de 10 ans _(sans le prendre pour un idiot)_ ; +- **Soyez bienveillant** : les erreurs sont humaines, ne soyez pas agressif en cas de correction. +- **Soyez ouvert** : les contributions sont ouvertes à tous, sans distinction de niveau ou d'expérience. + +En ce qui concerne la rédaction des guides, vous pouvez vous inspirer des guides existants. +Le ton employé se veut simple, direct et amical. + +Si vous remarquez un contenu qui ne respecte pas les règles mentionnées plus bas, +merci de le signaler en ouvrant une [issue](https://github.com/preparation-tp/memento-dev/issues) en précisant la page concernée. + +### ❌ Sujets interdits + +Certains sujets sont formellement interdits dans n'importe quelle page de ce site : + +- la politique ; +- la religion ; +- la pornographie ; +- la violence ; +- le racisme ; +- le sexisme ; +- l'homophobie ; +- la transphobie ; +- la xénophobie ; +- la discrimination ; +- la publicité ; +- les contenus illégaux. + +### ❌ Termes interdits + +L'emploi de certains termes considérés comme étant péjoratifs pour parler d'une personne sont également à proscrire : + +- son milieu ; +- son origine ; +- son genre ; +- son identité de genre ou l'expression de son genre ; +- son orientation sexuelle ; +- son handicap ; +- son âge ; +- son apparence physique ; +- sa situation de famille ; +- sa religion ; +- sa situation géographique ; +- autres attributs personnels. + +## 📦 Prérequis + +L'intégralité du contenu de ce site est rédigé en [MDX](https://mdxjs.com/), +un mélange de Markdown et de JSX. Des connaissances basiques en Markdown sont donc nécessaires. + +Pour contribuer, vous aurez besoin de : +- Un éditeur de texte ou de code _(Visual Studio Code, Sublime Text, Atom, etc.)_ ; +- Un navigateur web _(Chrome, Firefox, Edge, etc.)_. +- Un compte [Github](https://github.com) ; +- L'utilitaire [Git](https://git-scm.com/) installé sur votre machine ; +- [Node.js](https://nodejs.org/) et [npm](https://www.npmjs.com/) pour lancer le serveur de développement. + +## 🚀 Comment contribuer ? + +1. Faites un fork du projet + - [🔗 Documentation Github](https://docs.github.com/fr/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) +2. Clonez le projet sur votre machine + - [🔗 Documentation Github](https://docs.github.com/fr/repositories/creating-and-managing-repositories/cloning-a-repository) +3. Créez une branche pour votre contribution + - [🔗 Documentation Github](https://github.com/git-guides#create-a-branch) +4. Faites vos modifications +5. Testez vos modifications en local + - `npm install` pour installer les dépendances + - `npm start` pour lancer le serveur de développement +6. Poussez vos modifications sur votre fork + - [🔗 Documentation Github](https://github.com/git-guides/git-push) +7. Créez une pull request + - [🔗 Documentation Github](https://docs.github.com/fr/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) + - [🔗 Pull requests du repository Memento Dev](https://github.com/preparation-tp/memento-dev/pulls) + +## ✍️ Convention de nommage + +### 📁 Git + +L'intégralité des commits et branches doit être rédigée en anglais. +Ces dernières se basent sur la convention [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/). + +### 📝 Fichiers et dossiers + +Les fichiers et dossiers pour la documentation et les assets doivent être nommés en anglais et en kebab-case, +sans caractères spéciaux ni espaces. + +Les fichiers et dossiers pour les composants React _(hors pages)_ doivent être nommés en anglais et en PascalCase. + +## ©️ Licence + +La documentation de ce projet est sous [licence MIT](https://opensource.org/license/mit). +Cette licence permet à quiconque de réutiliser les contenus de ce site à des fins commerciales, sans restriction. + +## 🔓 Cession de droits + +En contribuant à ce projet, vous autorisez le site Memento Dev à utiliser votre contenu sous licence MIT. +Aucun droit d'auteur ne peut être réclamé sur vos contributions. + +Memento Dev s'engage à ne pas se considérer comme l'auteur ou unique propriétaire de vos contributions. +Memento Dev sert uniquement de support pour la publication des différentes contributions. + +Il est important de noter que les contributions sont publiques et que tout le monde peut les consulter, +tout comme l'historique des modifications. + +## 🫶 Réutilisation des contenus + +Bien qu'aucune autorisation ne soit nécessaire pour réutiliser les contenus de ce site, +nous appréciions tout de même que vous mentionniez la source originale et la liste des contributeurs +figurant sur la page de chaque guide. + +Par respect et solidarité envers les contributeurs, merci de ne pas copier-coller les contenus sans en mentionner la source. \ No newline at end of file diff --git a/old/docs/glossaires/_category_.json b/old/docs/glossaires/_category_.json new file mode 100644 index 0000000..3cd2abb --- /dev/null +++ b/old/docs/glossaires/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "📖 Glossaires", + "position": 2 +} diff --git a/old/docs/glossaires/titres-professionnel.mdx b/old/docs/glossaires/titres-professionnel.mdx new file mode 100644 index 0000000..a53fe10 --- /dev/null +++ b/old/docs/glossaires/titres-professionnel.mdx @@ -0,0 +1,84 @@ +--- +sidebar_position: 1 +title: "Titres professionnels" +description: "Définitions des termes utilisés dans le cadre des titres professionnels." +--- + +import Admonition from '@theme/Admonition'; + +# Titres professionnels + +<Admonition type="warning"> +Les définitions ci-dessous permettent de mieux comprendre les termes utilisés dans le cadre des titres professionnels. +Cependant, tous les termes existants ne sont pas présents sur cette page. + +Comme certains termes ne sont pas utilisés dans le cadre de ce memento, ils ne sont pas définis ici. +</Admonition> + +## Activité type _(AT)_ +Une activité type est un bloc de compétences qui résulte de l'agrégation de tâches _(ce qu'il y a à faire dans l'emploi)_ +dont les missions et finalités sont suffisamment proches pour être regroupées. +Elle renvoie au certificat de compétences professionnelles _(CCP)_. + +## Compétence professionnelle _(CP)_ +La compétence professionnelle se traduit par une capacité à combiner un ensemble de savoirs, +savoir faire, comportements, conduites, procédures, type de raisonnement, en vue de réaliser une tâche ou une activité. +Elle a toujours une finalité professionnelle. Le résultat de sa mise en œuvre est évaluable. + +## Compétence transversale +La compétence transversale désigne une compétence générique commune aux diverses situations professionnelles de l'emploi type. +Parmi les compétences transversales, on peut recenser les compétences correspondant : + +- à des savoirs de base, +- à des attitudes comportementales et/ou organisationnelles. + +## Critère de performance +Un critère de performance sert à porter un jugement d'appréciation sur un objet en termes de résultat(s) attendu(s) : +il revêt des aspects qualitatifs et/ou quantitatifs. + +## Emploi type +L'emploi type est un modèle d'emploi représentatif d'un ensemble d'emplois réels suffisamment proches, en termes de mission, +de contenu et d'activités effectuées, pour être regroupées : il s'agit donc d'une modélisation, +résultante d'une agrégation critique des emplois. + +## Référentiel d'Emploi, Activités et Compétences _(REAC)_ +Le REAC est un document public à caractère règlementaire _(visé par l'arrêté du titre professionnel)_ qui s'applique aux +titres professionnels du ministère chargé de l'emploi. Il décrit les repères pour une représentation concrète du +métier et des compétences qui sont regroupées en activités dans un but de certification. + +## Mise en situation professionnelle +Il s'agit d'une reconstitution qui s'inspire d'une situation professionnelle représentative de l'emploi visé par le titre. +Elle s'appuie sur le plateau technique d'évaluation défini dans l'annexe 1 du référentiel de certification. + +## Présentation d'un projet réalisé en amont de la session +Lorsqu'une mise en situation professionnelle est impossible à réaliser, il peut y avoir présentation d'un projet réalisé dans le centre de formation +ou en entreprise. Dans cette hypothèse, le candidat prépare ce projet en amont de la session. Dans ce cas, la rubrique « Informations +complémentaires concernant la présentation du projet réalisé en amont de la session » mentionne en quoi consiste ce projet. + +## Entretien technique +L'entretien technique peut être prévu par le référentiel de certification. Sa durée et son périmètre de compétences sont précisés. +Il permet si nécessaire d'analyser la mise en situation professionnelle et/ou d'évaluer une _(des)_ compétence(s) particulière(s). + +## Questionnaire professionnel +Il s'agit d'un questionnaire écrit passé sous surveillance. Cette modalité est nécessaire pour certains métiers lorsque la mise en situation ne +permet pas d'évaluer certaines compétences ou connaissances, telles des normes de sécurité. Les questions peuvent être de type questionnaire +à choix multiples _(QCM)_, semi-ouvertes ou ouvertes. + +## Questionnement à partir de production(s) +Il s'agit d'une réalisation particulière _(dossier, objet…)_ élaborée en amont de la session par le candidat, pour évaluer certaines des compétences +non évaluables par la mise en situation professionnelle. Elle donne lieu à des questions spécifiques posées par le jury. Dans ce cas, la rubrique +« Informations complémentaires concernant le questionnement à partir de production(s) » mentionne en quoi consiste/nt cette/ces production(s). + +## Entretien final +Il permet au jury de s'assurer, que le candidat possède : + +- La compréhension et la vision globale du métier quel qu'en soit le contexte d'exercice ; +- La connaissance et l'appropriation de la culture professionnelle et des représentations du métier. +- Lors de l'entretien final, le jury dispose de l'ensemble du dossier du candidat, dont son dossier professionnel + +--- + +## Sources utilisées + +- [REAC DWWM 2018 _(réalisé par l'AFPA pour le compte de l'État français)_](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/EGPResultat.aspx?ct=01280m03&type=t) +- [RC DWWM 2018 _(réalisé par l'AFPA pour le compte de l'État français)_](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/EGPResultat.aspx?ct=01280m03&type=t) \ No newline at end of file diff --git a/old/docs/intro.mdx b/old/docs/intro.mdx new file mode 100644 index 0000000..86c97f5 --- /dev/null +++ b/old/docs/intro.mdx @@ -0,0 +1,23 @@ +--- +sidebar_position: 1 +description: "Memento Dev, une plateforme open-source de partage de connaissances en développement !" +--- + +# 📜 Préambule + +## Bienvenue ! + +Toi qui vient d'arriver sur cette plateforme, sache que si tu cherches un coup de main pour mieux comprendre certaines notions dans le développement, tu es tombé au bon endroit ! + +En prime, tu trouveras également des synthèses de certains référentiels de titres professionnels ! 🎉 + +## Pourquoi cette plateforme ? + +À l'instar du [**MDN Web Docs**](https://developer.mozilla.org/fr/) et feu **Le Site du Zéro**, cette plateforme a pour objectif de te fournir des ressources de qualité pour t'aider à te perfectionner dans le développement. + +## Qui peut contribuer ? + +Tout le monde ! Si tu as des connaissances que tu souhaites partager, tu es évidemment le bienvenu ! +Que tu sois auto-didacte, étudiant, formateur ou que sais-je encore : tu as ta place ici. + +Si tu es intéressé pour contribuer, tu peux consulter la page [Contribuer](/contribuer) pour en savoir plus. \ No newline at end of file diff --git a/old/docs/ressources/_category_.json b/old/docs/ressources/_category_.json new file mode 100644 index 0000000..1a13bbd --- /dev/null +++ b/old/docs/ressources/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "📁 Ressources", + "position": 4 +} diff --git a/old/docs/ressources/bases-de-donnees/_category_.json b/old/docs/ressources/bases-de-donnees/_category_.json new file mode 100644 index 0000000..fcd7f06 --- /dev/null +++ b/old/docs/ressources/bases-de-donnees/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "💽 Bases de données", + "position": 1, + "link": { + "type": "generated-index" + } +} diff --git a/old/docs/ressources/bases-de-donnees/modelisation/_category_.json b/old/docs/ressources/bases-de-donnees/modelisation/_category_.json new file mode 100644 index 0000000..7b5db7f --- /dev/null +++ b/old/docs/ressources/bases-de-donnees/modelisation/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Modélisation", + "position": 1 +} diff --git a/old/docs/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees.mdx b/old/docs/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees.mdx new file mode 100644 index 0000000..73c884b --- /dev/null +++ b/old/docs/ressources/bases-de-donnees/modelisation/dictionnaire-de-donnees.mdx @@ -0,0 +1,67 @@ +--- +sidebar_position: 3 +title: "Création du MCD" +description: "Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données." +tags: + - Conception + - Modélisation + - Base de données + - Merise + - Dictionnaire de Données + - Modèle Conceptuel de Données (MCD) + - Modèle Logique de Données (MLD) + - Modèle Relationnel de Données (MRD) + - Modèle Physique de Données (MPD) + - SQL + - DWWM + - CDA +--- + +import Admonition from '@theme/Admonition'; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; + +# Merise - Le Dictionnaire de Données + +Le **Dictionnaire de Données** est un document qui contient toutes les informations sur les données qui vont être stockées dans la base de données. + +Ici, on ne va pas parler de tables, de colonnes ou de relations, mais uniquement de données. Ces informations nous sont données par le client, +et il est important que le dictionnaire reste compréhensible par le client ! + +Voici un exemple de dictionnaire de données, à partir des informations données par le client : + +<Tabs> + <TabItem value="employee" label="Salarié"> + | Nom de la donnée | Type de donnée | Description | Taille attendue | Taille fixe ? | Exemple(s) de valeur | + |----------------------|----------------|---------------------------------------------------------------|-----------------|---------------|--------------------------| + | adresse email | Alphanumérique | - | N/A | N/A | elodie.martin@exemple.fr | + | prénom | Alphabétique | - | 50 caractères | Variable | Élodie, Christophe | + | nom | Alphabétique | - | 50 caractères | Variable | Martin, Dupont | + | adresse postale | Alphanumérique | Numéro de rue, type de voie et nom de la voie | N/A | N/A | 1 rue de la Paix | + | code postal | Numérique | - | 5 caractères | Fixe | 75000, 01000 | + | ville | Alphabétique | - | 50 caractères | Variable | Paris, Lyon | + | mot de passe | Alphanumérique | Mot de passé sécurisé _(haché)_ | 80 caractères | Variable | - | + | manager de l'employé | Liaison | Liaison vers le manager du salarié | N/A | N/A | N/A | + | employés managés | Liaison | Liste des salariés gérés par ce manager _(également salarié)_ | N/A | N/A | N/A | + </TabItem> + + <TabItem value="task" label="Tâche"> + | Nom de la donnée | Type de donnée | Description | Taille attendue | Taille fixe ? | Exemple(s) de valeur | + |---------------------------|----------------|-----------------------------------------|-----------------|---------------|----------------------| + | nom | Alphanumérique | - | 255 caractères | Variable | - | + | est réalisée ? | Vrai/Faux | Indique si la tâche est réalisée ou non | N/A | N/A | Vrai, Faux | + | projet | Liaison | Projet auquel la tâche est rattachée | N/A | N/A | N/A | + </TabItem> + + <TabItem value="project" label="Projet"> + | Nom de la donnée | Type de donnée | Description | Taille attendue | Taille fixe ? | Exemple(s) de valeur | + |------------------|----------------|--------------------------------------|-----------------|---------------|----------------------| + | nom | Alphanumérique | - | 255 caractères | Variable | Mon super projet | + | tâches | Liaison | Liste des tâches associées au projet | N/A | N/A | N/A | + </TabItem> +</Tabs> + +Comme tu peux voir, il n'y a aucun terme technique dans ce document 😉 +Cet exemple, on va le mettre de côté car en vrai, il présente quelques notions intermédiaires qui pourraient être déroutantes pour une entrée en matière. + +Mais on y reviendra une fois toutes les étapes expliquées, comme ça tu auras un exemple un poil plus concret pour te représenter le lien entre les étapes ! \ No newline at end of file diff --git a/old/docs/ressources/bases-de-donnees/modelisation/img/mcd-exemple.webp b/old/docs/ressources/bases-de-donnees/modelisation/img/mcd-exemple.webp new file mode 100644 index 0000000..07f5726 Binary files /dev/null and b/old/docs/ressources/bases-de-donnees/modelisation/img/mcd-exemple.webp differ diff --git a/old/docs/ressources/bases-de-donnees/modelisation/img/mcd-guide.webp b/old/docs/ressources/bases-de-donnees/modelisation/img/mcd-guide.webp new file mode 100644 index 0000000..09a90a2 Binary files /dev/null and b/old/docs/ressources/bases-de-donnees/modelisation/img/mcd-guide.webp differ diff --git a/old/docs/ressources/bases-de-donnees/modelisation/img/mld-exemple.webp b/old/docs/ressources/bases-de-donnees/modelisation/img/mld-exemple.webp new file mode 100644 index 0000000..5c62b77 Binary files /dev/null and b/old/docs/ressources/bases-de-donnees/modelisation/img/mld-exemple.webp differ diff --git a/old/docs/ressources/bases-de-donnees/modelisation/img/mld-guide.webp b/old/docs/ressources/bases-de-donnees/modelisation/img/mld-guide.webp new file mode 100644 index 0000000..86e265d Binary files /dev/null and b/old/docs/ressources/bases-de-donnees/modelisation/img/mld-guide.webp differ diff --git a/old/docs/ressources/bases-de-donnees/modelisation/mcd.mdx b/old/docs/ressources/bases-de-donnees/modelisation/mcd.mdx new file mode 100644 index 0000000..b9dc14a --- /dev/null +++ b/old/docs/ressources/bases-de-donnees/modelisation/mcd.mdx @@ -0,0 +1,141 @@ +--- +sidebar_position: 3 +title: "Création du MCD" +description: "Tout en respectant la méthode Merise, on va voir comment créer un Modèle Conceptuel de Données (MCD) pour une base de données." +tags: + - Conception + - Modélisation + - Base de données + - Merise + - Dictionnaire de Données + - Modèle Conceptuel de Données (MCD) + - Modèle Logique de Données (MLD) + - Modèle Relationnel de Données (MRD) + - Modèle Physique de Données (MPD) + - SQL + - DWWM + - CDA +--- + +import Admonition from '@theme/Admonition'; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; + +# Merise - Le MCD + +Ce modèle a pour objectif de représenter sous forme graphique les données et les relations entre ces données. +Avant le MCD, nous sommes en théorie en possession du dictionnaire de données +qui contient toutes les informations qui vont nous être utiles. + +Il est important de noter que l'on doit rester le plus clair possible dans la représentation des données, +car ce modèle doit être compris par tout le monde : y compris le client final. + +## Les définitions + +Chaque regroupement de données est appelé une entité, et chaque entité est composée d'attributs. +Les relations entre les entités sont représentées par trois éléments : +- Un trait reliant les entités _(ou la même entité dans le cas d'une relation réflexive)_ +- Un verbe qui décrit la relation à l'**infinitif** +- Une cardinalité pour quantifier la relation entre les entités + +- **Entité** : Regroupement de données, représentée par un rectangle jaune dans le schéma ci-dessous. +- **Attribut** : Propriété d'une entité + - **Discriminant** _(ou déterminant)_ : Attribut qui permet de distinguer les occurrences d'une entité. Il est souligné et en gras dans le schéma. + - **Attribut unique** : Attribut qui ne peut pas avoir la même valeur pour deux occurrences d'une entité. Il est en gras dans le schéma. +- **Relation** : Lien entre deux entités, représentée par un trait reliant les entités. +- **Cardinalité** : Nombre d'occurrences _(minimum et maximum)_ d'une entité qui peuvent être associées à une occurrence d'une autre entité. + +## Exemple de MCD + +C'est pas clair ? Prenons alors ce modèle ! +![Modèle Conceptuel de Données, MCD, Merise](./img/mcd-guide.webp) + +Ce modèle nous indique plusieurs choses : + +<Tabs> + <TabItem value="entities" label="Entités"> + - Deux entités sont présentes : + - `Entité 1` et `Entité 2` + - L'entité `Entité 1` possède quatre attributs : + - `code entité 1` _(discriminant)_ + - `attribut 2` + - `attribut 3` + - `attribut 4` + - L'entité `Entité 2` possède trois attributs : + - `code entité 2` _(discriminant)_ + - `attribut 2` + - `attribut 3` + + <Admonition type="quote" title="Pourquoi il n'y a pas d'ID dans le schéma ?"> + Avant d'expliquer **pourquoi** il n'y a pas d'ID, je me permets de faire un petit écart pour expliquer **ce qu'est** un ID. + + `ID`, c'est le nom qu'on donne pour parler de l'identifiant qui se doit d'être unique afin d'identifier facilement une ressource d'une autre. + + Il s'agit, en réalité, d'une donnée purement technique. + Après tout, c'est pas le client final qui va s'intéresser à l'ID de ses données, n'est-ce pas ? + + Comme le MCD se doit d'être **non-technique**, le terme `ID` n'est donc pas pertinent et surtout : n'a pas sa place. + + En reprenant le schéma ci-dessus, on peut dire que le `code entité 1` et le `code entité 2` sont les déterminants de leurs entités respectives. + Une fois qu'on fera nos schémas techniques _(MLD, MRD, MPD)_, on pourra alors utiliser le terme `ID` ! + </Admonition> + </TabItem> + + <TabItem value="relations" label="Relations et cardinalités"> + - Une relation : + - Entre `Entité 1` et `Entité 2` + - Cardinalité : + - `Entité 1` peut posséder de 1 à 1 occurrence de `Entité 2` + - `Entité 2` peut être possédée par 0 à n occurrences de `Entité 1` + - Verbe : + - `POSSÉDER` + + Si on revient à la déclaration faite plus tôt, on remarque qu'il est effectivement à l'**infinitif**. + Mais alors, pourquoi c'est important ? + + En fait, le verbe à l'infinitif permet de faciliter la compréhension des relations et ce, dans les deux sens. + + Mais parlons des cardinalités parce qu'on y retrouve quelque chose de bizarre : `n`. + C'est quoi `n` ? + + `n` est une valeur qui signifie que l'entité peut être possédée par un nombre indéfini d'occurrences de l'autre entité. + C'est une notation que l'on retrouvera très fréquemment, puisque la majorité du temps on ne peut pas déterminer le nombre exact d'occurrences. + + <Admonition type="quote" label="Mais est-il possible d'indiquer une valeur définie, comme `42` par exemple ?"> + Oui ! Si tu connais à l'avance le nombre maximal d'occurrences et que ce nombre est fixe _(peu importe le contexte)_, tu peux tout à fait le spécifier. + + Par exemple : demain on te demande de modéliser une base de données avec deux entités `Année` et `Mois`. + + Tu peux donc représenter la relation de cette manière : + + > `Année 1,12 - POSSÉDER - 1,1 Mois` + > `Année` possède de 1 à 12 occurrences de `Mois` + > `Mois` est possédée par une seule occurrence de `Année` + + C'est un exemple simple, mais qui montre bien que c'est possible ! + </Admonition> + </TabItem> +</Tabs> + +Tiens d'ailleurs, autre sujet important pour le **MCD** ! + +On a vu que certains termes ne sont pas employés _(comme `ID`, mais également `tables`, `clé primaire` ou encore `clé étrangère`)_ +pour respecter la nature du document qui se veut non-technique. +Mais il y a autre chose qui peut nous sauter aux yeux : c'est écrit en français ! + +La raison est identique à ce que j'ai pu rabâcher plus tôt : le document doit être compris par tout le monde. +Et si le client final est francophone, il est donc plus simple de lui présenter un document dans sa langue maternelle. + +<Admonition type="quote" title="Mouais, toujours pas convaincu par le MCD"> + Tant pis pour toi ! 😜 + Si je devais te donner un argument majeur, ce serait celui-ci. Après j'abandonne, promis ! + + Ton client est un spécialiste dans son domaine, mais toi tu n'y connais rien. + Il te parle de certaines données, tu arrives à peu près à comprendre comment ça fonctionne, mais tu n'as pas toutes les informations. + + D'une part, le dictionnaire de données t'en donne la nature et "qui" _(l'entité)_ possède ces données. + Par contre, comme le MCD te permet de quantifier et de qualifier les relations entre les entités, tu as une vision plus claire de ce que le client veut. + + Et si le client comprend et valide le MCD, c'est que tu as bien compris ses besoins et que tu peux donc passer à la suite du projet sans foncer dans le mur, + ce qui t'obligerai de déconstruire et de reconstruire une partie de ton application. +</Admonition> \ No newline at end of file diff --git a/old/docs/ressources/bases-de-donnees/modelisation/merise.mdx b/old/docs/ressources/bases-de-donnees/modelisation/merise.mdx new file mode 100644 index 0000000..4b62211 --- /dev/null +++ b/old/docs/ressources/bases-de-donnees/modelisation/merise.mdx @@ -0,0 +1,479 @@ +--- +sidebar_position: 1 +title: "Modélisation avec Merise" +description: "Voyons ensemble comment on peut modéliser une base de données avec Merise !" +tags: + - Conception + - Modélisation + - Base de données + - Merise + - Dictionnaire de Données + - Modèle Conceptuel de Données (MCD) + - Modèle Logique de Données (MLD) + - Modèle Relationnel de Données (MRD) + - Modèle Physique de Données (MPD) + - SQL + - DWWM +--- + +import ICalLink from '@site/src/components/ICalLink'; +import Admonition from '@theme/Admonition'; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; + +# Modélisation d'une base de données avec Merise + +## Introduction + +Si jamais tu n'es pas au courant, on recommande _(pour ne pas ainsi dire qu'on oblige 🙃)_ les concepteurs et développeurs d'applications à modéliser leur base de données avant de commencer à coder. + +Mais alors, quel est réellement l'intérêt derrière ces schémas qui sont parfois considérés comme faisant partie d'une étape fastidieuse et inutile ? + +Eh bien, la modélisation d'une base de données permet de : + +- Comprendre les besoins du client final +- Faciliter la communication entre les différents acteurs du projet +- Éviter les erreurs de conception _(ou pas 😅)_ + +## Modélisation avec Merise + +[Merise](https://fr.wikipedia.org/wiki/Merise_(informatique)) est une méthode d'analyse, de conception et de gestion de projet informatique. +Pour faire plus simple que cette première phrase toute droit sortie de Wikipédia, Merise est une méthode qui permet entre autres de modéliser une base de données. + +Même si dans cette documentation on va parler uniquement de la conception qui concerne la base de données, +je t'ai fait un court résumé des différentes étapes principale de la méthode Merise. + +## Les différentes étapes principales + +1. **L'analyse des besoins** : On commence par recueillir les besoins du client pour notre cahier des charges. +2. **La conception** : On modélise la base de données en utilisant les différents outils de Merise. +3. **L'implémentation** : On passe à la phase de développement en utilisant les modèles créés précédemment. +4. **La mise en service** : On met en service l'application et on la teste. +5. **La maintenance** : On assure la maintenance de l'application. + +## Les différents documents + +En ce qui concerne les différents documents, on va en retrouver cinq principaux : + +- **Le Dictionnaire de Données** : Il contient toutes les informations sur les données qui vont être stockées. +- **Le Modèle Conceptuel de Données _(MCD)_** : Il représente les données et les relations entre ces données. +- **Le Modèle Logique de Données _(MLD)_** : Il ajoute des éléments techniques au MCD. +- **Le Modèle Relationnel de Données _(MRD)_** : Il est une représentation textuelle du MLD. +- **Le Modèle Physique de Données _(MPD)_** : Il ajoute les types de données et les contraintes au MLD. + +Bien sûr, il est possible de rajouter d'autres documents en fonction des besoins du projet ! +Mais pour l'instant, on va se concentrer sur ces cinq-là. + +### Le Dictionnaire de Données + +Le **Dictionnaire de Données** est un document qui contient toutes les informations sur les données qui vont être stockées dans la base de données. + +Ici, on ne va pas parler de tables, de colonnes ou de relations, mais uniquement de données. Ces informations nous sont données par le client, +et il est important que le dictionnaire reste compréhensible par le client ! + +Voici un exemple de dictionnaire de données, à partir des informations données par le client : + +<Tabs> + <TabItem value="employee" label="Salarié"> + | Nom de la donnée | Type de donnée | Description | Taille attendue | Taille fixe ? | Exemple(s) de valeur | + |----------------------|----------------|---------------------------------------------------------------|-----------------|---------------|--------------------------| + | adresse email | Date | - | N/A | N/A | elodie.martin@exemple.fr | + | prénom | Alphabétique | - | 50 caractères | Variable | Élodie, Christophe | + | nom | Alphabétique | - | 50 caractères | Variable | Martin, Dupont | + | adresse postale | Alphanumérique | Numéro de rue, type de voie et nom de la voie | N/A | N/A | 1 rue de la Paix | + | code postal | Numérique | - | 5 caractères | Fixe | 75000, 01000 | + | ville | Alphabétique | - | 50 caractères | Variable | Paris, Lyon | + | mot de passe | Alphanumérique | Mot de passé sécurisé _(haché)_ | 80 caractères | Variable | - | + | manager de l'employé | Liaison | Liaison vers le manager du salarié | N/A | N/A | N/A | + | employés managés | Liaison | Liste des salariés gérés par ce manager _(également salarié)_ | N/A | N/A | N/A | + </TabItem> + + <TabItem value="task" label="Tâche"> + | Nom de la donnée | Type de donnée | Description | Taille attendue | Taille fixe ? | Exemple(s) de valeur | + |---------------------------|----------------|-----------------------------------------|-----------------|---------------|----------------------| + | nom | Alphanumérique | - | 255 caractères | Variable | - | + | est réalisée ? | Vrai/Faux | Indique si la tâche est réalisée ou non | N/A | N/A | Vrai, Faux | + | projet | Liaison | Projet auquel la tâche est rattachée | N/A | N/A | N/A | + </TabItem> + + <TabItem value="project" label="Projet"> + | Nom de la donnée | Type de donnée | Description | Taille attendue | Taille fixe ? | Exemple(s) de valeur | + |------------------|----------------|--------------------------------------|-----------------|---------------|----------------------| + | nom | Alphanumérique | - | 255 caractères | Variable | Mon super projet | + | tâches | Liaison | Liste des tâches associées au projet | N/A | N/A | N/A | + </TabItem> +</Tabs> + +Comme tu peux voir, il n'y a aucun terme technique dans ce document 😉 +Cet exemple, on va le mettre de côté car en vrai, il présente quelques notions intermédiaires qui pourraient être déroutantes pour une entrée en matière. + +Mais on y reviendra une fois toutes les étapes expliquées, comme ça tu auras un exemple un poil plus concret pour te représenter le lien entre les étapes ! + +### Le Modèle Conceptuel de Données _(MCD)_ + +Ce modèle a pour objectif de représenter sous forme graphique les données et les relations entre ces données. +Avant le MCD, nous sommes en théorie en possession du dictionnaire de données +qui contient toutes les informations qui vont nous être utiles. + +Il est important de noter que l'on doit rester le plus clair possible dans la représentation des données, +car ce modèle doit être compris par tout le monde : y compris le client final. + +Chaque regroupement de données est appelé une entité, et chaque entité est composée d'attributs. +Les relations entre les entités sont représentées par trois éléments : +- Un trait reliant les entités _(ou la même entité dans le cas d'une relation réflexive)_ +- Un verbe qui décrit la relation à l'**infinitif** +- Une cardinalité pour quantifier la relation entre les entités + +<Admonition type="info" title="Quelques définitions avant d'aller plus en profondeur"> + - **Entité** : Regroupement de données, représentée par un rectangle jaune dans le schéma ci-dessous. + - **Attribut** : Propriété d'une entité + - **Discriminant** _(ou déterminant)_ : Attribut qui permet de distinguer les occurrences d'une entité. Il est souligné et en gras dans le schéma. + - **Attribut unique** : Attribut qui ne peut pas avoir la même valeur pour deux occurrences d'une entité. Il est en gras dans le schéma. + - **Relation** : Lien entre deux entités, représentée par un trait reliant les entités. + - **Cardinalité** : Nombre d'occurrences _(minimum et maximum)_ d'une entité qui peuvent être associées à une occurrence d'une autre entité. +</Admonition> + +C'est pas clair ? Prenons alors ce modèle ! +![Modèle Conceptuel de Données, MCD, Merise](./img/mcd-guide.webp) + +Ce modèle nous indique plusieurs choses : + +<Tabs> + <TabItem value="entities" label="Entités"> + - Deux entités sont présentes : + - `Entité 1` et `Entité 2` + - L'entité `Entité 1` possède quatre attributs : + - `code entité 1` _(discriminant)_ + - `attribut 2` + - `attribut 3` + - `attribut 4` + - L'entité `Entité 2` possède trois attributs : + - `code entité 2` _(discriminant)_ + - `attribut 2` + - `attribut 3` + + <Admonition type="quote" title="Pourquoi il n'y a pas d'ID dans le schéma ?"> + Avant d'expliquer **pourquoi** il n'y a pas d'ID, je me permets de faire un petit écart pour expliquer **ce qu'est** un ID. + + `ID`, c'est le nom qu'on donne pour parler de l'identifiant qui se doit d'être unique afin d'identifier facilement une ressource d'une autre. + + Il s'agit, en réalité, d'une donnée purement technique. + Après tout, c'est pas le client final qui va s'intéresser à l'ID de ses données, n'est-ce pas ? + + Comme le MCD se doit d'être **non-technique**, le terme `ID` n'est donc pas pertinent et surtout : n'a pas sa place. + + En reprenant le schéma ci-dessus, on peut dire que le `code entité 1` et le `code entité 2` sont les déterminants de leurs entités respectives. + Une fois qu'on fera nos schémas techniques _(MLD, MRD, MPD)_, on pourra alors utiliser le terme `ID` ! + </Admonition> + </TabItem> + + <TabItem value="relations" label="Relations et cardinalités"> + - Une relation : + - Entre `Entité 1` et `Entité 2` + - Cardinalité : + - `Entité 1` peut posséder de 1 à 1 occurrence de `Entité 2` + - `Entité 2` peut être possédée par 0 à n occurrences de `Entité 1` + - Verbe : + - `POSSÉDER` + + Si on revient à la déclaration faite plus tôt, on remarque qu'il est effectivement à l'**infinitif**. + Mais alors, pourquoi c'est important ? + + En fait, le verbe à l'infinitif permet de faciliter la compréhension des relations et ce, dans les deux sens. + + Mais parlons des cardinalités parce qu'on y retrouve quelque chose de bizarre : `n`. + C'est quoi `n` ? + + `n` est une valeur qui signifie que l'entité peut être possédée par un nombre indéfini d'occurrences de l'autre entité. + C'est une notation que l'on retrouvera très fréquemment, puisque la majorité du temps on ne peut pas déterminer le nombre exact d'occurrences. + + <Admonition type="quote" label="Mais est-il possible d'indiquer une valeur définie, comme `42` par exemple ?"> + Oui ! Si tu connais à l'avance le nombre maximal d'occurrences et que ce nombre est fixe _(peu importe le contexte)_, tu peux tout à fait le spécifier. + + Par exemple : demain on te demande de modéliser une base de données avec deux entités `Année` et `Mois`. + + Tu peux donc représenter la relation de cette manière : + + > `Année 1,12 - POSSÉDER - 1,1 Mois` + > `Année` possède de 1 à 12 occurrences de `Mois` + > `Mois` est possédée par une seule occurrence de `Année` + + C'est un exemple simple, mais qui montre bien que c'est possible ! + </Admonition> + </TabItem> +</Tabs> + +Tiens d'ailleurs, autre sujet important pour le **MCD** ! + +On a vu que certains termes ne sont pas employés _(comme `ID`, mais également `tables`, `clé primaire` ou encore `clé étrangère`)_ +pour respecter la nature du document qui se veut non-technique. +Mais il y a autre chose qui peut nous sauter aux yeux : c'est écrit en français ! + +La raison est identique à ce que j'ai pu rabâcher plus tôt : le document doit être compris par tout le monde. +Et si le client final est francophone, il est donc plus simple de lui présenter un document dans sa langue maternelle. + +<Admonition type="quote" title="Mouais, toujours pas convaincu par le MCD"> + Tant pis pour toi ! 😜 + Si je devais te donner un argument majeur, ce serait celui-ci. Après j'abandonne, promis ! + + Ton client est un spécialiste dans son domaine, mais toi tu n'y connais rien. + Il te parle de certaines données, tu arrives à peu près à comprendre comment ça fonctionne, mais tu n'as pas toutes les informations. + + D'une part, le dictionnaire de données t'en donne la nature et "qui" _(l'entité)_ possède ces données. + Par contre, comme le MCD te permet de quantifier et de qualifier les relations entre les entités, tu as une vision plus claire de ce que le client veut. + + Et si le client comprend et valide le MCD, c'est que tu as bien compris ses besoins et que tu peux donc passer à la suite du projet sans foncer dans le mur, + ce qui t'obligerai de déconstruire et de reconstruire une partie de ton application. +</Admonition> + +### Le Modèle Logique de Données _(MLD)_ + +À partir de maintenant, on "abandonne" le client et on dit bonjour à la technique ! ⚙️ + +Le **Modèle Logique de Données** est une étape intermédiaire entre le MCD et le MPD. +Il se base de manière directe sur le MCD, mais il ajoute des éléments techniques qui vont permettre de nous assurer **avant** de faire +la base de données que tout est correct. + +En reprenant l'exemple donné pour le MCD, voici le MLD correspondant. + +![Modèle Logique de Données, MLD, Merise](./img/mld-guide.webp) + +Ici, on ne parle plus d'entités, mais de tables. +Et ce qui était souligné avant _(les déterminants)_ devient des clés primaires. +De manière générale, on y retrouvera le terme `id` pour les clés primaires même si ce n'est pas une obligation. + +<Admonition type="quote" title="Où qu'elles sont les relations ?"> + Bien vu ! Elles sont totalement disparues... enfin presque. + + Si tu regardes de plus près, tu peux voir que la table nommée `table_1` s'est vue ajouter une colonne `table_2_id`. + Mais qu'est-ce que c'est ? + + Il s'agit d'une référence vers la table `table_2` : c'est ce qu'on appelle une **clé étrangère**. + Le but des clés étrangères est de lier les tables entre elles, et donc de recréer les relations que l'on avait dans le MCD. + + Une clé étrangère pointe systématiquement vers une clé primaire d'une autre table _(ou de la même table dans le cas d'une relation réflexive)_. + Dans cet exemple, la clé étrangère `table_2_id` de la table `table_1` est une référence à la clé primaire `id` de la table `table_2`. +</Admonition> + +Maintenant, j'ai une question pour vous... est-ce que vous savez ce qu'il se passe quand dans notre MCD, +une relation à une cardinalité avec un `n` pour le maximum des deux côtés ? _(`0,n` ou `1,n` par exemple)_ + +Eh bien... on se retrouve avec une table intermédiaire ! +Cette table peut se nommer de différentes manières. +Pour ma part, j'appelle ça une "table pivot" même si on peut également parler de "table de liaison" +ou encore de "table de jointure" _(et sans doute d'autres termes !)_. + +<Admonition type="quote" title="Table pivot ? Kézako ?"> + Le but d'une table pivot est de permettre de lier deux tables entre elles lorsque la relation entre ces deux tables est de type `n`. + + Cette table va stocker **uniquement** _(sauf besoin spécifique)_ la valeur des clés primaires des deux tables qu'elle relie. + Et si tu as bien suivi, ces deux colonnes seront des clés étrangères qui pointeront vers les clés primaires des tables qu'elles relient 😉 +</Admonition> + +### Le Modèle Relationnel de Données _(MRD)_ + +Souffle un coup, parce qu'on vient de voir était quand même déjà pas mal costaud ! 🥵 + +C'est le moment détente, parce que le **Modèle Relationnel de Données** est en fait une simple représentation textuelle de notre MLD. +Pas besoin donc de schéma, juste une liste de tables avec leurs colonnes ! + +Et toujours à partir de notre exemple, voici le MRD correspondant. + +> table_1(<u className='font-bold'>id</u>, colonne_2, colonne_3, colonne_4, <i className="italic">#table_2_id</i>) +> table_2(<u className='font-bold'>id</u>, colonne_2, colonne_3) + +Tu as vu ? Rien de bien méchant ! + +On vient reprendre une partie de l'écriture que l'on retrouve dans le MLD, mais on ajoute des symboles pour indiquer les clés étrangères. + +Le symbole `#` est utilisé pour indiquer une clé étrangère, en préfixe du nom de la colonne. + +Tu sais maintenant ce qu'il manque comme ajout majeur pour passer du MRD au MPD ? +Je te le donne en mille : les **types de données** et leurs **contraintes** ! + +### Le Modèle Physique de Données _(MPD)_ + +Avant toute chose, permet moi de t'imposer _(tel le manitou que je suis 😆)_ une petite révision des types de données que l'on retrouve en SQL. +Et comme je ne suis pas méchant, voici une liste des types selon les SGBD les plus utilisés : + +- [**PostgreSQL**](https://www.postgresql.org/docs/current/datatype.html) +- [**MySQL**](https://dev.mysql.com/doc/refman/9.0/en/data-types.html) +- [**SQL Server**](https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-ver15) +- [**SQLite**](https://www.sqlite.org/datatype3.html) +- [**Oracle**](https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html) + +_(Désolé pour les autres SGBD, mais je ne peux pas tout mettre 😅)_ + +<Admonition type="quote" title="Mais pourquoi il me bassine avec les types de données ?"> + Parce que c'est important ! + Les types de données permettent de définir le format des données que l'on va stocker dans notre base de données. + + Chaque SGBD fixe ses propres types de données, mais on retrouve des similitudes entre eux. + On peut d'ailleurs retrouver quelque chose de très différent du côté de + [**MongoDB**](https://docs.mongodb.com/manual/reference/bson-types/) qui est une base de données NoSQL. +</Admonition> + +Maintenant que tu as révisé, on peut réellement passer au **Modèle Physique de Données** ! + +Le but du MPD est de se baser sur le MLD et d'y ajouter les types de données et les contraintes _(comme les clés primaires par exemple)_. +Bien que c'était déjà le cas dans le MLD, le MPD est plus précis et plus technique. + +Le MPD peut se représenter de deux manières différentes : + +- Un script pour créer la base de données +- Un schéma visuel _(encore un..)_ de la base de données + +Je ne vais pas m'attarder sur le schéma visuel, car il est très similaire au MLD avec uniquement les types de données et les contraintes en plus. + +Par contre, je vais te montrer un exemple de script pour créer une base de données à partir de notre MLD. + +```sql title="MPD sous forme de script SQL" showLineNumbers +CREATE TABLE IF NOT EXISTS table_1( + id INT PRIMARY KEY, + colonne_2 VARCHAR(50) NOT NULL, + colonne_3 VARCHAR(80), + colonne_4 TINYINT DEFAULT 0, + table_2_id INT +); + +CREATE TABLE IF NOT EXISTS table_2( + id INT PRIMARY KEY, + colonne_2 VARCHAR(50) NOT NULL, + colonne_3 DATE +); + +ALTER TABLE table_1 +ADD FOREIGN KEY (table_2_id) REFERENCES table_2(id); +``` + +Et voilà ! +Bien sûr, ce script est un exemple très simple, mais il te montre comment on peut passer d'un MLD à un MPD. + +## Exemple concret + +Tu te souviens du dictionnaire de données que je t'avais montré plus tôt ? Je t'avais dit qu'on y reviendrai plus tard : **c'est l'heure** ! + +Reprenons donc le dictionnaire de données précédent _(que je te remet juste ici, ce sera plus simple 😉)_ et voyons commen t tout s'articule au niveau des étapes et modèles de conception. + +<Tabs> + <TabItem value="employee" label="Salarié"> + | Nom de la donnée | Type de donnée | Description | Taille attendue | Taille fixe ? | Exemple(s) de valeur | + |----------------------|----------------|---------------------------------------------------------------|-----------------|---------------|--------------------------| + | adresse email | Date | - | N/A | N/A | elodie.martin@exemple.fr | + | prénom | Alphabétique | - | 50 caractères | Variable | Élodie, Christophe | + | nom | Alphabétique | - | 50 caractères | Variable | Martin, Dupont | + | adresse postale | Alphanumérique | Numéro de rue, type de voie et nom de la voie | N/A | N/A | 1 rue de la Paix | + | code postal | Numérique | - | 5 caractères | Fixe | 75000, 01000 | + | ville | Alphabétique | - | 50 caractères | Variable | Paris, Lyon | + | mot de passe | Alphanumérique | Mot de passé sécurisé _(haché)_ | 80 caractères | Variable | - | + | manager de l'employé | Liaison | Liaison vers le manager du salarié | N/A | N/A | N/A | + | employés managés | Liaison | Liste des salariés gérés par ce manager _(également salarié)_ | N/A | N/A | N/A | + </TabItem> + + <TabItem value="task" label="Tâche"> + | Nom de la donnée | Type de donnée | Description | Taille attendue | Taille fixe ? | Exemple(s) de valeur | + |---------------------------|----------------|-----------------------------------------|-----------------|---------------|----------------------| + | nom | Alphanumérique | - | 255 caractères | Variable | - | + | est réalisée ? | Vrai/Faux | Indique si la tâche est réalisée ou non | N/A | N/A | Vrai, Faux | + | projet | Liaison | Projet auquel la tâche est rattachée | N/A | N/A | N/A | + </TabItem> + + <TabItem value="project" label="Projet"> + | Nom de la donnée | Type de donnée | Description | Taille attendue | Taille fixe ? | Exemple(s) de valeur | + |------------------|----------------|--------------------------------------|-----------------|---------------|----------------------| + | nom | Alphanumérique | - | 255 caractères | Variable | Mon super projet | + | tâches | Liaison | Liste des tâches associées au projet | N/A | N/A | N/A | + </TabItem> +</Tabs> + +Dans le MCD, on retrouvera donc trois entités : `Salarié`, `Tâche` et `Projet`. +Et biensûr, on n'oubliera pas les attributs de ces entités ! + +![Modèle Conceptuel de Données, MCD, Merise](./img/mcd-exemple.webp) + +Ici on va remarquer trois relations, dont une réflexive _(le manager de l'employé)_. +Sur le papier, voici comment on peut parler de ces relations : + +- `Salarié` 0,n - GÉRER - 0,1 `Salarié` + - Un salarié peut gérer plusieurs salariés + - Un salarié peut être géré par aucun ou un seul salarié +- `Salarié` 0,n - RÉALISER - 1,n `Tâche` + - Un salarié peut réaliser plusieurs tâches + - Une tâche doit être réalisée par au moins un salarié +- `Tâche` 1,1 - ATTRIBUER - 0,n `Projet` + - Une tâche est attribuée à un seul projet + - Un projet peut avoir aucune ou plusieurs tâches attribuées + +On peut donc en déduire que l'on va avoir une table pivot entre `Salarié` et `Tâche` pour la relation `RÉALISER` car des deux côtés on retrouve le fameux `n` qui indique qu'il peut y avoir plusieurs occurrences. + +Ensuite, on passe au MLD, où l'on va transformer nos entités en tables et nos attributs en colonnes. + +![Modèle Logique de Données, MLD, Merise](./img/mld-exemple.webp) + +Et là, magie ! On retrouve bien une table pivot entre l'entité `Salarié` _(devenue `employee`)_ et l'entité `Tâche` _(devenue `task`)_ pour la relation `RÉALISER`, qui se nomme `employee_has_task`. +Dedans, on y retrouve deux clés étrangères : `employee_id` et `task_id`. + +On peut également constater que pour la relation `GÉRER`, on a une clé étrangère `manager_id` dans la table `employee`. +Cette clé étrangère pointera vers la clé primaire `id` de la table `employee`, mais on verra ça plus facilement à partir du MPD avec un script SQL ! + +Pour le MRD, voici à quoi ça ressemble : + +> employee(<u className="font-bold underline">id</u>, **email**, firstname, lastname, postal_address, postal_code, city, password, <i className="italic">#manager_id</i>); +> project(<u className="font-bold underline">id</u>, name); +> task(<u className="font-bold underline">id</u>, name, is_done, <i className="italic">#project_id</i>); +> employee_has_task(<i className="italic">#employee_id</i>, <i className="italic">#task_id</i>); + +Et pour finir... 🥁 +Le MPD ! + + +```sql showLineNumbers +CREATE TABLE employee( + id CHAR(30), + email VARCHAR(320), + firstname VARCHAR(30), + lastname VARCHAR(30), + postal_address VARCHAR(60), + postal_code CHAR(5), + city VARCHAR(30), + password CHAR(80), + manager_id CHAR(30), + CONSTRAINT employee_pk PRIMARY KEY (id), + CONSTRAINT employee_ak UNIQUE (email), + CONSTRAINT employee_manager_fk FOREIGN KEY (manager_id) REFERENCES employee(id) +); + +CREATE TABLE project( + id CHAR(30), + name VARCHAR(255), + CONSTRAINT project_pk PRIMARY KEY (id) +); + +CREATE TABLE task( + id CHAR(30), + name VARCHAR(255), + is_done BOOLEAN, + project_id CHAR(30), + CONSTRAINT task_pk PRIMARY KEY (id), + CONSTRAINT task_project_fk FOREIGN KEY (project_id) REFERENCES project(id) +); + +CREATE TABLE employee_has_task( + employee_id CHAR(30), + task_id CHAR(30), + CONSTRAINT employee_has_task_pk PRIMARY KEY (employee_id, task_id), + CONSTRAINT employee_has_task_employee_fk FOREIGN KEY (employee_id) REFERENCES employee(id), + CONSTRAINT employee_has_task_task_fk FOREIGN KEY (task_id) REFERENCES task(id) +); +``` + +## Conclusion + +On est d'accord, c'est pas la partie la plus fun de la conception d'une application. +Mais sans ces étapes, il y a fort à parier que tu vas te retrouver à coder dans le vide et à devoir tout recommencer. + +Et si tu souhaites aller encore plus loin dans ces notions, je ne peux que te recommander de consulter un certain livre : +[**Merise - Guide pratique (4e édition)**](https://www.editions-eni.fr/livre/merise-guide-pratique-4e-edition-modelisation-des-donnees-et-des-traitements-manipulations-avec-le-langage-sql-conception-d-une-application-mobile-android-ou-ios-9782409046667) +écrit par [**Jean-Luc Baptiste**](https://www.editions-eni.fr/jean-luc-baptiste) que tu peux retrouver aux [Éditions ENI](https://www.editions-eni.fr/) ! + +C'est une vraie mine d'or, il s'agit de **la référence** en ce qui concerne Merise. diff --git a/old/docs/ressources/frontend/_category_.json b/old/docs/ressources/frontend/_category_.json new file mode 100644 index 0000000..96aab57 --- /dev/null +++ b/old/docs/ressources/frontend/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "🌈 Frontend", + "position": 1, + "link": { + "type": "generated-index" + } +} diff --git a/old/docs/ressources/frontend/react/_category_.json b/old/docs/ressources/frontend/react/_category_.json new file mode 100644 index 0000000..b228121 --- /dev/null +++ b/old/docs/ressources/frontend/react/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "React", + "position": 1 +} diff --git a/old/docs/ressources/frontend/react/contextes.mdx b/old/docs/ressources/frontend/react/contextes.mdx new file mode 100644 index 0000000..7a1847e --- /dev/null +++ b/old/docs/ressources/frontend/react/contextes.mdx @@ -0,0 +1,582 @@ +--- +sidebar_position: 7 +title: "Le hook useContext de React" +description: "Découvrez comment utiliser le hook useContext de React pour gérer les contextes dans vos applications." +tags: + - Frontend + - React + - JavaScript/TypeScript + - Bibliothèque + - Interface utilisateur (UI) +--- + +import Button from '@site/src/components/Button'; +import Quiz from '@site/src/components/Quiz'; +import Admonition from '@theme/Admonition'; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; + +# L'utilisation des contextes avec React + +## Introduction + +Les contextes sont un moyen de diffuser des données au travers des composants, sans avoir à les passer explicitement à chaque composant. +Pour faire simple, imaginons une arborescence de plusieurs composants imbriqués les uns dans les autres : + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx title="App.jsx" showLineNumbers + import { useState } from 'react'; + + const App = () => { + const [theme, setTheme] = useState('light'); + + return <A theme={theme} setTheme={theme} /> + }; + + const A = ({ theme, setTheme }) => { + return <B theme={theme} setTheme={setTheme} /> + }; + + const B = ({ theme, setTheme }) => { + return <C theme={theme} setTheme={setTheme} /> + }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx title="App.tsx" showLineNumbers + import type { Dispatch, SetStateAction } from 'react'; + + import { useState } from 'react'; + + type Theme = 'light' | 'dark'; + + const App = () => { + const [theme, setTheme] = useState<Theme>('light'); + + return <A theme={theme} setTheme={theme} /> + }; + + const A = ({ theme, setTheme }: { theme: Theme, setTheme: Dispatch<SetStateAction<Theme>> }) => { + return <B theme={theme} setTheme={setTheme} /> + }; + + const B = ({ theme, setTheme }: { theme: Theme, setTheme: Dispatch<SetStateAction<Theme>> }) => { + return <C theme={theme} setTheme={setTheme} /> + }; + ``` + </TabItem> +</Tabs> + +Fastidieux, n'est-ce pas ? On transmet à chaque fois les mêmes données, et ce, à chaque niveau de l'arborescence. + +C'est là que les contextes entrent en jeu ! +On va pouvoir alors déclarer notre contexte _(qui contiendra les données à diffuser)_ et le fournir à un niveau supérieur de l'arborescence. + +## Déclaration d'un contexte + +Avant de penser à notre contexte, on va réfléchir à ce que l'on veut diffuser et les valeurs par défaut. +Si on reprend notre exemple avec le thème clair et sombre, on sait que l'on va vouloir diffuser la valeur du thème et une fonction pour le changer. + +On va donc préparer le terrain en créant un fichier `ThemeContext.jsx` _(ou `ThemeContext.tsx` si tu utilises TypeScript)_ : + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx title="ThemeContext.jsx" showLineNumbers + import { createContext } from 'react'; + + // On crée notre contexte, avec une valeur par défaut : un thème clair + const ThemeContext = createContext({ + theme: 'light', + setTheme: () => {}, + }); + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx title="ThemeContext.tsx" showLineNumbers + import type { Dispatch, SetStateAction } from 'react'; + + import { createContext } from 'react'; + + // On crée un type pour les valeurs de thème + export type Theme = 'light' | 'dark'; + + // On crée un type pour notre contexte + type ThemeContextType = { + theme: Theme; + setTheme: Dispatch<SetStateAction<Theme>>; + }; + + // On crée notre contexte, avec une valeur par défaut : un thème clair + const ThemeContext = createContext<ThemeContextType>({ + theme: 'light', + setTheme: () => {}, + }); + ``` + </TabItem> +</Tabs> + +## Fournir un contexte + +Maintenant on peut le dire : notre contexte est prêt à être utilisé ! +Il ne reste plus qu'à le fournir à notre arborescence de composants en lui créant un `Provider`. + +<Admonition type="quote" title="Un Provider ?"> + Un `Provider` est un composant qui va permettre de diffuser les données du contexte à ses enfants. + Il est important de noter que le `Provider` doit être placé **au-dessus** des composants qui vont utiliser le contexte. +</Admonition> + +Un contexte React est un objet qui contient deux propriétés : `Provider` et `Consumer`. +Le `Provider` est un composant qui va permettre de diffuser les données du contexte à ses enfants. +Le `Consumer` est un composant qui va permettre de récupérer les données du contexte. + + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx title="App.jsx" + import { useState } from 'react'; + + const App = () => { + const [theme, setTheme] = useState('light'); + + return ( + <ThemeContext.Provider value={{ theme, setTheme }}> + <A /> + </ThemeContext.Provider> + ); + }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx title="App.tsx" + import type { Theme } from './ThemeContext'; + + import { useState } from 'react'; + + const App = () => { + const [theme, setTheme] = useState<Theme>('light'); + + return ( + <ThemeContext.Provider value={{ theme, setTheme }}> + <A /> + </ThemeContext.Provider> + ); + }; + ``` + </TabItem> +</Tabs> + +Mais on peut aller encore plus loin, en créant un `Provider` dédié à notre contexte ! +Cela permettra de simplifier l'arborescence de composants et de rendre le code plus lisible : + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx title="ThemeContext.jsx" {8-16} showLineNumbers + import { createContext, useState } from 'react'; + + const ThemeContext = createContext({ + theme: 'light', + setTheme: () => {}, + }); + + const ThemeProvider = ({ children }) => { + const [theme, setTheme] = useState('light'); + + return ( + <ThemeContext.Provider value={{ theme, setTheme }}> + {children} + </ThemeContext.Provider> + ); + }; + + export { ThemeContext, ThemeProvider }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx title="ThemeContext.tsx" {21-29} showLineNumbers + import type { ReactNode } from 'react'; + + import { createContext, useState } from 'react'; + + export type Theme = 'light' | 'dark'; + + type ThemeContextType = { + theme: Theme; + setTheme: Dispatch<SetStateAction<Theme>>; + }; + + const ThemeContext = createContext<ThemeContextType>({ + theme: 'light', + setTheme: () => {}, + }); + + type ThemeProviderProps = { + children: ReactNode; + }; + + const ThemeProvider = ({ children }: ThemeProviderProps) => { + const [theme, setTheme] = useState<Theme>('light'); + + return ( + <ThemeContext.Provider value={{ theme, setTheme }}> + {children} + </ThemeContext.Provider> + ); + }; + + export { ThemeContext, ThemeProvider }; + ``` + </TabItem> +</Tabs> + +Et pour terminer, on va maintenant pouvoir directement imbriquer notre `ThemeProvider` dans notre `App` : + +```jsx title="App.jsx (ou App.tsx)" {1,5-7} showLineNumbers +import { ThemeProvider } from './ThemeContext'; + +const App = () => { + return ( + <ThemeProvider> + <A /> + </ThemeProvider> + ); +}; +``` + +## Utilisation d'un contexte + +C'est bien beau de créer un contexte, mais comment l'utiliser ? +Tu te souviens peut-être du `Consumer` que l'on a évoqué plus tôt, non ? + +Et bien, il est temps de le mettre en pratique ! 😁 + +Pour commencer, nous allons avoir besoin du fameux hook `useContext` de React. +Ce hook va nous permettre de récupérer les données du contexte, et ce, directement dans nos composants. + +```jsx title="C.jsx (ou C.tsx)" +import { useContext } from 'react'; +``` + +Ensuite, on pensera à importer le contexte que l'on souhaite utiliser : + +```jsx title="C.jsx (ou C.tsx)" +import { ThemeContext } from './ThemeContext'; +``` + +Et enfin, on va pouvoir utiliser le hook `useContext` pour récupérer les données du contexte : + +```jsx title="C.jsx (ou C.tsx)" +const C = () => { + const { theme, setTheme } = useContext(ThemeContext); + + return ( + <> + {/** JSX */} + </> + ); +}; +``` + +Pas mal, non ? 😉 +Fini l'arborescence de composants à rallonge, on peut maintenant récupérer les données du contexte directement dans nos composants ! + +## Les défauts des contextes + +Seulement... Un grand pouvoir implique de grandes responsabilités. 🕷️ + +Bien que les contextes soient très pratiques, il faut prendre en compte quelques points : + +- On ne peut pas utiliser les contextes pour tout et n'importe quoi. + Ils sont plutôt adaptés pour diffuser des données qui sont utilisées par plusieurs composants. +- Les contextes peuvent rendre le code plus difficile à comprendre. +- L'utilisation de nombreux contextes va faire apparaître ce qu'on appelle le **context hell**. + +### Le context hell + +Dans cet article, nous avons vu comment créer un contexte et l'utiliser. +Et par chance, nous n'avons pas encore rencontré le **context hell**. + +Mais maintenant, que se passe-t-il si on a besoin de plusieurs contextes _(plusieurs dizaines par exemple !)_ dans notre application ? +On va se retrouver avec une arborescence de composants qui va devenir de plus en plus difficile à comprendre et à maintenir. + +Et c'est ça, le **context hell**. + +<Admonition type="example" title="Exemple de context hell"> + ```jsx title="index.jsx (ou index.tsx)" showLineNumbers + root.render( + <StrictMode> + <UserProvider> + <ThemeProvider> + <LanguageProvider> + <PostProvider> + <SettingsProvider> + <SocketProvider> + <FriendProvider> + <NotificationProvider> + <ChatProvider> + <MusicProvider> + <VideoProvider> + <GameProvider> + <WeatherProvider> + <NewsProvider> + <CalendarProvider> + <TaskProvider> + <NoteProvider> + <App /> + </NoteProvider> + </TaskProvider> + </CalendarProvider> + </NewsProvider> + </WeatherProvider> + </GameProvider> + </VideoProvider> + </MusicProvider> + </ChatProvider> + </NotificationProvider> + </FriendProvider> + </SocketProvider> + </SettingsProvider> + </PostProvider> + </LanguageProvider> + </ThemeProvider> + </UserProvider> + </StrictMode> + ); + ``` + + Maintenant, demande à un développeur d'inverser le provider `UserProvider` avec le provider `NoteProvider`. + C'est jouable sans difficulté, mais si tu entends des cris de désespoir, c'est normal. 😅 +</Admonition> + +Pour éviter de tomber dans le **context hell**, il est important de bien réfléchir à l'utilisation des contextes dans notre application avec ces quelques questions : + +- Est-ce que l'utilisation d'un contexte est vraiment nécessaire pour ce cas d'usage ? +- Est-ce que le contexte est utilisé par plusieurs composants ? +- Est-ce que le contexte est utilisé par des composants éloignés dans l'arborescence ? + +Mais alors, si tu as besoin d'autant de contextes dans ton application, comment faire ? +Et bien, il existe des solutions pour éviter le **context hell** : + +- Utiliser des bibliothèques tierces comme Redux _(solution lourde, mais très puissante)_ +- Créer un nouveau composant qui va regrouper tous les contextes _(solution plus légère, mais plus difficile à maintenir)_ + +N'étant pas un grand fan de Redux, je te conseille plutôt la deuxième solution. +Mais si tu veux en savoir plus sur Redux, n'hésite pas à consulter la [documentation officielle](https://redux.js.org/) ! + +### Résoudre le context hell avec un composant dédié + +Parlons de ce fameux composant qui va regrouper tous les contextes ! +On ne parle pas ici d'un simple composant `Providers` qui va imbriquer tous les `Provider` de nos contextes, mais d'une solution plus élégante. + +Après tout, nous sommes des ~feignants~ développeurs, non ? 😏 + +Réfléchissons à ce que l'on veut faire : + +- On veut pouvoir regrouper tous les contextes dans un seul composant. +- On veut pouvoir ajouter ou supprimer des contextes facilement. +- On veut pouvoir facilement les ordonner entre eux. +- On veut éviter le **context hell**. + +Et si on créait un composant `Providers` qui va nous permettre de faire tout ça ? + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx title="Providers.jsx" showLineNumbers + const Providers = ({ providers, children }) => { + return ( + <> + {/** Ouverture des providers */} + {children} + {/** Fermeture des providers */} + </> + ); + }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx title="Providers.tsx" {8-16} showLineNumbers + import type { ReactNode } from 'react'; + + type ProvidersProps = { + providers: ReactNode[]; + children: ReactNode; + }; + + const Providers = ({ providers, children }: ProvidersProps) => { + return ( + <> + {/** Ouverture des providers */} + {children} + {/** Fermeture des providers */} + </> + ); + }; + ``` + </TabItem> +</Tabs> + +Ici on ne va pas remettre une cascade de `Provider` comme on a pu le voir plus tôt. +On va chercher à créer une fonction qui va nous permettre de les imbriquer les uns dans les autres. + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx + const nest = (children, component) => { + return React.cloneElement(component, {}, children); + }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx + const nest = (children: ReactNode, component: ReactNode) => { + return React.cloneElement(component, {}, children); + }; + ``` + </TabItem> +</Tabs> + +<Admonition type="tip" title="React.cloneElement"> + `React.cloneElement` est une fonction qui va permettre de cloner un élément React en lui passant de nouvelles propriétés. + Cela va nous permettre de créer une nouvelle arborescence de composants sans modifier l'arborescence actuelle. + + Le premier argument est l'élément à cloner _(le composant)_, et le deuxième argument est un objet contenant les nouvelles propriétés. + Le troisième argument est le contenu de l'élément cloné _(les enfants)_. +</Admonition> + +Et maintenant, on va pouvoir utiliser notre fonction `nest` pour imbriquer nos `Provider` en utilisant la méthode `reduceRight` : + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx title="Providers.jsx" showLineNumbers + const nest = (children, component) => { + return React.cloneElement(component, {}, children); + }; + + const Providers = ({ providers, children }) => { + return providers.reduceRight(nest, children); + }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx title="Providers.tsx" showLineNumbers + import type { ReactNode } from 'react'; + + type ProvidersProps = { + providers: ReactNode[]; + children: ReactNode; + }; + + const nest = (children: ReactNode, component: ReactNode) => { + return React.cloneElement(component, {}, children); + }; + + const Providers = ({ providers, children }: ProvidersProps) => { + return providers.reduceRight(nest, children); + }; + ``` + </TabItem> +</Tabs> + + +<Admonition type="tip" title="reduceRight"> + `reduceRight` est une méthode qui va permettre de réduire un tableau _(ou un objet)_ en appliquant une fonction de rappel de droite à gauche. + Cela va nous permettre de réduire un tableau de `Provider` en les imbriquant les uns dans les autres sans se soucier de l'ordre _(qui est défini par le tableau)_. + + Dans l'idée, on commence par le **dernier** élément du tableau, et on l'imbrique avec l'élément **précédent** du tableau et ainsi de suite jusqu'au **premier** élément du tableau. + Chaque itération va créer un nouvel élément imbriqué dans le précédent, en appelant la fonction `nest` qui est passée en argument. + + <details> + <summary>Plus d'informations sur `reduceRight`</summary> + + Ajoutons des logs dans notre fonction `nest` pour mieux comprendre le fonctionnement de `reduceRight` : + + ```jsx + const providers = [<Provider1 />, <Provider2 />, <Provider3 />, <Provider4 />, <Provider5 />]; + + const nest = (children, component) => { + console.log(`Composant à imbriquer : ${children.type.name}. Composant recevant l'imbriquation : ${component.type.name}.`); + return React.cloneElement(component, {}, children); + }; + + const Providers = ({ children }) => { + return providers.reduceRight(nest, children); + }; + + root.render( + <Providers> + <App /> + </Providers> + ); + ``` + + Voici les logs qui vont s'afficher : + ```txt + Composant à imbriquer : App. Composant recevant l'imbriquation : Provider5. + Composant à imbriquer : Provider5. Composant recevant l'imbriquation : Provider4. + Composant à imbriquer : Provider4. Composant recevant l'imbriquation : Provider3. + Composant à imbriquer : Provider3. Composant recevant l'imbriquation : Provider2. + Composant à imbriquer : Provider2. Composant recevant l'imbriquation : Provider1. + ``` + + Le premier `Provider` du tableau _(`<Provider1 />`)_ sera donc le `Provider` le plus "haut" dans l'arborescence, tandis que le dernier _(`<Provider5 />`) sera le plus "bas". + + Nous obtiendrons donc cette arborescence de composants : + ```jsx + <Provider1> + <Provider2> + <Provider3> + <Provider4> + <Provider5> + <App /> + </Provider5> + </Provider4> + </Provider3> + </Provider2> + </Provider1> + ``` + + Pour mieux comprendre le fonctionnement de `reduceRight`, n'hésite pas à consulter la [documentation officielle](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/reduceRight). + </details> +</Admonition> + +Et voilà ! Il ne nous reste plus qu'à utiliser notre composant `Providers` pour regrouper tous nos `Provider` : + +```jsx title="index.jsx (ou index.tsx)" {3-16} showLineNumbers +root.render( + <StrictMode> + <Providers + providers={[ + <UserProvider />, + <ThemeProvider />, + <LanguageProvider />, + <PostProvider />, + <SettingsProvider />, + <SocketProvider />, + <FriendProvider />, + // ... + ]} + > + <App /> + </Providers> + </StrictMode> +); +``` + +Évidemment le fichier contiendra toujours beaucoup de lignes, mais au moins, on a évité le **context hell** ! +Il sera nettement plus facile de modifier l'ordre des `Provider` ou d'en ajouter de nouveaux. + +## Conclusion + +Ça casse un peu la tête, mais les contextes sont un outil très puissant pour diffuser des données dans nos applications React. + +C'est aussi une excellente solution pour éviter d'utiliser des bibliothèques tierces comme Redux +_(qui est très bien, mais qui peut être un peu lourd pour des petites applications)_. + +Et si tu as besoin de plusieurs contextes dans ton application, n'oublie pas de réfléchir à l'utilisation de notre composant `Providers` pour éviter le **context hell**. \ No newline at end of file diff --git a/old/docs/ressources/frontend/react/hooks.mdx b/old/docs/ressources/frontend/react/hooks.mdx new file mode 100644 index 0000000..1ab2e85 --- /dev/null +++ b/old/docs/ressources/frontend/react/hooks.mdx @@ -0,0 +1,382 @@ +--- +sidebar_position: 6 +title: "Les hooks de React" +description: "Découvre les hooks de React, une fonctionnalité qui te permet de gérer le state et le cycle de vie de tes composants fonctionnels." +tags: + - Frontend + - React + - JavaScript/TypeScript + - Bibliothèque + - Interface utilisateur (UI) +--- + +import Button from '@site/src/components/Button'; +import Quiz from '@site/src/components/Quiz'; +import Admonition from '@theme/Admonition'; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; + +# Les hooks de React + +## Introduction + +Ça y est, on rentre dans le vif du sujet avec les **hooks** de React ! + +On en a déjà parlé un peu dans l'article précédent _(notamment avec le hook `useState` pour déclarer un state)_, mais on va maintenant les aborder en détail. + +## 🎣 Qu'est-ce qu'un hook ? + +Tu te souviens du charabia dans l'article précédent ? +> Un **hook** en React est une fonction qui permet d'exploiter les fonctionnalités de React dans un composant fonctionnel _(fonction)_. + +Essayons de comprendre cette phrase un peu plus en détail en prenant l'origine des composants React. + +Historiquement, on utilisait des **classes** pour déclarer des composants React plutôt que des **fonctions**. +C'était pas mal, mais ça devenait vite compliqué à gérer, notamment pour partager de la logique entre plusieurs composants _(comme le state par exemple)_. + +Pour te donner un aperçu, voici à quoi ressemblait un composant de classe avec les trois étapes du cycle de vie : + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx + import React from 'react'; + + class MyComponent extends React.Component { + constructor(props) { + super(props); + this.state = { count: 0 }; + } + + componentDidMount() { + console.log('Component mounted'); + } + + componentDidUpdate() { + console.log('Component updated'); + } + + componentWillUnmount() { + console.log('Component unmounted'); + } + + render() { + return <div>{this.state.count}</div>; + } + } + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx + import React from 'react'; + + type MyComponentState = { + count: number; + }; + + class MyComponent extends React.Component { + constructor(props) { + super(props); + this.state: MyComponentState = { count: 0 }; + } + + componentDidMount() { + console.log('Component mounted'); + } + + componentDidUpdate() { + console.log('Component updated'); + } + + componentWillUnmount() { + console.log('Component unmounted'); + } + + render() { + return <div>{this.state.count}</div>; + } + } + ``` + </TabItem> +</Tabs> + +Comme dirait l'un de mes chers confrères jury : +> C'est pas téros 😕 + +Mais si tu as bien fait attention, tu as pu remarquer trois méthodes _(on ne prend pas le constructor en compte)_ qui sont appelées à des moments précis du cycle de vie du composant : + +- `componentDidMount` : appelée après le premier rendu du composant +- `componentDidUpdate` : appelée après chaque mise à jour du composant +- `componentWillUnmount` : appelée avant la suppression du composant + +Seulement, comment on peut faire pour gérer ces étapes avec des composants fonctionnels ? +Et bien c'est là qu'interviennent les **hooks** ! + +Avant de te montrer **comment** reproduire ces étapes avec des **hooks**, voici les **principaux hooks** de base que tu vas **très souvent** utiliser : + +- `useState` : pour déclarer un **state** +- `useEffect` : pour gérer le **cycle de vie** d'un composant _(on en parle juste après !)_ + +Il en existe d'autres bien entendu, mais ces deux-là sont les plus utilisés. +On reviendra sur les autres hooks "basiques" un peu plus tard 😉 + +## `useEffect`, ou la machinerie du cycle de vie + +Ce hook.. il est **tellement** puissant ! +Mais il est surtout très mal compris par les débutants _(et même parfois par les confirmés)_. + +Il faut dire que Facebook n'a pas aidé en le nommant `useEffect`, surtout que tu vas voir : c'est un couteau suisse ce machin 😅 + +Pour faire court : `useEffect` permet de gérer le cycle de vie d'un composant fonctionnel _(comme `componentDidMount`, `componentDidUpdate` et `componentWillUnmount` pour les composants de classe)_. + +Oui. Il fait tout. Tout seul. +Tu comprends pourquoi je dis "couteau suisse" ? 😏 + +Alors sur le papier c'est top, mais maintenant je te laisse t'amuser à comprendre comment ça fonctionne 😇 + +<Tabs> + <TabItem value="first" label="Écriture #1"> + ```jsx + React.useEffect(() => { + // ... + }, []); + ``` + </TabItem> + + <TabItem value="third" label="Écriture #3"> + ```jsx + React.useEffect(() => { + // ... + }, [props.uneProp]); + ``` + </TabItem> + + <TabItem value="second" label="Écriture #2"> + ```jsx + React.useEffect(() => { + // ... + }); + ``` + </TabItem> +</Tabs> + +Pas cool, hein ? 😂 +Et bien dans ces exemples, on a trois manières d'écrire un `useEffect` : + +1. **Écriture #1** : le hook est exécuté une seule fois, après le premier rendu du composant +2. **Écriture #2** : le hook est exécuté à chaque mise à jour du composant +3. **Écriture #3** : le hook est exécuté à chaque mise à jour du composant, mais seulement si la propriété `uneProp` de `props` a changé + +<Admonition type="info" title="useEffect et les mises à jour du composant"> + Alors quand je dis "le hook est exécuté à chaque mise à jour du composant", il faut également prendre en compte qu'il est également exécuté après le premier rendu du composant. +</Admonition> + +Mais alors, comment on fait pour gérer ces étapes avec des composants fonctionnels ? +Si tu n'as pas vu la différence entre les trois écritures, tu remarqueras que c'est le deuxième argument de `useEffect` qui fait la différence. + +Le premier argument lui, est une fonction **synchrone** _(pas le droit de la rendre asynchrone !)_. +On mettra dedans tout ce qu'on veut exécuter lors de l'appel du hook. + +Le deuxième argument est un tableau de dépendances. +Selon ce tableau, le hook sera exécuté à des moments différents du cycle de vie du composant. + +### ⚙️ ComponentDidMount + +```jsx +React.useEffect(() => { + // ... +}, []); +``` + +Le tableau de dépendances est vide, on sous-entend que le hook ne dépend d'aucune variable et sera exécuté une seule fois. +On peut donc dire que c'est l'équivalent de `componentDidMount` pour les composants de classe. + +### 🔧 ComponentDidUpdate + +```jsx +React.useEffect(() => { + // ... +}); +``` + +Ici, le tableau de dépendances est absent _(et tout va bien, il est optionnel !)_. +Le hook sera exécuté à chaque mise à jour du composant, ainsi que lors du premier rendu. + +```jsx +React.useEffect(() => { + // ... +}, [props.uneProp]); +``` + +Dans ce cas, le tableau de dépendances contient la propriété `uneProp` de `props`. +Le hook sera exécuté à chaque mise à jour du composant _(ainsi qu'au montage)_, mais seulement si la propriété `uneProp` a changé. + +### 🗑️ ComponentWillUnmount + +Et là, tu te dis : "Mais comment je fais pour gérer le démontage du composant ?". +Hehehe, c'est là que ça devient intéressant 😏 + +```jsx +React.useEffect(() => { + return () => { + // ... + }; +}, []); +``` + +Tu as vu ce petit `return` ? Et bien, c'est notre équivalent de `componentWillUnmount` pour les composants de classe ! + +Dans cette fonction de retour, on mettra tout ce qu'on veut exécuter avant la suppression du composant. + +### 📦 Les dépendances + +Tu as pu voir que le deuxième argument de `useEffect` est un tableau de dépendances. +Ce tableau est très important, car il permet de gérer les mises à jour du composant. + +L'idée ici, c'est **d'optimiser** le rendu du composant en évitant de déclencher des mises à jour inutiles. +Pour éviter que React se dise "Tiens, il y a eu un changement, je vais re-rendre le composant", on va lui dire "Non, non, il n'y a pas eu de changement sur la prop que je t'ai fourni, tu peux rester tranquille". + +### 🤓 Exemple concret + +Allez, mettons un peu ce qu'on voit de voir en pratique ! + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx title="Counter.jsx" showLineNumbers + import React from 'react'; + + export const Counter = () => { + const [count, setCount] = React.useState(0); + + React.useEffect(() => { + console.log('Component mounted'); + + return () => { + console.log('Component unmounted'); + }; + }, []); + + React.useEffect(() => { + console.log('Component updated'); + }); + + const increment = () => setCount(count + 1); + + return ( + <button onClick={increment}>{count}</button> + ); + }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx title="Counter.tsx" showLineNumbers + import React from 'react'; + + export const Counter = () => { + const [count, setCount] = React.useState<number>(0); + + React.useEffect(() => { + console.log('Component mounted'); + + return () => { + console.log('Component unmounted'); + }; + }, []); + + React.useEffect(() => { + console.log('Component updated'); + }); + + const increment = () => setCount(count + 1); + + return ( + <button onClick={increment}>{count}</button> + ); + }; + ``` + </TabItem> +</Tabs> + +### 🔢 On revient sur le cycle de vie ! + +Et... stoooop ! +On revient sur le cycle de vie d'un composant maintenant qu'on a vu `useEffect` en action ! + +Je vais te donner un exemple de code supplémentaire et tu vas devoir deviner l'ordre d'apparition des messages dans la console. + +```jsx title="MyComponent.jsx" {5,8,11,16} showLineNumbers +import React from 'react'; + +export const MyComponent = () => { + React.useEffect(() => { + console.log('1'); + }); + + console.log('2'); + + React.useEffect(() => { + console.log('3'); + }, []); + + const logInRender = () => { + console.log('4'); + return null; + }; + + return ( + <div> + {logInRender()} + </div> + ); +}; +``` + +Voici les possibilités : + +<Quiz + question="Dans quel ordre les messages s'affichent-ils dans la console ?" + answers={[ + { label: 'A', value: '4, 2, 1, 3' }, + { label: 'B', value: '2, 4, 1, 3' }, + { label: 'C', value: '1, 2, 3, 4' }, + { label: 'D', value: 'La réponse D' }, + ]} + correctAnswer='B' +> + Assez contre-intuitif, n'est-ce pas ? 😅 + + - `2` est affiché en premier. + - Ce code est exécuté **avant** le rendu du composant _(logique puisqu'on n'a pas encore atteint le `return`, non ?)_. + - `4` est affiché en deuxième. + - Ce code est exécuté **pendant** le rendu du composant _(dans le `return`)_. + - `1` est affiché en troisième. + - Ce code est exécuté **après** le rendu du composant _(dans le premier `useEffect`)_. + - `3` est affiché en dernier. + - Ce code est exécuté **après** le rendu du composant _(dans le deuxième `useEffect`)_. + + <Button href="https://playcode.io/1940712"> + 🕹️ Voir l'exemple sur PlayCode + </Button> +</Quiz> + +## 🧩 Les autres hooks + +On a vu les deux hooks les plus utilisés, mais il en existe d'autres qui peuvent être très utiles dans certaines situations. + +Par exemple, on a : + +- `useContext` : pour accéder à un contexte +- `useReducer` : pour gérer un state complexe +- `useCallback` : pour éviter les re-rendus inutiles +- `useMemo` : pour éviter les calculs inutiles +- `useRef` : pour accéder à un élément du DOM + +Ne t'inquiète pas, on va les voir plus tard car le hook `useEffect` est déjà bien assez complexe à comprendre pour le moment 😅 + +## Conclusion + +Et voilà, tu as maintenant toutes les clés en main pour gérer le cycle de vie de tes composants fonctionnels avec les hooks de React ! + +Vraiment, même si les autres hooks restent importants _(voire obligatoires dans certains contextes)_, +tu as déjà de quoi faire de bons composants avec seulement ces deux là 😁 diff --git a/old/docs/ressources/frontend/react/initialiser-un-projet-react.mdx b/old/docs/ressources/frontend/react/initialiser-un-projet-react.mdx new file mode 100644 index 0000000..22a0ed9 --- /dev/null +++ b/old/docs/ressources/frontend/react/initialiser-un-projet-react.mdx @@ -0,0 +1,288 @@ +--- +sidebar_position: 2 +title: "Initialisation" +description: "Initialisons un nouveau projet React, avec ou sans TypeScript." +tags: + - Frontend + - React + - JavaScript/TypeScript + - Bibliothèque + - Interface utilisateur (UI) + - Vite + - Vike + - SSR + - SSG + - CSR +--- + +import Admonition from '@theme/Admonition'; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; + +# Initialiser un projet React + +## Introduction + +Allez, on se lance dans la création d'un projet React ! 🚀 + +L'article sera très court, car il n'y a pas grand chose à dire sur la création d'un projet React. +Tu vas voir à quel point c'est simple ! + +## 👴 Ancienne méthode _(CRA)_ + +<Admonition type="warning" title="Dépréciation de `create-react-app`"> + Ici on va parler d'une méthode qui est dépréciée. + Ne l'utilise donc **pas** pour créer de nouveaux projets ! +</Admonition> + +Il y a encore quelques mois/années, on passait régulièrement par le CRA, ou `create-react-app`, pour initialiser un projet React. +L'avantage que proposait cette méthode était de nous fournir un projet prêt à l'emploi, avec une structure de fichiers déjà en place, et des dépendances déjà installées. + +Cependant, cette méthode est désormais dépréciée. Au delà d'être dépréciée, cette méthode a même été **totalement** retirée de la nouvelle documentation officielle de React. + +À la place, la documentation nous propose plutôt d'utiliser : + +- [Next.js](https://react.dev/learn/start-a-new-react-project#nextjs-pages-router) +- [Remix](https://react.dev/learn/start-a-new-react-project#remix) +- [Gatsby](https://react.dev/learn/start-a-new-react-project#gatsby) +- [Expo _(pour les applications natives iOS, Android et web)_](https://react.dev/learn/start-a-new-react-project#expo) + +Mais dans cet article, je vais plutôt te montrer comment initialiser un projet React avec `Vite` et par la suite : [**Vike**](https://vike.dev/). + +Et si tu te demandes "pourquoi" _(à juste titre !)_, c'est tout simplement car il s'agit d'une solution plus légère, plus flexible et qui est en constante amélioration par la communauté ! + +## 🏃 Vite + +Vite est un outil de développement web _(frontend)_ créé par [**Evan You**](https://evanyou.me/), le créateur de Vue.js. +Et si tu connais Vue.js, tu sais déjà qu'on parle d'un outil de qualité ! + +L'objectif principal derrière Vite, c'est d'améliorer considérablement la rapidité de développement de nos applications web, avec notamment un serveur de développement ultra-rapide, et une compilation de production optimisée. + +On peut notamment comparer Vite à Webpack, Grunt ou encore Gulp, mais en beaucoup plus rapide et plus simple à utiliser. +Beaucoup moins "usine à gaz", beaucoup plus "plug-and-play". + +Et si on voyait comment initialiser un projet React avec Vite ? +C'est parti ! 🚀 + +### 👷 Initialisation + +Avant de commencer, assure-toi d'avoir Node.js installé sur ta machine. +Si ce n'est pas le cas, tu peux le télécharger [ici](https://nodejs.org/). + +Prépare toi maintenant pour la partie la plus difficile de cet article... +Ouvre ton terminal, et tape la commande suivante : + +<Tabs> + <TabItem value="npm" label="NPM"> + ```bash + npm init vite + ``` + </TabItem> + + <TabItem value="yarn" label="Yarn"> + ```bash + yarn create vite + ``` + </TabItem> + + <TabItem value="pnpm" label="PNPM"> + ```bash + pnpm create vite + ``` + </TabItem> +</Tabs> + +Tu vas ensuite devoir répondre à quelques questions, notamment le nom de ton projet, le template que tu souhaites utiliser _(React, Vue, Vanilla, etc.)_, et si tu souhaites utiliser TypeScript. + +Je te laisse la liberté de répondre comme tu veux à ces questions, mais pour un projet React, tu vas devoir choisir le template `react` _(logique non ?)_. + +Et voilà, c'est tout ! +... oui j'ai menti, c'était vraiment pas difficile. 😅 + +### 🚀 Lancement + +Une fois que tu as répondu à toutes les questions, tu vas devoir te rendre dans le dossier de ton projet, et lancer le serveur de développement : + +<Tabs> + <TabItem value="npm" label="NPM"> + ```bash + cd mon-projet # Se rendre dans le dossier du projet + npm install # Installer les dépendances + npm run dev # Lancer le serveur de développement + ``` + </TabItem> + + <TabItem value="yarn" label="Yarn"> + ```bash + cd mon-projet # Se rendre dans le dossier du projet + yarn install # Installer les dépendances + yarn dev # Lancer le serveur de développement + ``` + </TabItem> + + <TabItem value="pnpm" label="PNPM"> + ```bash + cd mon-projet # Se rendre dans le dossier du projet + pnpm install # Installer les dépendances + pnpm dev # Lancer le serveur de développement + ``` + </TabItem> +</Tabs> + +<Admonition type="warning" title="Dépendances"> + Pense à installer les dépendances de ton projet avant de lancer le moindre script _(comme `dev`, `build` etc)_, sinon ça ne va pas très bien se passer ! +</Admonition> + +Tu auras ensuite un message dans ton terminal qui t'indiquera l'adresse à laquelle tu pourras accéder à ton application. +En général, il s'agit de `http://localhost:3000` _(le port peut varier)_. + +Et voilà, tu as maintenant un projet React initialisé avec Vite ! 🎉 + +Par contre je préfère te prévenir, avec cette solution on va davantage s'orienter sur des applications **CSR** _(Client-Side Rendering)_, mais on pourra également voir comment faire du **SSR** _(Server-Side Rendering)_ ou du **SSG** _(Static Site Generation)_ avec Vike. + +## 💪 Vike + +**Vike**, ou anciennement **vite-plugin-ssr**, est un **framework** basé sur Vite qui va nous permettre de créer des applications web avec presque n'importe quelle bibliothèque _(React, Vue, Svelte, etc.)_. + +Dans notre cas, on s'en servira comme alternative au géant du SSR React : Next.js. + +L'énorme avantage de Vike au delà de pouvoir utiliser n'importe quel framework/bibliothèque UI _(et même un framework maison ou du vanilla JS !)_, c'est que tout comme Vite, il est **extrêmement plus léger** et **flexible**. + +Au niveau des fonctionnalités natives, on va retrouver un peu la même chose que Next.js, avec notamment : + +- De quoi gérer le rendu à effectuer _(SSR, SSG, CSR)_ +- Un système de layouts +- Un système de routage +- Un système pour séparer la logique front et la logique back + +Et bien d'autres ! + +Maintenant, si on voyait comment initialiser un projet React avec Vike ? 😉 + +### 👷 Initialisation + +Pour initialiser un projet React avec Vike, c'est très similaire à Vite ! + +Tu vas devoir ouvrir ton terminal, et taper la commande suivante : + +<Tabs> + <TabItem value="npm" label="NPM"> + ```bash + npm create vike@latest + ``` + </TabItem> + + <TabItem value="yarn" label="Yarn"> + ```bash + yarn create vike + ``` + </TabItem> + + <TabItem value="pnpm" label="PNPM"> + ```bash + pnpm create vike + ``` + </TabItem> +</Tabs> + +Et là, comme avec Vite : ton nouveau projet vient d'être créé ! 🎉 + +Mais si je te disais qu'on peut aller encore plus loin dans cette initialisation ? +Comme rajouter des choses précises comme... + +<Tabs> + <TabItem value="framework" label="Framework/Bibliothèque UI"> + **Choix unique** : + + - [React](https://fr.react.dev/) + - [Vue](https://vuejs.org/) + - [SolidJS](https://www.solidjs.com/) + </TabItem> + + <TabItem value="css" label="CSS"> + **Choix unique** : + + - [Tailwind CSS](https://tailwindcss.com/) + - [daisyUI](https://daisyui.com/) + - [Compiled](https://compiledcssinjs.com/) _(uniquement pour React)_ + </TabItem> + + <TabItem value="hosting" label="Hébergement"> + **Choix unique** : + + - [Cloudflare](https://www.cloudflare.com/) + - [Vercel](https://vercel.com/) + - [Netlify](https://www.netlify.com/) _(indisponible à l'heure actuelle - 16/07/2024)_ + </TabItem> + + <TabItem value="auth" label="Authentification"> + **Choix unique** : + + - [Auth.js](https://authjs.dev/) + - [Auth0](https://auth0.com/) + - [Firebase](https://firebase.google.com/) + </TabItem> + + <TabItem value="data-fetching" label="Data fetching"> + **Choix unique** : + + - [Telefunc](https://telefunc.com/) + - [tRPC](https://trpc.io/) + - [ts-rest](https://ts-rest.com/) + </TabItem> + + <TabItem value="server" label="Framework Node.js"> + **Choix unique** : + + - [Hono](https://hono.dev/) + - [h3](https://h3.unjs.io/) + - [Express](https://expressjs.com/) + - [Fastify](https://www.fastify.io/) + - [HatTip](https://hattipjs.org/) + </TabItem> + + <TabItem value="db" label="Base de données"> + **Choix unique** : + + - [Prisma](https://www.prisma.io/) + - [EdgeDB](https://edgedb.com/) + - [Drizzle](https://orm.drizzle.team/) + </TabItem> + + <TabItem value="linter" label="Linters/formatters"> + **Choix multiple** : + + - [ESLint](https://eslint.org/) + - [Prettier](https://prettier.io/) + - [Biome](https://biomejs.dev/) + </TabItem> + + <TabItem value="analytics" label="Analytics"> + **Choix unique** : + + - [Plausible.io](https://plausible.io/) + - [Google Analytics](https://analytics.google.com/) + - [Segment](https://segment.com/) _(indisponible à l'heure actuelle - 16/07/2024)_ + </TabItem> + + <TabItem value="error-tracking" label="Error tracking"> + **Choix indisponibles à l'heure actuelle** _(16/07/2024)_ : + + - [Sentry](https://sentry.io/) + - [Logrocket](https://logrocket.com/) + </TabItem> +</Tabs> + +C'est fou non, surtout pour **une seule commande** ?! 😱 +Et bien c'est totalement possible grâce à [**Bâti**](https://batijs.dev/) qui est un super outil pour initialiser des projets web avec Vike, créé par [**Joël Charles** _(magne4000)_](https://github.com/magne4000) ! + +Si jamais tu veux voir un peu plus comment ça fonctionne, je t'invite fortement à consulter l'outil en question [juste ici](https://batijs.dev/). + +Pour le lancement de ton projet, c'est exactement la même chose que pour Vite. +N'hésite donc pas à te référer à la section précédente pour voir comment lancer ton serveur de développement 😉 + +## Conclusion + +Tu l'auras remarqué, initialiser un projet React avec Vite ou Vike est vraiment très simple ! + +On parle ici d'une simple petite commande et de questions auxquelles répondre, et le tour est joué 🚀 diff --git a/old/docs/ressources/frontend/react/intro.mdx b/old/docs/ressources/frontend/react/intro.mdx new file mode 100644 index 0000000..a2478a9 --- /dev/null +++ b/old/docs/ressources/frontend/react/intro.mdx @@ -0,0 +1,246 @@ +--- +sidebar_position: 1 +title: "Introduction à React" +description: "Parlons un peu de React, ce qu'il est, ce qu'il fait et pourquoi il est si populaire." +tags: + - Frontend + - React + - JavaScript/TypeScript + - Bibliothèque + - Interface utilisateur (UI) +--- + +import Admonition from '@theme/Admonition'; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; + +# Introduction à React + +## Introduction + +Parlons peu, parlons bien ! 😄 + +React est une **bibliothèque** _(non, pas un **framework** !)_ JavaScript open-source développée par Facebook. +Elle est utilisée pour construire des interfaces utilisateur _(UI)_ interactives et dynamiques. + +<Admonition type="quote" title="Pourquoi React est si populaire ?"> + - **Facilité d'utilisation** : React est facile à apprendre et à utiliser. Il est basé sur JavaScript, qui est l'un des langages de programmation les plus populaires. + - **Réutilisabilité des composants** : React permet de créer des composants réutilisables. Cela signifie que tu peux créer un composant une fois et l'utiliser partout où tu en as besoin. + - **Performances** : React utilise un DOM virtuel _(Virtual DOM)_ pour améliorer les performances de l'application. + - **Communauté active** : React a une communauté active de développeurs qui contribuent à son développement et partagent des ressources utiles. +</Admonition> + +Mais on peut aussi y noter des points faibles bien entendu, car tout n'est pas rose : + +- **Courbe d'apprentissage** : Bien que React soit "facile" à apprendre, les concepts avancés demandent un peu de temps pour être maîtrisés. +- **Taille du bundle** : React est relativement lourd en termes de taille de bundle, ce qui peut affecter les performances de l'application en terme de chargement initial. +- **GAFAM** : Comme d'autres bibliothèques/frameworks, React n'échappe pas à la critique de la part de certains développeurs qui ne souhaitent pas utiliser des technologies développées par des géants du web. + +## 🤔 Pourquoi une bibliothèque et pas un framework ? + +Très grand débat que voilà ! Vraiment.. il y a des guerres qui se sont déclarées pour moins que ça 😅 + +Blague à part, pour pouvoir dire que React n'est pas un framework, il faut comprendre la différence entre les deux : + +- **Framework** : Un framework est un ensemble de bibliothèques et de composants qui sont prédéfinis et structurés pour te permettre de construire une application. + En gros, le framework te dit comment faire les choses. +- **Bibliothèque** : Une bibliothèque est un ensemble de fonctions et de composants que tu peux utiliser pour construire une application. + En gros, c'est toi qui décides comment faire les choses. + +Et si tu connais déjà React, je te vois venir avec tes grands sabots... ! + +<Admonition type="quote" title="React a ses propres règles, on ne peut pas faire n'importe quoi !"> + C'est vrai ! React a ses propres règles et conventions, mais il te laisse quand même une grande liberté pour organiser ton code comme tu le souhaites. + + Si on se concentre sur la **préoccupation principale** de React, c'est de gérer l'**interface utilisateur** _(UI)_ de ton application. + En aucun cas, React _(tel quel et "pour le moment")_ va te dire comment gérer ton état global, comment gérer tes requêtes HTTP, etc. + + Mais tu peux totalement utiliser React **au sein** d'un framework ! + Tu as notamment des frameworks comme [**Next.js**](https://nextjs.org/) ou [**Gatsby**](https://www.gatsbyjs.com/) qui utilisent React + avec des fonctionnalités supplémentaires pour gérer le routage, le rendu côté serveur, etc. + + _(Le meilleur, selon moi, c'est [**Vike**](https://vike.dev/) qui te permet d'utiliser presque n'importe quelle bibliothèque avec une même architecture 😏)_ + + Mais concentrons-nous sur React en tant que bibliothèque, et non en tant que framework 😉 +</Admonition> + +## 📝 JSX + +Ce qui peut être déroutant au premier abord avec React, c'est le **JSX**. +On serait tenté de dire que c'est du HTML, mais en fait : **pas du tout** ! + +Le JSX est un sucre syntaxique _(syntactic sugar)_ qui permet d'écrire du code JavaScript en se basant sur le système de balisage HTML. + +L'avantage de JSX c'est que le code devient beaucoup plus lisible et plus proche de ce que tu connais déjà avec HTML. +Mais il s'agit bien de JavaScript, et non de HTML ! + +## 🧩 Composants + +React est basé sur le concept de **composants**. Un composant est une partie réutilisable de l'interface utilisateur _(UI)_ qui peut être affichée à l'écran. + +Dans la majorité des cas, on va chercher à **mutualiser** les composants pour éviter de répéter du code inutilement. +L'exemple le plus flagrant sera par exemple tous les boutons de ton application, qui auront probablement tous la même apparence et le même comportement. + +Il est aussi possible de les **imbriquer** les uns dans les autres ! +En fait, on joue avec des Lego, mais en version code 👷 + +Mais si on veut vraiment montrer le potentiel de React, parlons maintenant... 🥁 +Des **states**, **cycles de vie** et des **props** ! + +## 🛠️ States, Cycles de vie et Props + +T'assomer aussi vite avec ces termes qui ne te parlent peut-être pas, c'est pas cool de ma part... +Pardon pour les gros mots, je me calme tout de suite ! 🙈 + +Si ça te rassure, je vais très rapidement évoquer ce qu'il se cache derrière ces termes barbares, +je réserve les détails pour des articles dédiés 😉 + +### 🗄️ States + +... ou également appelés **états** en français. + +Le but du state, c'est de stocker des données qui vont être **observées** par React. +À chaque fois que le state va être modifié, React va **réagir** et mettre à jour l'interface utilisateur _(UI)_ en conséquence afin d'afficher les nouvelles données. + +### 🔄 Cycles de vie + +Les **cycles de vie** _(lifecycle)_ sont des méthodes qui sont appelées à des moments précis dans le cycle de vie d'un composant React. + +Si tu as lu la section qui parle brièvement des states, tu auras peut-être remarqué cette phrase : +> À chaque fois que le state va être modifié, React va **réagir** et mettre à jour l'interface utilisateur [...] + +Et bien c'est là que les cycles de vie entrent en jeu ! +Un composant sur React va avoir un cycle de vie, caractérisé par trois phases : + +1. **Montage du composant** _(Mounting)_ : le composant est créé et inséré dans le DOM. +2. **Mise à jour du composant** _(Updating)_ : le composant est mis à jour en fonction des changements de state ou de props. +3. **Démontage du composant** _(Unmounting)_ : le composant est retiré du DOM. + +Ces différentes phases vont nous permettre d'interagir avec le composant à des moments précis, et d'effectuer des actions en conséquence. + +### 📦 Props + +Et pour finir, les **props** _(properties ou tout simplement "propriétés" en français)_ ! + +Il s'agit ni plus ni moins que des **arguments** que tu vas passer à un composant, comme tu le ferais avec une fonction. + +Cependant il faut noter une chose : + +On transmet les props à un composant précis, qui sera donc un composant **enfant**. +Un composant enfant ne pourra pas transmettre des props à un composant parent, c'est unidirectionnel _(mais on verra comment on peut faire autrement 😉)_. + +## 🖥️ Une petite démo ? + +OK, mais vraiment petite ! + +Prenons l'exemple d'une application qui servira **uniquement** à afficher une liste de tâches _(une todolist donc !)_. +_(Bon... utiliser React uniquement pour ça c'est abusé, mais c'est pour l'exemple 😅)_ + +<Tabs> + <TabItem value="demo-app" label="App.tsx"> + ```tsx showLineNumbers + import TodoList from './TodoList'; + import React from 'react'; + + const App = () => { + return ( + <div> + <h1>TodoList</h1> + + <TodoList /> + </div> + ); + }; + ``` + </TabItem> + + <TabItem value="demo-todolist" label="TodoList.tsx"> + ```tsx showLineNumbers + import TodoListItem from './TodoListItem'; + import React from 'react'; + + const TodoList = () => { + const [items, setItems] = React.useState<string[]>([]); + const [inputValue, setInputValue] = React.useState<string>(""); + + const handleInputValueChange = (event: React.ChangeEvent<HTMLInputElement>) => { + setInputValue(event.target.value); + }; + + const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => { + // On empêche le comportement par défaut du formulaire + event.preventDefault(); + + // On ajoute un nouvel élément à la liste des tâches + setItems([...items, inputValue]); + + // On réinitialise la valeur de l'input + setInputValue(""); + }; + + return ( + <div> + <form onSubmit={handleSubmit}> + <label htmlFor="todolist-input"> + </label> + + <input + id="todolist-input" + type="text" + value={inputValue} + onChange={handleInputValueChange} + /> + </form> + + <ul> + {items.map((item, index) => ( + <li key={index}> + <TodoListItem item={item} /> + </li> + ))} + </ul> + </div> + ); + }; + + export default TodoList; + ``` + </TabItem> + + <TabItem value="demo-todolistitem" label="TodoListItem.tsx"> + ```tsx showLineNumbers + import React from 'react'; + + interface TodoListItemProps { + item: string; + } + + const TodoListItem = (props: TodoListItemProps) => { + return <span>{props.item}</span>; + }; + + export default TodoListItem; + ``` + </TabItem> +</Tabs> + +On peut très bien imaginer des améliorations à cette application, comme par exemple : + +- Supprimer une tâche +- Réinitialiser la liste des tâches +- Marquer une tâche comme terminée _(et inversement)_ +- Ordonner les tâches pour afficher en priorité les tâches non terminées +- Enregistrer les tâches dans le navigateur pour les retrouver après un rafraîchissement de la page + +Et si on se gardait ça pour la suite ? 😉 + +## Conclusion + +Tu l'auras compris, React permet de résoudre un certain nombre de problématiques que l'on peut rencontrer lors du développement d'une application web. + +Pas des problématiques majeures, mais ça nous permet tout de même en tant que développeur de gagner du temps et de l'efficacité ! + +Dans le cas où le fait que ce soit créé et maintenu par Facebook _(ou GAFAM de manière générale)_ est contre tes valeurs, +tu as des solutions très semblables qui existent, comme [**SolidJS**](https://www.solidjs.com/) par exemple. + +Et si tu veux en savoir plus, je t'invite à lire les articles suivants qui vont te permettre de rentrer un peu plus dans le détail de React ! 🚀 \ No newline at end of file diff --git a/old/docs/ressources/frontend/react/premier-composant.mdx b/old/docs/ressources/frontend/react/premier-composant.mdx new file mode 100644 index 0000000..23677ae --- /dev/null +++ b/old/docs/ressources/frontend/react/premier-composant.mdx @@ -0,0 +1,240 @@ +--- +sidebar_position: 4 +title: "Premier composant" +description: "Voyons ensemble comment notre premier composant React !" +tags: + - Frontend + - React + - JavaScript/TypeScript + - Bibliothèque + - Interface utilisateur (UI) +--- + +import Admonition from '@theme/Admonition'; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; + +# Premier composant React + +## Introduction + +Rentrons maintenant dans le vif du sujet en créant notre premier composant React ! +Dans cet article, on va faire un composant très simple : un **dumb component** qui sera tout simplement un bouton. + +<Admonition type="quote" title="Un... dumb component ?"> + Un **dumb component** est un composant React qui ne contient pas de logique. + Enfin si, il peut en contenir _(mais rien de foufou)_, son rôle est de simplement afficher des données. + + En gros : + - Il ne fait que de l'affichage + - Il ne fait pas de calculs + - Il ne fait pas de requêtes HTTP +</Admonition> + +## ⚙️ Syntaxes pour créer un composant + +Il existe plusieurs façons de créer un composant React. + +La plus simple est de créer une fonction qui retourne du JSX, mais il est aussi possible de créer une classe qui étend `React.Component`. + +Cependant, on ne va pas s'attarder sur la déclaration de composants dans des classes. + +Pourquoi ? Déjà parce que la [documentation officielle](https://react.dev/reference/react/Component) recommande désormais de définir des composants en tant que fonctions, mais surtout parce que c'est plus simple et plus lisible ! 🚀 + +## 👷 Création du composant + +Allez c'est parti, occupons-nous de notre premier composant React ! + +```jsx title="Button.jsx" showLineNumbers +import React from 'react'; + +export const Button = () => { + return <button>Click me</button>; +}; +``` + +... et c'est tout ! 🎉 +On a créé notre premier composant React, c'est pas beau ça ? + +Bon évidemment, il reste extrêmement sommaire et n'a pas d'intérêt à l'heure actuelle, mais c'est un bon début ! + +Avant d'aller plus loin, décortiquons un peu ce code : + +- On importe `React` depuis la librairie React _(ligne 1)_ +- On crée une fonction fléchée `Button` _(lignes 3 à 5)_ + - Cette fonction retourne un élément JSX `<button>Click me</button>` + +## 🧩 Utilisation du composant + +C'est bien beau d'avoir un composant, mais maintenant il faut l'utiliser ! + +```jsx title="App.jsx" {3,9} showLineNumbers +import React from 'react'; + +import { Button } from './Button'; + +export const App = () => { + return ( + <div> + <h1>Mon premier composant React</h1> + <Button /> + </div> + ); +}; +``` + +On importe notre composant `Button` _(ligne 3)_ et on l'utilise dans notre composant `App` _(ligne 9)_. + +Rien de bien sorcier, n'est-ce pas ? 😊 + +Mais maintenant, on va vouloir donner un peu plus de vie à notre bouton... +Parce que là pour le coup, il est inutile. 😅 + +## 📦 Props + +Les **props** _(pour properties)_ sont des arguments que l'on peut passer à un composant React. +Il s'agit en quelque sorte des paramètres d'une fonction. + +Imaginons ici que l'on veut rajouter : + +- Un texte au bouton +- Une action à effectuer lorsqu'on clique dessus + +Avant de t'expliquer **comment** faire, je vais te montrer **ce que** ça donne pour son utilisation : + +```jsx title="App.jsx" {3,6,11-13} showLineNumbers +import React from 'react'; + +import { Button } from './Button'; + +export const App = () => { + const handleClick = () => console.log('Je suis cliqué !'); + + return ( + <div> + <h1>Mon premier composant React</h1> + <Button onClick={handleClick}> + Clique-moi ! + </Button> + </div> + ); +}; +``` + +Voyons un peu ce qui change ! + +- Fonction `handleClick` qui affiche un message dans la console _(ligne 6)_ +- On passe la fonction `handleClick` en tant que prop `onClick` à notre composant `Button` _(ligne 11)_ +- On passe le texte `Clique-moi !` entre la balise ouvrante et fermante de notre composant `Button` _(ligne 12)_ + +Mais alors, comment on fait pour récupérer ces props dans notre composant `Button` ? + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx title="Button.jsx" showLineNumbers + import React from 'react'; + + export const Button = (props) => { + return <button onClick={props.onClick}>{props.children}</button>; + }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx title="Button.tsx" showLineNumbers + import React from 'react'; + + type ButtonProps = { + onClick: () => void; + children: React.ReactNode; + }; + + export const Button = (props: ButtonProps) => { + return <button onClick={props.onClick}>{props.children}</button>; + }; + ``` + </TabItem> +</Tabs> + +Comme tu peux voir, on récupère les props passées à notre composant `Button` en tant que paramètre de la fonction. + +Mais tu peux également remarquer qu'il y a une propriété `children` qui n'est pas passée de la même manière que `onClick`. + +C'est totalement normal ! `children` est une prop spéciale qui contient tout ce qui se trouve entre les balises ouvrante et fermante du composant. + +<Admonition type="quote" title="Le JavaScript inline, c'est pas bien !"> + Tu as totalement raison ! On recommande effectivement de ne pas faire du JS inline dans notre HTML et de privilégier un fichier distinct pour notre JavaScript. + Et donc tu sais déjà qu'on va préférer l'utilisation des `addEventListener` 😏 + + ... cependant ici, **on ne fait pas du HTML** mais du JSX, et c'est une autre histoire ! +</Admonition> + +## 🖇️ Les différentes props + +Il existe plusieurs props que l'on peut passer à un composant React : + +- `children` : Contient tout ce qui se trouve entre les balises ouvrante et fermante du composant +- les autres props : Tout ce qui est passé en dehors des balises ouvrante et fermante du composant + +Alors évidemment, cette explication est très réductrice, mais on va s'en contenter pour le moment. + +Mais tu te doutes bien qu'il existe des props spécifiques à certains éléments HTML qui peuvent être passées à un composant React. + +### 🔒 Mots clés protégés + +En HTML, il existe des attributs qui sont utilisés dans certains éléments HTML. Cependant, comme ici on ne fait pas du HTML mais du JSX, on ne va pas pouvoir les utiliser tels quels. + +Pour te donner un exemple concret, si tu veux ajouter une classe CSS à un élément, tu ne pourras pas utiliser l'attribut `class` mais `className`. + +Mais alors, pourquoi ? + +Comme le JSX reste avant tout du JavaScript, on ne peut pas utiliser des mots-clés réservés comme `class`, `for`, `default`, etc. + +<details> + <summary>Plus d'informations sur les mots-clés protégés</summary> + + React comprendra ces mots clés au sein des composants, cependant il va générer un avertissement dans la console du navigateur pour te prévenir que tu utilises un mot-clé protégé qui est "ambigu". + + Cependant, certaines bibliothèques qui utilisent le JSX, comme [SolidJS](https://www.solidjs.com/) par exemple, utilisent ces mots-clés protégés au sein des composants. Ca ne veut pas dire que c'est "bien" ou "pas bien", mais qu'il faut être conscient de ce que l'on fait et de comment est interprété notre code par la bibliothèque 😉 +</details> + +On va donc utiliser des noms d'attributs qui sont similaires à ceux du HTML, mais qui sont adaptés pour le JSX. + +- `class` devient `className` _(pour les classes CSS)_ +- `for` devient `htmlFor` _(pour les labels)_ +- `default` devient `defaultValue` _(pour les champs de formulaire)_ + +Et il en existe bien d'autres, mais on va s'arrêter là pour le moment ! 😊 + +### 👂 Écouteurs d'événements + +Il existe également des attributs spécifiques pour les écouteurs d'événements. +Tu as notamment pu déjà faire la rencontre de `onClick`, mais il en existe bien d'autres ! + +Il s'agit de la syntaxe à adopter avec React pour ajouter des écouteurs d'événements à des composants JSX, et non pas d'utiliser `addEventListener` directement dans le JavaScript 😉 + +J'aimerai beaucoup pouvoir te donner une liste d'exemples d'écouteurs d'événements, mais il y en a tellement que je ne pourrais pas tous les citer ici. +La forme étant toujours la même, tu peux facilement savoir comment les écrire ! + +La forme est simple : +- Préfixe : `on` +- Événement : nom de l'événement en camelCase + +Par exemple : +- `click` => `onClick` +- `change` => `onChange` +- `submit` => `onSubmit` +- `mouseenter` => `onMouseEnter` +- `mouseleave` => `onMouseLeave` + +Et si tu cherches une liste complète des écouteurs d'événements, je t'invite à tout simplement consulter le [MDN Web Docs](https://developer.mozilla.org/fr/docs/Web/Events) qui est une mine d'or pour tout ce qui est lié au développement web ! + +Au début, on peut trouver ça un peu déroutant puisqu'on va naturellement les associer à du HTML, mais il faut se rappeler qu'on est dans du JSX _(oui, j'insiste beaucoup là-dessus !)_. + +## Conclusion + +Et voilà, on a créé notre premier composant React ! +On a même rapidement vu comment passer des props à un composant et comment les récupérer. + +Et si pour le prochain article, on parle un peu des states pour rajouter un peu d'intéractivité à nos composants ? +Parce que c'est déjà cool ce qu'on a pu faire, mais on peut faire tellement plus avec React ! 🚀 diff --git a/old/docs/ressources/frontend/react/reducers.mdx b/old/docs/ressources/frontend/react/reducers.mdx new file mode 100644 index 0000000..02e4dc8 --- /dev/null +++ b/old/docs/ressources/frontend/react/reducers.mdx @@ -0,0 +1,596 @@ +--- +sidebar_position: 8 +title: "Le hook useReducer de React" +description: "Découvrez comment utiliser le hook useReducer de React pour gérer l'état de vos composants de manière plus efficace." +tags: + - Frontend + - React + - JavaScript/TypeScript + - Bibliothèque + - Interface utilisateur (UI) +--- + +import Button from '@site/src/components/Button'; +import Quiz from '@site/src/components/Quiz'; +import Admonition from '@theme/Admonition'; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; + +# L'utilisation des reducers avec React + +## Introduction + +Si tu as lu les précédentes pages concernant les hooks de React _(`useState`, `useEffect` et `useContext`)_, tu as déjà une bonne vision de la manière dont tu peux concevoir une application React. + +Mais si je te dis que tu peux aller encore plus loin avec `useReducer` pour la gestion des états, est-ce que tu serais intéressé·e ? 🤔 + +<Admonition type="quote" title="Pourquoi ? useState ne suffit pas ?"> + Le hook `useState` est génial et essentiel pour gérer l'état local d'un composant, mais il n'est pas adapté pour des états dits "complexes" ou pour des états qui dépendent les uns des autres. +</Admonition> + +## Qu'est-ce que le hook `useReducer` ? + +Le hook `useReducer` est une alternative à `useState` qui est plus adaptée pour gérer des états complexes ou des états qui dépendent les uns des autres. + +Il est basé sur le concept de [**reducers**](https://redux.js.org/tutorials/fundamentals/part-3-state-actions-reducers) que l'on retrouve dans la [bibliothèque Redux](https://redux.js.org). + +Un reducer est une fonction qui prend en paramètre un état et une action, et qui retourne un nouvel état. Il permet un découpage plus fin de la logique de gestion de l'état. + +Mais avant de rentrer dans les détails, donnons des exemples de quand utiliser `useReducer` ou `useState` ! + +### Quand utiliser `useState` ? + +Si tu dois stocker un état simple, comme un booléen, un nombre ou une chaîne de caractères, alors `useState` est parfait pour cela. + +Ne te casse donc pas la tête à remplacer tous tes `useState` par des `useReducer` si tu n'en as pas besoin. 😅 + +### Quand utiliser `useReducer` ? + +Dès que l'on a des états complexes ou des états qui dépendent les uns des autres, il est recommandé d'utiliser `useReducer`. + +Par exemple, si tu as un formulaire avec plusieurs champs, et que tu veux gérer l'état de chaque champ de manière indépendante, alors `useReducer` est une bonne solution. + +Ça te permettra d'éviter de créer des tonnes de `useState` et/ou handlers pour chaque champ du formulaire. + +Mais `useReducer` n'est pas seulement utile pour les formulaires, il peut être utilisé dans de nombreux cas, comme la gestion d'un panier d'achat, la gestion d'une ressource, etc. + +## À quoi ressemble un reducer ? + +Comme expliqué plus tôt, un reducer est une fonction qui prend en paramètre un état et une action, et qui retourne un nouvel état. + +Parlons dans un premier temps de la signature d'un reducer : + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx + const reducer = (state, action) => { + switch (action.type) { + case 'TYPE_1': + return { ...state, /* Nouvel état */ }; + case 'TYPE_2': + return { ...state, /* Nouvel état */ }; + default: + return state; + } + }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```jsx + const reducer = (state: State, action: Action) => { + switch (action.type) { + case 'TYPE_1': + return { ...state, /* Nouvel état */ }; + case 'TYPE_2': + return { ...state, /* Nouvel état */ }; + default: + return state; + } + }; + ``` + </TabItem> +</Tabs> + +Comme tu peux le voir, on récupère bien deux paramètres : `state` et `action`. + +Le `state` est l'état actuel du composant, et l'`action` est un objet qui contient un type et d'autres propriétés. + +En fonction du type de l'action, on retourne un nouvel état. +Par défaut _(c'est-à-dire si le type de l'action n'est pas reconnu)_, on retourne l'état actuel sans l'altérer. + +Dans le reducer, il est strictement impossible d'altérer l'état actuel directement. +L'état est contraint au principe d'**immutabilité**. + +On fera donc des `return` de l'état actuel avec les modifications nécessaires. + +<Admonition type="quote" title="Pourquoi déverser le contenu de l'état actuel ?"> + Si on ne déverse pas le contenu de l'état actuel, on perdrait les propriétés qui ne sont pas modifiées par l'action. + + En déversant le contenu de l'état actuel, on s'assure de ne pas perdre ces propriétés. + + Par exemple : + ```jsx + const initialState = { count: 0, message: 'Hello' }; + + const reducer = (state, action) => { + switch (action.type) { + case 'INCREMENT': + return { count: state.count + 1 }; + default: + return state; + } + }; + ``` + + On perdrait ici la propriété `message` si on ne la déversait pas dans le nouvel état. +</Admonition> + +## Comment utiliser `useReducer` ? + +Maintenant que tu as une idée de ce qu'est un reducer, voyons comment l'utiliser avec le hook `useReducer` au sein d'une application React ! 🚀 + +Naturellement, on va commencer par importer le hook `useReducer` : + +```jsx +import { useReducer } from 'react'; +``` + +Ensuite, on va définir notre état initial : + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx + const initialState = { count: 0 }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx + type State = { + count: number; + }; + + const initialState: State = { + count: 0, + }; + ``` + </TabItem> +</Tabs> + +On peut maintenant définir notre reducer : + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx + const reducer = (state, action) => { + switch (action.type) { + case "INCREMENT": + return { ...state, count: state.count + 1 }; + case "DECREMENT": + return { ...state, count: state.count - 1 }; + case "RESET": + return { ...state, count: 0 }; + case "SET": + return { ...state, count: action.payload }; + default: + return state; + } + }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx + type State = { + count: number; + }; + + type Action = { + type: "INCREMENT" | "DECREMENT" | "RESET" | "SET"; + payload?: number; + }; + + const reducer = (state: State, action: Action) => { + switch (action.type) { + case "INCREMENT": + return { ...state, count: state.count + 1 }; + case "DECREMENT": + return { ...state, count: state.count - 1 }; + case "RESET": + return { ...state, count: 0 }; + case "SET": + return { ...state, count: action.payload! }; + default: + return state; + } + }; + ``` + </TabItem> +</Tabs> + +<Admonition type="quote" title="C'est quoi `action.payload!` ?"> + La propriété `payload` de l'action est optionnelle. Il s'agit d'une convention pour passer des données à l'action. + + Le `!` après `action.payload` signifie que l'on est sûr que `payload` est défini. + Cela permet d'éviter une erreur de type avec TypeScript. + + Dans le cas du type `SET`, le payload sera défini obligatoirement avec un nombre qui sera la nouvelle valeur de la propriété `count` de l'état. +</Admonition> + +Enfin, on peut utiliser le hook `useReducer` dans notre composant : + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx + const [state, dispatch] = useReducer(reducer, initialState); + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx + const [state, dispatch] = useReducer(reducer, initialState); + ``` + </TabItem> +</Tabs> + +`state` contient l'état actuel, et `dispatch` est une fonction qui permet d'envoyer une action au reducer. + +Pour modifier l'état, on va donc appeler `dispatch` avec une action : + +```jsx +dispatch({ type: 'INCREMENT' }); +``` + +Et voilà, tu sais maintenant comment utiliser `useReducer` dans une application React ! 🎉 + +## On nettoie tout ça ! + +Tout ce qui t'a été montré plus haut fonctionne, mais est-ce que pour autant ce code est qualitatif ? 🤔 + +**Non !** + +Pourquoi ? Déjà, on a tout mis dans le même fichier, ce qui n'est pas très propre. +Mais surtout, notre code n'est pas à l'abri d'erreurs. + +Que se passerait-il si on se trompait dans le type de l'action ? +Ou si on oubliait de passer un payload à l'action `SET` ? + +C'est ce genre de comportements que l'on veut éviter pour nous assurer le bon fonctionnement de notre application. + +Pour contrer ces problèmes, on va créer des actions et des types d'actions pour garantir la cohérence de notre code. + +### Création des types d'actions + +Nos types d'actions seront tous des chaînes de caractères. On va donc pouvoir les définir sous forme de constantes. + +```jsx +export const INCREMENT = 'INCREMENT'; +export const DECREMENT = 'DECREMENT'; +export const RESET = 'RESET'; +export const SET = 'SET'; +``` + +<Admonition type="tip" title="Regrouper les exports"> + Et là, tu te dis : "Pourquoi ne pas regrouper les exports dans un seul objet ?" + + Bien vu ! Et pour TypeScript, on peut aller encore plus loin en créant un `enum` pour les types d'actions 😉 + + <Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx + export const CounterActionTypes = { + INCREMENT: 'INCREMENT', + DECREMENT: 'DECREMENT', + RESET: 'RESET', + SET: 'SET', + }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx + export const enum CounterActionTypes { + INCREMENT = 'INCREMENT', + DECREMENT = 'DECREMENT', + RESET = 'RESET', + SET = 'SET', + } + ``` + </TabItem> + </Tabs> +</Admonition> + +### Typage des actions + +Si tu utilises JavaScript, je suis désolé de te dire que tu ne peux pas **fortement** typer les actions. + +En revanche, si tu utilises TypeScript, tu peux définir les actions de la manière suivante : + +```tsx +export type CounterAction = + | { type: CounterActionTypes.INCREMENT } + | { type: CounterActionTypes.DECREMENT } + | { type: CounterActionTypes.RESET } + | { type: CounterActionTypes.SET; payload: number }; +``` + +Tu pourras alors utiliser `CounterAction` pour typer les actions de ton reducer : + +```tsx +const reducer = (state: State, action: CounterAction) => { + switch (action.type) { + case CounterActionTypes.INCREMENT: + return { ...state, count: state.count + 1 }; + case CounterActionTypes.DECREMENT: + return { ...state, count: state.count - 1 }; + case CounterActionTypes.RESET: + return { ...state, count: 0 }; + case CounterActionTypes.SET: + return { ...state, count: action.payload }; + default: + return state; + } +}; +``` + +### Action creators + +Pour éviter de se tromper dans le type de l'action, on peut se créer des fonctions qui vont nous permettre de créer des actions. + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx + export const actions = { + increment: () => ({ type: CounterActionTypes.INCREMENT }), + decrement: () => ({ type: CounterActionTypes.DECREMENT }), + reset: () => ({ type: CounterActionTypes.RESET }), + set: (value) => ({ type: CounterActionTypes.SET, payload: value }), + }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx + export const actions = { + increment: (): CounterAction => ({ type: CounterActionTypes.INCREMENT }), + decrement: (): CounterAction => ({ type: CounterActionTypes.DECREMENT }), + reset: (): CounterAction => ({ type: CounterActionTypes.RESET }), + set: (value: number): CounterAction => ({ type: CounterActionTypes.SET, payload: value }), + }; + ``` + </TabItem> +</Tabs> + +Maintenant le dispatch de nos actions sera beaucoup plus simple et éviter davantage les erreurs lors du développement ! + +```jsx +dispatch(actions.increment()); +dispatch(actions.set(10)); +``` + +## Les fichiers complets + +On a vu beaucoup de chose et les fichiers sont un peu éparpillés. +Pour t'aider à mieux comprendre le fonctionnement du hook `useReducer` et comment l'implementer, voici les fichiers complets : + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx title="/src/reducers/counterReducer.js" showLineNumbers + const CounterActionTypes = { + INCREMENT: 'INCREMENT', + DECREMENT: 'DECREMENT', + RESET: 'RESET', + SET: 'SET', + }; + + export const initialState = { count: 0 }; + + export const reducer = (state, action) => { + switch (action.type) { + case CounterActionTypes.INCREMENT: + return { ...state, count: state.count + 1 }; + case CounterActionTypes.DECREMENT: + return { ...state, count: state.count - 1 }; + case CounterActionTypes.RESET: + return { ...state, count: 0 }; + case CounterActionTypes.SET: + return { ...state, count: action.payload }; + default: + return state; + } + }; + + export const actions = { + increment: () => ({ type: CounterActionTypes.INCREMENT }), + decrement: () => ({ type: CounterActionTypes.DECREMENT }), + reset: () => ({ type: CounterActionTypes.RESET }), + set: (value) => ({ type: CounterActionTypes.SET, payload: value }), + }; + ``` + + ```jsx title="/src/components/Counter.jsx" showLineNumbers + import { initialState, actions, reducer } from '../reducers/counterReducer'; + import { useReducer } from 'react'; + + const Counter = () => { + const [state, dispatch] = useReducer(reducer, initialState); + + return ( + <div> + <p>Count: {state.count}</p> + + <button onClick={() => dispatch(actions.increment())}> + Increment + </button> + + <button onClick={() => dispatch(actions.decrement())}> + Decrement + </button> + + <button onClick={() => dispatch(actions.reset())}> + Reset + </button> + + <button onClick={() => dispatch(actions.set(10))}> + Set counter to 10 + </button> + </div> + ); + }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx title="/src/reducers/counterReducer.ts" showLineNumbers + const enum CounterActionTypes { + INCREMENT = 'INCREMENT', + DECREMENT = 'DECREMENT', + RESET = 'RESET', + SET = 'SET', + } + + type State = { + count: number; + }; + + type Action = + | { type: CounterActionTypes.INCREMENT } + | { type: CounterActionTypes.DECREMENT } + | { type: CounterActionTypes.RESET } + | { type: CounterActionTypes.SET; payload: number }; + + export const initialState: State = { count: 0 }; + + export const reducer = (state: State, action: Action) => { + switch (action.type) { + case CounterActionTypes.INCREMENT: + return { ...state, count: state.count + 1 }; + case CounterActionTypes.DECREMENT: + return { ...state, count: state.count - 1 }; + case CounterActionTypes.RESET: + return { ...state, count: 0 }; + case CounterActionTypes.SET: + return { ...state, count: action.payload }; + default: + return state; + } + }; + + export const actions = { + increment: (): Action => ({ type: CounterActionTypes.INCREMENT }), + decrement: (): Action => ({ type: CounterActionTypes.DECREMENT }), + reset: (): Action => ({ type: CounterActionTypes.RESET }), + set: (value: number): Action => ({ type: CounterActionTypes.SET, payload: value }), + }; + ``` + + ```tsx title="/src/components/Counter.tsx" showLineNumbers + import { initialState, actions, reducer } from '../reducers/counterReducer'; + import { useReducer } from 'react'; + + const Counter = () => { + const [state, dispatch] = useReducer(reducer, initialState); + + return ( + <div> + <p>Count: {state.count}</p> + + <button onClick={() => dispatch(actions.increment())}> + Increment + </button> + + <button onClick={() => dispatch(actions.decrement())}> + Decrement + </button> + + <button onClick={() => dispatch(actions.reset())}> + Reset + </button> + + <button onClick={() => dispatch(actions.set(10))}> + Set counter to 10 + </button> + </div> + ); + }; + ``` + </TabItem> +</Tabs> + +## C'est l'heure des questions ! + +<Quiz + question="Quand utiliser `useReducer` ?" + answers={[ + { label: "A", value: "Pour des états simples" }, + { label: "B", value: "Pour des états complexes ou des états qui dépendent les uns des autres" }, + ]} + correctAnswer="B" +> + `useReducer` est plus adapté pour gérer des états complexes ou des états qui dépendent les uns des autres. + + Si tu dois stocker un état simple, comme un booléen, un nombre ou une chaîne de caractères, alors `useState` est parfait pour cela. + + Au contraire, si tu as un état complexe ou des états qui dépendent les uns des autres, il est recommandé d'utiliser `useReducer` du fait que `useState` n'est pas le plus performant pour les états complexes. +</Quiz> + +<Quiz + question="Quelle est la signature d'un reducer ?" + answers={[ + { label: "A", value: "(state, action) => { /* Code */ }" }, + { label: "B", value: "(action, state) => { /* Code */ }" }, + { label: "C", value: "(state) => { /* Code */ }" }, + ]} + correctAnswer="A" +> + La signature d'un reducer est `(state, action) => { /* Code */ }`. + + On récupère bien deux paramètres : `state` et `action`. + + Le `state` est l'état actuel du composant, et l'`action` est un objet qui contient un type et d'autres propriétés. + + En fonction du type de l'action, on retourne un nouvel état. +</Quiz> + +<Quiz + question="Pourquoi déverser le contenu de l'état actuel dans le nouvel état ?" + answers={[ + { label: "A", value: "Pour rendre le code plus lisible" }, + { label: "B", value: "Pour éviter de perdre les propriétés qui ne sont pas modifiées par l'action" }, + { label: "C", value: "Pour éviter de faire des erreurs" }, + ]} + correctAnswer="B" +> + On déverse le contenu de l'état actuel dans le nouvel état pour éviter de perdre les propriétés qui ne sont pas modifiées par l'action. + + Si on ne déversait pas le contenu de l'état actuel, on perdrait les propriétés qui ne sont pas modifiées par l'action. + + En déversant le contenu de l'état actuel, on s'assure de ne pas perdre ces propriétés. +</Quiz> + +<Quiz + question="Pourquoi utiliser des constantes pour les types d'actions ?" + answers={[ + { label: "A", value: "Pour rendre le code plus lisible" }, + { label: "B", value: "Pour alourdir inutilement le code" }, + { label: "C", value: "Pour éviter de se tromper dans le type de l'action" }, + ]} + correctAnswer="C" +> + On utilise des constantes pour les types d'actions pour éviter de se tromper dans le type de l'action. + + En définissant des constantes pour les types d'actions, on s'assure que le type de l'action est correct, cohérent et surtout : **existant**. +</Quiz> + +## Conclusion + +Alors, pas trop fatigué·e ? 😅 +Au moins ça en valait la peine ! Tu te feras moins de nœuds au cerveau par la suite dans tes projets React ! + +Comme tu as pu le voir, `useReducer` est un outil puissant pour gérer des états complexes ou des états qui dépendent les uns des autres. + +Même si ici notre exemple n'était qu'un simple compteur, tu peux appliquer tout ce que tu as pu voir dans des cas plus concrets. + +Si tu veux aller encore plus loin, n'hésite pas à jeter un œil à la [documentation officielle de React](https://react.dev/reference/react/useReducer) pour `useReducer`. +Tu peux également te renseigner sur [Redux](https://redux.js.org) si tu veux aller encore plus loin dans la gestion de l'état de ton application, mais attention, c'est une autre paire de manches ! 😄 \ No newline at end of file diff --git a/old/docs/ressources/frontend/react/state-et-cycle-de-vie.mdx b/old/docs/ressources/frontend/react/state-et-cycle-de-vie.mdx new file mode 100644 index 0000000..f14bdba --- /dev/null +++ b/old/docs/ressources/frontend/react/state-et-cycle-de-vie.mdx @@ -0,0 +1,212 @@ +--- +sidebar_position: 5 +title: "State et cycle de vie" +description: "Voyons ensemble comment gérer le state et le cycle de vie d'un composant React !" +tags: + - Frontend + - React + - JavaScript/TypeScript + - Bibliothèque + - Interface utilisateur (UI) +--- + +import Button from '@site/src/components/Button'; +import Admonition from '@theme/Admonition'; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; + +# State et cycle de vie + +## Introduction + +Dans le précédent article, nous avons vu comment créer notre premier composant React avec notamment le concept de **props**. + +Voyons maintenant comment gérer le **state** et le **cycle de vie** d'un composant React ! +Commençons tranquillement avec le **cycle de vie** d'un composant, puisqu'il est indispensable pour comprendre le **state**. + +<Admonition type="info" title="Rappel"> + Dans cet article, on va utiliser des composants fonctionnels _(fonctions)_ plutôt que des composants de classe _(classes)_ pour déclarer nos composants React. + Pour rappel, les composants déclarés avec des classes ne sont plus recommandés par la [documentation officielle](https://react.dev/reference/react/Component). +</Admonition> + +## 🔄 Cycle de vie + +Le **cycle de vie** d'un composant React est une série d'étapes que traverse un composant, de sa création _(montage)_ à sa destruction _(démontage)_. + +Voici les trois différentes étapes du cycle de vie d'un composant React : + +1. **Montage** _(Mounting)_ : le composant est créé et inséré dans le DOM +2. **Mise à jour** _(Updating)_ : le composant est mis à jour suite à un changement de **props** ou de **state** +3. **Démontage** _(Unmounting)_ : le composant est retiré du DOM + +On verra un peu plus en détail ces étapes dans l'article suivant qui traitera un certain hook de React : `useEffect`. + +<Admonition type="quote" title="Hook.. comme le capitaine ? 🦜🏴‍☠️"> + Haha, non ! + + Un hook en React, est une fonction qui permet d'exploiter les fonctionnalités de React dans un composant fonctionnel _(fonction)_. + + Bon... c'est un peu du charabia, mais on verra ça plus en détail dans le prochain article car il y a beaucoup à dire sur les hooks ! +</Admonition> + +Mais pour le moment, restons en à une vue d'ensemble du cycle de vie ! + +## 🧠 State + +Le **state** est un objet qui contient les données internes d'un composant. +Il est propre à chaque composant et peut être modifié par ce dernier _(à ne pas confondre avec les **props** qui elles sont immuables)_. + +Mais alors, pourquoi utiliser un state alors qu'on pourrait tout simplement déclarer une variable dans notre composant ? + +Prenons cet exemple : + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx title="Counter.jsx" showLineNumbers + import React from 'react'; + + export const Counter = () => { + let count = 0; + + const increment = () => { + count += 1; + console.log("Increment", count); + }; + + return ( + <button onClick={increment}>{count}</button> + ); + }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx title="Counter.tsx" showLineNumbers + import React from 'react'; + + export const Counter = () => { + let count: number = 0; + + const increment = () => { + count += 1; + console.log("Increment", count); + }; + + return ( + <button onClick={increment}>{count}</button> + ); + }; + ``` + </TabItem> +</Tabs> + +<Button href="https://playcode.io/1940681"> + 🕹️ Voir l'exemple sur PlayCode +</Button> + +On serait tentés de croire que ce code fonctionne. Après tout, en vanilla JS _(JavaScript pur)_, on pourrait tout à fait faire ça ! +Et maintenant tu t'en doutes _(sinon pourquoi j'en parlerai ?)_, ce code ne fonctionne pas. + +Pourtant, si on regarde la console du navigateur on voit bien que la variable `count` est bien incrémentée ! + +La raison est très simple : React ne sait pas que la variable `count` a été modifiée. +Pour être plus précis, React ne sait pas qu'il doit mettre à jour l'interface utilisateur _(UI)_ suite à la modification de `count`. + +C'est là qu'intervient le **state** ! +Le state est **réactif** et permet à React de savoir quand il doit mettre à jour l'interface utilisateur _(UI)_. + +### 📝 Déclaration du state + +Pour déclarer un **state**, on utilise le hook `useState` de React. + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx + const [count, setCount] = React.useState(0); + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx + const [count, setCount] = React.useState<number>(0); + ``` + </TabItem> +</Tabs> + +Et là tu vas peut-être te demander une chose... + +<Admonition type="quote" title="Ouh là... pourquoi on a deux assignements ?"> + Bien vu ! Effectivement on va avoir deux assignements pour déclarer un **state** : + - `count` : la valeur du **state** + - `setCount` : la fonction qui permet de modifier la valeur du **state** + + Si tu as déjà fait de la POO, le principe de **getter** et **setter** te sera familier puisque c'est un peu le même principe ! + + Le hook `useState` prend en paramètre la valeur initiale du **state** _(ici `0`)_ et retourne un tableau avec la valeur du **state** et la fonction pour le modifier. +</Admonition> + +### 🔄 Utilisation du state + +Maintenant que notre **state** est déclaré, on peut l'utiliser dans notre composant. + +<Tabs> + <TabItem value="js" label="JavaScript"> + ```jsx title="Counter.jsx" showLineNumbers + import React from 'react'; + + export const Counter = () => { + const [count, setCount] = React.useState(0); + + const increment = () => setCount(count + 1); + + return ( + <button onClick={increment}>{count}</button> + ); + }; + ``` + </TabItem> + + <TabItem value="ts" label="TypeScript"> + ```tsx title="Counter.tsx" showLineNumbers + import React from 'react'; + + export const Counter = () => { + const [count, setCount] = React.useState<number>(0); + + const increment = () => setCount(count + 1); + + return ( + <button onClick={increment}>{count}</button> + ); + }; + ``` + </TabItem> +</Tabs> + +<Button href="https://playcode.io/1940705"> + 🕹️ Voir l'exemple sur PlayCode +</Button> + +Et voilà ! Pas besoin de plus pour gérer un **state** en React 😉 + +Mais qu'est-ce qu'il se passe sous le capot ? +C'est un peu plus complexe que ça, mais pour faire simple : + +#### ⚙️ Montage du composant _(Mounting)_ +On vient prévenir React que notre composant va avoir un **state** et on lui donne une valeur initiale _(ici `0`)_. + +#### 🔧 Mise à jour du composant _(Updating)_ +Ce state, à chaque modification, va déclencher un nouveau rendu du composant. + +#### 🗑️ Démontage du composant _(Unmounting)_ +Et enfin, quand le composant est retiré du DOM, le state est détruit avec lui. + +Ce fonctionnement est identique pour les props donnés à un composant d'ailleurs ! +React est vraiment bien fait pour ça 😊 + +## Conclusion + +Plutôt simple, non ? +Alors maintenant que tu sais comment gérer le **state** et le **cycle de vie** d'un composant React, tu es prêt à te pencher sur la prochaine étape _(et pas des moindres)_ : les **hooks** ! + +Mais pour l'heure, je te laisse jouer avec les **states** et les **props** pour bien comprendre comment tout ça fonctionne. \ No newline at end of file diff --git a/old/docs/ressources/frontend/react/syntaxe-jsx.mdx b/old/docs/ressources/frontend/react/syntaxe-jsx.mdx new file mode 100644 index 0000000..288566d --- /dev/null +++ b/old/docs/ressources/frontend/react/syntaxe-jsx.mdx @@ -0,0 +1,306 @@ +--- +sidebar_position: 3 +title: "Syntaxe JSX" +description: "Découvrons la syntaxe JSX, un langage de balisage utilisé par React pour décrire l'interface utilisateur." +tags: + - Frontend + - React + - JavaScript/TypeScript + - Bibliothèque + - Interface utilisateur (UI) +--- + +import Button from '@site/src/components/Button'; +import Admonition from '@theme/Admonition'; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; + +# Syntaxe JSX + +## Introduction + +Avant de commencer à parler des composants React, découvrons tranquillement la syntaxe **JSX**. + +Le **JSX** est un sucre syntaxique _(une syntaxe plus lisible et plus simple que le JavaScript pur)_ qui permet de décrire l'interface utilisateur _(UI)_ de notre application. +Le sigle en lui-même signifie **JavaScript XML**, dans le sens où l'on va retrouver une syntaxe proche du **XML** _(eXtensible Markup Language)_ qui est un langage de balisage _(comme le **HTML**)_. + +## 🔍 Différences entre HTML et JSX + +Et oui, le **JSX** ressemble beaucoup au **HTML** et c'est normal ! +C'est l'objectif premier de **React** : rendre la création d'interfaces utilisateur _(UI)_ plus simple et plus intuitive. + +Cependant il ne faut pas oublier que le **JSX** n'est pas du **HTML**, mais du JavaScript. + +Pour faire plus simple, voici un élément **HTML** et son équivalent avec React _(avec et sans JSX)_ : + +<Tabs> + <TabItem value="html" label="HTML"> + ```html + <button class="button">Clique moi !</button> + ``` + </TabItem> + + <TabItem value="react-no-jsx" label="React sans JSX"> + ```jsx + React.createElement('button', { className: 'button' }, 'Clique moi !'); + ``` + </TabItem> + + <TabItem value="react-jsx" label="React avec JSX"> + ```jsx + <button className="button">Clique moi !</button> + ``` + </TabItem> +</Tabs> + +Comme tu peux le constater, la différence entre le **JSX** et le **HTML** est minime. +Il y a toutefois des différences, comme certains mots réservés _(comme `class` qui devient `className`)_ ou encore la manière de déclarer des événements _(comme `onclick` qui devient `onClick`)_. + +Par contre si on regarde la différence entre le **JSX** et le JavaScript pur _(en utilisant React quand même)_, on voit bien que le **JSX** est beaucoup plus lisible et plus simple à écrire. + +Là où c'est encore plus flagrant, c'est quand on commence à imbriquer des éléments _(comme des composants React par exemple)_ ! + +<Tabs> + <TabItem value="react-no-jsx" label="React sans JSX"> + ```jsx showLineNumbers + React.createElement(React.Fragment, null, + React.createElement('h2', null, 'Formulaire de contact'), + React.createElement('form', { onSubmit: handleSubmit }, + React.createElement('fieldset', null, + React.createElement('label', { htmlFor: 'lastname' }, 'Nom'), + React.createElement('input', { type: 'text', name: 'lastname', id: 'lastname', required: true }) + ), + React.createElement('fieldset', null, + React.createElement('label', { htmlFor: 'email' }, 'Email'), + React.createElement('input', { type: 'email', name: 'email', id: 'email', required: true }) + ), + React.createElement('fieldset', null, + React.createElement('label', { htmlFor: 'message' }, 'Message'), + React.createElement('textarea', { name: 'message', id: 'message', required: true }) + ), + React.createElement('fieldset', null, + React.createElement('label', { htmlFor: 'gdpr' }, + React.createElement('input', { type: 'checkbox', name: 'gdpr', id: 'gdpr', required: true }), + 'J\'accepte que mes données soient utilisées pour me recontacter' + ) + ), + React.createElement('button', { type: 'submit' }, 'Envoyer') + ) + ); + ``` + </TabItem> + + <TabItem value="react-jsx" label="React avec JSX"> + ```jsx showLineNumbers + <React.Fragment> + <h2>Formulaire de contact</h2> + <form onSubmit={handleSubmit}> + <fieldset> + <label htmlFor="lastname">Nom</label> + <input type="text" name="lastname" id="lastname" required> + </fieldset> + + <fieldset> + <label for="email">Email</label> + <input type="email" name="email" id="email" required> + </fieldset> + + <fieldset> + <label for="message">Message</label> + <textarea name="message" id="message" required></textarea> + </fieldset> + + <fieldset> + <label for="gdpr"> + <input type="checkbox" name="gdpr" id="gdpr" required> + J'accepte que mes données soient utilisées pour me recontacter + </label> + </fieldset> + + <button type="submit">Envoyer</button> + </form> + </React.Fragment> + ``` + </TabItem> +</Tabs> + +Et bien même si le code final est **identique**, le **JSX** apporte une lisibilité et une simplicité d'écriture qui est très appréciable. +Pas mal non ? 😄 + +Et donc oui ! En faisant du **JSX**, on fait en réalité du **JavaScript** et **pas du HTML** ! + +<Admonition type="warning" title="Importation de React et de ses exports"> + Au sein de ses pages, tu verras **toujours** que j'importe le contenu de **React** en intégralité _(comme `import React from 'react';`)_. + + Dans la réalité, on va destructurer les exports de **React** pour n'importer que ce dont on a besoin. + + Cependant, pour te donner l'information d'où provient chaque élément, je préfère importer **React** en intégralité et que tu puisses visualiser les éléments de **React** utilisés avec leur provenance. + + Par exemple, cela donnerait : + ```jsx + import React from 'react'; + + const [count, setCount] = React.useState(0); + ``` + + Au lieu de : + ```jsx + import { useState } from 'react'; + + const [count, setCount] = useState(0); + ``` + + Pour tes projets, privilégies la seconde méthode pour ne pas surcharger ton code inutilement et surtout importer **seulement** ce dont tu as besoin ! + + J'espère que tu comprends mieux pourquoi je fais comme ça pour ces ressources 😉 +</Admonition> + +## 🧩 Intégration de JavaScript dans le JSX + +Mais l'un des autres avantages du **JSX** est la possibilité d'ajouter du JavaScript directement dans le code ! + +Pour pouvoir ajouter du JavaScript dans le **JSX**, il suffit d'entourer le code JavaScript avec des accolades `{}`. +C'est un peu comme si on "ouvrait un portail" pour insérer du JavaScript dans notre code **JSX**. + +### 📦 Variables et fonctions + +Par exemple, si tu veux afficher une variable dans ton **JSX**, tu peux le faire directement : + +```jsx +const name = 'Jean Dupont'; + +return <h1>Bonjour {name} !</h1>; +``` + +Et si tu veux appeler une fonction, c'est tout aussi simple : + +```jsx +const sayHello = () => 'Bonjour !'; + +return <p>{sayHello()}</p>; +``` + +### 📝 Expressions + +Tu peux également ajouter des expressions _(comme des conditions ternaires par exemple)_ : + +```jsx +const age = 18; + +return <p>{age >= 18 ? 'Majeur' : 'Mineur'}</p>; +``` + +Mais tu peux aussi faire un **affichage conditionnel** de manière très simple : + +```jsx + +const isLogged = false; + +return ( + <div> + {isLogged && <p>Bienvenue sur notre site !</p>} + {!isLogged && <p>Connectez-vous pour accéder à notre site</p>} + </div> +); +``` + +### 🔄️ Boucles + +Maintenant imagine que tu souhaites créer une interface qui liste des éléments provenant d'un tableau. + +```js +const fruits = ['pomme', 'banane', 'fraise']; +``` + +Dans un premier temps, on va revoir très rapidement comment on peut parser un tableau en JavaScript : + +- `for` : + ```js + for (let i = 0; i < fruits.length; i++) { + console.log(fruits[i]); + } + ``` +- `forEach` : + ```js + fruits.forEach((fruit) => console.log(fruit)); + ``` +- `map` : + ```js + fruits.map((fruit) => console.log(fruit)); + ``` +- et bien d'autres encore... + +En soit, toutes ces méthodes sont très bien et font ce qu'on leur demande sans souci. +Cependant, React ne va pas forcément aimer ça sauf pour `map`. + +La raison est simple : +React a besoin qu'on lui **retourne un élément** _(ou un tableau d'éléments)_ pour pouvoir les afficher. + +Alors avec des `console.log` on ne va pas aller loin, mais si au lieu de retourner un `console.log` on retournait un élément **JSX** ? 🤔 + +```jsx +const fruits = ['pomme', 'banane', 'fraise']; + +return ( + <ul> + {fruits.map((fruit) => <li key={fruit}>{fruit}</li>)} + </ul> +); +``` + +<Button href="https://playcode.io/1940876"> + 🕹️ Voir l'exemple sur PlayCode +</Button> + +Et là : **BAM** ! 💥 +Tu viens de créer une liste de fruits en utilisant un tableau de fruits. + +Mais par contre... + +<Admonition type="quote" title={`C'est quoi ce "key" qui vient d'apparaître ?`}> + La `key` est une propriété spéciale que React utilise pour identifier chaque élément de manière unique. + Cela permet à React de savoir quel élément a été ajouté, modifié ou supprimé. + + Il est **obligatoire** d'avoir une `key` unique pour chaque élément d'une liste. + Si tu listes des éléments qui ont un identifiant unique _(comme l'`id` qu'on aura dans nos données stockées dans une base de données par exemple)_, tu peux utiliser cet identifiant comme `key`. +</Admonition> + +## 📦 Les props + +Les **props** _(ou propriétés)_ sont des arguments que l'on peut passer à un composant React. +Je ne vais pas trop rentrer dans les détails ici, car on va les voir dans l'article d'après ! + +Mais pour te donner un aperçu, voici comment on peut passer des **props** à un composant : + +<Tabs> + <TabItem value="jsx" label="JSX"> + ```jsx + const Button = (props) => { + return <button onClick={props.onClick}>{props.children}</button>; + }; + ``` + </TabItem> + + <TabItem value="tsx" label="TSX"> + ```tsx + type ButtonProps = { + onClick: () => void; + children: React.ReactNode; + }; + + const Button = (props: ButtonProps) => { + return <button onClick={props.onClick}>{props.children}</button>; + }; + ``` + </TabItem> +</Tabs> + +Ici, on a un composant `Button` qui prend deux **props** : `onClick` et `children`. +`onClick` est une fonction qui sera appelée lorsqu'on cliquera sur le bouton, et `children` est tout ce qui se trouve entre les balises ouvrante et fermante du composant. + +## Conclusion + +Alors, plutôt cool le **JSX** non ? 😎 + +Même si cette syntaxe rebute certains développeurs _(souvent ils se la jouent puristes, mais chuuuuut 🤫)_, elle est toutefois très appréciée pour sa simplicité et sa lisibilité. +Question de goût après tout ! \ No newline at end of file diff --git a/old/docs/ressources/influenceurs-et-createurs.mdx b/old/docs/ressources/influenceurs-et-createurs.mdx new file mode 100644 index 0000000..fea0b0d --- /dev/null +++ b/old/docs/ressources/influenceurs-et-createurs.mdx @@ -0,0 +1,54 @@ +--- +sidebar_position: 1 +title: "🎥 Influenceurs et créateurs de contenu" +description: "Liste d'influenceurs et créateurs de contenu dans le domaine du développement." +--- + +import Admonition from '@theme/Admonition'; + +# Influenceurs et créateurs de contenu + +<Admonition type="warning"> + Les contenus créés par ces professionnels n'ont pas été vérifiés, il est donc important de rester critique face à ces informations et de savoir les remettre en question si nécessaire. + + Toutefois, ces professionnels peuvent être une source d'inspiration et de découverte pour les personnes qui les suivent. + De manière générale, cela peut être une superbe opportunité de t'aider à faire de la veille technique et à rester à jour sur les dernières tendances et mises à jours dans le développement ! +</Admonition> + +## ❤️ Coups de coeur de l'équipe Memento Dev + +- [**Alsa Créations**](https://www.alsacreations.com/) +- [**Benjamin Code**](https://bento.me/benjamincode) +- [**Kipdev**](https://kipdev.io/) +- [**Korben**](https://korben.info/) + + +## 🌟 Influenceurs et créateurs de contenu inspirants + +- [**laConsole**](https://laconsole.dev/) + +## 🫶 Apparaître sur cette page + +Alors tout d'abord : merci pour ton implication dans la communauté tech ! +Pour figurer sur cette page, tu peux tout simplement faire un fork du dépôt GitHub de ce memento et ajouter ton nom dans le fichier `docs/ressources/influenceurs-et-createurs.mdx` en suivant le format des autres noms déjà présents. + +Si ça te rassure, il n'y a aucun prérequis spécifique pour apparaître sur cette page, du moment que tu es actif dans la communauté du développement et que tu crées du contenu en lien avec la tech _(pas obligatoire **que** du développement)_. + +<Admonition type="info" title="Lien vers tes différents réseaux"> + En ce qui concerne les liens : un seul est autorisé, et il doit pointer vers une page où l'on peut te suivre ou consulter tes contenus. + Il peut s'agir d'un HUB _(Linktree, Bento, etc.)_ où l'on peut retrouver tous tes liens, ou d'un lien vers un réseau social _(X/Twitter, Youtube, etc.)_ où tu es actif. + + Cependant, ce lien doit intégralement et impérativement être en conformité avec les [règles de contribution](/contribuer#-directives-de-r%C3%A9daction). + Dans le cas contraire, par exemple si l'un des contenus disponibles via l'un des réseaux n'est pas en adéquation avec les [règles de contribution](/contribuer#-directives-de-r%C3%A9daction), toute mention sera supprimée sans préavis ni justification. +</Admonition> + +<Admonition type="warning" title="Ordre d'apparition"> + Aucun influenceur ou créateur de contenu, en dehors des coups de coeurs de l'équipe derrière Memento Dev, n'est mis en avant par rapport à un autre dans cette page. + Les noms sont listés par ordre alphabétique, peu importe le nombre d'abonnés ou de vues. +</Admonition> + +## 🥷 Disparaître de cette page + +Pour retirer ton nom de cette page, tu peux tout simplement faire un fork du dépôt GitHub de ce memento et supprimer ton nom dans le fichier `docs/ressources/influenceurs-et-createurs.mdx`. + +Toutefois, nous t'informons que l'historique des modifications est conservé sur GitHub, et que nous ne pourrons pas supprimer les anciennes contributions. diff --git a/old/docs/soutiens-et-contributeurs.mdx b/old/docs/soutiens-et-contributeurs.mdx new file mode 100644 index 0000000..b56aa18 --- /dev/null +++ b/old/docs/soutiens-et-contributeurs.mdx @@ -0,0 +1,20 @@ +--- +sidebar_position: 99998 +description: "Soutiens et contributeurs de la plateforme Memento Dev." +--- + +# 🤗 Soutiens et contributeurs + +## 🌟 Contributeurs + +Un grand merci à toutes les personnes qui ont contribué à ce projet et/ou qui le soutiennent ! + +Bien que cette section est vide, je tiens à remercier personnellement l'intégralité de mes consœurs et confrères jurys +qui ont contribué à ce projet sans le savoir, en me partageant leurs connaissances et leurs expériences. + +## 🤝 Soutiens et partages de la plateforme + +- [**O'clock**](https://oclock.io/) + - Partage de la plateforme aux apprenants DWWM +- [**Wild Code School**](https://www.wildcodeschool.com/fr-fr/) + - Partage de la plateforme aux apprenants DWWM \ No newline at end of file diff --git a/old/docs/titres-professionnels/CDA/AT1/CP1.mdx b/old/docs/titres-professionnels/CDA/AT1/CP1.mdx new file mode 100644 index 0000000..508d1bd --- /dev/null +++ b/old/docs/titres-professionnels/CDA/AT1/CP1.mdx @@ -0,0 +1,12 @@ +--- +sidebar_position: 1 +title: "CP 1" +description: "Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04)." +tags: + - CDA + - Environnement de développement +--- + +import Admonition from '@theme/Admonition'; + +# Installer et configurer son environnement de travail en fonction du projet \ No newline at end of file diff --git a/old/docs/titres-professionnels/CDA/AT1/CP2.mdx b/old/docs/titres-professionnels/CDA/AT1/CP2.mdx new file mode 100644 index 0000000..eb4f3fe --- /dev/null +++ b/old/docs/titres-professionnels/CDA/AT1/CP2.mdx @@ -0,0 +1,11 @@ +--- +sidebar_position: 2 +title: "CP 2" +description: "Synthèse de la CP 2 \"Développer des interfaces utilisateur\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04)." +tags: + - CDA +--- + +import Admonition from '@theme/Admonition'; + +# Développer des interfaces utilisateur \ No newline at end of file diff --git a/old/docs/titres-professionnels/CDA/AT1/CP3.mdx b/old/docs/titres-professionnels/CDA/AT1/CP3.mdx new file mode 100644 index 0000000..2c01de2 --- /dev/null +++ b/old/docs/titres-professionnels/CDA/AT1/CP3.mdx @@ -0,0 +1,11 @@ +--- +sidebar_position: 3 +title: "CP 3" +description: "Synthèse de la CP 3 \"Développer des composants métier\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04)." +tags: + - CDA +--- + +import Admonition from '@theme/Admonition'; + +# Développer des composants métier \ No newline at end of file diff --git a/old/docs/titres-professionnels/CDA/AT1/CP4.mdx b/old/docs/titres-professionnels/CDA/AT1/CP4.mdx new file mode 100644 index 0000000..fb0fcd2 --- /dev/null +++ b/old/docs/titres-professionnels/CDA/AT1/CP4.mdx @@ -0,0 +1,11 @@ +--- +sidebar_position: 4 +title: "CP 4" +description: "Synthèse de la CP 4 \"Contribuer à la gestion d’un projet informatique\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04)." +tags: + - CDA +--- + +import Admonition from '@theme/Admonition'; + +# Contribuer à la gestion d’un projet informatique \ No newline at end of file diff --git a/old/docs/titres-professionnels/CDA/AT1/_category_.json b/old/docs/titres-professionnels/CDA/AT1/_category_.json new file mode 100644 index 0000000..188ab02 --- /dev/null +++ b/old/docs/titres-professionnels/CDA/AT1/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Activité Type 1", + "position": 3 +} diff --git a/old/docs/titres-professionnels/CDA/AT2/CP5.mdx b/old/docs/titres-professionnels/CDA/AT2/CP5.mdx new file mode 100644 index 0000000..18d535d --- /dev/null +++ b/old/docs/titres-professionnels/CDA/AT2/CP5.mdx @@ -0,0 +1,11 @@ +--- +sidebar_position: 5 +title: "CP 5" +description: "Synthèse de la CP 5 \"Analyser les besoins et maquetter une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04)." +tags: + - CDA +--- + +import Admonition from '@theme/Admonition'; + +# Analyser les besoins et maquetter une application \ No newline at end of file diff --git a/old/docs/titres-professionnels/CDA/AT2/CP6.mdx b/old/docs/titres-professionnels/CDA/AT2/CP6.mdx new file mode 100644 index 0000000..685c12f --- /dev/null +++ b/old/docs/titres-professionnels/CDA/AT2/CP6.mdx @@ -0,0 +1,11 @@ +--- +sidebar_position: 6 +title: "CP 6" +description: "Synthèse de la CP 6 \"Définir l’architecture logicielle d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04)." +tags: + - CDA +--- + +import Admonition from '@theme/Admonition'; + +# Définir l’architecture logicielle d’une application \ No newline at end of file diff --git a/old/docs/titres-professionnels/CDA/AT2/CP7.mdx b/old/docs/titres-professionnels/CDA/AT2/CP7.mdx new file mode 100644 index 0000000..cb211c9 --- /dev/null +++ b/old/docs/titres-professionnels/CDA/AT2/CP7.mdx @@ -0,0 +1,11 @@ +--- +sidebar_position: 7 +title: "CP 7" +description: "Synthèse de la CP 7 \"Concevoir et mettre en place une base de données relationnelle\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04)." +tags: + - CDA +--- + +import Admonition from '@theme/Admonition'; + +# Concevoir et mettre en place une base de données relationnelle \ No newline at end of file diff --git a/old/docs/titres-professionnels/CDA/AT2/CP8.mdx b/old/docs/titres-professionnels/CDA/AT2/CP8.mdx new file mode 100644 index 0000000..c9190b3 --- /dev/null +++ b/old/docs/titres-professionnels/CDA/AT2/CP8.mdx @@ -0,0 +1,11 @@ +--- +sidebar_position: 8 +title: "CP 8" +description: "Synthèse de la CP 8 \"Développer des composants d’accès aux données SQL et NoSQL\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04)." +tags: + - CDA +--- + +import Admonition from '@theme/Admonition'; + +# Développer des composants d’accès aux données SQL et NoSQL \ No newline at end of file diff --git a/old/docs/titres-professionnels/CDA/AT2/_category_.json b/old/docs/titres-professionnels/CDA/AT2/_category_.json new file mode 100644 index 0000000..1163cd5 --- /dev/null +++ b/old/docs/titres-professionnels/CDA/AT2/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Activité Type 2", + "position": 4 +} diff --git a/old/docs/titres-professionnels/CDA/AT3/CP10.mdx b/old/docs/titres-professionnels/CDA/AT3/CP10.mdx new file mode 100644 index 0000000..61afb4f --- /dev/null +++ b/old/docs/titres-professionnels/CDA/AT3/CP10.mdx @@ -0,0 +1,11 @@ +--- +sidebar_position: 10 +title: "CP 10" +description: "Synthèse de la CP 10 \"Préparer et documenter le déploiement d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04)." +tags: + - CDA +--- + +import Admonition from '@theme/Admonition'; + +# Préparer et documenter le déploiement d’une application \ No newline at end of file diff --git a/old/docs/titres-professionnels/CDA/AT3/CP11.mdx b/old/docs/titres-professionnels/CDA/AT3/CP11.mdx new file mode 100644 index 0000000..0c8bdb4 --- /dev/null +++ b/old/docs/titres-professionnels/CDA/AT3/CP11.mdx @@ -0,0 +1,11 @@ +--- +sidebar_position: 11 +title: "CP 11" +description: "Synthèse de la CP 11 \"Contribuer à la mise en production dans une démarche DevOps\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04)." +tags: + - CDA +--- + +import Admonition from '@theme/Admonition'; + +# Contribuer à la mise en production dans une démarche DevOps \ No newline at end of file diff --git a/old/docs/titres-professionnels/CDA/AT3/CP9.mdx b/old/docs/titres-professionnels/CDA/AT3/CP9.mdx new file mode 100644 index 0000000..f663edd --- /dev/null +++ b/old/docs/titres-professionnels/CDA/AT3/CP9.mdx @@ -0,0 +1,11 @@ +--- +sidebar_position: 9 +title: "CP 9" +description: "Synthèse de la CP 9 \"Préparer et exécuter les plans de tests d’une application\" du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04)." +tags: + - CDA +--- + +import Admonition from '@theme/Admonition'; + +# Préparer et exécuter les plans de tests d’une application \ No newline at end of file diff --git a/old/docs/titres-professionnels/CDA/AT3/_category_.json b/old/docs/titres-professionnels/CDA/AT3/_category_.json new file mode 100644 index 0000000..420a7bc --- /dev/null +++ b/old/docs/titres-professionnels/CDA/AT3/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Activité Type 3", + "position": 5 +} diff --git a/old/docs/titres-professionnels/CDA/_category_.json b/old/docs/titres-professionnels/CDA/_category_.json new file mode 100644 index 0000000..088726e --- /dev/null +++ b/old/docs/titres-professionnels/CDA/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "🧑‍💻 CDA", + "position": 1 +} diff --git a/old/docs/titres-professionnels/CDA/intro.mdx b/old/docs/titres-professionnels/CDA/intro.mdx new file mode 100644 index 0000000..aa82174 --- /dev/null +++ b/old/docs/titres-professionnels/CDA/intro.mdx @@ -0,0 +1,75 @@ +--- +sidebar_position: 1 +title: "Résumé" +description: "Résumé du titre professionnel Concepteur Développeur d'Applications (CDA TP-01281m04, actif depuis décembre 2023)." +tags: + - CDA +--- + +import Admonition from "@theme/Admonition"; + +# Contenu du titre professionnel CDA + +Nom complet du titre : `Concepteur Développeur d'Applications` +Code titre : `TP-01281` +Code millésime : `04` + +## Documents officiels + +- [📄 REAC - Référentiel Emploi Activités Compétences _(02/07/2024)_](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/Download.aspx?i=4bab86d3-0e9d-470b-b6a2-a703e3549da8&d=1) +- [📄 RE - Référentiel d'Évaluation _(02/07/2024)_](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/Download.aspx?i=60bffdb0-b347-4717-849a-1750f8515de0&d=1) + +> Source(s) : +> +> - [🔗 Banque de ressources numériques de l'AFPA](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/EGPResultat.aspx?ct=01281m04&cd=&cr=&type=t) + +## Activités types et compétences professionnelles + +<Admonition type="warning" title="🚧 En cours de rédaction 🚧"> + Le contenu des compétences professionnelles est en cours de rédaction. +</Admonition> + +### 📚 Activité type 1 - Développer une application sécurisée + +- [CP 1 - Installer et configurer son environnement de travail en fonction du projet](./AT1/CP1) +- [CP 2 - Développer des interfaces utilisateur](./AT1/CP2) +- [CP 3 - Développer des composants métier](./AT1/CP3) +- [CP 4 - Contribuer à la gestion d’un projet informatique](./AT1/CP4) + +### 📚 Activité type 2 - Concevoir et développer une application sécurisée organisée en couches + +- [CP 5 - Analyser les besoins et maquetter une application](./AT2/CP5) +- [CP 6 - Définir l’architecture logicielle d’une application](./AT2/CP6) +- [CP 7 - Concevoir et mettre en place une base de données relationnelle](./AT2/CP7) +- [CP 8 - Développer des composants d’accès aux données SQL et NoSQL](./AT2/CP8) + +### 📚 Activité type 3 - Préparer le déploiement d’une application sécurisée + +- [CP 9 - Préparer et exécuter les plans de tests d’une application](./AT3/CP9) +- [CP 10 - Préparer et documenter le déploiement d’une application](./AT3/CP10) +- [CP 11 - Contribuer à la mise en production dans une démarche DevOps](./AT3/CP11) + +## Compétences transverses + +- Communiquer en français et en anglais +- Mettre en oeuvre une démarche de résolution de problème +- Apprendre en continu + +## Déroulé de l'examen + +<Admonition type="info" title="Déroulé relatif au passage de l'épreuve dans sa globalité"> + En cas de repassage d'un <abbr title="Certificat de Compétences Professionnelles">CCP</abbr>, + se référer au [Référentiel d'Évaluation](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/Download.aspx?i=60bffdb0-b347-4717-849a-1750f8515de0&d=1) + pour connaître les modalités de l'épreuve : + + - Pages 17 à 21 pour l'AT 1 + - Pages 23 et 27 pour l'AT 2 + - Pages 29 et 33 pour l'AT 3 +</Admonition> + +**Durée totale de l'examen** : 2h15 _(dont 1h45 de soutenance face au jury)_ + +1. Questionnaire professionnel _(30 minutes, sans présence du jury)_ +2. Présentation d'un projet réalisé en amont de la session _(40 minutes, face au jury)_ +3. Entretien technique _(45 minutes, face au jury)_ +4. Entretien final _(20 minutes, face au jury)_ diff --git a/old/docs/titres-professionnels/DWWM/AT1/CP1.mdx b/old/docs/titres-professionnels/DWWM/AT1/CP1.mdx new file mode 100644 index 0000000..68e0475 --- /dev/null +++ b/old/docs/titres-professionnels/DWWM/AT1/CP1.mdx @@ -0,0 +1,63 @@ +--- +sidebar_position: 1 +title: "CP 1" +description: "Synthèse de la CP 1 \"Installer et configurer son environnement de travail en fonction du projet web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04)." +tags: + - DWWM + - Environnement de développement +--- + +import Admonition from '@theme/Admonition'; + +# Installer et configurer son environnement de travail en fonction du projet web ou web mobile + +## 📚 Références + +- REAC _(mise à jour du 03/07/2024)_, pages 15 et 16 +- RE _(mise à jour du 03/07/2024)_, page 9 + +## 📋 En résumé + +Ce qui est attendu de ta part, c'est d'expliquer **comment** on peut installer et configurer les prérequis pour exécuter ton projet. + +Tu as utilisé un framework PHP et React en front ? +Tu devras alors expliquer comment installer PHP, Composer, Node.js, npm _(ou autre gestionnaire de dépendances Node)_ +et les autres dépendances nécessaires à ton projet comme la base de données ! + +Et pour te quantifier le tout, voici ce que ça peut donner : + +- Versionning _(Git, SVN, ...)_ +- IDE ou éditeur de code _(Visual Studio Code, PhpStorm, ...)_ +- Langages/runtimes _(PHP, Node.js, ...)_ +- Gestionnaires de dépendances _(Composer, npm, ...)_ +- Serveurs web _(Apache, Nginx, ...)_ +- Base de données _(MySQL, PostgreSQL, ...)_ +- DevOps _(Docker, Vagrant, ...)_ +- etc. + +Tu l'as compris, c'est vaste ! +Mais heureusement, tu dois uniquement expliquer comment installer et configurer les outils que tu as utilisés pour ton projet. + +Si tu fais un projet Laravel et React, nul besoin d'expliquer comment installer et configurer Ruby et Java, par exemple 😉 + +<Admonition type="info" title="Utilisation de XAMPP, WAMP, MAMP, LAMP, etc."> + Si tu utilises un logiciel comme XAMPP, WAMP, MAMP, LAMP, etc., tu as évidemment le droit de le mentionner dans ta présentation et dossier de projet. + + Toutefois, il est préférable que tu saches expliquer comment installer et configurer les éléments nécessaires de manières individuelles. +</Admonition> + +## ➕ Informations complémentaires + +<Admonition type="warning" title="Versions des outils et dépendances"> + Même si le choix des outils que tu utilises est libre, il est important de préciser les versions que tu as utilisées pour ton projet. + + Étant donné que chaque version corrige probablement diverses failles de sécurité et/ou ajoute des fonctionnalités, c'est le bon moment pour montrer que tu prends la veille technologique au sérieux. +</Admonition> + +## 🎯 Critères d'évaluation + +- Les outils de développement nécessaires sont installés et configurés +- Les outils de gestion de versions et de collaboration sont installés +- Les conteneurs implémentes les services requis pour l'environnement de développement +- La documentation technique de l'environnement de travail est comprise, en langue française ou anglaise (niveau B1 CECRL pour l'anglais) +- Le système de veille permet de suivre les évolutions technologies et les problématiques de sécurité en lien avec l'installation et la configuration d'un environnement de travail diff --git a/old/docs/titres-professionnels/DWWM/AT1/CP2.mdx b/old/docs/titres-professionnels/DWWM/AT1/CP2.mdx new file mode 100644 index 0000000..99fa655 --- /dev/null +++ b/old/docs/titres-professionnels/DWWM/AT1/CP2.mdx @@ -0,0 +1,141 @@ +--- +sidebar_position: 2 +title: "CP 2" +description: "Synthèse de la CP 2 \"Maquetter des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04)." +tags: + - DWWM + - Eco-conception + - Accessibilité + - SEO/Référencement naturel + - Maquettage + - Wireframe + - Zoning + - Front-end +--- + +import Admonition from "@theme/Admonition"; + +# Maquetter des interfaces utilisateur web ou web mobile + +## 📚 Références + +- REAC _(mise à jour du 03/07/2024)_, pages 17 et 18 +- RE _(mise à jour du 03/07/2024)_, page 9 + +## 📋 En résumé + +Pour cette compétence, tu vas devoir réaliser des maquettes d'interfaces utilisateur. +Mais par maquettage, on ne parle pas de maquette en papier ou en carton, mais bien de maquettes numériques. + +<iframe + src="https://giphy.com/embed/28n0C19zo9OOvHnYww" + width="480" + height="269" + className="mx-auto my-4" + allowFullScreen +></iframe> + +Blague à part, on entend par cette compétence professionnelle la réalisation de maquettes d'interfaces utilisateur, au travers des différentes étapes maquettage : + +1. Analyse du cahier des charges +2. Création de l'arborescence du site et de ses pages +3. Conception des zonings +4. Réalisation des wireframes +5. Création de la charte graphique +6. Mise en forme des maquettes à partir des wireframes et de la charte graphique +7. Mise en place des interactions via un prototype + +Alors bien entendu, toutes ces étapes ne sont des étapes "purement" maquettage, mais qui sont utilisées pour réaliser ces maquettes sans se vautrer. +Il s'agit de l'ordre logique allant du tout début jusqu'à la réalisation de maquettes finales et du prototype. + +<Admonition type="quote" title="Mais je ne suis pas webdesigner ! 😱"> + Pas de panique ! Tu n'as pas besoin d'être un webdesigner pour réaliser des maquettes. + Évidemment, si tu as des compétences en design, c'est un plus car en général les développeurs ne sont pas tous réputés pour être de bons designers... 😅 + + Ce qu'on attend de toi, c'est de respecter les consignes du cahier des charges tout en répondant au besoin du client et en faisant attention à l'expérience utilisateur et l'accessibilité. + + Si par ailleurs tu cherches un outil gratuit pour réaliser des maquettes, tu peux te tourner vers [Figma](https://www.figma.com/) qui permet non seulement de créer des maquettes et prototypes, mais aussi de collaborer avec d'autres personnes sur un même projet. +</Admonition> + +Tiens d'ailleurs, parlons accessibilité ! +D'après toi, qu'est-ce que l'accessibilité en matière de développement web ? + +Si tu as répondu que c'est le fait de rendre un site accessible à tous, tu as tout bon ! +L'accessibilité est un point crucial à prendre en compte lors de la réalisation de maquettes, car tout le monde doit pouvoir accéder à un site web, y compris les personnes en situation de handicap. + +Pour améliorer l'accessibilité de ton site, il est recommandé de suivre les recommandations du [W3C à propos du WCAG](https://www.w3.org/WAI/WCAG21/quickref/) et du [RGAA](https://accessibilite.numerique.gouv.fr/), mais je ne te cache pas c'est un gros morceau et qu'on se perdre en voulant tout respecter à la lettre. +Alors voici un condensé des points les plus importants à respecter dans un premier temps : + +- **Contraste** : Assure-toi que le texte est lisible sur n'importe quel fond. Il faut viser un score AA _(ratio 4.5:1)_ au minimum et idéalement AAA _(ratio 7:1)_ sur nos éléments textuels et pour l'iconographie. +- **Taille de police** : La taille de police doit être suffisamment grande pour être lisible par tout le monde. En général, on recommande une taille de **16px minimum**. +- **Choix de la police** : Utilise des polices lisibles et évite les polices fantaisistes. Si tu cherches une police légère, gratuite et réputée pour être lisible, tu peux te tourner vers la police [Luciole](https://luciole-vision.com/) ! _(c'est d'ailleurs celle qui est utilisée sur cette plateforme)_ +- **Intitulés des liens et boutons** : Les liens et boutons doivent être clairs et explicites. Évite les "Cliquez ici" et préfère des phrases plus descriptives. Évite également d'uniquer mettre un pictogramme pour un lien, car cela peut ne pas être compris par tout le monde. + +Bien entendu, l'accessibilité ne se limite pas à ces points, mais c'est un bon début pour rendre ton site accessible à tous. +J'y reviendrai plus en détail dans la compétence suivante, puisqu'on parlera de l'intégration de ces maquettes 😉 + +Et pour terminer ! _(oui, je sais, je parle beaucoup 😅)_ +**L'éco-conception** ! + +## 🌍 L'éco-conception + +L'éco-conception, c'est l'art de concevoir un site web de manière à réduire son impact environnemental. On évitera par exemple d'intégrer beaucoup d'images et autres médias. +De manière générale : moins il y a de requêtes, moins il y a de données à charger, et donc moins d'énergie consommée. + +Même si dans l'ensemble on serait en droit de crier "greenwashing" _(et on aurait pas tort)_, il est important de prendre en compte l'impact environnemental de nos sites web. +Au delà de l'impact environnemental, un site éco-conçu est souvent plus rapide et plus léger, ce qui permet aux sites et applications d'être plus performants tant en termes de vitesse que de consommation de données. + +Tu l'auras compris, que tu sois éco-convaicu ou non, c'est un point essentiel pour l'expérience utilisateur ! 🚀 + +## ➕ Informations complémentaires + +Il est probable que ton client t'impose une charte graphique à respecter et que cette dernière ne soit pas forcément accessible, ergonomique ou éco-conçue. +C'est à toi en tant que développeur d'expliquer à ton client les enjeux que ça représente pour son site web. + +Il aura dans tous les cas le dernier mot, mais il est important de l'informer des conséquences de ses choix pour son site. +S'il ne veut pas améliorer prendre en compte ces informations, tu pourras toujours lui proposer de le faire évoluer par la suite, une fois le site en ligne _(mais attention, cela peut coûter cher pour rattraper les différents défauts)_. + +## 🎯 Critères d'évaluation + +- Les maquettes sont réalisées conformément au dossier de conception, en langue française ou anglaise _(niveau B1 du CECRL pour l'anglais)_ +- La charte graphique de l'entreprise est respectée +- Les exigences de sécurisation sont respectées +- Les maquettes tiennent compte de l'expérience utilisateur, y compris pour les personnes en situation de handicap et du type d'utilisation, y compris pour les équipements mobiles +- L'enchainement des maquettes est formalisé par un schéma +- La législation en vigueur est respectée, y compris celle relative à l'accessibilité + +## 🤯 Aller plus loin _(hors référentiel)_ + +Tu trouves que je n'ai pas assez parlé dans cette compétence ? Déjà, tu m'en vois surpris, mais je vais te donner quelques pistes pour aller plus loin ! + +Je vais parler un peu plus en détail de l'éco-conception, tant il s'agit d'un sujet très important et souvent négligé. +Le premier réflexe que l'on pourrait avoir en entendu ce terme, c'est accuser du greenwashing et penser qu'on attend de nous de revenir dans les années 90 avec des sites tout moches et tout plats. + +Alors... Greenwashing ? Tout dépend de qui en parle, mais la cause elle-même est noble et mérite d'être prise en compte. +Pour le côté "site tout moche", c'est effectivement une possibilité, mais ce n'est pas une fatalité. + +Faire une galerie photo avec des images en pleine résolution, c'est bien, mais c'est lourd à charger. Et pourtant, on peut quand même rendre le site d'un photographe beau et éco-conçu, tout en préservant la qualité de son travail ! +Ça peut sembler contre-intuitif, mais tout va se jouer dans le code où l'on pourra charger **uniquement au besoin et à la demande de l'utilisateur** les images dans notre page. + +Toujours pas convaincu par l'éco-conception ? +Et si je te disais que l'éco-conception, c'est aussi un argument de vente ? +En effet, un site éco-conçu, c'est un site qui se charge plus vite et qui sera donc plus agréable à utiliser grace à sa fluidité. + +--- + +## 🧠 Documentation + +- [Wikipédia - Wireframe _(design)_](<https://fr.wikipedia.org/wiki/Wireframe_(design)>) +- [Atlassian - User stories](https://www.atlassian.com/fr/agile/project-management/user-stories) + +## 🛠️ Outils + +- [Figma - Outil de création de design](https://www.figma.com/fr-fr/) +- [Adobe XD - Outil de design et de prototypage](https://www.adobe.com/fr/products/xd.html) +- [Sketch - Outil de design](https://www.sketch.com/) +- [GlooMaps - Générateur d'arborescence de pages](https://www.gloomaps.com/) +- [WebAim Contrast Checker](https://webaim.org/resources/contrastchecker/) +- [Contrast Checker](https://contrastchecker.com/) +- [Coolors - Contrast Checker](https://coolors.co/contrast-checker/112a46-acc8e5) +- [Luciole - Police de caractères](https://luciole-vision.com/) +- [Éco-index - Testeur d'éco-conception](https://www.ecoindex.fr/) diff --git a/old/docs/titres-professionnels/DWWM/AT1/CP3.mdx b/old/docs/titres-professionnels/DWWM/AT1/CP3.mdx new file mode 100644 index 0000000..ad86ef9 --- /dev/null +++ b/old/docs/titres-professionnels/DWWM/AT1/CP3.mdx @@ -0,0 +1,286 @@ +--- +sidebar_position: 3 +title: "CP 3" +description: "Synthèse de la CP 3 \"Réaliser des interfaces utilisateur statiques web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04)." +tags: + - DWWM + - Intégration + - Responsive + - HTML + - CSS + - Accessibilité + - Éco-conception + - SEO/Référencement naturel + - Déploiement + - Reverse Proxy + - Front-end + - Serveur web +--- + +import Admonition from "@theme/Admonition"; + +# Réaliser des interfaces utilisateur statiques web ou web mobile + +## 📚 Références + +- REAC _(mise à jour du 03/07/2024)_, pages 19 et 20 +- RE _(mise à jour du 03/07/2024)_, page 10 + +## 📋 En résumé + +Pfiou, les maquettes sont terminées et tu as survécu à mes pavés d'explications ! 💪 +Eh bien... c'est reparti pour un tour, car maintenant tu vas devoir réaliser les interfaces statiques web ou web mobile à partir de ces maquettes. + +<Admonition + type="tip" + icon="🤔" + title="Mais qu'est-ce que interface statique ?" +> + Une interface statique, c'est une interface qui ne bouge pas, qui n'a pas + d'interactions avec l'utilisateur autre que les différents liens qui peuvent + être présents. +</Admonition> + +Pour réaliser ces interfaces, tu vas devoir respecter les maquettes que tu as réalisées précédemment, tout en prenant en compte les besoins en éco-conception et en accessibilité. _(je radote, mais c'est important !)_ + +On va rentrer directement dans le vif du sujet, avec pour commencer... les technologies à utiliser ! +Puisqu'on ne parle pas de dynamique mais de statique, tu vas devoir te tourner vers des technologies front-end, comme le HTML et le CSS. Le JavaScript sera également de la partie, mais qu'à partir de la CP 4 😉 + +Dans un premier temps, tu vas devoir parler du squelette de ton site, c'est-à-dire de la structure HTML. On retrouvera par ailleurs des notions essentielles comme : + +- Les balises sémantiques (pour une meilleure accessibilité et un meilleur référencement) +- Les médias (images, vidéos, sons, etc.) +- Les liens (pour naviguer d'une page à une autre) + +Ensuite, tu vas devoir t'occuper de la mise en forme de ton site, c'est-à-dire du CSS. +N'oublie pas : le site **doit correspondre** aux maquettes que tu as réalisées, et donc respecter la charte graphique. + +<details> + <summary>Petit rappel sur le CSS</summary> + + Le CSS est un langage de style utilisé pour décrire la présentation d'un document écrit en HTML. + Il permet de définir la couleur, la police, la taille et l'espacement des éléments, mais aussi de les positionner sur la page. + + Même si le navigateur stylise déjà certains éléments HTML, il ne faut pas se baser sur les styles par défaut, car ils peuvent varier d'un navigateur à un autre et surtout se casser d'une version à une autre. + + Pour éviter les mauvaises surprises, il est recommandé de réinitialiser les styles par défaut en début de feuille de style, en utilisant par exemple un fichier de réinitialisation comme [Normalize.css](https://necolas.github.io/normalize.css/) ou [Reset CSS de Eric Meyer](https://meyerweb.com/eric/tools/css/reset/). +</details> + +Ensuite, tu vas devoir t'assurer que ton site est bien accessible à tous, rendre tes pages web responsives _(c'est-à-dire qu'elles s'adaptent à tous les types d'écrans)_ et enfin, publier ton site de manière sécurisée. + +La partie éco-conception sera également à prendre en compte, en veillant à ne pas surcharger ton site en médias inutiles ou trop lourds. + +## 👓 L'accessibilité + +Dans la compétence précédente, je t'ai parlé de l'accessibilité et de l'importance de rendre un site accessible à tous. On a notamment vu qu'il est important de maîtriser le contraste, la taille de police, le choix de la police et les intitulés des liens et boutons. + +Mais au delà de ces aspects, on va également pouvoir donner plus de précisions au navigateur sur le contenu de notre site, en utilisant des balises sémantiques ainsi que des attributs spécifiques : `alt` pour les images, `title` pour les liens, mais surtout `aria-*`. + +<details> + <summary>Petit rappel sur les attributs `aria-*`</summary> + + Les attributs `aria-*` sont des attributs spécifiques qui permettent de donner des informations supplémentaires sur les éléments de la page. + Ils sont particulièrement utiles pour les technologies d'assistance, comme les lecteurs d'écran, qui peuvent ainsi mieux comprendre le contenu de la page. + + Par exemple, si tu as un bouton qui ouvre un menu, tu pourrais ajouter l'attribut `aria-expanded="false"` pour indiquer que le menu est fermé, puis le passer à `true` lorsque le menu est ouvert. + + Tu peux retrouver la liste complète des attributs `aria-*` sur le [MDN](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA). +</details> + +## 🌐 Le référencement naturel + +J'entends déjà l'un de mes chers collègues juré s'impatienter : "Et le référencement, on en parle ?" +La réponse : bien sûr que ~non~ oui ! + +Le référencement naturel, ou SEO _(pour Search Engine Optimization)_, est un ensemble de techniques visant à améliorer la visibilité d'un site web dans les moteurs de recherche. +On parlera dans un premier temps de l'optimisation du contenu, avec des balises `<title>`, `<meta>`, `<h1>`, `<h2>`, etc., mais aussi de l'optimisation technique, avec la vitesse de chargement, la compatibilité mobile, les balises sémantiques, etc. + +On retrouvera également des notions de netlinking _(liens entrants et sortants)_, de maillage interne, de balises `<a>` et `<img>`, de sitemap, de robots.txt, etc. + +Ça fait beaucoup, non ? 😅 +Disons que c'est un vaste sujet et qui, même s'il ne fait pas toujours rêver, est indispensable pour que ton site soit visible sur les moteurs de recherche. + +Difficile de dire au client "Désolé, votre site n'apparaît pas sur Google et je m'en fiche" ! + +## 🌳 L'éco-conception + +On sait déjà que l'éco-conception c'est l'art de concevoir un site web de manière à réduire son impact environnemental, et que pour cela, il faut éviter d'intégrer beaucoup d'images et autres médias. +Mais est-ce que ça veut pour autant dire que tu dois te contenter de sites tout moches et tout gris ? Non ! + +En HTML, au delà de l'import des médias, on ne va pas avoir beaucoup de contrôle sur la consommation énergétique. +Mais pas aucun contrôle ! + +L'action la plus primordiale sur les images, c'est dans un premier temps d'utiliser des ressources compressées, mais aussi de les dimensionner correctement. + +<Admonition + type="quote" + title="En CSS, ça prend 2 secondes de redimensionner une image" +> + Effectivement, il est possible de redimensionner les images en leur appliquant une largeur et une hauteur. + Mais l'image reste chargée en entier, même si elle n'est pas affichée dans sa totalité. + Ça voudrait donc dire imposer au navigateur de télécharger une image en haute résolution pour l'afficher en miniature : pas terrible. + + Pour éviter ça, on va dans un premier temps réduire et compresser l'image et on peut également utiliser l'attribut `srcset` qui permet de charger une image en fonction de la taille de l'écran. + +</Admonition> + +Maintenant que nos images sont prêtes, il faut que je vous dise que ce n'est pas tout ! +Il faut également penser au format de nos images. La plupart du temps, on croise des images en JPEG, PNG ou GIF, mais il existe un format plus récent et plus performant : le WebP. _(et non, ce n'est pas un Pokémon)_ + +<details> + <summary>Et le format SVG ? Ce n'est pas bien ?</summary> + + Si, si, le format SVG est très bien ! + + C'est vrai que je ne l'évoque pas ici, mais le SVG est un format d'image vectorielle qui a l'avantage d'être léger et de s'adapter à toutes les tailles d'écran sans créer de flou ou pixélisation. + + Il est particulièrement adapté pour les icônes, logos et autres éléments graphiques simples. +</details> + +Allez cette fois-ci, on ne touche plus aux images et leur format, par contre "comment peut-on les charger ?". +Celui qui répond "avec une simple balise `<img>` et son attribut `src`" a tout faux ! _(enfin non, pas tout faux, mais pas tout à fait juste)_ + +On va évidemment utiliser une balise `<img>`, mais on va également utiliser des techniques de chargement différé, comme le **lazy loading**, qui permet de charger les images uniquement lorsqu'elles sont visibles à l'écran. + +En tant que juré, j'ai souvent vu des projets qui exploitent un script JS pour faire du lazy loading, mais il existe un attribut HTML qui permet de faire ça très simplement : `loading="lazy"`. +De cette manière, nos images ne seront chargées que si elles sont visibles à l'écran, ce qui permet de réduire la consommation de bande passante et donc l'impact environnemental. + +<Admonition + type="tip" + icon="🧪" + title="Voici un exemple concret de ce qu'on vient de voir" +> + ```html {3-4,6} + <img + src="clairiere.jpg" + srcset="clairiere-480w.webp 480w, clairiere-800w.webp 800w" + sizes="(max-width: 600px) 480px, 800px" + alt="Une clairière verdoyante" + loading="lazy" + > + ``` +</Admonition> + +Allez, arrêtons-nous là pour l'éco-conception ! + +## 📱 Le responsive design + +Maintenant que notre site est éco-conçu, accessible et optimisé pour le référencement, il est temps de s'attaquer à la partie responsive design. Tu connais certainement déjà le principe, mais pour les autres, le responsive design c'est le fait de rendre un site web adaptatif et lisible sur tous les types d'écrans, que ce soit un ordinateur, une tablette ou un smartphone. + +Pour cela, nous avons plusieurs possibilités : + + - Les media queries _(pour adapter le style en fonction de la taille de l'écran et du type de support)_ + - Les unités relatives _(pour adapter la taille des éléments en fonction de la taille de la police ou d'un élément parent)_ + - `em` : unité relative à la taille de la police de l'élément parent + - `rem` : unité relative à la taille de la police de l'élément racine + - `%` : unité relative à la taille de l'élément parent + - `vw/vh` : unité relative à la largeur de la fenêtre _(ainsi que les variantes `lvh/lvw`, `svh/svw` et `dvh/dvw`)_ + - Les grid et flexbox _(pour organiser les éléments de manière flexible et adaptative)_ + +Il est également possible d'utiliser des frameworks CSS, comme Tailwind CSS ou Bootstrap, qui proposent des composants et des classes prédéfinies pour faciliter la mise en place du responsive design. + +<details> + <summary>Le cas de Bootstrap</summary> + + Alors je vais faire le vieux râleur, mais Bootstrap c'est bien, mais c'est pas bien. + + <iframe + src="https://giphy.com/embed/26ufdipQqU2lhNA4g" + width="480" + height="480" + className="mx-auto my-4" + ></iframe> + + Mais alors, pourquoi ce n'est pas bien ? + Pour faire simple : Bootstrap c'est lourd. Très lourd. + + Il propose beaucoup de fonctionnalités, mais il est très rare de toutes les utiliser et derrière ça implique que le navigateur va charger du code inutile, ce qui va ralentir le chargement de la page. + + Si tu veux utiliser un framework CSS, je te conseille plutôt de te tourner vers Tailwind CSS, qui propose une approche plus modulaire et plus légère. + Tailwind CSS viendra te générer un fichier CSS final basé **uniquement** sur les classes que tu utilises, ce qui permet de réduire la taille du fichier final. + + Comme ça, adieu les 200Ko de CSS pour un site qui n'en fait que 20Ko ! 🚀 +</details> + +## 🔒 Déploiement et sécurité + +Dernière étape avant de pouvoir souffler un peu : le déploiement de ton site. + +Pour déployer ton site, tu vas devoir choisir un hébergeur, un nom de domaine, configurer un serveur, transférer tes fichiers, etc. +Tu peux totalement utiliser des services "gratuits", comme Netlify ou Vercel, mais assure-toi que le service que tu choisis respecte les normes de sécurité, les normes de respect sur les données personnelles, mais surtout que tu sois en mesure de déployer ton site sans ces outils ! + +Enfin, n'oublie pas de sécuriser ton site, en utilisant un certificat SSL par exemple. + +<Admonition + type="tip" + icon="🤔" + title="Un certificat quoi ?" +> +Un certificat SSL est un fichier de données qui sécurise les échanges de données entre un serveur et un navigateur en cryptant les données transmises. Il garantit que les données sont sécurisées et ne peuvent pas être interceptées. + +Tu peux en générer un gratuitement avec [Let's Encrypt](https://letsencrypt.org/), mais il faudra le renouveler tous les 3 mois. + +</Admonition> + +Si tu as la main sur la configuration du serveur, tu pourras également mettre en place des règles de sécurité, comme le CSP _(Content Security Policy)_, qui permet de limiter les risques de failles XSS _(Cross-Site Scripting)_. +Tu peux également activer la compression Gzip pour réduire la taille des fichiers envoyés au navigateur afin d'accélérer le chargement du site et de répondre davantage aux critères d'éco-conception. + +## 🎯 Critères d'évaluation + +- L'interface est conforme à la maquette et les besoins en éco-conception sont pris en compte +- L'interface tient compte de l'expérience utilisateur, y compris pour les personnes en situation de handicap +- L'interface respecte les recommandations de sécurité liées aux applications web ou web mobile +- L'interface s'adapte au type d'utilisation de l'application, et notamment à la taille, au type et à la disposition du support, y compris pour les équipements mobiles +- La règlementation en vigueur est respectée, y compris celle relative à l'accessibilité +- Le site est publié de manière sécurisée +- Le site est visible sur les moteurs de recherche et le référencement dépend du public + +## 🤯 Aller plus loin _(hors référentiel)_ + +Tu utilises un site qui tourne sur un port spécifique, mais tu aimerais bien que ton site soit accessible sur les ports 80 _(HTTP)_ et 443 _(HTTPS)_ ? +Pour ça il y a une merveilleuse technologie qui s'appelle le reverse proxy ! + +Le reverse proxy, c'est un serveur qui va recevoir les requêtes HTTP et les rediriger vers le serveur qui héberge le site. Tu peux très bien faire la redirection sur le même serveur, c'est d'ailleurs ce qu'on va faire ici. + +<Admonition type="example" title="Exemple concret"> + Prenons un exemple concret, le cas d'une application qui tourne sur le port 3000, mais que l'on souhaite rendre accessible sur le port 80. + + Avec Nginx, on peut faire ça très simplement en créant un fichier de configuration dans `/etc/nginx/sites-available/`. + + ```nginx showLineNumbers + server { + listen 80; + listen [::]:80; + server_name monsite.fr; + + location / { + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; # On transmet l'adresse IP du client + proxy_set_header Host $host; # On transmet le nom de domaine + proxy_pass http://localhost:3000; # On redirige les requêtes vers le port 3000, où tourne notre application + } + } + ``` + + ... Tadaaa ! C'est tout ! + Bien entendu, il va falloir activer ce site avec un lien symbolique dans `/etc/nginx/sites-enabled/` et redémarrer Nginx pour que les changements soient pris en compte. + Si tu souhaites également rajouter le support du HTTPS, tu peux utiliser [Certbot](https://certbot.eff.org/) pour générer un certificat Let's Encrypt. +</Admonition> + +--- + +## 🧠 Documentations + +- [Wikipédia - Accessibilité web](https://fr.wikipedia.org/wiki/Accessibilit%C3%A9_du_web) +- [Wikipédia - Référencement naturel](https://fr.wikipedia.org/wiki/R%C3%A9f%C3%A9rencement_naturel) +- [Wikipédia - Éco-conception numérique](https://fr.wikipedia.org/wiki/%C3%89coconception) +- [MDN - Accessible Rich Internet Applications _(ARIA)_](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) +- [Let's Encrypt](https://letsencrypt.org/) + +## 🛠️ Outils + +- [Certbot](https://certbot.eff.org/) +- [WebAim Contrast Checker](https://webaim.org/resources/contrastchecker/) +- [Contrast Checker](https://contrastchecker.com/) +- [Coolors - Contrast Checker](https://coolors.co/contrast-checker/112a46-acc8e5) +- [Tailwind CSS](https://tailwindcss.com/) +- [Bootstrap](https://getbootstrap.com/) diff --git a/old/docs/titres-professionnels/DWWM/AT1/CP4.mdx b/old/docs/titres-professionnels/DWWM/AT1/CP4.mdx new file mode 100644 index 0000000..86efb59 --- /dev/null +++ b/old/docs/titres-professionnels/DWWM/AT1/CP4.mdx @@ -0,0 +1,274 @@ +--- +sidebar_position: 4 +title: "CP 4" +description: "Synthèse de la CP 4 \"Développer la partie dynamique des interfaces utilisateur web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04)." +tags: + - DWWM + - JavaScript/TypeScript + - Front-end + - Eco-conception + - Accessibilité + - SEO/Référencement naturel +--- + +import Admonition from "@theme/Admonition"; +import TabItem from "@theme/TabItem"; +import Tabs from "@theme/Tabs"; + +# Développer la partie dynamique des interfaces utilisateur web ou web mobile + +## 📚 Références + +- REAC _(mise à jour du 03/07/2024)_, pages 21 et 22 +- RE _(mise à jour du 03/07/2024)_, page 10 + +## 📋 En résumé + +Ça y est, on commence à parler développement pour de vrai maintenant ! On quitte doucement l'intégration pour maintenant rajouter de l'interactivité à nos interfaces utilisateur, ce qui veut dire "utilisation d'un langage script côté client", soit... + +<iframe + src="https://giphy.com/embed/SvFocn0wNMx0iv2rYz" + width="480" + height="480" + className="mx-auto my-4" +></iframe> + +C'est le meilleur moment pour parler de nombreuses fonctionnalités implémentées sur ton application avec JavaScript, comme : + +- Les formulaires dynamiques _(ajout/suppression de champs, vérification des données, etc.)_ +- Les animations _(chargement d'un témoin de chargement, apparition/disparition d'éléments, etc.)_ +- Les interactions avec l'utilisateur _(drag and drop, ouverture de fenêtre modale, etc.)_ +- Les appels à des services web _(API REST, etc.)_ + +<Admonition type="warning" title="Consommation d'API"> + Bien que j'ai mentionné le fait que faire des appels à des services web corresponde entièrement à cette CP, il est important de noter que la consommation d'API est une compétence à part entière, qui sera abordée dans la CP 7 qui correspond à la mise en place de services web et composants métier. + + Ne te focalise donc pas sur ce que fait l'API en arrière plan, concentre toi sur comment configurer tes requêtes et comment traiter les réponses obtenues ! +</Admonition> + +<Admonition type="quote" icon="🤔" title="Mon site est fait avec React/Angular/Vue.js, donc je valide automatiquement cette CP ?"> + Pas si vite ! 😏 + Effectivement, ton site répond _(en théorie)_ en tous points pour la compétence actuelle, mais il est important de montrer que tu sais comment fonctionne le JavaScript "vanilla" _(c'est-à-dire sans framework ou bibliothèque)_. + + Si tu as utilisé un framework, tu peux tout à fait montrer des extraits de code en JavaScript pur pour montrer que tu sais comment ça fonctionne "sous le capot" ! + + Mais on ne va pas se le cacher, si tu as réussi à réaliser un projet avec un framework, c'est déjà un très bon point pour toi qui permet de démontrer que tu as de bonnes connaissances en JavaScript. + Cependant il va potentiellement y avoir un défaut majeur sur ton projet : le référencement naturel _(SEO)_. +</Admonition> + +<details> + <summary> + Référencement d'un site généré côté client _(comme React, Vue.js etc)_ + </summary> + + Les sites web générés côté client _(ou "client-side rendering")_ ont un défaut majeur : ils ne sont pas très bien référencés par les moteurs de recherche. + + En effet, les moteurs de recherche ont du mal à lire le contenu d'un site généré côté client, car ils n'exécutent pas le JavaScript. + C'est pour cela qu'il est recommandé de mettre en place un rendu côté serveur _(ou "server-side rendering")_ pour améliorer le référencement naturel de ton site. + + Si tu veux en savoir plus sur le sujet, tu peux consulter [cet article de Google](https://web.dev/articles/rendering-on-the-web?hl=fr#rendering-terminology). + + De mon côté, je recommande énormément de passer par le framework [Vike](https://vike.dev/) qui permet de générer des sites web ultra-rapides avec un rendu côté serveur et un rendu côté client, le tout en utilisant Vue.js, React ou (presque) n'importe quel autre framework front-end JavaScript ! + + Tu as aussi la possibilité d'utiliser [Next.js](https://nextjs.org/) pour React, [Nuxt.js](https://nuxtjs.org/) pour Vue.js ou [SvelteKit](https://kit.svelte.dev/) pour Svelte qui permettent de faire du rendu côté serveur. +</details> + +## ➕ Informations complémentaires + +Je me permets également de lâcher une bombe sur une certaine techno JS : **jQuery**. +Bon sang, celui-là il me fait penser à un vieux pote qui a pris un coup de vieux... 😅 + +<details> + <summary>jQuery, c'est quoi ?</summary> + + jQuery est une bibliothèque JavaScript qui a été très populaire dans les années 2000 et 2010. + Elle a été créée pour simplifier l'écriture de scripts JavaScript et pour faciliter la manipulation du DOM. + + jQuery a été très utilisée pour les animations, les requêtes AJAX, la manipulation du DOM, etc. + Mais depuis l'arrivée des frameworks front-end comme React, Angular ou Vue.js, jQuery a perdu de sa superbe et est de moins en moins utilisée. + + Cependant, il est toujours bon de connaître jQuery, car il est possible que tu tombes sur un projet qui l'utilise encore, comme sur des templates Wordpress qui commencent à dater par exemple. +</details> + +Mais alors, pourquoi je te parle de jQuery ? + +Eh bien.. pour faire simple, aujourd'hui jQuery est relativement obsolète et surtout très lourd pour ce que ça rajoute à un projet. +Dans la mesure du possible, il est recommandé de ne pas utiliser jQuery pour un nouveau projet, et de préférer JavaScript "vanilla" ou un framework ou bibliothèque front-end comme React, Angular ou Vue.js _(attention, d'un point de vue éco-conception l'utilisation d'un framework n'est pas forcément la meilleure solution)_. + +<details> + <summary> + Mais comment je vais faire pour mes consommations d'API, vu que j'utilisais `jQuery.ajax()` ?! + </summary> + + Tout doux, tout doux, il existe une solution ! 😎 + + Si je te parle des requêtes XHR _(XMLHttpRequest)_ tu me dis... ? + + > "Mais c'est vieux ça, c'est pas du tout à la mode !" + + Et tu as raison, mais si maintenant je te dis qu'il y a une autre solution, native, plus moderne et plus performante, tu me dis... ? + + > "Fetch !" + + **Et sinon, pour faire simple :** + + Fetch est une API plus moderne et plus simple à utiliser que les requêtes XHR, et elle est supportée par tous les navigateurs modernes. + Elle permet de faire des requêtes HTTP de manière asynchrone et de gérer les réponses de manière plus simple. + + <Tabs> + <TabItem value="🥉 XHR"> + ```javascript showLineNumbers + const xhr = new XMLHttpRequest(); + xhr.open("GET", "https://api.exemple.com/data", true); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4 && xhr.status === 200) { + console.log(JSON.parse(xhr.responseText)); + } + }; + xhr.send(); + ``` + </TabItem> + + <TabItem value="🥈 jQuery"> + ```javascript showLineNumbers + $.ajax({ + url: "https://api.exemple.com/data", + method: "GET", + success: function (data) { + console.log(data); + }, + }); + ``` + </TabItem> + + <TabItem value="🥇🏆 Fetch"> + ```javascript showLineNumbers + fetch("https://api.exemple.com/data") + .then((response) => response.json()) + .then((data) => console.log(data)); + ``` + </TabItem> + </Tabs> + + Non seulement `fetch` est plus simple à utiliser et comprendre _(contrairement à XMLHttpRequest)_ mais elle est également plus légère que `jQuery.ajax()` puisqu'elle est native au navigateur ! Alors pourquoi s'en priver ? 😉 +</details> + +## 🎯 Critères d'évaluation + +- L'interface utilisateur est conforme au dossier de conception +- L'interface est dynamique et l'expérience utilisateur est améliorée, y compris pour les personnes en situation de handicap +- Les recommandations de sécurité liées aux applications web et web mobile sont respectées +- La règlementation en vigueur sont respectées, y compris celle relative à l'accessibilité +- Le code est documenté, y compris en anglais _(niveau B1 CECRL pour l'anglais)_ +- Le jeu d'essai fonctionnel est complet et les tests unitaires sont réalisés pour les composants concernés +- Les tests de sécurité sont réalisés + +## 🤯 Aller plus loin _(hors référentiel)_ + +Plus tôt, dans la CP 3, je t'ai parlé d'une astuce d'éco-conception pour différer le chargement des images avec l'attribut `loading="lazy"` sur les balises `<img>`. Mais on peut aller encore plus loin que simplement différer le chargement des images ! + +On peut également différer le chargement des scripts JavaScript avec l'attribut defer sur les balises `<script>`. + +<details> + <summary>`defer` sur les balises `<script>`</summary> + + Si ça te rassure, ça ne cassera pas ton site web et au contraire, ça peut même l'améliorer ! + L'intérêt premier de cet attribut est de différer l'exécution du script jusqu'à ce que le document HTML soit entièrement chargé. + + L'avantage de cette technique est qu'on va demander au navigateur de charger le script en parallèle du reste du contenu, sans bloquer le chargement de la page. + Comme ça : pas de page blanche pendant le chargement du script, et le script sera exécuté une fois que le navigateur aura fini de charger le reste de la page ! + + ```html + <script src="script.js" defer></script> + ``` +</details> + +Maintenant, on sait qu'on peut charger de manière "asynchrone" nos images et nos scripts, mais ce n'est toujours pas terminé.. 😏 + +Prenons l'exemple d'un site qui incorpore plusieurs dizaines de vidéos Youtube sur une seule page. On aura donc des `<iframe>` qui vont charger des vidéos Youtube, et ça, c'est pas très éco-responsable... 😕 +Mais on peut améliorer notre page en mettant en place une légère interaction JavaScript pour charger l'iframe uniquement si l'utilisateur clique sur un bouton ! + +<details> + + <summary> + Chargement d'un iframe Youtube uniquement au clic de l'utilisateur + </summary> + + <Tabs> + <TabItem value="HTML - 1ère étape"> + ```html showLineNumbers + <div + className="iframe-container" + data-src="https://www.youtube.com/watch?v=dQw4w9WgXcQ" + data-width="1280" + data-height="720" + > + <img src="https://img.youtube.com/vi/dQw4w9WgXcQ/maxresdefault.jpg" loading="lazy"> + <button type="button" className="iframe-loader">Charger la vidéo</button> + </div> + ``` + </TabItem> + + <TabItem value="JavaScript - 2ème étape"> + ```javascript showLineNumbers + document.querySelectorAll('button.iframe-loader').forEach((button: HTMLButtonElement) => { + // Pour chaque bouton qui doit charger un iframe, on écoute le clic dessus + button.addEventListener('click', () => { + // On récupère le container de l'iframe, qui dans notre exemple est la balise parente du bouton + const container: HTMLElement | null = button.closest('.iframe-container'); + + // Si le container n'existe pas, on arrête l'exécution de la fonction pour éviter un plantage + if (!container) return; + + const { src, width, height } = container.dataset as { + src: string, + width: string, + height: string + }; + + // On prépare notre iframe avec les données stockées dans le container + const iframe = document.createElement('iframe'); + iframe.setAttribute('src', src); + iframe.setAttribute('width', width); + iframe.setAttribute('height', height); + + // On supprime le contenu du container pour y ajouter notre iframe + container.innerHTML = ''; + container.appendChild(iframe); + }); + }); + ``` + </TabItem> + </Tabs> +</details> + +<details> + <summary> + Mais ça fait beaucoup de code juste pour charger des iframes, c'est vraiment + nécessaire ? + </summary> + + Pour être franc, il n'y a pas de solution idéale. Mais on peut améliorer les performances du site et gagner en sobriété numérique en ne chargeant pas des ressources lourdes inutilement. + + Est-ce que tu savais que le simple fait de charger un iframe d'une vidéo Youtube demande au navigateur de faire une dizaine de requêtes HTTP pour charger la vidéo, les scripts et les styles de Youtube ? Imagine si on mixe plusieurs sources pour nos iframes, comme Dailymotion, Vimeo, etc. 😱 + + Et le pire dans tout ça, c'est que le navigateur va charger ces ressources même si l'utilisateur ne comptait pas regarder la vidéo ! + Alors autant faire en sorte que notre site réponde au besoin de l'utilisateur, sans pour autant supprimer les fonctionnalités _(comme nos iframes)_ qui peuvent être utiles. +</details> + +--- + +## 🧠 Documentations + +- [MDN Web Docs - Attribut `loading` sur les balises `<img>`](https://developer.mozilla.org/fr/docs/Web/HTML/Element/img#loading) +- [MDN Web Docs - Attribut `defer` sur les balises `<script>`](https://developer.mozilla.org/fr/docs/Web/HTML/Element/script#defer) +- [MDN Web Docs - Attribut `data-*`](https://developer.mozilla.org/fr/docs/Web/HTML/Global_attributes/data-*) +- [MDN Web Docs - `fetch`](https://developer.mozilla.org/fr/docs/Web/API/Fetch_API) +- [Wikipédia - API](https://fr.wikipedia.org/wiki/Interface_de_programmation) + +## 🛠️ Outils + +- [Vike - Framework front-end pour un rendu côté serveur et côté client](https://vike.dev/) +- [Next.js - Framework pour React avec rendu côté serveur](https://nextjs.org/) +- [Nuxt.js - Framework pour Vue.js avec rendu côté serveur](https://nuxtjs.org/) +- [SvelteKit - Framework pour Svelte avec rendu côté serveur](https://kit.svelte.dev/) diff --git a/old/docs/titres-professionnels/DWWM/AT1/_category_.json b/old/docs/titres-professionnels/DWWM/AT1/_category_.json new file mode 100644 index 0000000..188ab02 --- /dev/null +++ b/old/docs/titres-professionnels/DWWM/AT1/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Activité Type 1", + "position": 3 +} diff --git a/old/docs/titres-professionnels/DWWM/AT2/CP5.mdx b/old/docs/titres-professionnels/DWWM/AT2/CP5.mdx new file mode 100644 index 0000000..e4d2ad5 --- /dev/null +++ b/old/docs/titres-professionnels/DWWM/AT2/CP5.mdx @@ -0,0 +1,435 @@ +--- +sidebar_position: 5 +title: "CP 5" +description: "Synthèse de la CP 5 \"Mettre en place une base de données relationnelle\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04)." +tags: + - DWWM + - Conception + - Modélisation + - Base de données + - Merise + - Dictionnaire de Données + - Modèle Conceptuel de Données (MCD) + - Modèle Logique de Données (MLD) + - Modèle Relationnel de Données (MRD) + - Modèle Physique de Données (MPD) + - SQL + - Back-end +--- + +import Admonition from "@theme/Admonition"; + +# Mettre en place une base de données relationnelle + +## 📚 Références + +- REAC _(mise à jour du 03/07/2024)_, pages 23 et 24 +- RE _(mise à jour du 03/07/2024)_, page 11 + +## 📋 En résumé + +Le front-end : c'est **fini** ! +Mais avant de nous attaquer au back-end d'un point de vue code, on va voir ce qui est attendu dans cette CP qui parle de la mise en place d'une base de données relationnelle. + +<Admonition + type="quote" + title="Mais attend ! J'ai juste une base de données non relationnelle à mettre en place, c'est bon ?" +> + J'aurai aimé te dire que oui, mais ça va être un poil trop léger pour cette compétence... + Mais garde sous la main ta base de données non relationnelles + pour la prochaine compétence, ça te servira 😉 +</Admonition> + +## 🎨 Modélisation de la base de données + +Commençons par le commencement : **comment créer une base de données relationnelle ?** + +Il y a pléthore de possibilités, mais ici on va s'attarder sur une méthodologie française _(cocorico 🐓)_ qui est la méthode **Merise**. +On va se baser sur différents schémas issus de cette méthode pour créer notre base de données relationnelle, à savoir : + +1. Le **dictionnaire des données** : qui va recenser toutes les données que l'on va stocker par la suite dans notre base de données +2. Le **MCD** _(Modèle Conceptuel des Données)_ : qui va représenter les données et leurs relations, sous la forme d'entités et d'associations dans un schéma graphique +3. Le **MLD** _(Modèle Logique des Données)_ : qui va représenter les données sous forme de tables et de relations, dans un schéma graphique +4. Le **MRD** _(Modèle Relationnel des Données)_ : qui va représenter les mêmes informations que le MLD, mais cette fois-ci en format texte +5. Le **MPD** _(Modèle Physique des Données)_ : qui va représenter les données sous forme de tables et de relations, en intégrant les types de données et les contraintes + +Tu remarqueras que j'y ai indiqué un ordre dans la liste ci-dessus. +Si je peux te donner un indice : ce n'est pas pour rien que c'est une liste ordonnée 😉 + +Donc si tu réalises un dictionnaire de données après avoir fait ton MPD, c'est que tu n'as pas compris l'objectif du dictionnaire de données ! _(par exemple)_ + +### 🗂️ Le dictionnaire des données + +L'objectif du dictionnaire des données est de recenser toutes les données que l'on va stocker dans notre base de données. +L'idée est qu'il soit très simple et compréhensible par tout le monde, même par quelqu'un qui n'y connaît rien en base de données. + +<details> + <summary>Exemple de dictionnaire de données</summary> + + | Nom de la donnée | Format de la données | Longueur maximale attendue | Description de la donnée | Exemple de donnée | + | ---------------------------------- | -------------------- | -------------------------- | ------------------------------- | ---------------------- | + | Numéro d'identification du salarié | Alphanumérique | 30 | - | - | + | Prénom du salarié | Alphabétique | 30 | - | Jean | + | Nom du salarié | Alphabétique | 30 | - | Dupont | + | Adresse email du salarié | Alphanumérique | 50 | - | jean.dupont@exemple.fr | + | Adresse postale du salarié | Alphanumérique | 60 | - | 1 rue de la Paix | + | Code postal du salarié | Alphanumérique | 5 | - | 75000 | + | Ville du salarié | Alphabétique | 30 | - | Paris | + | Mot de passe du salarié | Alphanumérique | 80 | Mot de passe sécurisé _(hashé)_ | - | + + ... et ainsi de suite pour toutes les données que tu vas stocker dans ta base de données. +</details> + +On peut constater qu'on ne fait apparaître aucun terme technique, on se contente de décrire les données de manière simple et compréhensible. +Grossièrement, voici les formats que l'on peut retrouver dans un dictionnaire des données : + +- **Alphabétique** : pour les chaînes de caractères contenant uniquement des lettres +- **Alphanumérique** : pour les chaînes de caractères contenant des lettres et des chiffres +- **Numérique** : pour les nombres +- **Date** : pour les dates +- **Vrai/Faux** : pour les données booléennes + +<details> + <summary> + Mais pourquoi le code postal est marqué en alphanumérique ? 🤔 + </summary> + + C'est une très bonne question figure-toi ! + + En France, le code postal est composé de 5 chiffres, mais il peut arriver que certains codes postaux commencent par un zéro. + Or, si on stocke le code postal en numérique, on risque de perdre ce zéro au début du code postal. + + Exemple : + + - `75000` -> `75000` + - `01000` -> `1000` _(on a perdu le zéro au début)_ + + On retrouve également ce cas de figure pour les numéros de téléphone, qui peuvent commencer par un zéro. + + Toutefois il faut également prendre en compte quelque chose... ici, l'exemple ne concerne que la France. + Si demain on te demande de prévoir le fait que ton application puisse être utilisée dans un autre pays, il faudra peut-être revoir ce choix de format pour le code postal. + Certains pays ont des codes postaux composés de lettres et de chiffres, d'autres vont avoir jusqu'à 9 caractères, etc. + + ⬇️ **Cas de figure spécifique, et pourtant très important à connaître** ⬇️ + + Prenons l'exemple où l'on fait une application pour la France **uniquement**. + En France, on considère que l'indicatif des numéros de téléphone est `+33`. On serait donc tenté de se dire : + + > "Pas besoin de stocker l'indicatif puisque je veux uniquement enregistrer des numéros de téléphones français." + + Hmm.. vraiment ? + Pourtant : la Réunion, la Guadeloupe, la Martinique, la Guyane et Mayotte sont bien des départements français, non ? + + En regardant de plus près, les numéros de téléphone de ces départements ne commencent pas par `+33` mais par `+262` pour la Réunion, `+590` pour la Guadeloupe, etc. + + Il te faudra donc stocker les numéros de téléphone avec 13 caractères _(ou plus)_ pour être sûr de ne pas perdre d'informations et t'assurer que ton application puisse être utilisée partout en France et/ou dans le monde selon les besoins ! + + **Conclusion de ce pavé :** + Pensez à vous renseigner sur les pays que vous ciblez pour votre application, ça peut vous éviter des erreurs de conception 😉 +</details> + +### 📊 Le MCD + +Tout comme le dictionnaire des données, le MCD a pour objectif de représenter les données et leurs relations, mais cette fois-ci sous forme graphique. +On va également découper davantage nos données en les faisant apparaître dans des entités distinctes. + +On fera attention à ne pas être technique, comme pour le dictionnaire des données, et on va se contenter de représenter les données et leurs relations. +Ce document est avant tout destiné à être compris par tout le monde, notamment le client final. + +<details> + <summary>Exemple de MCD</summary> + + ![Exemple de MCD, modèle conceptuel de données, Merise](@site/static/merise/mcd.webp) +</details> + +Sur ce schéma, on peut distinguer deux entités : `Salarié` et `Congé`. Elles sont représentées par des rectangles et contiennent leurs différentes propriétés. +On peut également remarquer d'autres éléments, comme des "bulles" bleues qui représentent les relations entre les entités. On y retrouve des verbes à l'infinitif qui décrivent la relation entre les entités. + +Mais entre ces verbes et les entités, il y a des chiffres _(et parfois un `n` qui se balade)_, ce sont les fameuses **cardinalités**. + +Ce schéma nous apprend donc que : + +- `Salarié` - GÉRER - `Salarié` _(Relation réflexive)_ + - Un même salarié peut gérer plusieurs autres salariés _(`Salarié` 0,n - GÉRER - `Salarié` 0,1)_ + - Un salarié peut n'avoir aucun ou qu'un seul manager _(`Salarié` 0,1 - GÉRER - `Salarié` 0,n)_ +- `Salarié` - RÉALISER - `Tâche` + - Un salarié peut réaliser plusieurs tâches _(`Salarié` 0,n - RÉALISER - `Tâche` 1,n)_ + - Une tâche est réalisée par un ou plusieurs salariés _(`Tâche` 0,n - RÉALISER - `Salarié` 1,n)_ +- `Tâche` - ATTRIBUER - `Projet` + - Une tâche est attribuée à un seul projet _(`Tâche` 1,1 - ATTRIBUER - `Projet` 0,n)_ + - Un projet peut contenir plusieurs tâches _(`Projet` 0,n - ATTRIBUER - `Tâche` 1,1)_ + +<details> + <summary>Mais pourquoi il n'y a pas les ID dans le schéma ? 🤔</summary> + + Ni les clés étrangères d'ailleurs... + Tout simplement parce que les ID ne sont pas des données à proprement parler. + Ce sont avant tout des identifiants qui permettent de différencier les entités entre elles, d'un point de vue technique. + + Sauf s'il s'agit d'une donnée concrète _(comme le numéro de badge de salarié, un numéro de sécurité sociale, un ISBN pour un livre, etc.)_, + on ne les fait pas apparaître dans le MCD. Cependant, on peut noter que ce n'est pas pour autant que nous n'avons pas de discriminant dans nos entités ! + On peut très bien voir la propriété `adresse email` dans l'entité `Salarié` qui pourrait servir de discriminant, puisque chaque salarié a une adresse email unique. +</details> + +Ce document peut être réalisé à l'aide de divers outils, mais je vous recommande chaudement le logiciel [Looping](https://www.looping.fr/) qui est gratuit et très simple d'utilisation. +Certes... il semble tout droit sorti des années 90, mais il est adapté à la réalisation de schémas de la méthodologie Merise ! + +Et si tu utilises ou utilisais [Mocodo](https://www.mocodo.net/), fais très attention ! Certes, l'outil est très puissant et permet tout de même de réaliser des MCD, mais contrairement à Looping il ne va pas t'imposer de respecter les règles de la méthode Merise. + +Pratique d'un côté, mais pas fiable donc... à moins que tu sois un⸱e expert⸱e en Merise et que tu veuilles te passer de Looping ! + +### 📈 Le MLD + +Cette fois-ci, on va passer à la vitesse supérieure en représentant nos données sous forme de tables et de relations ! +Les termes techniques ont alors entièrement leur place dans ce document, puisqu'il est destiné aux développeurs qui vont mettre en place la base de données. + +<details> + <summary>Exemple de MLD</summary> + + ![Exemple de MLD, modèle logique de données, Merise](@site/static/merise/mld.webp) +</details> + +Et voilà un peu de changement ! + +Déjà, on peut dire au revoir aux entités et aux relations, et bonjour aux tables et aux clés étrangères 🎉 ! +On peut aussi voir que certaines de nos propriétés ont changé de nom, comme `numéro d'identification` de l'entité `Salarié` qui est devenu `id` pour la table `employee`. + +On peut également voir que nos relations ont été transformées en clés étrangères, qui permettent de lier nos tables entre elles et si nécessaire : en table de jointure _(comme pour la relation `Salarié` - RÉALISER - `Tâche`)_. + +Et pour finir : tous les termes ont été traduits du français vers l'anglais. + +<Admonition type="warning" title="Langue utilisée dans la base de données"> + De manière simple : il n'y a pas de règle. Cependant, il est recommandé d'utiliser une seule langue pour nommer les tables, les colonnes, les clés, etc dans une base de données. + Pour choisir cette langue, il est recommandé de se baser sur la langue de travail de l'entreprise ou de l'équipe de développement. + + Si tu travailles exclusivement avec des francophones : tu as bien évidemment le droit de nommer tes tables et colonnes en français. + Cependant, si au moindre moment tu as besoin de travailler avec des anglophones ou des personnes qui ne sont pas francophones : Shakespeare sera ton ami 📜 + + _(Bon, si tu travailles dans une entreprise espagnole, tu peux aussi opter pour l'espagnol à contrario du français... mais tu as compris l'idée)_ + + Le plus important dans l'histoire, c'est d'être **cohérent** dans le choix de la langue utilisée. + Tu as commencé par utiliser de l'anglais pour parler des éléments techniques ? Alors tu te dois de tout faire en anglais. +</Admonition> + +### 📑 Le MRD + +La plupart du temps, le MRD est réalisé sous le nom de MLD mais en format texte. +En réalité, le MRD est la représentation textuelle du MLD. + +Mais si ça te rassure, on ne t'en voudra pas si tu parles de "MLD" à la place de "MRD" 😅 + +On peut donc dire qu'au choix, on peut soit faire un MLD sous forme de schéma, soit sous forme de texte _(et dans ce cas, on parle de MRD)_. +Mais si tu as l'occasion de faire les deux, c'est encore mieux ! + +<details> + <summary>Exemple de MRD</summary> + + employee(<u className="font-bold underline">id</u>, **email**, firstname, lastname, postal_address, postal_code, city, password, <i className="italic">#manager_id</i>); + project(<u className="font-bold underline">id</u>, name); + task(<u className="font-bold underline">id</u>, name, is_done, <i className="italic">#project_id</i>); + employee_has_task(#employee_id, <i className="italic">#task_id</i>); +</details> + +Si tu veux comprendre pourquoi certains éléments sont en gras, en italique ou soulignés, voici un court résumé : + +- <u className="underline">Sous-ligné</u> : Clé primaire _(en gras également car unique, + voir ci-dessous)_ +- **Gras** : Donnée unique au sein de la table +- _Italique_ : Clé étrangère + +### 📦 Le MPD + +Maintenant on ne rigole plus, on met les mains dans le cambouis ! 🧑‍🔧 + +Puisque tous nos schémas sont prêts, on va pouvoir passer à la création de notre base de données. +Mais si on y repense, notre MLD représente déjà bien notre base de données, non ? + +Pas entièrement... car il nous manque les types de données ! +Si on reprend notre dictionnaire des données, on avait pu inscrire "Alphabétique" et d'autres formats génériques pour nos données. Mais ces termes n'existent pas _(du moins, pas tous)_ dans les bases de données. + +<Admonition type="warning" title="Spécificités des SGBD"> + Selon le SGBD que tu utilises, les types de données peuvent varier. Il est + donc obligatoire que tu te réfères à la documentation de ton SGBD pour + connaître les types de données disponibles 😉 +</Admonition> + +Au passage, le MPD peut se décliner dans deux formats : + +- **Le format texte** : qui reprend les informations du MLD en y ajoutant les types de données et les contraintes. En réalité, il s'agira d'un script SQL qui permettra de créer la base de données et toutes ses tables. +- **Le format graphique** : qui reprend les informations du MLD en y ajoutant les types de données et les contraintes, mais sous forme de schéma. + +Cependant je mets en garde sur le format graphique et la notation que peuvent proposer certains logiciels. Vous avez peut-être eu l'occasion de voir des schémas avec des carrés, des ronds, des losanges ou encore des pattes de corbeau... Cette notation est propre à un langage de modélisation, le **UML** _(Unified Modeling Language)_, qui ne correspond pas à la méthode Merise. + +Dans la méthode Merise, on utilisera simplement des lignes pleines pour représenter les relations entre les tables, et des carrés pour représenter les tables. +On retrouvera tout de même des lignes fléchées pour illustrer nos relations dans le MLD, mais c'est tout. + +UML est un excellent langage de modélisation, mais on y reviendra davantage dans le cursus CDA 😉 + +<details> + <summary>Exemple de MPD _(SQL)_</summary> + + ```sql showLineNumbers + CREATE TABLE employee( + id CHAR(30), + email VARCHAR(320), + firstname VARCHAR(30), + lastname VARCHAR(30), + postal_address VARCHAR(60), + postal_code CHAR(5), + city VARCHAR(30), + password CHAR(80), + manager_id CHAR(30), + CONSTRAINT employee_pk PRIMARY KEY (id), + CONSTRAINT employee_ak UNIQUE (email), + CONSTRAINT employee_manager_fk FOREIGN KEY (manager_id) REFERENCES employee(id) + ); + + CREATE TABLE project( + id CHAR(30), + name VARCHAR(255), + CONSTRAINT project_pk PRIMARY KEY (id) + ); + + CREATE TABLE task( + id CHAR(30), + name VARCHAR(255), + is_done BOOLEAN, + project_id CHAR(30), + CONSTRAINT task_pk PRIMARY KEY (id), + CONSTRAINT task_project_fk FOREIGN KEY (project_id) REFERENCES project(id) + ); + + CREATE TABLE employee_has_task( + employee_id CHAR(30), + task_id CHAR(30), + CONSTRAINT employee_has_task_pk PRIMARY KEY (employee_id, task_id), + CONSTRAINT employee_has_task_employee_fk FOREIGN KEY (employee_id) REFERENCES employee(id), + CONSTRAINT employee_has_task_task_fk FOREIGN KEY (task_id) REFERENCES task(id) + ); + ``` +</details> + +## 💾 Sauvegardes de la base de données + +C'est bien beau de créer une base de données, mais si on ne la sauvegarde pas, on risque de tout perdre en cas de problème... + +Certains hébergeurs permettent de faire des sauvegardes automatisées, mais dans le cas où tu dois toi-même sauvegarder ta base de données, il existe plusieurs solutions : + +- **Les sauvegardes manuelles** : qui consistent à exporter le contenu de ta base de données dans un fichier _(généralement au format SQL)_ +- **Les sauvegardes automatiques** : qui consistent à automatiser le processus de sauvegarde, généralement via un script ou un outil dédié + +On va se concentrer _(que très rapidement, ne t'inquiète pas !)_ sur la partie automatisée, puisqu'elle permet également de comprendre comment faire une sauvegarde manuellement. + +Pour mettre en place l'automatisation, on peut mettre en place une tâche planifiée : un processus qui va s'exécuter à intervalles réguliers pour sauvegarder notre base de données. +Sur Linux, on parlera d'un `cron job` _(ou `tâche cron` en français)_. + +Sans rentrer dans les détails de configuration d'une tâche cron, on va devoir la créer en donnant plusieurs informations : + +- **Le chemin vers le script de sauvegarde** : qui va contenir les commandes pour sauvegarder notre base de données +- **La fréquence d'exécution** : qui va déterminer à quelle fréquence notre tâche va s'exécuter _(toutes les heures, tous les jours, toutes les semaines, etc.)_ +- **Le compte utilisateur** : qui va exécuter la tâche, généralement le compte de l'utilisateur qui a les droits d'accès à la base de données + +<details> + <summary> + Exemple de script `bash` pour sauvegarder une base de données PostgreSQL + </summary> + + ```bash showLineNumbers + #!/bin/bash + + # Variables + DB_USER="user" + DB_NAME="database" + BACKUP_DIR="/path/to/backup" + DATE=$(date +"%Y%m%d%H%M%S") + + # Création du répertoire de sauvegarde + mkdir -p $BACKUP_DIR + + # Sauvegarde de la base de données + pg_dump -U $DB_USER $DB_NAME > $BACKUP_DIR/$DB_NAME-$DATE.sql + ``` + + Ce script va permettre de sauvegarder une base de données PostgreSQL en exportant son contenu dans un fichier SQL. + Il est important de remplacer les variables `DB_USER`, `DB_NAME` et `BACKUP_DIR` par les informations de ta base de données. +</details> + +Une fois ce script créé, il suffira de le rendre exécutable et de le planifier dans une tâche cron pour automatiser la sauvegarde de ta base de données. + +<details> + <summary>Exemple de tâche cron pour automatiser la sauvegarde</summary> + + ```shell + # Ouvrir le fichier de tâches cron + crontab -e + + # Ajouter la tâche de sauvegarde, toutes les nuits à minuit + 0 * * * * /path/to/backup.sh + ``` + + Et voilà ! Ta base de données sera sauvegardée toutes les nuits à minuit, sans que tu aies besoin d'intervenir manuellement. +</details> + +## 🛡️ Sécurité et confidentialité des données + +On ne le répétera jamais assez, mais la sécurité et la confidentialité des données sont primordiales pour toute application. + +Pour garantir la sécurité de ta base de données, il est recommandé de mettre en place plusieurs mesures : + +- **Les sauvegardes régulières** : pour éviter de perdre des données en cas de problème +- **Les mises à jour régulières** : pour corriger les failles de sécurité et les bugs +- **Les accès restreints** : pour limiter l'accès à la base de données aux seules personnes autorisées +- **Les mots de passe forts** : pour éviter les attaques par force brute ou par dictionnaire +- **Les connexions sécurisées** : pour éviter les interceptions de données + +Mais la sécurité ne s'arrête pas là, il est également important de garantir la confidentialité des données : + +- **Le chiffrement des données** : pour éviter que des tiers puissent lire les données stockées, en cas de fuite + +<Admonition type="warning" title="Identifiants de connexion"> + Même en développement sur ta machine locale, prend l'habitude de ne jamais utiliser les identifiants par défaut de ta base de données _(comme `root` sans mot de passe par exemple)_. + + L'objectif est de te mettre dans les conditions réelles d'un environnement de production, où la sécurité est primordiale. Ça t'évitera de prendre de mauvaises habitudes qui pourraient te coûter cher par la suite. +</Admonition> + +## 🎯 Critères d'évaluation + +- Les données du schéma conceptuel et leurs relations sont identifiées et prises en compte +- Le schéma physique est conforme aux besoins exprimés dans le dossier de conception et respecte les règles des bases de données relationnelles +- Les règles de nommage sont respectées +- La sécurité, l'intégrité et la confidentialité des données est assurée +- La base de données de tests mise en place est conforme au schéma physique +- Les utilisateurs sont créés avec leurs droits respectifs conformément au dossier de conception +- La base de données créée est sauvegardée et elle peut être restaurée en cas d'incident +- La documentation technique des bases de données est comprise, en langue française ou anglaise _(niveau B1 du CECRL pour l'anglais)_ + +## 🤯 Aller plus loin _(hors référentiel)_ + +Pas trop mal à la tête ? On continue un tout petit peu ? 😅 +Tu as vu qu'on précise entre parenthèses la longueur des données, mais pourquoi on fait ça ? + +Tu n'es pas sans savoir que pour stocker des données et que pour les stocker, il nous faut de l'espace. +Et cet espace, on le définit en fonction de la longueur de nos données : on parle alors d'allocation. + +En précisant une valeur entre les parenthèses, on vient dire à notre SGBD combien de place il doit réserver pour stocker nos données **au maximum**. + +Dans le cas d'un `VARCHAR(30)`, on réserve 30 caractères pour stocker notre donnée, même si elle n'en fait que 5 _(allocation **dynamique**)_. +Dans le cas d'un `CHAR(30)`, on réserve également 30 caractères, mais cette fois-ci on "complète notre donnée avec des espaces" pour atteindre les 30 caractères _(allocation **statique**)_. + +Si on ne précise pas de longueur, le SGBD va réserver une place par défaut qui varie d'un SGBD à l'autre. +Donc ce n'est pas parce que tu te dis : "255 caractères c'est très bien pour mon `VARCHAR`, pas besoin de le préciser puisque c'est la valeur par défaut !" que tu as raison... 😅 +Si demain la norme change et que l'allocation par défaut pour les types `VARCHAR` passe à 100 caractères au lieu de 255 caractères, tu risques de te retrouver avec des données tronquées ! + +--- + +## 🧠 Documentations + +- [Éditions ENI - Merise - Guide pratique (4e édition), par **Jean-Luc Baptiste**](https://www.editions-eni.fr/livre/merise-guide-pratique-4e-edition-modelisation-des-donnees-et-des-traitements-manipulations-avec-le-langage-sql-conception-d-une-application-mobile-android-ou-ios-9782409046667) +- [Medium - Non, les ID n'ont pas leur place dans un MCD, par **Jean Prulière**](https://jeanpruliere.medium.com/non-les-id-nont-pas-leur-place-dans-un-mcd-43b5cd5ce9b6) +- [SQL.sh - Cours et tutoriels SQL](https://sql.sh/) +- [Wikipédia - UML](<https://fr.wikipedia.org/wiki/UML_(informatique)>) + +## 🛠️ Outils + +- [Looping - Logiciel de modélisation conceptuelle de données](https://www.looping-mcd.fr/) +- [Mocodo - Logiciel en ligne de modélisation conceptuelle de données](https://www.mocodo.net/) diff --git a/old/docs/titres-professionnels/DWWM/AT2/CP6.mdx b/old/docs/titres-professionnels/DWWM/AT2/CP6.mdx new file mode 100644 index 0000000..97f40d4 --- /dev/null +++ b/old/docs/titres-professionnels/DWWM/AT2/CP6.mdx @@ -0,0 +1,348 @@ +--- +sidebar_position: 6 +title: "CP 6" +description: "Synthèse de la CP 6 \"Développer des composants d'accès aux données SQL et NoSQL\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04)." +tags: + - DWWM + - Base de données + - SQL + - Back-end + - ORM/ODM + - Sécurité + - Chiffrement + - Hachage +--- + +import Admonition from "@theme/Admonition"; +import TabItem from "@theme/TabItem"; +import Tabs from "@theme/Tabs"; + +# Développer des composants d'accès aux données SQL et NoSQL + +## 📚 Références + +- REAC _(mise à jour du 03/07/2024)_, pages 25 et 26 +- RE _(mise à jour du 03/07/2024)_, page 11 + +## 📋 En résumé + +Gros morceau la création de bases de données, n'est-ce pas ? 😅 +On va pouvoir souffler un coup en parlant maintenant de l'accès à ces bases de données. _(enfin, souffler... pas trop quand même)_ + +Et tu sais quoi, comme tout ce qu'on a vu jusqu'à maintenant, on va alléger un peu les choses en parlant de merveilleux outils comme les **ORM** et les **ODM** ! + +<details> + <summary>C'est quoi un ORM et ODM ? Quelles sont les différences ?</summary> + + Les ORM _(Object-Relational Mapping)_ et les ODM _(Object-Document Mapper)_ sont des outils qui permettent de faire le lien entre les bases de données et les langages de programmation. + + - Les ORM sont utilisés pour les bases de données relationnelles, comme MySQL, PostgreSQL ou SQLite. Ils permettent de manipuler les données de la base de données sous forme d'objets, ce qui facilite leur utilisation dans le code. + - Les ODM sont utilisés pour les bases de données NoSQL, comme MongoDB. Ils fonctionnent de la même manière que les ORM, mais pour les bases de données NoSQL. + + En gros, les ORM et les ODM permettent de simplifier la manipulation des données dans le code, en évitant d'avoir à écrire des requêtes à la main. +</details> + +Alleeeez, on va voir ça de plus près ! 😎 + +## ⚙️ Configuration d'un ORM + +<Tabs> + <TabItem value="Prisma" label="NodeJS + Prisma"> + Pour ce qui est de l'ORM, on va parler de Prisma ! Bien entendu, mis à part la + syntaxe, les principes restent les mêmes pour les autres ORM. + + <details> + <summary>C'est quoi Prisma ?</summary> + + Prisma est un ORM qui permet de simplifier la manipulation des bases de données relationnelles. Il permet de générer du code à partir du schéma de la base de données, ce qui facilite la manipulation des données dans le code. + + Prisma est compatible avec plusieurs bases de données relationnelles, comme MySQL, PostgreSQL ou SQLite ainsi que MongoDB pour les bases de données NoSQL. + </details> + + Dans un premier temps, on va installer Prisma et configurer notre base de données. + + <details> + <summary>Installation de Prisma</summary> + + ```bash + npm install prisma --save-dev # Installation de Prisma + npx prisma init # Initialisation de Prisma dans le projet + ``` + + Une fois Prisma installé et initialisé, on va pouvoir le configurer _(ce qui correspond en partie à la CP 5)_ : + + - Modifier le fichier `.env` à la racine du projet pour y ajouter les informations de connexion à la base de données + - Créer les modèles de données dans le dossier `prisma/schema.prisma` + + <Tabs> + <TabItem value="prisma-.env" label="Fichier .env"> + ```env + DATABASE_URL="postgresql://username:password@localhost:5432/database?schema=public" + ``` + </TabItem> + + <TabItem value="prisma-prisma.schema" label="Fichier prisma.schema"> + ```prisma + datasource db { + provider = "postgresql" + url = env("DATABASE_URL") + } + + generator client { + provider = "prisma-client-js" + } + + model User { + id Int @id @default(autoincrement()) + email String @unique + password String + } + ``` + </TabItem> + </Tabs> + </details> + </TabItem> + + <TabItem value="Laravel" label="PHP + Laravel"> + Rédaction à faire + + Voir la documentation officielle de Laravel, pour la création de migrations et de modèles avec [Eloquent](https://laravel.com/docs/master/eloquent). + </TabItem> + + <TabItem value="Symfony" label="PHP + Symfony"> + Rédaction à faire + + Voir la documentation officielle de Symfony, pour la création de migrations et de modèles avec [Doctrine](https://symfony.com/doc/current/doctrine.html). + </TabItem> +</Tabs> + +<details> + <summary>Je fais mes requêtes SQL à la main, il faut que j'apprenne à utiliser un ORM/ODM ?</summary> + + **Non** ! + + D'un certain côté, c'est nettement plus intéressant de savoir réaliser les requêtes par toi-même, sans utiliser d'outils qui génèrent du SQL à ta place. + + En entreprise, tu vas certainement utiliser ces fameux outils, mais dès que l'on va chercher à avoir les requêtes les plus optimisées possibles, il va falloir mettre les mains dans le cambouis ! +</details> + +Mais avant de vouloir manipuler nos données, on va s'assurer d'une chose primordiale : l'**intégrité des données**. + +## 🔎 Intégrité des données + +L'intégrité des données, c'est le fait de garantir que les données stockées dans la base de données sont correctes et cohérentes, de la création jusqu'à la suppression. +Si dans un champ de ta base de données tu attends un nombre entier, tu ne vas pas accepter une chaîne de caractères, n'est-ce pas ? + +Et pour garantir cette intégrité, on va mettre en place des vérifications **avant** d'insérer ou de mettre à jour des données dans la base de données. + +Rien de plus simple bien entendu ! + +Tu t'attends à avoir une adresse email dans un champ ? +Alors tu vas vérifier que l'adresse email est bien une adresse email, et non pas une chaîne de caractères lambda. + +<Tabs> + <TabItem value="node-joi" label="JOI (Node.js)"> + ```typescript + import type { Request, Response } from 'express'; + + import { user } from '@/services'; + import Joi from 'joi'; + + const userController = { + // ... + + async updateEmail(req: Request, res: Response) { + const schema = Joi.object({ + email: Joi.string().email().required(), + }); + + const { error } = schema.validate(req.body); + + if (error) { + // L'email n'est pas valide : + // On retourne une erreur 400 avec le message d'erreur généré par JOI + return res.status(400).json({ error: error.details[0].message }); + } + + // L'email est valide : + // 1. On modifie l'email de l'utilisateur actuellement connecté (ID stocké en session) via notre service `user` + await user.updateEmail(req.session.userId, req.body.email); + + // 2. On retourne une réponse 200 avec un message de succès + return res.status(200).json({ message: 'Email mis à jour' }); + }, + }; + ``` + </TabItem> + + <TabItem value="php-laravel" label="Laravel (PHP)"> + ```php + namespace App\Http\Controllers; + + use Illuminate\Http\Request; + use App\Models\User; + use Validator; + + class UserController extends Controller + { + // ... + + public function updateEmail(Request $request) + { + $validator = Validator::make($request->all(), [ + 'email' => 'required|email', + ]); + + if ($validator->fails()) { + // L'email n'est pas valide : + // On retourne une erreur 400 avec les erreurs de validation + return response()->json($validator->errors(), 400); + } + + // L'email est valide : + // 1. On modifie l'email de l'utilisateur via notre modèle `User` + User::where('id', auth()->id())->update(['email' => $request->email]); + + // 2. On retourne une réponse 200 avec un message de succès + return response()->json(['message' => 'Email mis à jour'], 200); + } + } + ``` + </TabItem> +</Tabs> + +## 💼 Compétences attendues + +Si tu utilises un outil te générant les requêtes automatiquement, il est important de savoir reproduire à la main les requêtes générées par cet outil. + +Cet outil n'a que l'objectif de te faciliter la tâche, mais il ne doit pas te dispenser de comprendre ce qu'il se passe derrière. +À toi de montrer à ton jury que ce qu'il se passe derrière n'est pas pure magie ! 😄 + +<details> + <summary>Voici ce que ~peut~ **va** faire ton jury en cas de doute</summary> + + Si pour ton jury, il reste un doute sur ta compréhension des requêtes : il peut être amené à tes poser des questions supplémentaires et parfois te demander de reproduire une requête SQL de tête. + + Oui, une requête SQL de tête ! _(Même si tu as utilisé MongoDB ou une autre base de données NoSQL)_ + Alors ne t'inquiète pas, de tête c'est un sacré challenge et ton jury ne va pas t'en vouloir si tu t'emmêles les pinceaux. + + De manière général, on évite d'aller trop loin et on cherche **uniquemment** la compréhension et le placement des mots clés pour une requête avec jointure. + + Par exemple : + > "Pouvez-vous nous donner la requête SQL pour récupérer les pseudos d'utilisateur ayant posté au minimum 3 articles ?" + + Réponse possible : + ```sql + SELECT u.pseudo -- Sélectionne la colonne `pseudo` de la table `utilisateur` (aliasée `u` dans le `FROM`) + FROM utilisateur u -- Récupération de la table `utilisateur`, aliasée `u` + JOIN article a ON u.id = a.utilisateur_id -- Jointure entre `utilisateur` et `article` (aliasée `a`) sur la colonne `id` de `utilisateur` et `utilisateur_id` de `article` + GROUP BY u.pseudo -- Regroupe les résultats par `pseudo` + WHERE COUNT(a.id) >= 3; -- Compte le nombre d'articles par utilisateur et filtre sur ceux ayant posté au moins 3 articles + ``` + + ... Bon, OK.. cette requête, elle pique un peu plus qu'un simple jointure, à cause de l'utilisation du `GROUP BY` et du `COUNT`... mais tu vois l'idée ! 😅 + + Dans tous les cas, on ne va pas te demander de reproduire une requête complexe ou d'avoir le niveau d'un DBA _(administrateur de base de données)_ ! +</details> + +## 🔐 Confidentialité des données + +La plupart du temps, nos bases de données vont accueillir des données confidentielles, comme : + +- Des mots de passe +- Des informations personnelles _(nom, prénom, adresse, etc.)_ +- Des données sensibles _(informations bancaires, médicales, etc.)_ + +Bien que notre bases de données se doit d'être sécurisée dans son accès et ses permissions, dans le cas d'une fuite il est important de sécuriser ces données. + +Pour les mots de passe, on va les hacher avant de les stocker dans la base de données. + +<details> + <summary>C'est quoi le hachage d'un mot de passe ?</summary> + + Le hachage d'un mot de passe est une manière de le sécuriser en le transformant en une chaîne de caractères "aléatoire", appelée **hash**. + + Il est important de noter que le hachage est **unidirectionnel**, c'est-à-dire qu'il est impossible de retrouver le mot de passe d'origine à partir de son hash contrairement au **chiffrement**. +</details> + +<details> + <summary>Et le chiffrement, ça sert à quoi ?</summary> + + Comme le hachage, le chiffrement permet de sécuriser des données. Cependant : le chiffrement est **bidirectionnel**. + C'est à dire que l'on peut retrouver les données d'origine à partir des données chiffrées. + + Si tu as déjà eu l'occasion d'envoyer des "messages codés", c'est que tu as déjà utilisé le chiffrement sans pour autant le savoir ! + L'un des chiffrements les plus connus est le **chiffre de César**, qui consiste à décaler les lettres de l'alphabet d'un certain nombre de positions. + + Par exemple : + + ``` + Message : "Bonjour" + Décalage : 3 + + Message chiffré : "Erqmrxu" + ``` + + <Admonition type="warning"> + Le chiffrement n'est pas une solution de sécurité absolue, il est possible de retrouver les données d'origine à partir des données chiffrées. + D'ailleurs le chiffre de César est un chiffrement très simple à casser, on ne va donc pas l'utiliser pour protéger les données sensibles ! + </Admonition> + + On va privilégier un algorithme de chiffrement qui se base sur une **clé secrète**, qui sera la clé pour chiffrer et déchiffrer les données. + C'est d'ailleurs plus ou moins ce qui est fait avec la célèbre [machine Enigma](https://fr.wikipedia.org/wiki/Enigma_(machine)) utilisée par les allemands pendant la Seconde Guerre Mondiale pour chiffrer leurs messages et éviter qu'ils soient interceptés et compris par les alliés. +</details> + +Mais alors, comment on peut s'y prendre ? + +🥁🥁🥁 + +Avec des bibliothèques, tout simplement ! 🙃 +_(Ou si tu es un peu fou, tu peux essayer de le faire toi-même, mais attention à ce que ce soit **réellement sécurisé** sinon tu en deviens le seul et unique **responsable**)_ + +Tu as notamment des bibliothèques _(Node.js)_ qui sont très utilisées : +- Hachage : `bcrypt` _(ou encore `argon2`)_ +- Chiffrement : `crypto` _(native à Node.js en plus, si ça c'est pas la classe 😎)_ + +Je te laisse te plonger dans les documentations associées, que tu retrouveras _(presque)_ tout en bas de cette fiche. + +Et naturellement : **PERSONNE** ne doit avoir accès à ces données, à part les personnes autorisées/concernées bien entendu. + +## 🎯 Critères d'évaluation + +- Les traitements relatifs aux manipulations des données répondent aux fonctionnalités décrites dans le dossier de conception +- L'intégrité et la confidentialité des données sont maintenues +- Les cas d'exception sont pris en compte +- Toutes les entrées sont contrôlées et validées dans les composants serveurs sécurisés +- Les tests unitaires et de sécurité sont associés à chaque composant +- La démarche structurée de résolution de problème est adaptée en cas de dysfonctionnement +- Le système de veille permet de suivre les évolutions technologiques et les problématiques de sécurité liées aux bases de données SQL et NoSQL + +## 🤯 Aller plus loin _(hors référentiel)_ + +T'es encore là ? Tu aimes ça les ~patates~ bases de données, hein ? 😏 +Alors dans ce cas, je te recommande chaudement de te pencher sur PostgreSQL qui est, à mon sens, l'une des seules **vraies** bases de données relationnelles. + +Je ne m'étalerai pas sur ce sujet, mais désolé MySQL/MariaDB de ne pas être au niveau... 😅 + +Les ressources que je m'apprête à te recommander sont un peu plus avancées, mais ce sont d'excellentes portes d'entrées vers des métiers comme DBA par exemple. +Tu retrouveras des notions très bien expliquées et pertinentes pour t'améliorer sur le sujet dans les ressources de [Dalibo](https://www.dalibo.com/formations). + +<Admonition type="info" title="Gratuité des formations Dalibo"> + Dalibo propose des formations, mais qui ne sont pas gratuites pour autant. + Seuls les supports de cours sont disponibles gratuitement, aux formats EPUB et PDF. + + Tu peux retrouver ces supports sur la page [Formations](https://www.dalibo.com/formations) du site de Dalibo. +</Admonition> + +--- + +## 🧠 Documentations + +- [SQL.sh - Cours et tutoriels SQL](https://sql.sh/) +- [Prisma - Documentation](https://www.prisma.io/docs/) +- [JOI - Documentation](https://joi.dev/api/?v=17.13.0) +- [Dalibo - Formations](https://www.dalibo.com/formations) +- [Wikipédia - Chiffrement de César](https://fr.wikipedia.org/wiki/Chiffrement_par_d%C3%A9calage) +- [bcrypt - Documentation](https://www.npmjs.com/package/bcrypt) +- [argon2 - Documentation](https://www.npmjs.com/package/argon2) +- [crypto - Documentation](https://nodejs.org/api/crypto.html) diff --git a/old/docs/titres-professionnels/DWWM/AT2/CP7.mdx b/old/docs/titres-professionnels/DWWM/AT2/CP7.mdx new file mode 100644 index 0000000..a2c4ca1 --- /dev/null +++ b/old/docs/titres-professionnels/DWWM/AT2/CP7.mdx @@ -0,0 +1,331 @@ +--- +sidebar_position: 7 +title: "CP 7" +description: "Synthèse de la CP 7 \"Développer des composants métier coté serveur\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04)." +tags: + - DWWM + - Architecture + - Design Pattern + - Back-end + - Sécurité + - Tests +--- + +import Admonition from "@theme/Admonition"; +import TabItem from "@theme/TabItem"; +import Tabs from "@theme/Tabs"; + +# Développer des composants métier coté serveur + +## 📚 Références + +- REAC _(mise à jour du 03/07/2024)_, pages 27 et 28 +- RE _(mise à jour du 03/07/2024)_, page 12 + +## 📋 En résumé + +Maintenant que l'on sait modéliser et dialoguer avec notre base de données, on va pouvoir s'attaquer à la logique métier de notre application. +Dans le cadre d'un projet web, ça représentera principalement nos contrôleurs, middlewares et services. + +Si tu as déjà travaillé sur un projet web, tu as probablement déjà entendu parler du design pattern MVC. +Et si ce n'est pas le cas, pas de panique, on va voir ensemble ce que c'est ! + +## 💡 Le design pattern MVC + +Le design pattern MVC est un modèle d'architecture logicielle qui sépare les données, la logique métier et l'interface utilisateur. + +- **Modèle** : représente les données de l'application. Il contient les classes qui permettent de manipuler les données. +- **Vue** : représente l'interface utilisateur. C'est ce que l'utilisateur voit et avec quoi il interagit. +- **Contrôleur** : fait le lien entre le modèle et la vue. Il contient la logique métier de l'application. + +<Admonition type="warning" title="Les schémas disponibles en ligne"> + Il existe de nombreux schémas qui expliquent le design pattern MVC mais ils ne sont pas tous corrects. + Enfin, si, ils sont corrects... mais certains ne s'appliquent pas à tous les frameworks et architectures. +</Admonition> + +Pour t'aider à mieux te représenter l'un des schémas les plus courants, voici un diagramme de séquence "basique" : + +```mermaid +sequenceDiagram + autonumber + + box rgba(139,92,246,.1) Navigateur + actor Utilisateur + end + + box rgba(139,92,246,.1) Serveur + participant Routeur + participant Contrôleur + participant Modèle + participant Vue + end + + participant Base de données + + Utilisateur->>Routeur: Je veux voir la page d'accueil + Routeur->>Contrôleur: Appelle la méthode `home` + alt Si des données sont nécessaires + Contrôleur->>Modèle: Demande les données + Modèle->>Base de données: Récupère les données + Base de données-->>Modèle: Retourne les données + Modèle-->>Contrôleur: Retourne les données + end + Contrôleur->>Vue: Demande le HTML + Vue-->>Contrôleur: Retourne le HTML généré + Contrôleur->>Utilisateur: Retourne le HTML généré +``` + +Le concept est simple : chaque partie de l'application a un rôle bien défini et ne doit pas empiéter sur le rôle des autres. + +<details> + <summary>Et si j'ai des middlewares ?</summary> + + Dans la majorité des cas, les middlewares s'exécutent avant le contrôleur même si on peut en avoir à différents moments de la circulation de la donnée. + Si tu as déjà utilisé Express, tu as probablement déjà utilisé un middleware pour vérifier si l'utilisateur est connecté avant de lui afficher une page qui est réservée aux utilisateurs connectés. + + <Tabs> + <TabItem value="express" label="Node.js (Express)"> + ```typescript {16-25,31} showLineNumbers + import type { RequestHandler } from "express"; + + import * as controllers from '@/controllers'; + import session from 'express-session'; + import express from 'express'; + + const app = express(); + app.set('view engine', 'ejs'); + app.use(session({ + secret: 'keyboard cat', + resave: false, + saveUninitialized: true, + cookie: { secure: true }, + })); + + const isUserConnected: RequestHandler = (req, res, next) => { + // Si l'utilisateur n'est pas connecté... + if (!req.session.userId) { + // ... on appelle la méthode `unauthorized` du contrôleur `error` + return controller.error.unauthorized(req, res); + } + + // L'utilisateur est connecté, on peut continuer ! + next(); + }; + + // Route accessible par tout le monde, connecté ou non + app.get('/', controllers.home.index); + + // Route accessible uniquement par les utilisateurs connectés (middleware `isUserConnected`) + app.get('/dashboard', isUserConnected, controllers.dashboard.index); + + app.listen(3000, () => { + console.log('Serveur démarré sur le port 3000'); + }); + ``` + </TabItem> + </Tabs> +</details> + +<Admonition title="Le cas de React" type="warning"> + D'après toi, est-ce que React doit être considéré comme la vue dans le design pattern MVC ? + La réponse est **non** ! + + React est une bibliothèque _(pas une "librarie" et encore moins un framework ⚠️)_ JavaScript qui permet de créer des interfaces utilisateur, mais elle n'est pas liée de manière directe à un serveur. + Certes, on va consommer une API pour récupérer des données, mais React n'est que le réceptacle de ces données côté client _(navigateur)_. + + On va donc faire simple : on parlera plutôt d'une architecture "client-serveur" avec React côté client et notre API côté serveur. + Mais ça n'empêche pas que ton API puisse être une API REST _(ou GraphQL)_ qui respecte le design pattern MVC ! + Tout dépendra de si tu demandes dans ton serveur back-end de retourner une vue _(HTML)_ au navigateur. +</Admonition> + +## 🧑‍⚖️ Règles et conventions de nommage + +Peu importe le contexte dans lequel tu réalises le projet que tu vas soutenir face à ton jury, tu dois respecter les règles et conventions de nommage de l'entreprise. +Si tu fais un projet personnel, tu peux définir les tiennes, du moment que tu es en mesure de les expliquer à ton jury et que tu les respectes du début à la fin. + +<Admonition type="info" title="La cohérence, c'est la clé"> + Pense à être cohérent en ce qui concerne la langue utilisée. + + <Admonition title="Pas de franglais !" type="warning"> + Évite de mélanger plusieurs langues dans tes nommages. + Si tu choisis de travailler en français, reste en français. + Si tu choisis de travailler en anglais, reste en anglais. + </Admonition> + + D'ailleurs, je te recommande chaudement de travailler en anglais ne serait-ce que pour te familiariser avec la langue de Shakespeare qui est, on le rappelle, la langue la plus répandue dans le monde de l'informatique. + + Tu as évidemment le droit d'utiliser des traducteurs en ligne pour t'aider à trouver le bon mot _(ou la bonne expression)_, on ne te demande pas d'être bilingue ! +</Admonition> + +Au delà de la langue utilisée, on va également parler de la syntaxe des noms de fichiers, dossiers, classes, méthodes, variables, etc. +Pour t'aider à te lancer, tu peux t'inspirer des conventions de nommage les plus répandues que tu trouveras facilement en ligne. + +Par exemple, voici ce qu'on pourrait faire : + +<Tabs> + <TabItem value="indentation" label="Indentation"> + - **2 espaces** pour le JavaScript + - **4 espaces** pour le HTML + - **4 espaces** pour le CSS + </TabItem> + + <TabItem value="case" label="Case"> + - **camelCase** pour les variables, fonctions et méthodes + - **PascalCase** pour les classes et les composants React + - **kebab-case** pour les noms de fichiers et de dossiers + - **UPPER_CASE** pour les constantes + </TabItem> + + <TabItem value="comments" label="Commentaires"> + - Dans la langue définie pour le projet + - JSDoc pour les fonctions et méthodes + - `// @TODO [nom du développeur]` pour les tâches à réaliser plus tard + </TabItem> + + <TabItem value="imports" label="Imports"> + - Commencer par importer les types + - Continuer par les imports de bibliothèques et modules _(de la plus spécifique à la plus générale)_ + - Terminer par les imports non nommés + - Un saut de ligne entre chaque groupe d'imports + - Ordonner les imports par taille _(du plus court au plus long)_ puis par ordre alphabétique + + ```typescript + import type { Type1, Type2 } from 'module'; + + import { Component1, Component2 } from 'components'; + import { module1, module2 } from 'module'; + import { lib1, lib2 } from 'library'; + + import 'style.css'; + + // ... + ``` + </TabItem> +</Tabs> + +Au passage, tu as la possibilité de configurer ton éditeur de texte pour qu'il respecte ces conventions de nommage. +Sur VSCode, l'extension [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) te permettra de vérifier que ton code respecte bien les conventions de nommage que tu auras définies et [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) te permettra de formater ton code automatiquement selon ces mêmes conventions. + +Ça me permet également de te rappeler que tu dois **documenter ton code** et ce, **dans la langue définie pour le projet**. +Le premier réflexe à avoir est de documenter l'installation et l'utilisation de ton projet dans le fichier `README.md` à la racine de ton projet. + +Ensuite, n'ai pas peur d'abuser de la JSDoc _(ou PHPDoc si tu travailles en PHP)_ pour documenter tes fonctions et méthodes. +Par contre, n'abuse pas des commentaires potentiellement "inutiles" qui alourdissent la lecture de ton code, ça peut être contre-productif. + +## 🔄 Le jeu d'essai et les tests unitaires + +Histoire de faire simple : commençons par le jeu d'essai ! + +### 🎮 Le jeu d'essai + +Le jeu d'essai est un ensemble de données qui permet de tester le bon fonctionnement de l'application. +Ce type de test se compose de trois parties : + +- **Les données d'entrée** : ce sont les données que tu vas envoyer à ton application pour tester son comportement. +- **Les données de sortie attendues** : ce sont les données que tu attends en retour de ton application. +- **Les données de sortie obtenues** : ce sont les données que ton application te renvoie. + +Si on prend l'exemple d'un formulaire d'inscription où nous vérifions que l'utilisateur utilise une adresse e-mail valide et unique, ainsi qu'un mot de passe fort _(12 caractères minimum, au moins une majuscule, une minuscule, un chiffre et un caractère spécial)_, voici ce que pourrait donner notre jeu d'essai : + +<Tabs> + <TabItem value="invalid" label="Données invalides"> + - **Les données d'entrée** : + - Adresse e-mail : `mauvaise-adresse@email` + - Mot de passe : `password` + - **Les données de sortie attendues** : + - Erreur : `Adresse e-mail invalide` + - Erreur : `Le mot de passe ne respecte pas les critères de sécurité requis` + - **Les données de sortie obtenues** : + - Erreur : `Adresse e-mail invalide` + - Erreur : `Le mot de passe ne respecte pas les critères de sécurité requis` + </TabItem> + + <TabItem value="valid" label="Données valides"> + - **Les données d'entrée** : + - Adresse e-mail : `bonne-adresse@email.fr` + - Mot de passe : `Password123&` _(bon, le mot de passe n'est absolument pas "fort", mais il respecte les critères imposés)_ + - **Les données de sortie attendues** : + - Succès : `Utilisateur inscrit avec succès` + - **Les données de sortie obtenues** : + - Succès : `Utilisateur inscrit avec succès` + </TabItem> + + <TabItem value="email-already-used" label="Adresse email déjà utilisée"> + - **Les données d'entrée** : + - Adresse e-mail : `adresse-email@utilisee.fr` + - Mot de passe : `Password123&` + - **Les données de sortie attendues** : + - Erreur : `Adresse e-mail déjà utilisée` + - **Les données de sortie obtenues** : + - Erreur : `Adresse e-mail déjà utilisée` + </TabItem> +</Tabs> + +<Admonition type="tip" title="Mais alors, comment faire ces tests facilement ?"> + Si je te parle de client HTTP, tu me réponds... ? + Postman ? Insomnia ? + + Bingo ! 🎉 + + Utiliser un client HTTP comme Postman ou Insomnia te permettra de tester facilement les routes de ton API, et de vérifier que les données que tu envoies sont bien traitées par ton serveur. +</Admonition> + +### 🧪 Les tests unitaires + +Les tests unitaires, c'est un peu comme le jeu d'essai, mais en plus automatisé et surtout axé sur les fonctions et méthodes de ton application. + +Le gros avantage que ça va te permettre, c'est de t'assurer que toutes les fonctionnalités développées fonctionnent comme prévu et ce, à chaque fois que tu modifies ton code. +Oui oui, tu as bien lu : **à chaque fois que tu modifies ton code**, pas forcément à chaque fois que tu modifies une fonction ou une méthode qui avait déjà des tests unitaires. + +Alors pas forcément à la moindre modification, je veux plutôt dire que le but est de vérifier avant de livrer ! +Tu peux d'ailleurs faire en sorte que **tous les tests unitaires** doivente passer avant de pouvoir pusher ton code sur la branche principale de ton dépôt Git. Au début c'est casse pied, mais tu verras que ça te permettra de gagner du temps sur le long terme. + +L'objectif c'est de t'assurer que tu ne casses pas une fonctionnalité existante en ajoutant une nouvelle fonctionnalité ou en modifiant une fonctionnalité existante pour garantir que ton projet reste fonctionnel et ne casse pas sous les mains des utilisateurs. + +<details> + <summary>Un petit exemple ?</summary> + + Imaginons que tu as une fonction qui permet de vérifier si une adresse e-mail est valide. + Voici ce que pourrait donner un test unitaire pour cette fonction : + + <Tabs> + <TabItem value="nodejs" label="Node.js"> + ```javascript + import { isValidEmail } from './utils'; + + describe('isValidEmail', () => { + it('should return true if the email is valid', () => { + expect(isValidEmail('fake@email')).toBe(false); + expect(isValidEmail('true@email.com')).toBe(true); + }); + }); + ``` + </TabItem> + </Tabs> +</details> + +## 🎯 Critères d'évaluation + +- Les traitements répondent aux fonctionnalités décrites dans le dossier de conception +- Les composants métier sont sécurisés +- Les bonnes pratiques de la programmation orientée objet _(POO)_ sont respectées +- Les règles de nommage sont conformes aux normes de qualité de l'entreprise +- Le code source est documenté, y compris en anglais +- Un jeu d'essai fonctionnel et les tests unitaires ont été réalisés pour les composants concernés +- Les tests de sécurité sont réalisés +- La démarche structurée de résolution de problème est adaptée en cas de dysfonctionnement + +--- + +## 🧠 Documentations + +- [Wikipédia - Design pattern MVC](https://fr.wikipedia.org/wiki/Mod%C3%A8le-vue-contr%C3%B4leur) _(Attention, le schéma présenté n'est pas forcément le plus adapté à tous les frameworks et architectures)_ +- [Wikipédia - Conventions de nommage](https://fr.wikipedia.org/wiki/Convention_de_nommage) +- [JSDoc - Documentation](https://jsdoc.app/) +- [PHPDoc - Documentation](https://www.phpdoc.org/) + + +## 🛠️ Outils + +- [Postman](https://www.postman.com/) +- [Insomnia](https://insomnia.rest/) diff --git a/old/docs/titres-professionnels/DWWM/AT2/CP8.mdx b/old/docs/titres-professionnels/DWWM/AT2/CP8.mdx new file mode 100644 index 0000000..7deb9f2 --- /dev/null +++ b/old/docs/titres-professionnels/DWWM/AT2/CP8.mdx @@ -0,0 +1,166 @@ +--- +sidebar_position: 8 +title: "CP 8" +description: "Synthèse de la CP 8 \"Documenter le déploiement d'une application dynamique web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04)." +tags: + - DWWM + - Déploiement + - Back-end + - Reverse Proxy + - Serveur web +--- + +import Admonition from "@theme/Admonition"; + +# Documenter le déploiement d'une application dynamique web ou web mobile + +## 📚 Références + +- REAC _(mise à jour du 03/07/2024)_, page 29 +- RE _(mise à jour du 03/07/2024)_, page 12 + +## 📋 En résumé + +Allez, on clos la dernière compétence professionnelle de ce millésime 2023 avec la documentation du déploiement ! +Et heureusement, on n'attend pas de toi de maîtriser un serveur dans les détails, mais d'expliquer **comment** mettre en ligne ton projet. + +Tu as le droit d'utiliser des plateformes de déploiement en ligne comme Vercel, Netlify, Heroku, etc. +Mais la compréhension, même basique, d'un serveur Linux est quelque chose d'extrêmement apprécié et enrichissant. + +## 🤖 Les plateformes de déploiement en ligne + +Selon la plateforme utilisée, la procédure de déploiement peut varier. Certaines plateformes peuvent déployer automatiquement ton projet à partir de ton dépôt Git, d'autres nécessitent de passer par la ligne de commande pour `push` une branche spécifique sur le serveur de la plateforme. + +C'est à toi _(et ton équipe)_ de choisir la plateforme qui vous convient le mieux et de documenter la procédure de déploiement afin que tout le monde puisse s'y retrouver. + +## 🤝 Les serveurs mutualisés + +Beaucoup d'hébergeurs proposent des serveurs mutualisés, c'est-à-dire que plusieurs sites web partagent les ressources d'un même serveur _(même si tu n'es pas le responsable des autres sites hébergés sur le serveur)_. + +Il s'agit d'une solution moins coûteuse que les serveurs dédiés ou les VPS, mais qui peut être moins performante en fonction de la qualité de l'hébergeur. +Cependant, pour un site web de petite ou moyenne envergure, un serveur mutualisé peut suffire et surtout : il est souvent plus simple à gérer. + +<details> + <summary>Parenthèse éco-conception</summary> + + On peut également considérer que l'utilisation de serveurs mutualisés est plus écologique, car elle permet de mutualiser les ressources et de limiter le nombre de serveurs physiques nécessaires pour héberger des sites web. + + Moins de matériel physique = moins de consommation d'énergie = moins d'émissions de CO2. +</details> + +Mais attention, les serveurs mutualisés ne permettent pas de configurer entièrement le serveur _(par exemple, tu ne pourras pas installer un serveur Node.js sur un serveur mutualisé qui n'est pas prévu pour)_. +Il est donc important de bien se renseigner sur les fonctionnalités proposées par l'hébergeur avant de choisir un serveur mutualisé. + +## 🔨 Les serveurs dédiés et VPS + +Maintenant, le meilleur du meilleur : les serveurs dédiés et les VPS ! +Ça peut faire peur sur le papier car on devient l'unique gestionnaire et responsable du serveur, mais c'est certainement la meilleure façon de comprendre comment fonctionne un serveur web. + +La configuration la plus classique que l'on retrouvera sur un serveur dédié ou un VPS est la suivante : + +- Un système d'exploitation headless _(sans interface graphique, à l'ancienne ! 👴)_ comme Ubuntu Server, CentOS, Debian, etc. +- Un serveur web comme Apache, Nginx, ou Caddy +- Une ou plusieurs bases de données comme MySQL, PostgreSQL, MongoDB, etc. +- Un serveur de langage comme Node.js, PHP, Ruby, Python, etc. +- Un gestionnaire de processus comme PM2, Supervisor, etc. +- Un gestionnaire de paquets comme APT, YUM, etc. +- Un pare-feu comme UFW, iptables, etc. + +<details> + <summary>Dernière parenthèse éco-conception</summary> + + Les serveurs dédiés et les VPS sont souvent plus énergivores que les serveurs mutualisés, car ils sont allumés en permanence _(sauf configuration spécifique)_ et consomment plus d'énergie pour fonctionner. + + Sur le papier, ça sonne moins bien, mais dans le concret : un serveur dédié ou un VPS bien configuré peut être plus écologique qu'un serveur mutualisé mal configuré _(qui consomme plus d'énergie pour moins de performance)_. + Comme on dit souvent : + + <Admonition type="quote" title="Le problème se situe souvent entre la chaise et le clavier" /> + + Si tu recherches un hébergeur qui se veut éco-responsable _(bien plus que la moyenne)_ : Infomaniak est un excellent choix. + _(Non, je ne détiens aucune part chez eux, mais j'apprécie leur démarche et leur qualité de service donc un peu de pub gratuite ne fait pas de mal !)_ + + D'ailleurs, sur toute la partie RGPD : Infomaniak a une politique de confidentialité et de sécurité très sérieuse que tu peux retrouver [juste ici](https://www.infomaniak.com/fr/cgv/reglement-general-protection-donnees). + Et promis : elle est lisible et compréhensible, pas comme certaines politiques de confidentialité qui sont plus longues que l'intégrale de la saga Harry Potter. +</details> + +Avant d'arrêter de parler de serveurs à configurer soi-même, je me permets d'ouvrir une toute petite rubrique sur la mise en ligne d'applications tournant sur des ports autres que le 80 (ou 443 pour le HTTPS), comme on peut le faire avec un serveur Node.js. + +## 🚪 Les reverse proxies + +Un serveur web classique écoute sur les ports 80 et 443 pour les requêtes HTTP et HTTPS. +Sauf que ton application va probablement tourner sur d'autres ports, que ce soit 3000, 5000 ou je ne sais quel autre numéro. + +Notre objectif avec les reverse proxies, c'est de lier un domaine _(sur les ports 80 et 443)_ à un port interne spécifique de notre serveur. +C'est un peu comme une "pseudo-redirection", mais qui sera invisible pour l'utilisateur. + +### 📦 Nginx + +Nginx est un serveur web qui est souvent utilisé comme reverse proxy, notamment pour sa simplicité de configuration et sa syntaxe nettement moins verbeuse que celle d'Apache. + +Prenons l'exemple d'un serveur Node.js qui tourne sur le port 5000. + +<Admonition type="example" title="Configuration Nginx pour un reverse proxy"> + ```nginx showLineNumbers + # Ensemble de configurations pour un serveur Nginx + server { + listen 80; # Port 80 pour les requêtes HTTP + listen [::]:80; # Port 80 pour les requêtes HTTP en IPv6 + server_name mon-domaine.com; # Ton domaine qui pointe vers ton serveur web qui fait tourner ton application Node.js + + # Configuration pour le reverse proxy, qui va rediriger les requêtes vers le port 5000 + location / { + proxy_pass http://0.0.0.0:5000; # Redirige les requêtes vers le port 5000 (interne au serveur) + proxy_set_header X-Forwarded-For $remote_addr; # Envoie l'adresse IP du client à l'application Node.js dans le header + proxy_set_header Host $http_host; # Envoie le nom de domaine à l'application Node.js dans le header + } + } + ``` + + Oui, c'est aussi simple que ça ! Alors effectivement, il y a d'autres configurations possibles, mais pour un usage basique : c'est tout ce dont tu as besoin. +</Admonition> + + +### 📦 Caddy + +Caddy est un serveur web qui se veut simple à configurer et qui propose de nombreuses fonctionnalités "out-of-the-box", comme la gestion automatique des certificats SSL _(gratuits)_ avec Let's Encrypt. + +Pour le coup je n'ai pas encore eu l'occasion de faire des tests avec Caddy, mais je sais que la configuration pour un reverse proxy est extrêmement simple, voire plus simple que celle de Nginx. + +### 📦 Apache + +On ne le présente plus, Apache est certainement **le** serveur web le plus utilisé au monde. +Au delà d'être d'être installé par défaut avec toutes les solutions type Wamp, Xampp, Mamp, etc., on utilise régulièrement Apache sur de vrais serveurs. + +Sa configuration est un peu plus verbeuse que celle de Nginx, mais si ça t'intéresse de découvrir Apache : je t'invite à consulter la [documentation officielle](https://httpd.apache.org/docs/2.4/). + +## ❓ Les autres solutions + +Il existe d'autres solutions pour déployer une application web, mais je pense que tu as déjà pas mal de lecture pour aujourd'hui. + +Par contre, il y a **une solution** que je te recommande de ne **jamais utiliser** : les serveurs FTP. +Alors oui, c'est pratique, c'est simple, mais on attend de toi une approche de développeur ! + +Tu as de nombreux outils spécialement conçus pour le déploiement, l'automatisation, la gestion de versions, etc. +C'est ton rôle d'utiliser ces outils pour déployer ton projet, et non pas de faire du simple drag-n-drop de fichiers via FTP et attendre 45 minutes pour transférer un dossier de 10 Mo _(oui, j'ai déjà vu ça et même bien pire que ça quand on se souvient qu'on a des node_modules ou les dépendances PHP dans le dossier vendor 🤡)_. + +## 🎯 Critères d'évaluation + +- La procédure de déploiement est rédigée ou mise à jour +- Les scripts de déploiement sont écrits et documentés +- Le système de veille permet de suivre les évolutions technologiques et les problématiques de sécurité liées au déploiement d'une application dynamique web ou web mobile, y compris dans le cadre d'une démarche DevOps + +--- + +## 🧠 Documentations + +- [Nginx](https://nginx.org/en/docs/) +- [Caddy](https://caddyserver.com/docs/) +- [Apache](https://httpd.apache.org/docs/2.4/) +- [Let's Encrypt](https://letsencrypt.org/docs/) + +## 🛠️ Outils + +- [Infomaniak](https://www.infomaniak.com/fr) +- [Vercel](https://vercel.com/) +- [Netlify](https://www.netlify.com/) +- [Heroku](https://www.heroku.com/) diff --git a/old/docs/titres-professionnels/DWWM/AT2/_category_.json b/old/docs/titres-professionnels/DWWM/AT2/_category_.json new file mode 100644 index 0000000..1163cd5 --- /dev/null +++ b/old/docs/titres-professionnels/DWWM/AT2/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Activité Type 2", + "position": 4 +} diff --git a/old/docs/titres-professionnels/DWWM/_category_.json b/old/docs/titres-professionnels/DWWM/_category_.json new file mode 100644 index 0000000..9fe6e05 --- /dev/null +++ b/old/docs/titres-professionnels/DWWM/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "🧑‍💻 DWWM", + "position": 2 +} diff --git a/old/docs/titres-professionnels/DWWM/intro.mdx b/old/docs/titres-professionnels/DWWM/intro.mdx new file mode 100644 index 0000000..03e4176 --- /dev/null +++ b/old/docs/titres-professionnels/DWWM/intro.mdx @@ -0,0 +1,64 @@ +--- +sidebar_position: 1 +title: "Résumé" +description: "Résumé du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m04, actif depuis septembre 2023)." +tags: + - DWWM +--- + +import Admonition from "@theme/Admonition"; + +# Contenu du titre professionnel DWWM + +Nom complet du titre : `Développeur Web et Web Mobile` +Code titre : `TP-01280` +Code millésime : `04` + +## Documents officiels + +- [📄 REAC - Référentiel Emploi Activités Compétences _(02/07/2024)_](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/Download.aspx?i=7343fd7e-6491-49ba-8a6c-1dabffdbdb1d&d=1) +- [📄 RE - Référentiel d'Évaluation _(02/07/2024)_](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/Download.aspx?i=442c27b5-0394-4e85-ace8-fe801ad6d229&d=1) + +> Source(s) : +> +> - [🔗 Banque de ressources numériques de l'AFPA](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/EGPResultat.aspx?cr=d%C3%A9veloppeur%20web&cd=&ct=01280m04&type=t) + +## Activités types et compétences professionnelles + +### 📚 Activité type 1 - Développer la partie front-end d'une application web ou web mobile sécurisée + +- [CP 1 - Installer et configurer son environnement de travail en fonction du projet web ou web mobile](./AT1/CP1) +- [CP 2 - Maquetter des interfaces utilisateur web ou web mobile](./AT1/CP2) +- [CP 3 - Réaliser des interfaces utilisateur statiques web ou web mobile](./AT1/CP3) +- [CP 4 - Développer la partie dynamique des interfaces utilisateur web ou web mobile](./AT1/CP4) + +### 📚 Activité type 2 - Développer la partie back-end d'une application web ou web mobile sécurisée + +- [CP 5 - Mettre en place une base de données relationnelle](./AT2/CP5) +- [CP 6 - Développer des composants d'accès aux données SQL et NoSQL](./AT2/CP6) +- [CP 7 - Développer des composants métier coté serveur](./AT2/CP7) +- [CP 8 - Documenter le déploiement d'une application dynamique web ou web mobile](./AT2/CP8) + +## Compétences transverses + +- Communiquer en français et en anglais +- Mettre en oeuvre une démarche de résolution de problème +- Apprendre en continu + +## Déroulé de l'examen + +<Admonition type="info" title="Déroulé relatif au passage de l'épreuve dans sa globalité"> + En cas de repassage d'un <abbr title="Certificat de Compétences Professionnelles">CCP</abbr>, + se référer au [Référentiel d'Évaluation](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/Download.aspx?i=442c27b5-0394-4e85-ace8-fe801ad6d229&d=1) + pour connaître les modalités de l'épreuve : + + - Pages 17 et 18 pour l'AT 1 + - Pages 19 et 20 pour l'AT 2 +</Admonition> + +**Durée totale de l'examen** : 2h _(dont 1h30 de soutenance face au jury)_ + +1. Questionnaire professionnel _(30 minutes, sans présence du jury)_ +2. Présentation d'un projet réalisé en amont de la session _(35 minutes, face au jury)_ +3. Entretien technique _(40 minutes, face au jury)_ +4. Entretien final _(15 minutes, face au jury)_ diff --git a/old/docs/titres-professionnels/DWWM/soutenance.mdx b/old/docs/titres-professionnels/DWWM/soutenance.mdx new file mode 100644 index 0000000..bbc3804 --- /dev/null +++ b/old/docs/titres-professionnels/DWWM/soutenance.mdx @@ -0,0 +1,196 @@ +--- +sidebar_position: 2 +title: "La soutenance DWWM" +description: "Tu prépares un TP DWWM et tu te demandes à quoi t'attendre pour la soutenance ? Voici quelques conseils pour te préparer efficacement." +--- + +import Admonition from "@theme/Admonition"; + +# 📜 La soutenance du titre professionnel DWWM + +La soutenance est la derrière étape de ton titre professionnel DWWM. +C'est un moment important qui te permet de présenter ton travail et connaissances devant un jury. + +C'est l'occasion de montrer tout ce que tu as appris et de démontrer tes compétences. + +## 📝 Les documents officiels + +Avant d'aller plus loin dans la préparation de ta soutenance, je te conseille de bien lire les documents officiels de la certification. +Sans ces informations, tu ne sauras pas ce que le jury attend de toi et tu risques de passer à côté de points importants. + +Tu pourras les retrouver facilement : +- [Memento - Résumé DWWM](/titres-professionnels/DWWM/intro) +- [Banque de ressources numériques de l'AFPA](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/EGPResultat.aspx?cr=d%C3%A9veloppeur%20web&cd=&ct=01280m04&type=t) + +## 🤔 À quoi ressemble une soutenance + +Avant de parler de la soutenance elle-même, il est important de savoir à quoi t'attendre. + +Tu seras seul·e face à un jury composé de professionnels du secteur. +Ce jury cherche à évaluer tes compétences, ta capacité à exercer professionnellement et ta compréhension du métier. + +En soit : le jury est un peu comme un RH _(gentil et bienveillant)_, mais avec des compétences techniques ! + +Lors de ta soutenance, tu seras placé·e dans une salle close avec ton jury. +Sauf aménagement d'épreuve spécifique, tu n'auras pas la possibilité d'être accompagné·e. + +## 📅 Comment se déroule une soutenance + +La soutenance se déroule en plusieurs étapes, qu'on appelera "épreuves" : + +1. 🏴󠁧󠁢󠁥󠁮󠁧󠁿 **Questionnaire professionnel** +2. 📽️ **Présentation d'un projet réalisé en amont de la session** +3. 🔨 **Entretien technique** +4. 💬 **Entretien final** + +Chacune de ces épreuves a un objectif précis et permet au jury d'évaluer tes compétences, +pour s'assurer que tu es prêt·e à exercer le métier de développeur web. + +### 🏴󠁧󠁢󠁥󠁮󠁧󠁿 Questionnaire professionnel + +Cette épreuve est réalisée au tout début de la journée, avant même que tu ne rencontres le jury. + +Il s'agit d'une épreuve écrite d'**anglais**, qui te permettra de montrer ta capacité à **comprendre** +l'anglais et à **répondre** à des questions techniques _(toujours en anglais)_. + +Dedans tu y retrouveras une **documentation technique rédigée en anglais**, que tu devras lire et comprendre pour répondre aux questions posées. +Ces questions sont en lien avec le métier de développeur web et les technologies utilisées dans le milieu _(pas forcément celles que tu as étudiées)_. + +Les réponses seront déclinées de deux manières : +- Deux questions fermées à choix unique posées en français _(QCM)_ +- Deux questions ouvertes posées en anglais _(réponse libre et courte, à rédiger en anglais)_ + +L'épreuve se déroule sur une durée de **30 minutes**, supervisée et encadrée par un surveillant. + +### 📽️ Présentation d'un projet réalisé en amont de la session + +À partir de maintenant : tu es face au jury ! 😱 + +Pas de panique, ton jury est là pour **t'aider** et **te guider**. +Il ne cherchera pas à te piéger, mais à évaluer tes compétences. + +Mais alors, qu'est-ce que tu vas devoir présenter ? +_(Oui, le titre de cette épreuve est très explicite donc bof bof l'effet de suspense...)_ + +Tu vas devoir présenter un projet que tu as réalisé _(en solo ou en équipe)_. +Le projet présenté n'est pas nécessairement un projet "réel" : il peut s'agir d'un projet fictif, mais qui doit être **crédible**. + +Et même au delà d'être crédible, il doit répondre aux critères d'évaluation du référentiel de certification. + +<Admonition type="quote" title="Mais mon projet ne couvre pas toutes les compétences professionnelles..."> + Si ton projet ne couvre pas toutes les compétences professionnelles, ce n'est pas grave. + Tu n'auras juste pas ton titre professionnel. + + ... Non, je plaisante ! 😅 + + Tu as tout à fait le droit de présenter **plusieurs projets différents** pour te permettre de couvrir l'ensemble des compétences professionnelles ! +</Admonition> + +Pour en revenir sur les compétences à couvrir avec les projets présentés, voici les compétences **obligatoires** : +- [Maquetter des interfaces utilisateur web ou web mobile _(CP 2)_](/titres-professionnels/DWWM/AT1/CP1) +- [Réaliser des interfaces utilisateur web statiques web ou web mobile _(CP 3)_](/titres-professionnels/DWWM/AT1/CP2) +- [Développer la partie dynamique des interfaces utilisateur web ou web mobile _(CP 4)_](/titres-professionnels/DWWM/AT1/CP3) +- [Mettre en place une base de données relationnelle _(CP 5)_](/titres-professionnels/DWWM/AT2/CP5) +- [Développer des composants d'accès aux données SQL et NoSQL _(CP 6)_](/titres-professionnels/DWWM/AT2/CP6) +- [Développer des composants métier côté serveur _(CP 7)_](/titres-professionnels/DWWM/AT2/CP7) + +Comme tu peux le constater, il manque les CP 1 et 8. +En même temps, c'est normal : ce n'est pas le projet qui couvre ces compétences, mais la présentation de ton projet et ton entretien avec le jury ! + +Tu disposeras d'un total de **35 minutes** pour présenter ton projet. + +### 🔨 Entretien technique + +L'épreuve tant redoutée : l'entretien technique. + +À tort, car en réalité ton jury va chercher à cocher des cases pour valider tes compétences. +Il ne va pas chercher à te piéger, mais à t'aider à montrer ce que tu sais faire et ce que tu as compris ! + +L'entièreté de l'entretien technique se déroule à l'oral, où l'on ne te demandera pas de coder en direct. +Par contre, ton jury peut très bien te demander de **résoudre un problème** ou **expliquer un concept**, voire même de **faire une requête SQL avec jointure**. + +La raison est simple. Ce n'est pas parce que tu utilises au quotidien des outils comme des frameworks ou ORM que tu comprends comment ils fonctionnent et ce qu'ils font derrière. +Si demain ton entreprise décide d'arrêter d'utiliser un ORM pour des raisons de performance, tu dois être en mesure de comprendre comment faire une requête SQL. + +Mais rassure-toi, si cette épreuve est redoutée, c'est aussi parce qu'elle est très formatrice. +Ton jury te donnera des informations et conseils pour t'aider à évoluer et progresser ! + +Pour cette épreuve, tu disposes de **40 minutes**. + +### 💬 Entretien final + +Et maintenant on peut souffler ! La partie la plus "cool" de la soutenance arrive. +Bon, ça reste une épreuve à part entière, mais c'est la plus "cool" quand même. + +L'entretien final est une discussion avec le jury, où tu pourras poser des questions et échanger avec eux. +Ici on ne parlera pas de technique, mais de ton projet professionnel, de tes ambitions, de tes envies... + +Tu l'auras compris : c'est l'occasion de montrer que tu es motivé·e et que tu as envie d'apprendre et de progresser. + +Si tu es déjà salarié·e, n'hésite pas à parler de ton expérience, +du contexte humain qu'il y a et des projets sur lesquels tu as travaillé _(en faisant attention à respecter la confidentialité des informations)_. + +Ton jury cherchera de son côté à vérifier que tu ais une bonne vision du métier de développeur web et que tu es prêt·e à exercer ce métier d'un point de vue professionnel. + +## 🗓️ Planning type + +Maintenant tu te demandes peut-être comment se déroule une journée de soutenance type, non ? + +Même si chaque organisme organisatrice de certification peut avoir son propre planning, +voici un exemple de planning type relativement léger et conventionnel : + +| Début | Fin | Objet | Détails | +| ----- | ----- | ------------------------------- | -------------------------------------------------------------- | +| 09h00 | 09h30 | Accueil | Accueil des candidats et vérification des identités | +| 09h30 | 10h00 | **Questionnaire professionnel** | Épreuve écrite d'anglais | +| 10h00 | 10h30 | Pause | Moment de détente et de décompression | +| 10h30 | 12h00 | **Soutenance** | Présentation du projet, entretien technique et entretien final | +| 12h00 | 13h30 | Pause déjeuner | Moment de détente et de décompression | +| 13h30 | 15h00 | **Soutenance** | Présentation du projet, entretien technique et entretien final | +| 15h15 | 16h45 | **Soutenance** | Présentation du projet, entretien technique et entretien final | + +<Admonition type="tip" title="Les horaires annoncées"> + Les horaires annoncées sont donnés à titre **indicatif** et peuvent varier en fonction de l'organisme organisateur de la certification. + Réfère-toi aux **informations communiquées par l'organisme** pour connaître les **horaires exacts** et les **modalités de déroulement** de la certification. + + Mais ce qu'il faut bien avoir en tête, c'est que même le planning officiellement annoncé peut ne pas être respecté à la minute près. + + Un jury peut très bien décider de prendre moins de temps pour une autre à condition que le jury ait pu laisser le temps au candidat de montrer ses compétences, + sans le brusquer, le mettre en difficulté ou l'empêcher de s'exprimer et surtout : **avec l'accord du candidat**. + + Dans le cas contraire, le candidat peut signaler au surveillant _(ou responsable de session)_ + que le jury ne lui a pas permis de montrer ses compétences dans les meilleures conditions. + + Cependant, il ne pourra pas accorder plus de temps que prévu pour une épreuve, car cela pourrait être considéré comme un avantage injuste pour le candidat. + Par équité, le jury doit respecter le temps imparti pour chaque candidat. +</Admonition> + +<Admonition type="info" title="Les durées d'épreuves"> + Si tu te poses ce genre de question : + _"Si je boucle ma présentation 10 minutes en avance, j'aurais 10 minutes de plus pour l'entretien technique ?"_ + + La réponse est **non**. + Les durées d'épreuves sont des temps **maximaux** et ne peuvent pas être dépassés. + + Essaye au contraire du profiter du temps qu'il te reste pour présenter des éléments supplémentaires, montrer des fonctionnalités que tu n'as pas eu le temps de montrer, etc. +</Admonition> + +## 🧑‍⚖️ Les résultats + +Forcément, tu te demandes comment tu vas savoir si tu as réussi ou non ! +Pas de chance, tu n'auras aucune information sur place. + +Tant que l'information n'est pas rendue officielle par la [DREETS](https://dreets.gouv.fr/), aucune information ne peut être donnée. + +Les délais sont variables, mais entre le jour de la soutenance et la réception des résultats, il peut s'écouler entre **3 et 6 semaines**. + +<Admonition type="tip" title="Et si je n'ai pas mon titre professionnel ?"> + Si tu n'as pas ton titre professionnel, ce n'est pas la fin du monde. + Tu pourras te représenter à la certification selon les modalités de l'organisme organisateur de la certification. + + Tu as un total de **12 mois** pour te représenter à la certification, à partir de la date de la première session de certification. + Passé ce délai, tu devras repasser par la case formation ou t'inscrire en VAE si tu remplis les conditions. + + Dans le cas où tu as partiellement validé ton titre professionnel, tu pourras te représenter uniquement sur les compétences non validées. + Tu n'auras donc pas à repasser l'intégralité de la certification. +</Admonition> \ No newline at end of file diff --git a/old/docs/titres-professionnels/_category_.json b/old/docs/titres-professionnels/_category_.json new file mode 100644 index 0000000..8503b16 --- /dev/null +++ b/old/docs/titres-professionnels/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "🎓 Titres professionnels", + "position": 3, + "link": { + "type": "generated-index", + "description": "Tu retrouveras ici l'ensemble des titres professionnels couverts par la plateforme Memento Dev." + } +} diff --git a/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1.mdx b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1.mdx new file mode 100644 index 0000000..a590f56 --- /dev/null +++ b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP1.mdx @@ -0,0 +1,112 @@ +--- +sidebar_position: 1 +title: "CP 1" +description: "Synthèse de la CP 1 \"Maquetter une application\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." +--- + +import Admonition from '@theme/Admonition'; + +# Maquetter une application + +<Admonition type="warning" title="Attention, tu es en train de consulter un référentiel expiré !"> + [Aller sur le contenu du nouveau référentiel en vigueur](/titres-professionnels/DWWM/intro) +</Admonition> + +## 📚 Références + +- REAC _(mise à jour du 27/04/2018)_, pages 13 et 14 +- RC _(mise à jour du 19/04/2018)_, page 9 + +## 📋 En résumé + +Dans cette compétence professionnelle, tu devras démontrer tes compétences sur la conception du front-end, à savoir : + +- La réalisation d'un cahier des charges +- La conception des wireframes _(desktop et mobile)_, réalisés à partir des besoins du clients _(ou user stories)_ puis des maquettes en appliquant la charte graphique +- Arborescence des pages + +Comme tu peux le constater, ici il n'est pas question de code : uniquement de la conception de l'interface utilisateur et de son ergonomie 😉 + +Avant d'enchaîner avec les critères d'évaluation et la prochaine compétence professionnelle, voici quelques informations complémentaires qui sont importantes. + +## ➕ Informations complémentaires + +Bien qu'on soit tous tentés de se jeter directement dans le code, il est important de bien maquetter son application avant de commencer à coder. +Surtout si tu travailles en équipe, cela permet de bien comprendre les besoins du client et de s'assurer que tout le monde est sur la même longueur d'onde. + +Voici les étapes à suivre pour bien maquetter son application : + +1. **Récupération des besoins du client** + - Si tu as des user stories, c'est le moment de les relire + - Si tu n'as pas de user stories, c'est le moment de les rédiger à partir des besoins du client + - C'est aussi à ce moment que l'on rédige le cahier des charges +2. **Arborescence des pages** + - Elle permet de définir les liens entre les différentes pages de l'application, comme un plan de site + - Pense à distinguer les pages accessibles par tous des pages accessibles uniquement par les utilisateurs connectés _(par exemple)_ +3. **Création des zonings** + - Ils permettent de définir les zones de l'application, sans définir le contenu +4. **Conception des wireframes** + - Ils complètent les zonings en définissant le contenu des zones +5. **Création de la charte graphique** + - Elle permet de définir les couleurs, les polices, les icônes, etc. +6. **Conception des maquettes** + - Elles permettent de visualiser l'application finale, en appliquant la charte graphique définie plus tôt sur les wireframes déjà réalisés +7. **Prototypage** + - Il permet de simuler l'application pour valider l'expérience utilisateur + - Tu as plusieurs outils pour réaliser des prototypes, comme [Figma](https://www.figma.com/fr-fr/), [Adobe XD](https://www.adobe.com/fr/products/xd.html), [Sketch](https://www.sketch.com/), etc. + +Ce n'est qu'une fois toutes ces étapes réalisées que tu pourras te lancer dans le code, pour l'intégration de l'interface utilisateur. + +### ⚙️ Ergonomie + +- On essaye de ne pas perdre l'utilisateur avec une interface trop complexe +- On essaye de le guider dans son parcours utilisateur +- On lui évite de devoir réfléchir où se trouve l'information qu'il recherche en minimisant le nombre de clics + +### 👓 Accessibilité + +- On évite les couleurs trop proches ou trop peu contrastées _(<abbr title="Web Content Accessibility Guidelines">WCAG</abbr>)_ +- On prévoit des alternatives textuelles pour les images, vidéos et autres médias + +<Admonition type="info" title="Contrastes des couleurs"> + Pour vérifier si les couleurs de ton site respectent les normes d'accessibilité, tu peux utiliser des outils comme [WebAim Contrast Checker](https://webaim.org/resources/contrastchecker/), [Contrast Checker](https://contrastchecker.com/) ou encore [Coolors](https://coolors.co/contrast-checker/112a46-acc8e5). + + L'idée est de viser le niveau AA au strict minimum et idéalement le niveau AAA. + + Tu as également des extensions pour Firefox et Chrome qui te permettent de vérifier les contrastes directement sur ton site : + + - [_(Firefox)_ <abbr title="Web Content Accessibility Guidelines">WCAG</abbr> Contrast Checker, par Jorge Rumoroso](https://addons.mozilla.org/fr/firefox/addon/wcag-contrast-checker) + - [_(Chrome)_ <abbr title="Web Content Accessibility Guidelines">WCAG</abbr> Color Contrast Checker, par Jorge Rumoroso](https://chromewebstore.google.com/detail/wcag-color-contrast-check/plnahcmalebffmaghcpcmpaciebdhgdf) +</Admonition> + +## 🎯 Critères d'évaluation + +- La maquette prend en compte les spécificités fonctionnelles décrites dans les cas d'utilisation ou les scénarios utilisateur +- La maquette est conforme à l'expérience utilisateur et à l'équipement ciblé +- La maquette respecte les principes de sécurisation d'une interface utilisateur +- Le contenu de la maquette, pour la partie visible, est rédigé, en français ou en anglais, de façon adaptée à l'interlocuteur et sans faute + +## 🤯 Aller plus loin _(hors référentiel)_ + +Même si le référentiel ne le mentionne pas, il est important de bien concevoir les wireframes _(desktop et mobile)_ +pour bien comprendre les besoins du client et les retranscrire dans les maquettes. + +Au delà de la prise en compte des besoins du client, il est important de prendre en compte les spécificités des utilisateurs, +allant de l'ergonomie à l'accessibilité. + +--- + +## 🧠 Documentation + +- [Wikipédia - Wireframe _(design)_](https://fr.wikipedia.org/wiki/Wireframe_(design)) +- [Atlassian - User stories](https://www.atlassian.com/fr/agile/project-management/user-stories) + +## 🛠️ Outils + +- [Figma - Outil de création de design](https://www.figma.com/fr-fr/) +- [Adobe XD - Outil de design et de prototypage](https://www.adobe.com/fr/products/xd.html) +- [Sketch - Outil de design](https://www.sketch.com/) +- [GlooMaps - Générateur d'arborescence de pages](https://www.gloomaps.com/) +- [WebAim Contrast Checker](https://webaim.org/resources/contrastchecker/) +- [Contrast Checker](https://contrastchecker.com/) +- [Coolors - Contrast Checker](https://coolors.co/contrast-checker/112a46-acc8e5) \ No newline at end of file diff --git a/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2.mdx b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2.mdx new file mode 100644 index 0000000..4973aff --- /dev/null +++ b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP2.mdx @@ -0,0 +1,129 @@ +--- +sidebar_position: 2 +title: "CP 2" +description: "Synthèse de la CP 1 \"Réaliser une interface utilisateur web statique et adaptable\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." +--- + +import Admonition from '@theme/Admonition'; + +# Réaliser une interface utilisateur web statique et adaptable + +<Admonition type="warning" title="Attention, tu es en train de consulter un référentiel expiré !"> + [Aller sur le contenu du nouveau référentiel en vigueur](/titres-professionnels/DWWM/intro) +</Admonition> + +## 📚 Références + +- REAC _(mise à jour du 27/04/2018)_, pages 15 et 16 +- RC _(mise à jour du 19/04/2018)_, page 9 + +## 🚀 Contexte + +Ça y est, on peut enfin démarrer le code ! 🚀 +À cette étape, on ne parle encore que d'interface statique, c'est-à-dire sans interaction avec l'utilisateur. + +Pour résumer : HTML et CSS sont tes amis pour cette compétence professionnelle ! + +<Admonition type="quote" title="Le projet que je présente contient du JavaScript, est-ce un problème ?"> +Absolument pas ! C'est même rassurant, puisque ce sera nécessaire pour la suite. +Cependant pour cette compétence professionnelle, on se concentre sur l'interface statique. +Si ton projet contient du JS, voire même qu'il est fait avec React, Angular ou Vue.js, ne te concentre pas sur cet aspect là. + +Réserve toutes les informations croustillantes pour la prochaine compétence professionnelle 😉 +</Admonition> + +Maintenant qu'on sait que JS n'est pas attendu pour cette compétence professionnelle, parlons un peu de ce qui est attendu de toi. + +Quand on parle d'interface utilisateur, on parle de la partie visible de l'application. +Pour ce qui est du "statique et adaptable", on parle de la capacité de l'interface à s'adapter à différents supports _(desktop, tablette, mobile)_. + +Si je te parle de "responsive design", ça te dit quelque chose ? +L'idée va être de faire en sorte que l'interface s'adapte à la taille de l'écran de l'utilisateur et pour ça, tu as plusieurs solutions : + +- Les **media queries** en CSS +- Les **frameworks CSS** comme TailwindCSS, Bootstrap, Bulma, etc. +- Les **grilles CSS** _(Flexbox, Grid)_ + +<Admonition type="warning" title="Utilisation des frameworks CSS"> +Les frameworks CSS sont très pratiques pour gagner du temps, mais attention à ne pas les utiliser comme une béquille. +Il est important de comprendre comment ils fonctionnent pour ne pas se retrouver bloqué si un problème survient ou si demain, +tu dois travailler sur un projet qui n'utilise pas de framework. +</Admonition> + +Allez, c'est presque terminé pour cette <abbr title="Compétence Professionnelle">CP</abbr>, accroche-toi ! 🫠 + +Si on résume ce que tu as actuellement sous la main avec cette <abbr title="Compétence Professionnelle">CP</abbr>, tu as déjà fait : + +- Une structure de page en HTML _(ou JSX si tu utilises React par exemple)_ +- Une mise en forme de cette structure en CSS +- Une adaptation de cette mise en forme en fonction de la taille de l'écran de l'utilisateur + +Il ne reste alors qu'un seul détail à mettre en place : le référencement ! 📈 + +Heureusement on ne te demande pas d'être un expert <abbr title="Search Engine Optimization">SEO</abbr>, mais de maîtriser la sémantique et son impact sur le référencement. Si ta page est remplie de `<div>` et de `<span>`, tu peux être sûr que ton jury va te poser beaucoup de questions sur la sémantique. +Pourquoi ? Parce que ces deux balises n'ont aucun impact sur le référencement, rendant une page difficilement référençable et que ton jury a besoin de savoir si tu maîtrises ou non la sémantique HTML. + +Au delà de la sémantique et toujours dans l'optique du référencement, il est également attendu de toi que tu saches comment fonctionne le **SEO** _(Search Engine Optimization)_ dans les grandes lignes et comment référencer une page web _(`<meta name="description">`, `<title>`, etc.)_. + +Ça te fait un peu peur tout ça ? Il est probable qu'entre le jour où tu lis ces lignes et le jour de ta soutenance que tu n'aies pas le temps de faire toutes les modifications sur ton site : **ce n'est pas grave !** + +Bien sûr, il est préférable que les projets illustrés et présentés durant ta soutenance contiennent toutes ces notions et bonnes pratiques, mais tu peux très bien te baser sur tes connaissances et pas seulement sur ce qui a déjà été réalisé. + +<Admonition type="warning" title="Styles par défaut des navigateurs"> +Peut-être as-tu déjà entendu parler des styles par défaut des navigateurs ? +Ce qui permet à des éléments HTML de s'afficher d'une certaine manière sans que tu aies à les styliser. + +Par exemple, un titre `<h1>` sera plus gros qu'un titre `<h2>`, qui sera plus gros qu'un titre `<h3>`, etc. + +Cependant, il est important de ne pas s'appuyer sur ces styles par défaut pour la mise en forme de ton site. + +La raison est simple : +Imagine que dans les prochaines versions de navigateurs, ces styles par défaut changent. +Ton site ne sera plus du tout le même et tu auras beaucoup de travail pour tout remettre en ordre. + +Mon conseil est alors de **toujours** définir tes propres styles pour être sûr que ton site reste tel +que tu l'as imaginé et dans la mesure du possible, faire un reset CSS pour t'assurer que tous les styles +par défaut des navigateurs soient "inexistants". +</Admonition> + +<Admonition type="warning" title="Correspondance des maquettes avec l'intégration"> +Il est important que l'intégration de ton site web corresponde à la maquette que tu as réalisée lors de la première compétence professionnelle. + Si tu as des différences entre la maquette et l'intégration, tu risques de "t'attirer les foudres" de ton jury _(en toute bienveillance bien sûr 😉)_. + + Si tu as des différences, il est préférable de les expliquer lors de ta soutenance pour montrer que tu as conscience de ces différences et que tu comprends l'enjeu de la cohérence entre la maquette et l'intégration. + + Si tu as le temps, essaye de refaire l'intégralité de la <abbr title="Compétence Professionnelle">CP</abbr> 1 pour tous les documents de maquettage, à minima pour les maquettes desktop et mobile que tu présentes lors de ta soutenance _(non, ne refais pas les 3123 pages d'un coup, ça serait un peu trop 😅)_. +</Admonition> + +## ➕ Informations complémentaires + +Au delà du simple terme "responsive design", on parle régulièrement d'une bonne pratique qui est le **mobile first**. +Le mobile first consiste à concevoir en priorité l'interface pour les mobiles, puis de l'adapter pour les tablettes et les ordinateurs. + +Cet ordre permet de s'assurer que l'interface est bien adaptée pour les mobiles, qui sont les appareils les plus utilisés pour naviguer sur le web. _(Et oui, on est en 2023, les mobiles ont pris le dessus sur les ordinateurs 😉)_ + +**Anecdote inutile _(donc indispensable)_ :** +> Selon [Statista](https://fr.statista.com/infographie/31588/trafic-web-en-france-selon-le-support-utilise-pour-se-connecter-mobile-ordinateur-tablette/#:~:text=Utilisation%20d'Internet&text=Comme%20l'indique%20notre%20graphique,de%203%20%25%20sur%20une%20tablette.), en 2022/2023, 50.7% du trafic web en France était réalisé depuis un mobile, contre 46.7% depuis un ordinateur et 2.6% depuis une tablette. + +## 🎯 Critères d'évaluation + +- L'interface est conforme à la maquette de l'application +- Les bonnes pratiques de structuration sont respectées y compris pour le web mobile +- Les pages web s'adaptent à la taille de l'écran +- Le site respecte les règles de référencement naturel +- La démarche de recherche permet de résoudre un problème technique ou de mettre en œuvre une nouvelle fonctionnalité +- La documentation technique liée aux technologies associées, rédigée en langue anglaise, est comprise (sans contre-sens, ...) + +## 🤯 Aller plus loin _(hors référentiel)_ + +Si tu as lu les informations complémentaires de la <abbr title="Compétence Professionnelle">CP</abbr> 1, tu as déjà une idée de ce que je vais te dire ici... 😏 +Tu te rappelles du terme <abbr title="Web Content Accessibility Guidelines">WCAG</abbr> ? + +Si ce n'est pas le cas, je t'invite à consulter la section "Aller plus loin" de la <abbr title="Compétence Professionnelle">CP</abbr> 1 pour en savoir plus sur l'accessibilité web. + +--- + +## 🧠 Documentation + +- [MDN - Responsive Design](https://developer.mozilla.org/fr/docs/Learn/CSS/CSS_layout/Responsive_Design) +- [MDN - Media Queries](https://developer.mozilla.org/fr/docs/Web/CSS/Media_Queries/Using_media_queries) diff --git a/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3.mdx b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3.mdx new file mode 100644 index 0000000..e6f191a --- /dev/null +++ b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP3.mdx @@ -0,0 +1,125 @@ +--- +sidebar_position: 3 +title: "CP 3" +description: "Synthèse de la CP 3 \"Développer une interface utilisateur web dynamique\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." +--- + +import Admonition from '@theme/Admonition'; + +# Développer une interface utilisateur web dynamique + +<Admonition type="warning" title="Attention, tu es en train de consulter un référentiel expiré !"> + [Aller sur le contenu du nouveau référentiel en vigueur](/titres-professionnels/DWWM/intro) +</Admonition> + +## 📚 Références + +- REAC _(mise à jour du 27/04/2018)_, pages 17 et 18 +- RC _(mise à jour du 19/04/2018)_, page 9 + +## 🚀 Contexte + +Et maintenant que tout est fait pour la partie statique, il va falloir mettre en place une partie dynamique ! + +<Admonition type="quote" title="Mais... comment je peux faire ET du statique, ET du dynamique ?"> + Pas de panique, c'est très simple ! + + En réalité, toutes les pages peuvent avoir du JavaScript sans souci, mais il est important de ne pas parler de JavaScript dans la partie statique. + Par contre, vu qu'ici on parle de la <abbr title="Compétence Professionnelle">CP</abbr> 3 et donc de contenu dynamique, JavaScript prend toute son importance ! Tu peux tout à fait te baser sur la même page que la précédente et parler maintenant des interactions utilisateurs 😉 +</Admonition> + +<Admonition type="info" title="Petit rappel"> + En dehors de l'aspect statique, la <abbr title="Compétence Professionnelle">CP</abbr> 3 se base sur tous les points de la <abbr title="Compétence Professionnelle">CP</abbr> 2, donc référencement et responsive ! +</Admonition> + +Si tu as utilisé des requêtes AJAX pour récupérer des données, c'est le moment de les mettre en avant avec des extraits de code commentés pour expliquer leur fonctionnement ! + +<Admonition type="example" title="Exemple de connexion avec React"> + ```tsx showLineNumbers + import React, { useState } from 'react'; + + // On crée un état initial pour notre formulaire + const initialState = { + email: '', + password: '', + }; + + const LoginForm = () => { + const [form, setForm] = useState(initialState); + + const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => { + // On récupère le nom et la valeur de l'input qui a déclenché l'événement + const { name, value } = event.target; + setForm({ ...form, [name]: value }); + }; + + const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => { + // On empêche le formulaire de se soumettre et donc de recharger la page + event.preventDefault(); + + // On peut maintenant envoyer les données du formulaire à notre API + const response = await fetch('/api/login', { method: 'POST', body: JSON.stringify(form) }); + const data = await response.json(); + + // On peut ensuite traiter la réponse de l'API + // ... + }; + + return ( + <form onSubmit={handleSubmit}> + <label htmlFor="email">Email</label> + <input + id="email" + type="email" + name="email" + value={form.email} + onChange={handleChange} + placeholder="jean.dupont@exemple.fr" + /> + + <label htmlFor="password">Mot de passe</label> + <input + id="password" + type="password" + name="password" + value={form.password} + onChange={handleChange} + placeholder="********" + /> + + <button type="submit">Se connecter</button> + </form> + ); + }; + ``` +</Admonition> + +## 🎯 Critères d'évaluation + +- Les pages web sont conformes à l'expérience utilisateur y compris pour l'expérience mobile +- L'architecture de l'application répond aux bonnes pratiques de développement et de sécurisation d'application web +- L'application web est optimisée pour les équipements mobiles +- La démarche de recherche permet de résoudre un problème technique ou de mettre en œuvre une nouvelle fonctionnalité +- La veille sur les vulnérabilités connues permet d'identifier des failles potentielles +- La documentation technique liée aux technologies associées, rédigée en langue anglaise, est comprise _(sans contre-sens, ...)_ + +## 🤯 Aller plus loin _(hors référentiel)_ + +Cette partie concerne principalement les développeuses et développeurs qui ont utilisés des frameworks/bibliothèques +pour le développement de leur interface utilisateur, comme React, Angular, Vue.js, etc. + +Dans la plupart des cas, ces outils permettent de créer la partie front-end de manière dynamique, mais sans aucune gestion de la partie back-end. +Peut-être que vous me voyez venir... 😏 + +Comme la partie référencement est essentielle sur un site web et sur ce titre professionnel, +il est important de bien comprendre comment fonctionne le référencement sur une application web dynamique qui ne gère pas le back-end. +Le contenu généré par JavaScript _(côté navigateur)_ n'est pas indexé par les moteurs de recherche, ce qui implique que le référencement naturel est impacté. + +Pour contre-balancer cet aspect, il est possible de mettre en place des solutions comme le [Server Side Rendering _(SSR)_](https://openclassrooms.com/fr/courses/5922626-optimisez-le-referencement-de-votre-site-seo-en-ameliorant-ses-performances-techniques/6055261-decidez-entre-client-side-et-server-side-rendering) ou le [Static Site Generation _(SSG)_](https://www.cloudflare.com/fr-fr/learning/performance/static-site-generator/) pour générer le contenu côté serveur et le rendre accessible aux moteurs de recherche. + +Pour React, l'une des solutions les plus connue reste [Next.js](https://nextjs.org/), qui permet de gérer le rendu côté serveur et de générer des pages statiques. +On retrouve d'ailleurs une solution similaire pour Vue.js avec [Nuxt.js](https://nuxtjs.org/). + +Bien que ces solutions soient très intéressantes, je conseille régulièrement de regarder [Vike](https://vike.dev/) +qui permet aux applications React, Vue, Svelte, Preact, Solid et Angular de palier à ce problème de référencement _(et bien plus encore)_. + diff --git a/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4.mdx b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4.mdx new file mode 100644 index 0000000..14d97ab --- /dev/null +++ b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT1/CP4.mdx @@ -0,0 +1,45 @@ +--- +sidebar_position: 4 +title: "CP 4" +description: "Synthèse de la CP 4 \"Réaliser une interface utilisateur avec une solution de gestion de contenu ou e-commerce\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." +--- + +import Admonition from '@theme/Admonition'; + +# Réaliser une interface utilisateur avec une solution de gestion de contenu ou e-commerce + +<Admonition type="warning" title="Attention, tu es en train de consulter un référentiel expiré !"> + [Aller sur le contenu du nouveau référentiel en vigueur](/titres-professionnels/DWWM/intro) +</Admonition> + +## 📚 Références + +- REAC _(mise à jour du 27/04/2018)_, pages 19 et 20 +- RC _(mise à jour du 19/04/2018)_, page 10 + +## 🚀 Contexte + +Ici, on parle uniquement de la création d'un thème custom sur un CMS et/ou d'un ecommerce. +Comme je ne suis pas très calé sur cette partie, je te conseille de lire **très attentivement** +la ressource liée dans le REAC, aux pages mentionnées ci-dessus. + +C'est également le moment pour rappeler que cette compétence professionnelle n'est pas "obligatoire", dans la mesure +où les <abbr title="Compétences Professionnelles">CPs</abbr> 1, 2 et 3 sont validées. + +On retrouvera d'ailleurs le même cas de figure pour la <abbr title="Compétence Professionnelle">CP</abbr> 8. + +## 🎯 Critères d'évaluation + +- Les comptes utilisateurs sont créés avec leurs droits et rôles dans le respect des règles de sécurité +- La structure du site est conforme au besoin client +- Le site respecte les règles de référencement naturel +- La démarche de recherche permet de résoudre un problème technique ou de mettre en œuvre une nouvelle fonctionnalité +- La veille sur les vulnérabilités connues permet d'identifier des failles potentielles +- La documentation technique liée aux technologies associées, rédigée en langue anglaise, est comprise _(sans contre-sens, ...)_ + +--- + +## 🧠 Documentation + +- [Wordpress - Documentation](https://developer.wordpress.org/) +- [Wordpress - Hiérarchie des pages](https://developer.wordpress.org/themes/basics/template-hierarchy/) \ No newline at end of file diff --git a/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5.mdx b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5.mdx new file mode 100644 index 0000000..cb6586e --- /dev/null +++ b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP5.mdx @@ -0,0 +1,91 @@ +--- +sidebar_position: 5 +title: "CP 5" +description: "Synthèse de la CP 5 \"Créer une base de données\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." +--- + +import Admonition from '@theme/Admonition'; + +# Créer une base de données + +<Admonition type="warning" title="Attention, tu es en train de consulter un référentiel expiré !"> + [Aller sur le contenu du nouveau référentiel en vigueur](/titres-professionnels/DWWM/intro) +</Admonition> + +## 📚 Références + +- REAC _(mise à jour du 27/04/2018)_, pages 21 et 22 +- RC _(mise à jour du 19/04/2018)_, page 10 + +## 🚀 Contexte + +Je pense que les mots sont dits : il faut créer une base de données 🙃 +OK c'est vrai que si on part de ce principe, la CP est vite complétée et on passerait à la CP 6 de suite, mais ça va plus loin en réalité ! + +Comme pour la CP 1, on va avant toute chose parler de la conception, soit : La modélisation de la base de données. +Et pour modéliser notre base de données, on va se baser sur la méthode [Merise](https://fr.wikipedia.org/wiki/Merise_(informatique)). + +Dans cette méthode on retrouvera plusieurs schémas, notamment ces derniers : + +- Le dictionnaire des données qui permet de définir les données de chaque entité. +- Le MCD _(Modèle Conceptuel de Données)_ qui permet de définir les entités et les relations entre ces entités. +- Le MLD _(Modèle Logique de Données)_ qui permet de définir les tables et les relations entre ces tables. +- Le MPD _(Modèle Physique de Données)_ qui permet de définir les tables, les relations, les types de données, les contraintes, etc. + +Bien qu'il existe des outils pour réaliser ces modèles, il est tout à fait possible de les réaliser avec un papier et un crayon. +Toutefois, un super outil pour réaliser tout cette conception existe : [Looping](https://www.looping.fr/). + +<Admonition type="warning" title="Compatibilité"> + Looping est un logiciel qui fonctionne sous Windows. + Pour les utilisateurs de Mac ou Linux, il faudra passer par une machine virtuelle ou un émulateur comme [Wine](https://www.winehq.org/). +</Admonition> + +<Admonition type="warning" title="Conformité des schémas"> + Même si la base de données peut évoluer au travers du développement, le fait de maintenir à jour les schémas _(tous, sans exception !)_ est primordial. + Votre jury sera très attentif à la conformité de vos schémas, alors ne négligez pas cette partie. +</Admonition> + +## ➕ Informations complémentaires + +Tout comme la <abbr title="Compétence Professionnelle">CP</abbr> 1, on serait tenté de se plonger immédiatement dans le code, mais il est important de bien modéliser sa base de données avant de commencer à coder. + +Voici les étapes à suivre pour bien modéliser sa base de données : + +1. **Définition des besoins** + - Il est important de bien comprendre les besoins du client pour définir les données à stocker. +2. **Dictionnaire des données** + - Il permet de définir les données de chaque entité, avec des types génériques comme "alphanumérique", "alphabétique", "numérique", "date", etc. +3. **Modèle Conceptuel de Données _(MCD)_** + - Il permet de définir les entités et les relations entre ces entités, sans se soucier des contraintes techniques. +4. **Modèle Logique de Données _(MLD)_** + - Il permet de définir les tables et les relations entre ces tables, en prenant en compte les contraintes techniques. +5. **Modèle Physique de Données _(MPD)_** + - Il permet de définir les tables, les relations, les types de données, les contraintes, etc. pour la base de données. + +<Admonition type="warning" title="Intentions pour le MCD"> + N'oubliez pas que le <abbr title="Modèle Conceptuel de Données">MCD</abbr> est un modèle conceptuel, il ne doit pas contenir de contraintes techniques ni de termes techniques. + Ce dernier est avant tout destiné à être compris par le client. +</Admonition> + +<Admonition type="warning" title="Liaisons graphiques entre entités/tables"> + Les liaisons entre les entités/tables au travers de la méthode Merise ne doivent en aucun cas se faire avec la notation "crow's foot" _(pattes de corbeau)_. + Cette dernière n'est pas conforme à cette méthode et est davantage utilisée dans la méthode [UML](https://fr.wikipedia.org/wiki/UML_(informatique)). +</Admonition> + +## 🎯 Critères d'évaluation + +- La base de données est conforme au schéma physique +- Les scripts de création de bases de données et d'insertion des données de test s'exécutent sans erreurs +- Les besoins de sécurité du <abbr title="Système de Gestion de Base de Données">SGBD</abbr> sont exprimés selon l'état de l'art et les exigences de sécurité identifiées +- La démarche de recherche permet de résoudre un problème technique ou de mettre en œuvre une nouvelle fonctionnalité +- La documentation technique liée aux technologies associées, rédigée en langue anglaise, est comprise _(sans contre-sens, ...)_ + +--- + +## 🧠 Documentation + +- [Éditions ENI - Merise - Guide pratique (4e édition), par **Jean-Luc Baptiste**](https://www.editions-eni.fr/livre/merise-guide-pratique-4e-edition-modelisation-des-donnees-et-des-traitements-manipulations-avec-le-langage-sql-conception-d-une-application-mobile-android-ou-ios-9782409046667) + +## 🛠 Outils + +- [Looping](https://www.looping.fr/) diff --git a/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6.mdx b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6.mdx new file mode 100644 index 0000000..4164f40 --- /dev/null +++ b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP6.mdx @@ -0,0 +1,115 @@ +--- +sidebar_position: 6 +title: "CP 6" +description: "Synthèse de la CP 5 \"Développer les composants d'accès aux données\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." +--- + +import Admonition from '@theme/Admonition'; + +# Développer les composants d'accès aux données + +<Admonition type="warning" title="Attention, tu es en train de consulter un référentiel expiré !"> + [Aller sur le contenu du nouveau référentiel en vigueur](/titres-professionnels/DWWM/intro) +</Admonition> + +## 📚 Références + +- REAC _(mise à jour du 27/04/2018)_, pages 23 et 24 +- RC _(mise à jour du 19/04/2018)_, page 11 + +## 🚀 Contexte + +Maintenant que tu connais la structure de ta base de données et qu'elle est créée, il va falloir expliquer comment ton application pourra accéder aux données stockées. + +En PHP, tu connais certainement `PDO`, mais tu as peut-être également utilisé un <abbr title="Object-Relational Mapping">ORM</abbr> +comme [Eloquent](https://laravel.com/docs/11.x/eloquent) ou encore [Doctrine](https://symfony.com/doc/current/doctrine.html). + +Pour NodeJS, tu as peut-être utilisé les pilotes [mysql](https://www.npmjs.com/package/mysql), [pg](https://www.npmjs.com/package/pg) ou +[sqlite](https://www.npmjs.com/package/sqlite) pour accéder à ta base de données ou encore un <abbr title="Object-Relational Mapping">ORM</abbr> +comme [Prisma](https://www.npmjs.com/package/prisma) ou [Sequelize](https://www.npmjs.com/package/sequelize). + +L'idée ici est d'expliquer comment le back va se connecter à la base de données **ET** comment le back est structuré pour accéder aux données. + +Tu vas donc avoir très certainement avoir besoin de parler des services et des modèles qui permettent d'accéder aux données et de les altérer. + +Comme cette <abbr title="Compétence Professionnelle">CP</abbr> _(et les suivantes)_ parlent de sécurité, +c'est l'occasion de parler de ton fichier `.env` et du `.gitignore` afin de ne pas avoir de fichiers sensibles dans le repository de ton projet, +dont les informations de connexion à la base de données. + +<Admonition type="warning" title="Utilisation d'ORM/query builder"> + Si tu utilises un <abbr title="Object-Relational Mapping">ORM</abbr> ou un query builder, il est important de bien expliquer comment tu l'as configuré et comment tu l'utilises. + En plus d'expliquer comment cet outil a été paramétré, tu dois être en mesure d'expliquer la construction SQL générée par cet outil. + + Par exemple avec Prisma : + ```javascript showLineNumbers + const user = await prisma.user.findUnique({ + select: { + id: true, + name: true, + email: true, + posts: { + select: { + title: true, + }, + }, + }, + include: { + posts: true, + }, + where: { + id: 1, + }, + }); + ``` + + Ce qui donnera : + ```sql + SELECT u.id, u.name, u.email, p.title -- Sélection des colonnes + FROM "User" u -- Table principale + INNER JOIN "Post" p ON p.userId = u.id -- Jointure avec la table "Post" + WHERE u.id = 1; -- Condition de sélection + ``` + + _(Oui, c'est un exemple fictif et pas entièrement correspondant, mais tu as compris l'idée !)_ +</Admonition> + +On est d'accord : cette <abbr title="Compétence Professionnelle">CP</abbr> est un gros morceau, +mais c'est un passage obligé pour bien comprendre comment ton application va interagir avec la base de données ! + +## 🎯 Critères d'évaluation + +- Les traitements relatifs aux manipulations des données répondent aux fonctionnalités décrites dans le dossier de conception technique +- Un test unitaire est associé à chaque composant, avec une double approche fonctionnelle et sécurité +- Les composants d'accès à la base de données suivent les règles de sécurisation reconnues +- La démarche de recherche permet de résoudre un problème technique ou de mettre en œuvre une nouvelle fonctionnalité +- La veille sur les vulnérabilités connues permet d'identifier des failles potentielles +- La documentation technique liée aux technologies associées, rédigée en langue anglaise, est comprise _(sans contre-sens, ...)_ + +## 🤯 Aller plus loin _(hors référentiel)_ + +### 🛡️ Sécurisation des données + +J'imagine que dans ton application tu as des données sensibles, comme des informations personnelles ou encore des mots de passe. +En ce qui concerne les mots de passe, il est essentiel que ces derniers soient stockés de manière sécurisée, c'est-à-dire **hashés**. +Pour cela, tu peux utiliser des fonctions de hachage comme [bcrypt](https://www.npmjs.com/package/bcrypt) avec NodeJS ou encore [password_hash](https://www.php.net/manual/fr/function.password-hash.php) en PHP. + +Pour les informations personnelles, tu as également la possibilité de les sécuriser en les chiffrant ! +Tu peux très bien te baser sur un algorithme maison ou encore utiliser des bibliothèques comme [crypto-js](https://www.npmjs.com/package/crypto-js) en NodeJS ou encore [openssl](https://www.php.net/manual/en/book.openssl.php) en PHP. + +### 🗑️ Suppression des données + +<Admonition type="quote" title="Un peu de ménage ne fait jamais de mal !"> + On est d'accord ! Cependant, la suppression de données est une opération délicate. + Se dire "il suffit de faire un `DELETE FROM table WHERE id = 1`" peut potentiellement poser des problèmes. +</Admonition> + +En effet, il est important de bien réfléchir à la suppression de données, notamment pour les données liées à d'autres données _(les fameux `ON DELETE CASCADE` par exemple)_. + +Puisque l'erreur est humaine, permettre la suppression aussi simplement que via un bouton "Supprimer" peut être risqué, même si ce dernier est protégé par un message de confirmation. + +On va préférer d'une suppression logique, c'est-à-dire qu'on va "désactiver" la donnée plutôt que de la supprimer définitivement. +C'est ce qu'on appelle plus communément le **"soft delete"**, là où la suppression définitive est appelée **"hard delete"**. + +Il est également important de maintenir un certain état des données stockées, notamment pour des raisons légales ou encore pour des raisons de traçabilité. +Bien entendu, lorsque l'utilisateur souhaite supprimer définitivement ses données _(<abbr title="Règlement Général sur la Protection des Données">RGPD</abbr>)_, +il est important de bien l'informer des conséquences de cette action et des délais de suppression dans la politique de confidentialité de ton application. diff --git a/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7.mdx b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7.mdx new file mode 100644 index 0000000..deabcfc --- /dev/null +++ b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP7.mdx @@ -0,0 +1,43 @@ +--- +sidebar_position: 7 +title: "CP 7" +description: "Synthèse de la CP 7 \"Développer la partie back-end d'une application web ou web mobile\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." +--- + +import Admonition from '@theme/Admonition'; + +# Développer la partie back-end d'une application web ou web mobile + +<Admonition type="warning" title="Attention, tu es en train de consulter un référentiel expiré !"> + [Aller sur le contenu du nouveau référentiel en vigueur](/titres-professionnels/DWWM/intro) +</Admonition> + +## 📚 Références + +- REAC _(mise à jour du 27/04/2018)_, pages 25 et 26 +- RC _(mise à jour du 19/04/2018)_, page 11 + +## 🚀 Contexte + +En continuité avec la <abbr title="Compétence Professionnelle">CP</abbr> 6, +tu vas devoir maintenant expliquer comment circule la donnée dans le back de ton application, +que ce soit une API ou que ton back serve des pages web. + +Concrètement, voici ce qu'il faut couvrir : + +- Les routes et endpoints _(back uniquement !)_ +- Les middlewares _(vérification JWT, accès protégé à un rôle particulier, etc)_ +- Les controllers +- La récupération des données saisies par l'utilisateur _(avec une mise en place de la sécurité en y intégrant des vérifications et filtres)_ +- La récupération des données stockées dans la base de données et l'altération des données +- Le formatage de ces données récupérées +- Le retour de ces données au front _(JSON, variables données à une vue servie par le back, etc)_ + +## 🎯 Critères d'évaluation + +- Les bonnes pratiques de développement sont respectées +- Les composants serveur contribuent à la sécurité de l'application +- Le code source des composants est documenté ou auto-documenté +- La démarche de recherche permet de résoudre un problème technique ou de mettre en œuvre une nouvelle fonctionnalité +- La veille sur les vulnérabilités connues permet d'identifier des failles potentielles +- La documentation technique liée aux technologies associées, rédigée en langue anglaise, est comprise _(sans contre-sens, ...)_ diff --git a/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8.mdx b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8.mdx new file mode 100644 index 0000000..5332ece --- /dev/null +++ b/old/docs/titres-professionnels/archives/DWWM/2018-2023/AT2/CP8.mdx @@ -0,0 +1,44 @@ +--- +sidebar_position: 8 +title: "CP 8" +description: "Synthèse de la CP 8 \"Élaborer et mettre en œuvre des composants dans une application de gestion de contenu ou e-commerce\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)." +--- + +import Admonition from '@theme/Admonition'; + +# Élaborer et mettre en œuvre des composants dans une application de gestion de contenu ou e-commerce + +<Admonition type="warning" title="Attention, tu es en train de consulter un référentiel expiré !"> + [Aller sur le contenu du nouveau référentiel en vigueur](/titres-professionnels/DWWM/intro) +</Admonition> + +## 📚 Références + +- REAC _(mise à jour du 27/04/2018)_, pages 27 et 28 +- RC _(mise à jour du 19/04/2018)_, page 12 + +## 🚀 Contexte + +Hop hop, je me dédouane de nouveau pour la <abbr title="Compétence Professionnelle">CP</abbr> 8 ! +Il s'agit d'une <abbr title="Compétence Professionnelle">CP</abbr> qui concerne, +tout comme la <abbr title="Compétence Professionnelle">CP</abbr> 4, le développement par le biais d'un CMS. + +Pour prendre Wordpress en exemple, il est nécessaire ici de **développer** des fonctionnalités **additionnelles** à celles qui existent déjà. +Pour résumer une possibilité : la création d'un plugin. + +## 🎯 Critères d'évaluation + +- Les composants complémentaires ou réalisés s'intègrent dans l'environnement de l'application +- Les composants serveur contribuent à la sécurité de l'application +- Le code source des composants est documenté ou auto-documenté +- Les tests garantissent que les traitements serveurs répondent aux fonctionnalités décrites dans le cahier des charges +- La démarche de recherche permet de résoudre un problème technique ou de mettre en œuvre une nouvelle fonctionnalité +- La veille sur les vulnérabilités connues permet d'identifier des failles potentielles +- La documentation technique liée aux technologies associées, rédigée en langue anglaise, est comprise _(sans contre-sens, ...)_ + +--- + +## 🧠 Documentation + +- [Wordpress - Documentation](https://developer.wordpress.org/) +- [Wordpress - Hiérarchie des pages](https://developer.wordpress.org/themes/basics/template-hierarchy/) \ No newline at end of file diff --git a/old/docs/titres-professionnels/archives/DWWM/2018-2023/intro.mdx b/old/docs/titres-professionnels/archives/DWWM/2018-2023/intro.mdx new file mode 100644 index 0000000..4d68eaa --- /dev/null +++ b/old/docs/titres-professionnels/archives/DWWM/2018-2023/intro.mdx @@ -0,0 +1,64 @@ +--- +sidebar_position: 1 +title: "Résumé" +description: "Résumé du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, expiré depuis septembre 2023)." +--- + +import Admonition from '@theme/Admonition'; + +# Contenu du titre professionnel DWWM + +<Admonition type="warning" title="Attention, tu es en train de consulter un référentiel expiré !"> + [Aller sur le contenu du nouveau référentiel en vigueur](/titres-professionnels/DWWM/intro) +</Admonition> + +Nom complet du titre : `Développeur Web et Web Mobile` +Code titre : `TP-01280` +Code millésime : `03` + +## Documents officiels + +- [📄 REAC - Référentiel Emploi Activités Compétences _(27/04/2018)_](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/Download.aspx?i=48e5e746-396c-42ef-bf6d-19c97c374960&d=1) +- [📄 RE - Référentiel de Certification _(19/04/2018)_](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/Download.aspx?i=a636e6a8-8a35-4879-879e-81c75837da95&d=1) + +> Source(s) : +> +> - [🔗 Banque de ressources numériques de l'AFPA](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/EGPResultat.aspx?cr=d%C3%A9veloppeur%20web&cd=&ct=01280m03&type=t) + +## Activités types et compétences professionnelles + +### 📚 Activité type 1 - Développer la partie front-end d'une application web ou web mobile en intégrant les recommandations de sécurité + +- [CP 1 - Maquetter une application](./AT1/CP1) +- [CP 2 - Réaliser une interface utilisateur web statique et adaptable](./AT1/CP2) +- [CP 3 - Développer une interface utilisateur web dynamique](./AT1/CP3) +- [CP 4 - Réaliser une interface utilisateur avec une solution de gestion de contenu ou e-commerce](./AT1/CP4) + +### 📚 Activité type 2 - Développer la partie back-end d'une application web ou web mobile en intégrant les recommandations de sécurité + +- [CP 5 - Créer une base de données](./AT2/CP5) +- [CP 6 - Développer les composants d'accès aux données](./AT2/CP6) +- [CP 7 - Développer la partie back-end d'une application web ou web mobile](./AT2/CP7) +- [CP 8 - Elaborer et mettre en œuvre des composants dans une application de gestion de contenu ou e-commerce](./AT2/CP8) + +## Compétences transverses + +- Utiliser l'anglais dans son activité professionnelle en développement web et web mobile +- Actualiser et partager ses compétences en développement web et web mobile + +## Déroulé de l'examen + +<Admonition type="info" title="Déroulé relatif au passage de l'épreuve dans sa globalité"> + En cas de repassage d'un <abbr title="Certificat de Compétences Professionnelles">CCP</abbr>, + se référer au [Référentiel de Certification](https://www.banque.di.afpa.fr/EspaceEmployeursCandidatsActeurs/Download.aspx?i=a636e6a8-8a35-4879-879e-81c75837da95&d=1) + pour connaître les modalités de l'épreuve : + + - Pages 17 à 21 pour l'AT 1 + - Pages 23 à 26 pour l'AT 2 +</Admonition> + +**Durée totale de l'examen** : 1h30 + +1. Présentation d'un projet réalisé en amont de la session _(35 minutes, face au jury)_ +2. Entretien technique _(40 minutes, face au jury)_ +3. Entretien final _(15 minutes, face au jury)_ diff --git a/old/docs/titres-professionnels/archives/DWWM/_category_.json b/old/docs/titres-professionnels/archives/DWWM/_category_.json new file mode 100644 index 0000000..283222a --- /dev/null +++ b/old/docs/titres-professionnels/archives/DWWM/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "DWWM", + "position": 1 +} diff --git a/old/docs/titres-professionnels/archives/_category_.json b/old/docs/titres-professionnels/archives/_category_.json new file mode 100644 index 0000000..aeb72d6 --- /dev/null +++ b/old/docs/titres-professionnels/archives/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "🗃️ Archives", + "position": 500, + "link": { + "type": "generated-index", + "description": "Archives des différents référentiels arrivés à expiration." + } +} diff --git a/old/docs/titres-professionnels/retours.mdx b/old/docs/titres-professionnels/retours.mdx new file mode 100644 index 0000000..70c17fa --- /dev/null +++ b/old/docs/titres-professionnels/retours.mdx @@ -0,0 +1,64 @@ +--- +sidebar_position: 99999 +title: "Retours d'expériences" +description: "Découvre les témoignages de candidats et jury sur leur soutenance de titre professionnel : leurs ressentis avant, pendant et après leur passage devant le jury." +--- + +import Testimonials from '@site/src/components/Testimonials'; + +# Retours d'expériences sur la soutenance de titre professionnel + +Tu te poses peut-être des questions sur comment est vécue la soutenance de titre professionnel par les candidats, +et c'est parfaitement normal ! + +Même si chaque expérience est différente d'un candidat à l'autre, tu retrouveras des témoignages de candidats qui ont +accepté de partager leur ressenti avant, pendant et après leur passage devant le jury. + +Tu retrouveras également des témoignages de membres de jury qui partagent leur point de vue sur la soutenance de manière générale. + +## Les témoignages candidats + +<Testimonials type="candidates" /> + +{/* +Pour ajouter un nouveau témoignage, rends-toi dans le fichier `/src/data/testimonials.tsx` et ajoute un nouvel objet +dans le tableau `candidateTestimonials` en suivant le type suivant : + +```tsx +type Testimonial = { + name?: string; // `Undefined` si tu souhaites rester anonyme + date: Date; // Date du jour de la rédaction du témoignage + before: string[]; // Liste de phrases sur ton ressenti avant la soutenance + during: string[]; // Liste de phrases sur ton ressenti pendant la soutenance + after: string[]; // Liste de phrases sur ton ressenti après la soutenance +}; +``` +*/} + +## Les témoignages jury + +<Testimonials type="jury" /> + +{/* +Pour ajouter un nouveau témoignage, rends-toi dans le fichier `/src/data/testimonials.tsx` et ajoute un nouvel objet +dans le tableau `juryTestimonials` en suivant le type suivant : + +```tsx +type Testimonial = { + name?: string; // `Undefined` si tu souhaites rester anonyme + date: Date; // Date du jour de la rédaction du témoignage + before: string[]; // Liste de phrases sur ton ressenti avant la soutenance + during: string[]; // Liste de phrases sur ton ressenti pendant la soutenance + after: string[]; // Liste de phrases sur ton ressenti après la soutenance +}; +``` +*/} + +## Contribuer à cette page + +Tu as déjà passé une soutenance de titre professionnel _(ou tu es jury)_ et tu souhaites partager ton expérience pour aider les futurs candidats ? + +N'hésites pas à faire une pull request sur le [dépôt GitHub du Memento](https://github.com/preparation-tp/memento-dev) pour ajouter ton témoignage à cette page ! +Tu trouveras toutes les informations techniques pour contribuer sur la page [Contribuer](/contribuer). + +Si tu souhaites rester anonyme _(ou que tu ne te sens pas suffisamment à l'aise avec GitHub)_, tu peux directement m'envoyer ton témoignage par mail à [gauthier@gauthierdaniels.fr](mailto:gauthier@gauthierdaniels.fr) en me précisant si tu souhaites être identifié ou non et s'il s'agit d'un témoignage de candidat ou de jury. \ No newline at end of file diff --git a/old/docs/titres-professionnels/se-preparer.mdx b/old/docs/titres-professionnels/se-preparer.mdx new file mode 100644 index 0000000..c880df1 --- /dev/null +++ b/old/docs/titres-professionnels/se-preparer.mdx @@ -0,0 +1,191 @@ +--- +sidebar_position: 9999 +title: "Se préparer pour un TP" +description: "Tu prépares un titre professionnel et tu te demandes comment bien t'y préparer ? Jette donc un oeil !" +--- + +import Admonition from "@theme/Admonition"; + +# 🤓 Comment se préparer efficacement + +Préparer un titre professionnel peut sembler un travail colossal et effrayant. +Mais pas de panique, on est là pour t'aider à t'y préparer au mieux ! + +## 🤔 Quels titres sont concernés ? + +Tous ! Ici on ne va pas parler technique, mais posture et méthodologie. +Que tu prépares un DWWM, CDA, CDUI ou je ne sais quel autre titre, les conseils qui suivent seront tout autant valables. + +Cependant si tu cherches des ressources spécifiques à un titre en particulier, tu peux consulter les pages dédiées à chaque titre. +Tu y retrouveras les attendus, les modalités d'évaluation, +les compétences évaluées et tout le reste dans chaque rubrique dédiée à un titre professionnel. + +## 📚 Les ressources à ta disposition + +Chaque titre professionnel dispose de deux documents très spécifiques : +- Le **Référentiel Emploi Activités Compétences** _(REAC)_ qui définit les compétences attendues pour chaque titre. +- Le **Référentiel de Certification** _(RC)_ qui définit les modalités d'évaluation de ces compétences. + +<Admonition type="quote" title="Je n'ai pas de RC à ma disposition 😱"> + C'est tout à fait normal ! Récemment, le terme RC a été remplacé par RE _(Référentiel d'Évaluation)_. + Il s'agit exactement de la même chose, mais avec un nom différent. + + Tous les titres ne sont pas encore concernés, mais c'est une transition qui se fait progressivement. +</Admonition> + +Selon les conditions de ton passage, tu as également la possibilité de demander à un tuteur, +formateur ou référent pédagogique de l'organisme de formation de te fournir ces documents. + +Tu peux également retrouver les documentations sur [l'espace employeurs/candidats/acteurs de l'AFPA](https://www.banque.di.afpa.fr/espaceemployeurscandidatsacteurs/egprecherche.aspx). +Il ne te restera plus qu'à rechercher le titre professionnel qui te concerne et consulter les documentations associées ! + +## 📋 Les étapes à suivre + +Selon les modalités de ton passage, tu vas devoir te préparer différemment. +Dans certains titres professionnels, tu vas devoir réaliser un dossier professionnel, un projet ou un mémoire. + +Dans d'autres, tu auras des épreuves écrites et/ou orales à passer. +Il est également possible que tu ais des mises en situation professionnelle à réaliser face à ton jury. + +Pour être sûr de savoir ce qui t'attend, n'hésite vraiment pas à consulter les documents officiels de ton titre professionnel ! + +### 📝 Le dossier professionnel + +Le dossier professionnel est un document qui va te permettre de présenter ton parcours, tes compétences et tes réalisations. +Une documentation officielle est disponible à [cette adresse](https://www.dossierprofessionnel.fr/) +pour t'aider à comprendre de quoi il s'agit et comment le remplir. + +Ce qu'il faut noter, c'est que sa structure _(archaïque...)_ est très précise et qu'il est important de respecter les consignes à la lettre. +Tu n'as pas la possibilité de faire preuve de créativité ici, tu te dois d'insérer les informations demandées. + +Désolé si tu n'aimes pas le rose _(ou plus précisément le <span className="px-2 py-1 rounded-sm bg-[#D60193] font-semibold text-white">Hollywood Cerise</span> 🤡)_ +ou la mise en page, mais il faudra t'y conformer. + +Vraiment, les explications données sur le site officiel sont très claires et tu ne devrais pas avoir de mal à comprendre ce qu'on attend de toi. +Je ne peux que te recommander d'y jetter un oeil ! + +### 📦 Le projet + +Si ton titre professionnel prévoit la réalisation et la présentation d'un projet, tu vas devoir te préparer en conséquence. + +Dans certains titres, tu as la possibilité de présenter plusieurs projets distincts. +Ces projets ne sont pas nécessairement des projets avec un client derrière, mais peuvent être des projets personnels ou des projets réalisés en groupe. + +La contrainte majeure associée à ces projets est cet ensemble de règles : +- Présenter le cahier des charges ou l'expression des besoins +- Présenter les étapes de réalisation +- T'assurer que les projets répondent aux besoins du client _(même si le projet est fictif et/ou qu'il est encore en cours de réalisation)_ +- T'assurer que les projets couvrent l'ensemble ou une partie spécifique _(précisée dans les documentations du titre)_ des compétences attendues + +D'autres règles s'appliquent au cas par cas, mais celles-ci sont les plus courantes. +Pour être sûr de ne rien oublier, je te recommande de consulter les documents officiels de ton titre professionnel. + +<Admonition type="tip" title="Ne te limite pas à ces règles !"> + Si tu as des idées pour améliorer ton projet, n'hésite pas à les partager avec ton jury. + C'est ce qui fera la différence entre un projet "basique" et un projet "exceptionnel". + + Si tu te contentes de faire le strict minimum, ton jury serait en droit de se demander si tu as une bonne connaissance du métier. +</Admonition> + +<Admonition type="warning" title="Ne cherche pas à utiliser des tonnes de projets"> + La qualité prime sur la quantité. + Il vaut mieux présenter un seul projet bien ficelé et complet que plusieurs projets bâclés et incomplets. + + Surtout que lors de ta présentation, tu risques de te perdre entre tous tes projets et ton jury n'en sera que plus perdu. +</Admonition> + +### 📚 Les épreuves écrites + +Si ton titre professionnel prévoit des épreuves écrites, n'y va pas les mains dans les poches. + +Dans les titres professionnels que j'ai pu observer _(DWWM et CDA)_ qui contiennent des épreuves écrites, le niveau d'attente n'est pas élitiste. +Mais ce n'est pas une raison pour ne pas te préparer ! + +La forme peut varier d'un titre à l'autre, mais le fond reste le même : +- Comprendre un sujet transmis au moment de l'épreuve +- Répondre à des questions en lien avec ce sujet +- Rédiger des réponses claires et précises + +Par exemple pour les titres professionnels DWWM et CDA, voici ce qu'on y retrouve : +- Un texte rédigé en anglais +- Des questions à choix multiples _(QCM)_ +- Des questions ouvertes + +Encore une fois, les informations sont exposées dans les documents officiels de ton titre professionnel 😉 + +### 🎤 Les épreuves orales + +Les épreuves orales sont souvent redoutées, mais elles ne devraient pas l'être. + +Déjà : tu as le droit de te tromper, personne ne te jugera pour ça. +Ensuite : **sois toi-même**. + +<Admonition type="quote" title="Et si je me trompe ?"> + C'est pas grave ! + Si tu te trompes, tu te trompes. + Si tu ne sais pas répondre à une question, dis-le. + Si tu ne comprends pas une question, demande des précisions. + + Ton jury est là pour t'aider, pas pour te piéger. + Il est là pour évaluer tes compétences, pas pour te mettre en difficulté. +</Admonition> + +Sauf s'il s'agit du contexte de ton titre professionnel, ton jury ne cherche pas à avoir un commercial en face de lui _(désolé les commerciaux 😅)_. +Ton jury attend de toi que tu sois capable de tenir un échange à l'oral et que tu sois en mesure de présenter un ensemble de compétences et réalisations. + +L'étape la plus importante pour réussir une épreuve orale est de **préparer ta présentation**. + +Si tu ne sais pas par où commencer, voici quelques pistes : +- Entraîne ton élocution face à un miroir +- Enregistre-toi pour t'écouter +- Entraîne-toi face à des proches, surtout s'ils ne connaissent pas ton sujet +- Adopte une posture assurée et un ton de voix clair _(ne marmonne pas dans ta barbe)_ +- Ne parle ni trop vite, ni trop lentement _(c'est un exercice difficile, mais tu vas y arriver)_ + +Évidemment ces conseils semblent faciles à dire, mais ils sont plus difficiles à appliquer. +Alors n'hésite pas à t'entraîner encore et encore, tu vas y arriver ! +Si tu y arrives du premier coup et que tu prétends que c'est la première fois : je ne te croirai pas 😏 + +<Admonition type="quote" title="C'est quoi une posture assurée ?"> + Une posture assurée, c'est une posture qui montre que tu es à l'aise. + Tu ne dois pas être crispé, mais détendu. + Tu dois regarder ton interlocuteur dans les yeux, mais sans le fixer _(tu n'es pas un psychopathe, hein ?)_. + + Tu dois également adopter une posture droite, mais pas rigide. + Tu peux par exemple légèrement fléchir tes jambes pour te sentir plus à l'aise et être moins crispé. + + Si tu as du mal à visualiser ce que je viens de te dire, je te recommande de regarder attentivement la posture adoptée par Apple. + Pas besoin d'écouter ce qu'ils disent, mais regarde plutôt comment ils se tiennent et + comment ils regardent leur public _(la caméra étant comme le public pour eux)_. + + **Fabien Olicart** _(vidéaste sur YouTube et mentaliste)_ en a d'ailleurs fait un court sujet de moins de deux minutes ! + Tu retrouveras la vidéo sur YouTube, juste [ici](https://www.youtube.com/watch?v=TZIodEQfMNo). +</Admonition> + +### 🎯 Les mises en situation professionnelle + +J'aimerai pouvoir t'en dire davantage sur les mises en situation professionnelle, mais je n'y ai jamais été confronté. +Cependant, je peux te donner quelques pistes génériques pour t'y préparer ! + +Les mises en situation professionnelle sont souvent des exercices pratiques qui te permettent de démontrer tes compétences. +Tu vas devoir réaliser une tâche en lien avec ton titre professionnel, mais dans un contexte fictif et ce : face à un jury. + +Ton jury ne cherchera pas à te mettre des bâtons dans les roues, mais à évaluer tes compétences et vérifier que tu es capable +de t'adapter à une situation donnée _(moins scolaire et plus professionnelle)_. + +Si tu as des connaissances, collègues ou amis qui ont déjà passé ce type d'épreuve, n'hésite pas à leur demander des conseils. +Mais n'oubli pas que chaque mise en situation professionnelle est différente et +que les conseils donnés ne seront pas forcément adaptés à ta situation ! + +## 🚀 Conclusion + +Préparer un titre professionnel n'est pas une mince affaire, mais c'est un challenge que tu vas relever haut la main ! + +N'oublie pas que tu n'es pas seul dans cette aventure. +Tu as des formateurs, des tuteurs, des amis, des collègues et même des inconnus qui sont prêts à t'aider. + +Il ne faut pas que tu hésites à demander de l'aide si tu en ressent le besoin. + +Et surtout, n'oublie pas que tu es capable de réussir. + +<img className="max-w-xl w-auto h-auto block mx-auto" src="https://media1.tenor.com/m/f0X9smqZ8J4AAAAC/shia-motivation.gif" /> \ No newline at end of file diff --git a/old/docusaurus.config.ts b/old/docusaurus.config.ts new file mode 100644 index 0000000..53b8d2c --- /dev/null +++ b/old/docusaurus.config.ts @@ -0,0 +1,298 @@ +import type { + CreateSitemapItemsParams, + CreateSitemapItemsFn, +} from "@docusaurus/plugin-sitemap/lib/types"; + +import type * as Preset from "@docusaurus/preset-classic"; +import type { Config } from "@docusaurus/types"; + +import { themes as prismThemes } from "prism-react-renderer"; + +type CreateSitemapParams = CreateSitemapItemsParams & { + defaultCreateSitemapItems: CreateSitemapItemsFn; +}; + +const resourcesLinks = [ + { + label: "Préambule", + to: "/intro", + }, + { + label: "Front-end", + to: "/category/-frontend", + }, + { + label: "Bases de données", + to: "/category/-bases-de-données", + }, +]; + +const examsLinks = [ + { + label: "CDA", + to: "/titres-professionnels/CDA/intro", + }, + { + label: "DWWM", + to: "/titres-professionnels/DWWM/intro", + }, + { + label: "Se préparer", + to: "/titres-professionnels/se-preparer", + }, + { + label: "Retours d'expériences", + to: "/titres-professionnels/retours", + }, + { + label: "Archives", + to: "/category/%EF%B8%8F-archives", + }, +]; + +const config: Config = { + title: "Memento Dev", + tagline: "Souviens-toi que tu développeras.", + favicon: "img/favicon.webp", + + // Set the production url of your site here + url: "https://memento-dev.fr", + // Set the /<baseUrl>/ pathname under which your site is served + // For GitHub pages deployment, it is often '/<projectName>/' + baseUrl: "/", + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: "preparation-tp", // Usually your GitHub org/user name. + projectName: "memento-dev", // Usually your repo name. + + onBrokenLinks: "throw", + onBrokenMarkdownLinks: "warn", + + scripts: [ + { + src: "https://cloud.umami.is/script.js", + async: true, + defer: true, + "data-website-id": "ba70261e-d145-4dd1-b0e8-27cbf4927b74", + }, + ], + + markdown: { + mermaid: true, + }, + themes: ["@docusaurus/theme-mermaid"], + + // Even if you don't use internationalization, you can use this field to set + // useful metadata like html lang. For example, if your site is Chinese, you + // may want to replace "en" with "zh-Hans". + i18n: { + defaultLocale: "fr", + locales: ["fr"], + }, + + plugins: [ + [ + "@docusaurus/plugin-pwa", + { + debug: false, + offlineModeActivationStrategies: [ + "appInstalled", + "standalone", + "queryString", + ], + pwaHead: [ + { + tagName: "link", + rel: "icon", + href: "/img/favicon.webp", + }, + { + tagName: "link", + rel: "manifest", + href: "/manifest.json", + }, + { + tagName: "meta", + name: "theme-color", + content: "#7c3aed", + }, + { + tagName: "meta", + name: "apple-mobile-web-app-capable", + content: "yes", + }, + { + tagName: "meta", + name: "apple-mobile-web-app-status-bar-style", + content: "#242526", + }, + { + tagName: "link", + rel: "apple-touch-icon", + href: "/img/favicon.webp", + }, + { + tagName: "link", + rel: "mask-icon", + href: "/img/favicon.webp", + color: "#7c3aed", + }, + { + tagName: "meta", + name: "msapplication-TileImage", + content: "/img/favicon.webp", + }, + { + tagName: "meta", + name: "msapplication-TileColor", + content: "#7c3aed", + }, + ], + }, + ], + async function tailwind() { + return { + name: "docusaurus-tailwindcss", + configurePostCss(postcssOptions) { + // Appends TailwindCSS and AutoPrefixer. + postcssOptions.plugins.push(require("tailwindcss")); + postcssOptions.plugins.push(require("autoprefixer")); + return postcssOptions; + }, + }; + }, + [require.resolve("docusaurus-lunr-search"), { languages: ["fr"] }], + [ + "@docusaurus/plugin-sitemap", + { + lastmod: "date", + changefreq: "weekly", + priority: 0.5, + ignorePatterns: ["/tags/**"], + filename: "sitemap.xml", + id: "sitemap", + async createSitemapItems(params: CreateSitemapParams) { + const { defaultCreateSitemapItems, ...rest } = params; + const items = await defaultCreateSitemapItems(rest); + + return items.filter((item) => !item.url.includes("/page/")); + }, + }, + ], + ], + + presets: [ + [ + "classic", + { + docs: { + sidebarPath: "./sidebars.ts", + // Remove this to remove the "edit this page" links. + editUrl: "https://github.com/preparation-tp/memento-dev/tree/main/", + + admonitions: { + keywords: ["quote", "example"], + extendDefaults: true, + }, + + routeBasePath: "/", + tagsBasePath: "tags", + }, + blog: false, + theme: { + customCss: "./src/css/custom.css", + }, + } satisfies Preset.Options, + ], + ], + + themeConfig: { + // Replace with your project's social card + image: "img/docusaurus-social-card.jpg", + mermaid: { + theme: { + light: "neutral", + dark: "dark", + }, + }, + navbar: { + style: "dark", + title: "Memento Dev", + logo: { + alt: "Logo Memento Dev", + src: "img/logo.webp", + }, + items: [ + { + type: "docSidebar", + sidebarId: "tutorialSidebar", + position: "left", + label: "Documentation", + }, + { + position: "left", + label: "Ressources", + items: resourcesLinks, + }, + { + position: "left", + label: "Titres professionnels", + items: examsLinks, + }, + { + href: "https://github.com/preparation-tp/memento-dev", + label: "GitHub", + position: "right", + }, + ], + }, + footer: { + style: "dark", + links: [ + { + title: "Ressources", + items: resourcesLinks, + }, + { + title: "Titres professionnels", + items: examsLinks, + }, + { + title: "Memento Dev", + items: [ + { + label: "Mentions légales", + to: "/mentions-legales", + }, + { + label: "Contribuer", + to: "/contribuer", + }, + { + label: "GitHub", + href: "https://github.com/preparation-tp/memento-dev", + }, + ], + }, + ], + copyright: `<span className="text-white/70"> + Créé avec ❤️ par + <a + className="transition-colors hover:text-white hover:no-underline" + href="https://gauthierdaniels.fr" + target="_blank" + > + Gauthier Daniels + </a> + </span>`, + }, + prism: { + theme: prismThemes.oneLight, + darkTheme: prismThemes.oneDark, + additionalLanguages: ["php", "nginx", "bash"], + }, + } satisfies Preset.ThemeConfig, +}; + +export default config; diff --git a/old/i18n/fr/code.json b/old/i18n/fr/code.json new file mode 100644 index 0000000..f1584f7 --- /dev/null +++ b/old/i18n/fr/code.json @@ -0,0 +1,289 @@ +{ + "theme.tags.tagsPageLink": { + "message": "Voir tous les tags", + "description": "The label of the link targeting the tag list page" + }, + "theme.NotFound.title": { + "message": "Page introuvable", + "description": "The title of the 404 page" + }, + "theme.NotFound.p1": { + "message": "Nous n'avons pas trouvé ce que vous recherchez.", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "Veuillez contacter le propriétaire du site qui vous a lié à l'URL d'origine et leur faire savoir que leur lien est cassé.", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.ErrorPageContent.title": { + "message": "Cette page a planté.", + "description": "The title of the fallback page when the page crashed" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "Retour au début de la page", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.archive.title": { + "message": "Archive", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "Archive", + "description": "The page & hero description of the blog archive page" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "Pagination de la liste des articles du blog", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "Nouvelles entrées", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "Anciennes entrées", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "Pagination des articles du blog", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "Article plus récent", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "Article plus ancien", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.blog.post.plurals": { + "message": "Un article|{count} articles", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} tagués avec « {tagName} »", + "description": "The title of the page for a blog tag" + }, + "theme.colorToggle.ariaLabel": { + "message": "Basculer entre le mode sombre et clair (actuellement {mode})", + "description": "The ARIA label for the navbar color mode toggle" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "mode sombre", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "mode clair", + "description": "The name for the light color mode" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "Fil d'Ariane", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.DocCard.categoryDescription.plurals": { + "message": "1 élément|{count} éléments", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "Pages de documentation", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "Précédent", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "Suivant", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "Un document tagué|{count} documents tagués", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged} avec \"{tagName}\"", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "Version: {versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "Ceci est la documentation de la prochaine version {versionLabel} de {siteTitle}.", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "Ceci est la documentation de {siteTitle} {versionLabel}, qui n'est plus activement maintenue.", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "Pour une documentation à jour, consultez la {latestVersionLink} ({versionLabel}).", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "dernière version", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "Éditer cette page", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "Lien direct vers {heading}", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": " le {date}", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": " par {user}", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "Dernière mise à jour{atDate}{byUser}", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "Versions", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.tags.tagsListLabel": { + "message": "Tags :", + "description": "The label alongside a tag list" + }, + "theme.admonition.caution": { + "message": "attention", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "danger", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "info", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "remarque", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "astuce", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "attention", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "Fermer", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "Navigation article de blog récent", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.CodeBlock.copied": { + "message": "Copié", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "Copier le code", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.copy": { + "message": "Copier", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "Activer/désactiver le retour à la ligne", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "Développer la catégorie '{label}' de la barre latérale", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "Réduire la catégorie '{label}' de la barre latérale", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.NavBar.navAriaLabel": { + "message": "Main", + "description": "The ARIA label for the main navigation" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "Langues", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "Sur cette page", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.blog.post.readMore": { + "message": "Lire plus", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "En savoir plus sur {title}", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.blog.post.readingTime.plurals": { + "message": "Une minute de lecture|{readingTime} minutes de lecture", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.breadcrumbs.home": { + "message": "Page d'accueil", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "Réduire le menu latéral", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "Réduire le menu latéral", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "Docs sidebar", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "Fermer la barre de navigation", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← Retour au menu principal", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "Ouvrir/fermer la barre de navigation", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "Déplier le menu latéral", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "Déplier le menu latéral", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "Réessayer", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "Aller au contenu principal", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "Tags", + "description": "The title of the tag list page" + }, + "theme.unlistedContent.title": { + "message": "Page non répertoriée", + "description": "The unlisted content banner title" + }, + "theme.unlistedContent.message": { + "message": "Cette page n'est pas répertoriée. Les moteurs de recherche ne l'indexeront pas, et seuls les utilisateurs ayant un lien direct peuvent y accéder.", + "description": "The unlisted content banner message" + } +} diff --git a/old/i18n/fr/docusaurus-plugin-content-docs/current.json b/old/i18n/fr/docusaurus-plugin-content-docs/current.json new file mode 100644 index 0000000..2688d89 --- /dev/null +++ b/old/i18n/fr/docusaurus-plugin-content-docs/current.json @@ -0,0 +1,66 @@ +{ + "version.label": { + "message": "Next", + "description": "The label for version current" + }, + "sidebar.tutorialSidebar.category.📖 Glossaires": { + "message": "📖 Glossaires", + "description": "The label for category 📖 Glossaires in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.🎓 Titres professionnels": { + "message": "🎓 Titres professionnels", + "description": "The label for category 🎓 Titres professionnels in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.🎓 Titres professionnels.link.generated-index.description": { + "message": "Tu retrouveras ici l'ensemble des titres professionnels couverts par la plateforme Memento Dev.", + "description": "The generated-index page description for category 🎓 Titres professionnels in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.🧑‍💻 DWWM": { + "message": "🧑‍💻 DWWM", + "description": "The label for category 🧑‍💻 DWWM in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Activité Type 1": { + "message": "Activité Type 1", + "description": "The label for category Activité Type 1 in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Activité Type 2": { + "message": "Activité Type 2", + "description": "The label for category Activité Type 2 in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.🗃️ Archives": { + "message": "🗃️ Archives", + "description": "The label for category 🗃️ Archives in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.🗃️ Archives.link.generated-index.description": { + "message": "Archives des différents référentiels arrivés à expiration.", + "description": "The generated-index page description for category 🗃️ Archives in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.DWWM": { + "message": "DWWM", + "description": "The label for category DWWM in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.2018-2023": { + "message": "2018-2023", + "description": "The label for category 2018-2023 in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.AT1": { + "message": "AT1", + "description": "The label for category AT1 in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.AT2": { + "message": "AT2", + "description": "The label for category AT2 in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.📁 Ressources": { + "message": "📁 Ressources", + "description": "The label for category 📁 Ressources in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.💽 Bases de données": { + "message": "💽 Bases de données", + "description": "The label for category 💽 Bases de données in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Modélisation": { + "message": "Modélisation", + "description": "The label for category Modélisation in sidebar tutorialSidebar" + } +} diff --git a/old/i18n/fr/docusaurus-theme-classic/footer.json b/old/i18n/fr/docusaurus-theme-classic/footer.json new file mode 100644 index 0000000..5ed1e25 --- /dev/null +++ b/old/i18n/fr/docusaurus-theme-classic/footer.json @@ -0,0 +1,46 @@ +{ + "link.title.Ressources": { + "message": "Ressources", + "description": "The title of the footer links column with title=Ressources in the footer" + }, + "link.title.Titres professionnels": { + "message": "Titres professionnels", + "description": "The title of the footer links column with title=Titres professionnels in the footer" + }, + "link.title.Memento Dev": { + "message": "Memento Dev", + "description": "The title of the footer links column with title=Memento Dev in the footer" + }, + "link.item.label.Préambule": { + "message": "Préambule", + "description": "The label of footer link with label=Préambule linking to /intro" + }, + "link.item.label.Bases de données": { + "message": "Bases de données", + "description": "The label of footer link with label=Bases de données linking to /category/-bases-de-données" + }, + "link.item.label.DWWM": { + "message": "DWWM", + "description": "The label of footer link with label=DWWM linking to /titres-professionnels/DWWM/intro" + }, + "link.item.label.Archives": { + "message": "Archives", + "description": "The label of footer link with label=Archives linking to /category/%EF%B8%8F-archives" + }, + "link.item.label.Mentions légales": { + "message": "Mentions légales", + "description": "The label of footer link with label=Mentions légales linking to /mentions-legales" + }, + "link.item.label.Contribuer": { + "message": "Contribuer", + "description": "The label of footer link with label=Contribuer linking to /contribuer" + }, + "link.item.label.GitHub": { + "message": "GitHub", + "description": "The label of footer link with label=GitHub linking to https://github.com/preparation-tp/memento-dev" + }, + "copyright": { + "message": "<span className=\"text-white/70\">\n Créé avec ❤️ par\n <a\n className=\"transition-colors hover:text-white hover:no-underline\"\n href=\"https://gauthierdaniels.fr\"\n target=\"_blank\"\n >\n Gauthier Daniels\n </a>\n </span>", + "description": "The footer copyright" + } +} diff --git a/old/i18n/fr/docusaurus-theme-classic/navbar.json b/old/i18n/fr/docusaurus-theme-classic/navbar.json new file mode 100644 index 0000000..90456d5 --- /dev/null +++ b/old/i18n/fr/docusaurus-theme-classic/navbar.json @@ -0,0 +1,42 @@ +{ + "title": { + "message": "Memento Dev", + "description": "The title in the navbar" + }, + "logo.alt": { + "message": "Logo Memento Dev", + "description": "The alt text of navbar logo" + }, + "item.label.Documentation": { + "message": "Documentation", + "description": "Navbar item with label Documentation" + }, + "item.label.Ressources": { + "message": "Ressources", + "description": "Navbar item with label Ressources" + }, + "item.label.Titres professionnels": { + "message": "Titres professionnels", + "description": "Navbar item with label Titres professionnels" + }, + "item.label.GitHub": { + "message": "GitHub", + "description": "Navbar item with label GitHub" + }, + "item.label.Préambule": { + "message": "Préambule", + "description": "Navbar item with label Préambule" + }, + "item.label.Bases de données": { + "message": "Bases de données", + "description": "Navbar item with label Bases de données" + }, + "item.label.DWWM": { + "message": "DWWM", + "description": "Navbar item with label DWWM" + }, + "item.label.Archives": { + "message": "Archives", + "description": "Navbar item with label Archives" + } +} diff --git a/old/package.json b/old/package.json new file mode 100644 index 0000000..a914056 --- /dev/null +++ b/old/package.json @@ -0,0 +1,66 @@ +{ + "name": "memento-dev", + "version": "0.0.1", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "typecheck": "tsc" + }, + "dependencies": { + "@docusaurus/core": "3.6.1", + "@docusaurus/plugin-content-blog": "^3.6.1", + "@docusaurus/plugin-content-docs": "^3.6.1", + "@docusaurus/plugin-pwa": "^3.6.1", + "@docusaurus/plugin-sitemap": "^3.6.1", + "@docusaurus/preset-classic": "3.6.1", + "@docusaurus/theme-classic": "^3.6.1", + "@docusaurus/theme-common": "^3.6.1", + "@docusaurus/theme-mermaid": "^3.6.1", + "@mdx-js/react": "^3.0.0", + "autocomplete.js": "^0.38.1", + "autoprefixer": "^10.4.19", + "clsx": "^2.0.0", + "docusaurus-lunr-search": "^3.4.0", + "hogan.js": "^3.0.2", + "lunr": "^2.3.9", + "lunr-languages": "^1.14.0", + "mark.js": "^8.11.1", + "postcss": "^8.4.39", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-markdown": "^9.0.1", + "tailwindcss": "^3.4.4" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.6.1", + "@docusaurus/tsconfig": "3.6.1", + "@docusaurus/types": "3.6.1", + "@types/node": "^20.14.9", + "typescript": "~5.2.2" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=18.0" + } +} diff --git a/old/pnpm-lock.yaml b/old/pnpm-lock.yaml new file mode 100644 index 0000000..6fa6840 --- /dev/null +++ b/old/pnpm-lock.yaml @@ -0,0 +1,12900 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@docusaurus/core': + specifier: 3.6.1 + version: 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-content-blog': + specifier: ^3.6.1 + version: 3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': + specifier: ^3.6.1 + version: 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-pwa': + specifier: ^3.6.1 + version: 3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-sitemap': + specifier: ^3.6.1 + version: 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/preset-classic': + specifier: 3.6.1 + version: 3.6.1(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)(typescript@5.2.2) + '@docusaurus/theme-classic': + specifier: ^3.6.1 + version: 3.6.1(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/theme-common': + specifier: ^3.6.1 + version: 3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/theme-mermaid': + specifier: ^3.6.1 + version: 3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@mdx-js/react': + specifier: ^3.0.0 + version: 3.0.1(@types/react@18.3.3)(react@18.3.1) + autocomplete.js: + specifier: ^0.38.1 + version: 0.38.1 + autoprefixer: + specifier: ^10.4.19 + version: 10.4.19(postcss@8.4.39) + clsx: + specifier: ^2.0.0 + version: 2.1.1 + docusaurus-lunr-search: + specifier: ^3.4.0 + version: 3.4.0(@docusaurus/core@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + hogan.js: + specifier: ^3.0.2 + version: 3.0.2 + lunr: + specifier: ^2.3.9 + version: 2.3.9 + lunr-languages: + specifier: ^1.14.0 + version: 1.14.0 + mark.js: + specifier: ^8.11.1 + version: 8.11.1 + postcss: + specifier: ^8.4.39 + version: 8.4.39 + prism-react-renderer: + specifier: ^2.3.0 + version: 2.3.1(react@18.3.1) + prismjs: + specifier: ^1.29.0 + version: 1.29.0 + react: + specifier: ^18.0.0 + version: 18.3.1 + react-dom: + specifier: ^18.0.0 + version: 18.3.1(react@18.3.1) + react-markdown: + specifier: ^9.0.1 + version: 9.0.1(@types/react@18.3.3)(react@18.3.1) + tailwindcss: + specifier: ^3.4.4 + version: 3.4.4 + devDependencies: + '@docusaurus/module-type-aliases': + specifier: 3.6.1 + version: 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/tsconfig': + specifier: 3.6.1 + version: 3.6.1 + '@docusaurus/types': + specifier: 3.6.1 + version: 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/node': + specifier: ^20.14.9 + version: 20.14.9 + typescript: + specifier: ~5.2.2 + version: 5.2.2 + +packages: + + '@algolia/autocomplete-core@1.9.3': + resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} + + '@algolia/autocomplete-plugin-algolia-insights@1.9.3': + resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-preset-algolia@1.9.3': + resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/autocomplete-shared@1.9.3': + resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/cache-browser-local-storage@4.24.0': + resolution: {integrity: sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==} + + '@algolia/cache-common@4.24.0': + resolution: {integrity: sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==} + + '@algolia/cache-in-memory@4.24.0': + resolution: {integrity: sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==} + + '@algolia/client-account@4.24.0': + resolution: {integrity: sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==} + + '@algolia/client-analytics@4.24.0': + resolution: {integrity: sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==} + + '@algolia/client-common@4.24.0': + resolution: {integrity: sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==} + + '@algolia/client-personalization@4.24.0': + resolution: {integrity: sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==} + + '@algolia/client-search@4.24.0': + resolution: {integrity: sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==} + + '@algolia/events@4.0.1': + resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} + + '@algolia/logger-common@4.24.0': + resolution: {integrity: sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==} + + '@algolia/logger-console@4.24.0': + resolution: {integrity: sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==} + + '@algolia/recommend@4.24.0': + resolution: {integrity: sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==} + + '@algolia/requester-browser-xhr@4.24.0': + resolution: {integrity: sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==} + + '@algolia/requester-common@4.24.0': + resolution: {integrity: sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==} + + '@algolia/requester-node-http@4.24.0': + resolution: {integrity: sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==} + + '@algolia/transporter@4.24.0': + resolution: {integrity: sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==} + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@apideck/better-ajv-errors@0.3.6': + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.2': + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.2': + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': + resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.9': + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.25.9': + resolution: {integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.2': + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.25.9': + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.25.9': + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.25.9': + resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.25.9': + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.26.0': + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.25.9': + resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.25.9': + resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.25.9': + resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.25.9': + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.26.0': + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.25.9': + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.25.9': + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.25.9': + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.25.9': + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.25.9': + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.25.9': + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.25.9': + resolution: {integrity: sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.25.9': + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.25.9': + resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.25.9': + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.25.9': + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.25.9': + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.25.9': + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.25.9': + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.25.9': + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.25.9': + resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.25.9': + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.25.9': + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.25.9': + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9': + resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.25.9': + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.25.9': + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.25.9': + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.25.9': + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.25.9': + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.25.9': + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.25.9': + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.25.9': + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.25.9': + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-constant-elements@7.24.7': + resolution: {integrity: sha512-7LidzZfUXyfZ8/buRW6qIIHBY8wAZ1OrY9c/wTr8YhZ6vMPo+Uc/CVFLYY1spZrEQlD4w5u8wjqk5NQ3OVqQKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.25.9': + resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.25.9': + resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.25.9': + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.25.9': + resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.25.9': + resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.26.0': + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.25.9': + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-runtime@7.25.9': + resolution: {integrity: sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.25.9': + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.25.9': + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.25.9': + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.25.9': + resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.25.9': + resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.25.9': + resolution: {integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.25.9': + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.25.9': + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.25.9': + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9': + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.26.0': + resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.25.9': + resolution: {integrity: sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.26.0': + resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime-corejs3@7.26.0': + resolution: {integrity: sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + + '@braintree/sanitize-url@6.0.4': + resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@docsearch/css@3.6.0': + resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} + + '@docsearch/react@3.6.0': + resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + + '@docusaurus/babel@3.6.1': + resolution: {integrity: sha512-JcKaunW8Ml2nTnfnvFc55T00Y+aCpNWnf1KY/gG+wWxHYDH0IdXOOz+k6NAlEAerW8+VYLfUqRIqHZ7N/DVXvQ==} + engines: {node: '>=18.0'} + + '@docusaurus/bundler@3.6.1': + resolution: {integrity: sha512-vHSEx8Ku9x/gfIC6k4xb8J2nTxagLia0KvZkPZhxfkD1+n8i+Dj4BZPWTmv+kCA17RbgAvECG0XRZ0/ZEspQBQ==} + engines: {node: '>=18.0'} + peerDependencies: + '@docusaurus/faster': '*' + peerDependenciesMeta: + '@docusaurus/faster': + optional: true + + '@docusaurus/core@3.6.1': + resolution: {integrity: sha512-cDKxPihiM2z7G+4QtpTczS7uxNfNG6naSqM65OmAJET0CFRHbc9mDlLFtQF0lsVES91SHqfcGaaLZmi2FjdwWA==} + engines: {node: '>=18.0'} + hasBin: true + peerDependencies: + '@mdx-js/react': ^3.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/cssnano-preset@3.6.1': + resolution: {integrity: sha512-ZxYUmNeyQHW2w4/PJ7d07jQDuxzmKr9uPAQ6IVe5dTkeIeV0mDBB3jOLeJkNoI42Ru9JKEqQ9aVDtM9ct6QHnw==} + engines: {node: '>=18.0'} + + '@docusaurus/logger@3.6.1': + resolution: {integrity: sha512-OvetI/nnOMBSqCkUzKAQhnIjhxduECK4qTu3tq/8/h/qqvLsvKURojm04WPE54L+Uy+UXMas0hnbBJd8zDlEOw==} + engines: {node: '>=18.0'} + + '@docusaurus/mdx-loader@3.6.1': + resolution: {integrity: sha512-KPIsYi0S3X3/rNrW3V1fgOu5t6ahYWc31zTHHod8pacFxdmk9Uf6uuw+Jd6Cly1ilgal+41Ku+s0gmMuqKqiqg==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/module-type-aliases@3.6.1': + resolution: {integrity: sha512-J+q1jgm7TnEfVIUZImSFeLA1rghb6nwtoB9siHdcgKpDqFJ9/S7xhQL2aEKE7iZMZYzpu+2F390E9A7GkdEJNA==} + peerDependencies: + react: '*' + react-dom: '*' + + '@docusaurus/plugin-content-blog@3.6.1': + resolution: {integrity: sha512-FUmsn3xg/XD/K/4FQd8XHrs92aQdZO5LUtpHnRvO1/6DY87SMz6B6ERAN9IGQQld//M2/LVTHkZy8oVhQZQHIQ==} + engines: {node: '>=18.0'} + peerDependencies: + '@docusaurus/plugin-content-docs': '*' + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/plugin-content-docs@3.6.1': + resolution: {integrity: sha512-Uq8kyn5DYCDmkUlB9sWChhWghS4lUFNiQU+RXcAXJ3qCVXsBpPsh6RF+npQG1N+j4wAbjydM1iLLJJzp+x3eMQ==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/plugin-content-pages@3.6.1': + resolution: {integrity: sha512-TZtL+2zq20gqGalzoIT2rEF1T4YCZ26jTvlCJXs78+incIajfdHtmdOq7rQW0oV7oqTjpGllbp788nY/vY9jgw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/plugin-debug@3.6.1': + resolution: {integrity: sha512-DeKPZtoVExDSYCbzoz7y5Dhc6+YPqRWfVGwEEUyKopSyQYefp0OV8hvASmbJCn2WyThRgspOUhog3FSEhz+agw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/plugin-google-analytics@3.6.1': + resolution: {integrity: sha512-ZEoERiDHxSfhaEeT35ukQ892NzGHWiUvfxUsnPiRuGEhMoQlxMSp60shBuSZ1sUKuZlndoEl5qAXJg09Wls/Sg==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/plugin-google-gtag@3.6.1': + resolution: {integrity: sha512-u/E9vXUsZxYaV6Brvfee8NiH/iR0cMml9P/ifz4EpH/Jfxdbw8rbCT0Nm/h7EFgEY48Uqkl5huSbIvFB9n8aTQ==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/plugin-google-tag-manager@3.6.1': + resolution: {integrity: sha512-By+NKkGYV8tSo8/RyS1OXikOtqsko5jJZ/uioJfBjsBGgSbiMJ+Y/HogFBke0mgSvf7NPGKZTbYm5+FJ8YUtPQ==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/plugin-pwa@3.6.1': + resolution: {integrity: sha512-GsbpsgpAwdBpDpeVzk3UPNUQAc0oGU+0GL5s1LmFgqfpql5C7ZnkwD9FmW6lvieabQjC+Ga0d0zDqu20coqIRQ==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/plugin-sitemap@3.6.1': + resolution: {integrity: sha512-i8R/GTKew4Cufb+7YQTwfPcNOhKTJzZ1VZ5OqQwI9c3pZK2TltQyhqKDVN94KCTbSSKvOYYytYfRAB2uPnH1/A==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/preset-classic@3.6.1': + resolution: {integrity: sha512-b90Y1XRH9e+oa/E3NmiFEFOwgYUd+knFcZUy81nM3FJs038WbEA0T55NQsuPW0s7nOsCShQ7dVFyKxV+Wp31Nw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/react-loadable@6.0.0': + resolution: {integrity: sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==} + peerDependencies: + react: '*' + + '@docusaurus/theme-classic@3.6.1': + resolution: {integrity: sha512-5lVUmIXk7zp+n9Ki2lYWrmhbd6mssOlKCnnDJvY4QDi3EgjRisIu5g4yKXoWTIbiqE7m7q/dS9cbeShEtfkKng==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/theme-common@3.6.1': + resolution: {integrity: sha512-18iEYNpMvarGfq9gVRpGowSZD24vZ39Iz4acqaj64180i54V9el8tVnhNr/wRvrUm1FY30A1NHLqnMnDz4rYEQ==} + engines: {node: '>=18.0'} + peerDependencies: + '@docusaurus/plugin-content-docs': '*' + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/theme-mermaid@3.6.1': + resolution: {integrity: sha512-ke00/VSFibzucbr64JXwPWsiu66zcqI8mnEbbmPSV1Yby5FRsfGQqcE+1cvUkAOVCl+zX8RNjv8vrRb4ilQDLQ==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/theme-search-algolia@3.6.1': + resolution: {integrity: sha512-BjmuiFRpQP1WEm8Mzu1Bb0Wdas6G65VHXDDNr7XTKgbstxalE6vuxt0ioXTDFS2YVep5748aVhKvnxR9gm2Liw==} + engines: {node: '>=18.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/theme-translations@3.6.1': + resolution: {integrity: sha512-bNm5G6sueUezvyhsBegA1wwM38yW0BnqpZTE9KHO2yKnkERNMaV5x/yPJ/DNCOHjJtCcJ5Uz55g2AS75Go31xA==} + engines: {node: '>=18.0'} + + '@docusaurus/tsconfig@3.6.1': + resolution: {integrity: sha512-RvjMG9M9YK8N/I5oudqJed8jjfWGI7csr4XCkGXBToNkkoi2QgkTz2DxH+obKdfLejQaASdIMynYaE5Lv7Qw9Q==} + + '@docusaurus/types@3.6.1': + resolution: {integrity: sha512-hCB1hj9DYutVYBisnPNobz9SzEmCcf1EetJv09O49Cov3BqOkm+vnnjB3d957YJMtpLGQoKBeN/FF1DZ830JwQ==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + '@docusaurus/utils-common@3.6.1': + resolution: {integrity: sha512-LX1qiTiC0aS8c92uZ+Wj2iNCNJyYZJIKY8/nZDKNMBfo759VYVS3RX3fKP3DznB+16sYp7++MyCz/T6fOGaRfw==} + engines: {node: '>=18.0'} + + '@docusaurus/utils-validation@3.6.1': + resolution: {integrity: sha512-+iMd6zRl5cJQm7nUP+7pSO/oAXsN79eHO34ME7l2YJt4GEAr70l5kkD58u2jEPpp+wSXT70c7x2A2lzJI1E8jw==} + engines: {node: '>=18.0'} + + '@docusaurus/utils@3.6.1': + resolution: {integrity: sha512-nS3WCvepwrnBEgSG5vQu40XG95lC9Jeh/odV5u5IhU1eQFEGDst9xBi6IK5yZdsGvbuaXBZLZtOqWYtuuFa/rQ==} + engines: {node: '>=18.0'} + + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@mdx-js/mdx@3.0.1': + resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + + '@mdx-js/react@3.0.1': + resolution: {integrity: sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@2.2.2': + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} + + '@polka/url@1.0.0-next.25': + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + + '@rollup/plugin-babel@5.3.1': + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + + '@rollup/plugin-node-resolve@15.3.0': + resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-replace@2.4.2': + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@3.1.0': + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/pluginutils@5.1.3': + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + '@slorber/remark-comment@1.0.0': + resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==} + + '@surma/rollup-plugin-off-main-thread@2.2.3': + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0': + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0': + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0': + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0': + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@8.1.0': + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/core@8.1.0': + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + + '@svgr/hast-util-to-babel-ast@8.0.0': + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + + '@svgr/plugin-jsx@8.1.0': + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@svgr/plugin-svgo@8.1.0': + resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@svgr/webpack@8.1.0': + resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==} + engines: {node: '>=14'} + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/d3-scale-chromatic@3.0.3': + resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} + + '@types/d3-scale@4.0.8': + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + + '@types/d3-time@3.0.3': + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@8.56.10': + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@0.0.39': + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/express-serve-static-core@4.19.5': + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/gtag.js@0.0.12': + resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/history@4.7.11': + resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + + '@types/html-minifier-terser@6.1.0': + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/http-proxy@1.17.14': + resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@types/node@20.14.9': + resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/parse5@5.0.3': + resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} + + '@types/prismjs@1.26.4': + resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-router-config@5.0.11': + resolution: {integrity: sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==} + + '@types/react-router-dom@5.3.3': + resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} + + '@types/react-router@5.1.20': + resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + + '@types/react@18.3.3': + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + '@types/unist@3.0.2': + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + '@types/ws@8.5.10': + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.32': + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.16.0: + resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + + algoliasearch-helper@3.22.2: + resolution: {integrity: sha512-3YQ6eo7uYOCHeQ2ZpD+OoT3aJJwMNKEnwtu8WMzm81XmBOSCwRjQditH9CeSOQ38qhHkuGw23pbq+kULkIJLcw==} + peerDependencies: + algoliasearch: '>= 3.1 < 6' + + algoliasearch@4.24.0: + resolution: {integrity: sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + autocomplete.js@0.37.1: + resolution: {integrity: sha512-PgSe9fHYhZEsm/9jggbjtVsGXJkPLvd+9mC7gZJ662vVL5CRWEtm/mIrrzCx0MrNxHVwxD5d00UOn6NsmL2LUQ==} + + autocomplete.js@0.38.1: + resolution: {integrity: sha512-6pSJzuRMY3pqpozt+SXThl2DmJfma8Bi3SVFbZHS0PW/N72bOUv+Db0jAh2cWOhTsA4X+GNmKvIl8wExJTnN9w==} + + autoprefixer@10.4.19: + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + babel-loader@9.2.1: + resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + + babel-plugin-dynamic-import-node@2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + + babel-plugin-polyfill-corejs2@0.4.11: + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.6: + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.2: + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + bcp-47-match@1.0.3: + resolution: {integrity: sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w==} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bonjour-service@1.2.1: + resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boxen@6.2.1: + resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + + caniuse-lite@1.0.30001640: + resolution: {integrity: sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==} + + caniuse-lite@1.0.30001680: + resolution: {integrity: sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combine-promises@1.2.0: + resolution: {integrity: sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==} + engines: {node: '>=10'} + + comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + content-disposition@0.5.2: + resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} + engines: {node: '>= 0.6'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + copy-text-to-clipboard@3.2.0: + resolution: {integrity: sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==} + engines: {node: '>=12'} + + copy-webpack-plugin@11.0.0: + resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.1.0 + + core-js-compat@3.39.0: + resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} + + core-js-pure@3.37.1: + resolution: {integrity: sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==} + + core-js@3.37.1: + resolution: {integrity: sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cosmiconfig@6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + + css-declaration-sorter@7.2.0: + resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + + css-loader@6.11.0: + resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} + engines: {node: '>= 12.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + css-minimizer-webpack-plugin@5.0.1: + resolution: {integrity: sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@parcel/css': '*' + '@swc/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + lightningcss: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + '@swc/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-selector-parser@1.4.1: + resolution: {integrity: sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssnano-preset-advanced@6.1.2: + resolution: {integrity: sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano-preset-default@6.1.2: + resolution: {integrity: sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano-utils@4.0.2: + resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano@6.1.2: + resolution: {integrity: sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.30.0: + resolution: {integrity: sha512-l590mjTHT6/Cbxp13dGPC2Y7VXdgc+rUeF8AnF/JPzhjNevbDJfObnJgaSjlldOgBQZbue+X6IUZ7r5GAgvauQ==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.10: + resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + dayjs@1.11.11: + resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + del@6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + detect-port-alt@1.1.6: + resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} + engines: {node: '>= 4.2.1'} + hasBin: true + + detect-port@1.6.1: + resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} + engines: {node: '>= 4.0.0'} + hasBin: true + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + direction@1.0.4: + resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} + hasBin: true + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + docusaurus-lunr-search@3.4.0: + resolution: {integrity: sha512-GfllnNXCLgTSPH9TAKWmbn8VMfwpdOAZ1xl3T2GgX8Pm26qSDLfrrdVwjguaLfMJfzciFL97RKrAJlgrFM48yw==} + engines: {node: '>= 8.10.0'} + peerDependencies: + '@docusaurus/core': ^2.0.0-alpha.60 || ^2.0.0 || ^3.0.0 + react: ^16.8.4 || ^17 || ^18 + react-dom: ^16.8.4 || ^17 || ^18 + + dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + dompurify@3.1.6: + resolution: {integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.4.816: + resolution: {integrity: sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==} + + electron-to-chromium@1.5.62: + resolution: {integrity: sha512-t8c+zLmJHa9dJy96yBZRXGQYoiCEnHYgFwn1asvSPZSUdVxnB62A4RASd7k41ytG3ErFBA0TpHlKg9D9SQBmLg==} + + elkjs@0.9.3: + resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + emoticon@4.0.1: + resolution: {integrity: sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.5: + resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-value-to-estree@3.1.2: + resolution: {integrity: sha512-S0gW2+XZkmsx00tU2uJ4L9hUT7IFabbml9pHh2WQqFmAbxit++YGZne0sKJbNwkj9Wvg9E4uqWl4nCIFQMmfag==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eta@2.2.0: + resolution: {integrity: sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==} + engines: {node: '>=6.0.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + feed@4.2.2: + resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} + engines: {node: '>=0.4.0'} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-loader@6.2.0: + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + filesize@8.0.7: + resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} + engines: {node: '>= 0.4.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + engines: {node: '>=14'} + + fork-ts-checker-webpack-plugin@6.5.3: + resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} + engines: {node: '>=10', yarn: '>=1.0.0'} + peerDependencies: + eslint: '>= 6' + typescript: '>= 2.7' + vue-template-compiler: '*' + webpack: '>= 4' + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true + + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-monkey@1.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.4.2: + resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + has-yarn@3.0.0: + resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-parse5@6.0.1: + resolution: {integrity: sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==} + + hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + + hast-util-has-property@1.0.4: + resolution: {integrity: sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg==} + + hast-util-is-element@1.1.0: + resolution: {integrity: sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==} + + hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.0.4: + resolution: {integrity: sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==} + + hast-util-select@4.0.2: + resolution: {integrity: sha512-8EEG2//bN5rrzboPWD2HdS3ugLijNioS1pqOTIolXNf67xxShYw4SQEmVXd3imiBG+U2bC2nVTySr/iRAA7Cjg==} + + hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + + hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-string@1.0.4: + resolution: {integrity: sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==} + + hast-util-to-text@2.0.1: + resolution: {integrity: sha512-8nsgCARfs6VkwH2jJU9b8LNTuR4700na+0h3PqCaEk4MAnMDeu5P0tP8mjk9LLNGxIeQRLbiDbZVw6rku+pYsQ==} + + hast-util-whitespace@1.0.4: + resolution: {integrity: sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + + hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + history@4.10.1: + resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} + + hogan.js@3.0.2: + resolution: {integrity: sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==} + hasBin: true + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + + html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + + html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + html-webpack-plugin@5.6.0: + resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} + engines: {node: '>=10.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + + http-proxy-middleware@2.0.6: + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + image-size@1.1.1: + resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + engines: {node: '>=16.x'} + hasBin: true + + immediate@3.3.0: + resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + infima@0.2.0-alpha.45: + resolution: {integrity: sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + inline-style-parser@0.2.3: + resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-core-module@2.14.0: + resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-npm@6.0.0: + resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-root@2.1.0: + resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} + engines: {node: '>=6'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-yarn-global@0.4.1: + resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} + engines: {node: '>=12'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} + engines: {node: '>=14'} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + katex@0.16.11: + resolution: {integrity: sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + + launch-editor@2.8.0: + resolution: {integrity: sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@10.3.0: + resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==} + engines: {node: 14 || >=16.14} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lunr-languages@1.14.0: + resolution: {integrity: sha512-hWUAb2KqM3L7J5bcrngszzISY4BxrXn/Xhbb9TTCJYEGqlR1nG67/M14sp09+PTIRklobrn57IAxcdcO/ZFyNA==} + + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@2.0.0: + resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} + + markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + + mdast-util-directive@3.0.0: + resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} + + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + + mdast-util-from-markdown@2.0.1: + resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + + mdast-util-mdx-jsx@3.1.2: + resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mermaid@10.9.1: + resolution: {integrity: sha512-Mx45Obds5W1UkW1nv/7dHRsbfMM1aOKA2+Pxs/IGHNonygDHwmng8xTHyS9z4KWVi0rbko8gjiBmuwwXQ7tiNA==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + + micromark-core-commonmark@2.0.1: + resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + + micromark-extension-directive@3.0.0: + resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + + micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + + micromark-util-subtokenize@2.0.1: + resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mime-db@1.33.0: + resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} + engines: {node: '>= 0.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.18: + resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + mini-css-extract-plugin@2.9.2: + resolution: {integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp@0.3.0: + resolution: {integrity: sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==} + deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-emoji@2.1.3: + resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} + engines: {node: '>=18'} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + + nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + engines: {node: '>=14.16'} + + not@0.1.0: + resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + null-loader@4.0.1: + resolution: {integrity: sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + + path-to-regexp@3.3.0: + resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + + pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-calc@9.0.1: + resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.2 + + postcss-colormin@6.1.0: + resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-convert-values@6.1.0: + resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-comments@6.0.2: + resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-duplicates@6.0.3: + resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-empty@6.0.3: + resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-overridden@6.0.2: + resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-unused@6.0.5: + resolution: {integrity: sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-loader@7.3.4: + resolution: {integrity: sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==} + engines: {node: '>= 14.15.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + + postcss-merge-idents@6.0.3: + resolution: {integrity: sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-merge-longhand@6.0.5: + resolution: {integrity: sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-merge-rules@6.1.1: + resolution: {integrity: sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-font-values@6.1.0: + resolution: {integrity: sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-gradients@6.0.3: + resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-params@6.1.0: + resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-selectors@6.0.4: + resolution: {integrity: sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.0.5: + resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.0: + resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-nested@6.0.1: + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-normalize-charset@6.0.2: + resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-display-values@6.0.2: + resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-positions@6.0.2: + resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-repeat-style@6.0.2: + resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-string@6.0.2: + resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-timing-functions@6.0.2: + resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-unicode@6.1.0: + resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-url@6.0.2: + resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-whitespace@6.0.2: + resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-ordered-values@6.0.2: + resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-idents@6.0.3: + resolution: {integrity: sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-initial@6.1.0: + resolution: {integrity: sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-transforms@6.0.2: + resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-selector-parser@6.1.0: + resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} + engines: {node: '>=4'} + + postcss-sort-media-queries@5.2.0: + resolution: {integrity: sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.4.23 + + postcss-svgo@6.0.3: + resolution: {integrity: sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==} + engines: {node: ^14 || ^16 || >= 18} + peerDependencies: + postcss: ^8.4.31 + + postcss-unique-selectors@6.0.4: + resolution: {integrity: sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss-zindex@6.0.2: + resolution: {integrity: sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss@8.4.39: + resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} + engines: {node: ^10 || ^12 || >=14} + + pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + + pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + + pretty-time@1.1.0: + resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==} + engines: {node: '>=4'} + + prism-react-renderer@2.3.1: + resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==} + peerDependencies: + react: '>=16.0.0' + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pupa@3.1.0: + resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + engines: {node: '>=12.20'} + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.0: + resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} + engines: {node: '>= 0.6'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-dev-utils@12.0.1: + resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=2.7' + webpack: '>=4' + peerDependenciesMeta: + typescript: + optional: true + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-error-overlay@6.0.11: + resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-helmet-async@1.3.0: + resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 + + react-helmet-async@2.0.5: + resolution: {integrity: sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-json-view-lite@1.4.0: + resolution: {integrity: sha512-wh6F6uJyYAmQ4fK0e8dSQMEWuvTs2Wr3el3sLD9bambX1+pSWUVXIz1RFaoy3TI1mZ0FqdpKq9YgbgTTgyrmXA==} + engines: {node: '>=14'} + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + + react-loadable-ssr-addon-v5-slorber@1.0.1: + resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} + engines: {node: '>=10.13.0'} + peerDependencies: + react-loadable: '*' + webpack: '>=4.41.1 || 5.x' + + react-markdown@9.0.1: + resolution: {integrity: sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + + react-router-config@5.1.1: + resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==} + peerDependencies: + react: '>=15' + react-router: '>=5' + + react-router-dom@5.3.4: + resolution: {integrity: sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==} + peerDependencies: + react: '>=15' + + react-router@5.3.4: + resolution: {integrity: sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==} + peerDependencies: + react: '>=15' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regexp.prototype.flags@1.5.3: + resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + engines: {node: '>= 0.4'} + + regexpu-core@6.1.1: + resolution: {integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==} + engines: {node: '>=4'} + + registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.11.2: + resolution: {integrity: sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==} + hasBin: true + + rehype-parse@7.0.1: + resolution: {integrity: sha512-fOiR9a9xH+Le19i4fGzIEowAbwG7idy2Jzs4mOrFWBSJ0sNUgy0ev871dwWnbOo371SjgjG4pwzrbgSVrKxecw==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + remark-directive@3.0.0: + resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + + remark-emoji@4.0.1: + resolution: {integrity: sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + + remark-mdx@3.0.1: + resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pathname@3.0.0: + resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@2.79.2: + resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} + engines: {node: '>=10.0.0'} + hasBin: true + + rtl-detect@1.1.2: + resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==} + + rtlcss@4.1.1: + resolution: {integrity: sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==} + engines: {node: '>=12.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + schema-utils@2.7.0: + resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} + engines: {node: '>= 8.9.0'} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + + search-insights@2.14.0: + resolution: {integrity: sha512-OLN6MsPMCghDOqlCtsIsYgtsC0pnwVTyT9Mu6A3ewOj1DxvzZF6COrn2g86E/c05xbktB0XN04m/t1Z+n+fTGw==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-handler@6.1.6: + resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==} + + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@7.1.2: + resolution: {integrity: sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==} + engines: {node: '>=12.0.0', npm: '>=5.6.0'} + hasBin: true + + skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + + sort-css-media-queries@2.2.0: + resolution: {integrity: sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==} + engines: {node: '>= 6.3.0'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + srcset@4.0.0: + resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} + engines: {node: '>=12'} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + + style-to-object@1.0.6: + resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==} + + stylehacks@6.1.1: + resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + stylis@4.3.2: + resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + + tailwindcss@3.4.4: + resolution: {integrity: sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==} + engines: {node: '>=14.0.0'} + hasBin: true + + tapable@1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + + tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.31.1: + resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} + engines: {node: '>=10'} + hasBin: true + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-vfile@6.1.0: + resolution: {integrity: sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unified@9.2.2: + resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + + unist-util-find-after@3.0.0: + resolution: {integrity: sha512-ojlBqfsBftYXExNu3+hHLfJQ/X1jYY/9vdm4yZWjIbf0VuWF6CRufci1ZyoD/wV2TYMKxXUoNuoqwy+CkgzAiQ==} + + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-notifier@6.0.2: + resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} + engines: {node: '>=14.16'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-loader@4.1.1: + resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + file-loader: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + + utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + + value-equal@1.0.1: + resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-location@3.2.0: + resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==} + + vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + + vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + + vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + web-namespaces@1.1.4: + resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + web-worker@1.3.0: + resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webpack-bundle-analyzer@4.10.2: + resolution: {integrity: sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==} + engines: {node: '>= 10.13.0'} + hasBin: true + + webpack-dev-middleware@5.3.4: + resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + webpack-dev-server@4.15.2: + resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + + webpack-merge@6.0.1: + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.96.1: + resolution: {integrity: sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + webpackbar@6.0.1: + resolution: {integrity: sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==} + engines: {node: '>=14.21.3'} + peerDependencies: + webpack: 3 || 4 || 5 + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + workbox-background-sync@7.3.0: + resolution: {integrity: sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==} + + workbox-broadcast-update@7.3.0: + resolution: {integrity: sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==} + + workbox-build@7.3.0: + resolution: {integrity: sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==} + engines: {node: '>=16.0.0'} + + workbox-cacheable-response@7.3.0: + resolution: {integrity: sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==} + + workbox-core@7.3.0: + resolution: {integrity: sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==} + + workbox-expiration@7.3.0: + resolution: {integrity: sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==} + + workbox-google-analytics@7.3.0: + resolution: {integrity: sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==} + + workbox-navigation-preload@7.3.0: + resolution: {integrity: sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==} + + workbox-precaching@7.3.0: + resolution: {integrity: sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==} + + workbox-range-requests@7.3.0: + resolution: {integrity: sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==} + + workbox-recipes@7.3.0: + resolution: {integrity: sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==} + + workbox-routing@7.3.0: + resolution: {integrity: sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==} + + workbox-strategies@7.3.0: + resolution: {integrity: sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==} + + workbox-streams@7.3.0: + resolution: {integrity: sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==} + + workbox-sw@7.3.0: + resolution: {integrity: sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==} + + workbox-window@7.3.0: + resolution: {integrity: sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + + xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.4.5: + resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + engines: {node: '>= 14'} + hasBin: true + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + zwitch@1.0.5: + resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.14.0)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.14.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.14.0)': + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) + search-insights: 2.14.0 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)': + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) + '@algolia/client-search': 4.24.0 + algoliasearch: 4.24.0 + + '@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)': + dependencies: + '@algolia/client-search': 4.24.0 + algoliasearch: 4.24.0 + + '@algolia/cache-browser-local-storage@4.24.0': + dependencies: + '@algolia/cache-common': 4.24.0 + + '@algolia/cache-common@4.24.0': {} + + '@algolia/cache-in-memory@4.24.0': + dependencies: + '@algolia/cache-common': 4.24.0 + + '@algolia/client-account@4.24.0': + dependencies: + '@algolia/client-common': 4.24.0 + '@algolia/client-search': 4.24.0 + '@algolia/transporter': 4.24.0 + + '@algolia/client-analytics@4.24.0': + dependencies: + '@algolia/client-common': 4.24.0 + '@algolia/client-search': 4.24.0 + '@algolia/requester-common': 4.24.0 + '@algolia/transporter': 4.24.0 + + '@algolia/client-common@4.24.0': + dependencies: + '@algolia/requester-common': 4.24.0 + '@algolia/transporter': 4.24.0 + + '@algolia/client-personalization@4.24.0': + dependencies: + '@algolia/client-common': 4.24.0 + '@algolia/requester-common': 4.24.0 + '@algolia/transporter': 4.24.0 + + '@algolia/client-search@4.24.0': + dependencies: + '@algolia/client-common': 4.24.0 + '@algolia/requester-common': 4.24.0 + '@algolia/transporter': 4.24.0 + + '@algolia/events@4.0.1': {} + + '@algolia/logger-common@4.24.0': {} + + '@algolia/logger-console@4.24.0': + dependencies: + '@algolia/logger-common': 4.24.0 + + '@algolia/recommend@4.24.0': + dependencies: + '@algolia/cache-browser-local-storage': 4.24.0 + '@algolia/cache-common': 4.24.0 + '@algolia/cache-in-memory': 4.24.0 + '@algolia/client-common': 4.24.0 + '@algolia/client-search': 4.24.0 + '@algolia/logger-common': 4.24.0 + '@algolia/logger-console': 4.24.0 + '@algolia/requester-browser-xhr': 4.24.0 + '@algolia/requester-common': 4.24.0 + '@algolia/requester-node-http': 4.24.0 + '@algolia/transporter': 4.24.0 + + '@algolia/requester-browser-xhr@4.24.0': + dependencies: + '@algolia/requester-common': 4.24.0 + + '@algolia/requester-common@4.24.0': {} + + '@algolia/requester-node-http@4.24.0': + dependencies: + '@algolia/requester-common': 4.24.0 + + '@algolia/transporter@4.24.0': + dependencies: + '@algolia/cache-common': 4.24.0 + '@algolia/logger-common': 4.24.0 + '@algolia/requester-common': 4.24.0 + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@apideck/better-ajv-errors@0.3.6(ajv@8.16.0)': + dependencies: + ajv: 8.16.0 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.2': {} + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + convert-source-map: 2.0.0 + debug: 4.3.5 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.2': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.26.0 + + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.25.9 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.1.1 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.3.5 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.26.0 + + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helper-wrap-function@7.25.9': + dependencies: + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + + '@babel/parser@7.26.2': + dependencies: + '@babel/types': 7.26.0 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.25.9 + + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-simple-access': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-constant-elements@7.24.7(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-runtime@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.26.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/preset-env@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.26.0) + core-js-compat: 3.39.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.26.0 + esutils: 2.0.3 + + '@babel/preset-react@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/runtime-corejs3@7.26.0': + dependencies: + core-js-pure: 3.37.1 + regenerator-runtime: 0.14.1 + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + '@babel/traverse@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@braintree/sanitize-url@6.0.4': {} + + '@colors/colors@1.5.0': + optional: true + + '@discoveryjs/json-ext@0.5.7': {} + + '@docsearch/css@3.6.0': {} + + '@docsearch/react@3.6.0(@algolia/client-search@4.24.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)': + dependencies: + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.14.0) + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) + '@docsearch/css': 3.6.0 + algoliasearch: 4.24.0 + optionalDependencies: + '@types/react': 18.3.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + search-insights: 2.14.0 + transitivePeerDependencies: + - '@algolia/client-search' + + '@docusaurus/babel@3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@babel/core': 7.26.0 + '@babel/generator': 7.26.2 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.26.0) + '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + '@babel/preset-react': 7.25.9(@babel/core@7.26.0) + '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) + '@babel/runtime': 7.26.0 + '@babel/runtime-corejs3': 7.26.0 + '@babel/traverse': 7.25.9 + '@docusaurus/logger': 3.6.1 + '@docusaurus/utils': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + babel-plugin-dynamic-import-node: 2.3.3 + fs-extra: 11.2.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - react + - react-dom + - supports-color + - typescript + - uglify-js + - webpack-cli + + '@docusaurus/bundler@3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@babel/core': 7.26.0 + '@docusaurus/babel': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/cssnano-preset': 3.6.1 + '@docusaurus/logger': 3.6.1 + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + autoprefixer: 10.4.19(postcss@8.4.39) + babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.96.1) + clean-css: 5.3.3 + copy-webpack-plugin: 11.0.0(webpack@5.96.1) + css-loader: 6.11.0(webpack@5.96.1) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.96.1) + cssnano: 6.1.2(postcss@8.4.39) + file-loader: 6.2.0(webpack@5.96.1) + html-minifier-terser: 7.2.0 + mini-css-extract-plugin: 2.9.2(webpack@5.96.1) + null-loader: 4.0.1(webpack@5.96.1) + postcss: 8.4.39 + postcss-loader: 7.3.4(postcss@8.4.39)(typescript@5.2.2)(webpack@5.96.1) + react-dev-utils: 12.0.1(typescript@5.2.2)(webpack@5.96.1) + terser-webpack-plugin: 5.3.10(webpack@5.96.1) + tslib: 2.6.3 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.96.1))(webpack@5.96.1) + webpack: 5.96.1 + webpackbar: 6.0.1(webpack@5.96.1) + transitivePeerDependencies: + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - csso + - esbuild + - eslint + - lightningcss + - react + - react-dom + - supports-color + - typescript + - uglify-js + - vue-template-compiler + - webpack-cli + + '@docusaurus/core@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/babel': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/bundler': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/logger': 3.6.1 + '@docusaurus/mdx-loader': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/utils': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/utils-common': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@mdx-js/react': 3.0.1(@types/react@18.3.3)(react@18.3.1) + boxen: 6.2.1 + chalk: 4.1.2 + chokidar: 3.6.0 + cli-table3: 0.6.5 + combine-promises: 1.2.0 + commander: 5.1.0 + core-js: 3.37.1 + del: 6.1.1 + detect-port: 1.6.1 + escape-html: 1.0.3 + eta: 2.2.0 + eval: 0.1.8 + fs-extra: 11.2.0 + html-tags: 3.3.1 + html-webpack-plugin: 5.6.0(webpack@5.96.1) + leven: 3.1.0 + lodash: 4.17.21 + p-map: 4.0.0 + prompts: 2.4.2 + react: 18.3.1 + react-dev-utils: 12.0.1(typescript@5.2.2)(webpack@5.96.1) + react-dom: 18.3.1(react@18.3.1) + react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.96.1) + react-router: 5.3.4(react@18.3.1) + react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1) + react-router-dom: 5.3.4(react@18.3.1) + rtl-detect: 1.1.2 + semver: 7.6.2 + serve-handler: 6.1.6 + shelljs: 0.8.5 + tslib: 2.6.3 + update-notifier: 6.0.2 + webpack: 5.96.1 + webpack-bundle-analyzer: 4.10.2 + webpack-dev-server: 4.15.2(webpack@5.96.1) + webpack-merge: 6.0.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + '@docusaurus/cssnano-preset@3.6.1': + dependencies: + cssnano-preset-advanced: 6.1.2(postcss@8.4.39) + postcss: 8.4.39 + postcss-sort-media-queries: 5.2.0(postcss@8.4.39) + tslib: 2.6.3 + + '@docusaurus/logger@3.6.1': + dependencies: + chalk: 4.1.2 + tslib: 2.6.3 + + '@docusaurus/mdx-loader@3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/logger': 3.6.1 + '@docusaurus/utils': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/utils-validation': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@mdx-js/mdx': 3.0.1 + '@slorber/remark-comment': 1.0.0 + escape-html: 1.0.3 + estree-util-value-to-estree: 3.1.2 + file-loader: 6.2.0(webpack@5.96.1) + fs-extra: 11.2.0 + image-size: 1.1.1 + mdast-util-mdx: 3.0.0 + mdast-util-to-string: 4.0.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rehype-raw: 7.0.0 + remark-directive: 3.0.0 + remark-emoji: 4.0.1 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.0 + stringify-object: 3.3.0 + tslib: 2.6.3 + unified: 11.0.5 + unist-util-visit: 5.0.0 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.96.1))(webpack@5.96.1) + vfile: 6.0.1 + webpack: 5.96.1 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - supports-color + - typescript + - uglify-js + - webpack-cli + + '@docusaurus/module-type-aliases@3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/history': 4.7.11 + '@types/react': 18.3.3 + '@types/react-router-config': 5.0.11 + '@types/react-router-dom': 5.3.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-helmet-async: 2.0.5(react@18.3.1) + react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' + transitivePeerDependencies: + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/plugin-content-blog@3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/logger': 3.6.1 + '@docusaurus/mdx-loader': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/theme-common': 3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/utils-common': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + cheerio: 1.0.0-rc.12 + feed: 4.2.2 + fs-extra: 11.2.0 + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + reading-time: 1.5.0 + srcset: 4.0.0 + tslib: 2.6.3 + unist-util-visit: 5.0.0 + utility-types: 3.11.0 + webpack: 5.96.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + '@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/logger': 3.6.1 + '@docusaurus/mdx-loader': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/module-type-aliases': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/utils-common': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@types/react-router-config': 5.0.11 + combine-promises: 1.2.0 + fs-extra: 11.2.0 + js-yaml: 4.1.0 + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.6.3 + utility-types: 3.11.0 + webpack: 5.96.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + '@docusaurus/plugin-content-pages@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/mdx-loader': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/utils-validation': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + fs-extra: 11.2.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.6.3 + webpack: 5.96.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + '@docusaurus/plugin-debug@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + fs-extra: 11.2.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-json-view-lite: 1.4.0(react@18.3.1) + tslib: 2.6.3 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + '@docusaurus/plugin-google-analytics@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.6.3 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + '@docusaurus/plugin-google-gtag@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@types/gtag.js': 0.0.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.6.3 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + '@docusaurus/plugin-google-tag-manager@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.6.3 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + '@docusaurus/plugin-pwa@3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@babel/core': 7.26.0 + '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + '@docusaurus/bundler': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/logger': 3.6.1 + '@docusaurus/theme-common': 3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/theme-translations': 3.6.1 + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/utils-validation': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.96.1) + clsx: 2.1.1 + core-js: 3.37.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.6.3 + webpack: 5.96.1 + webpack-merge: 5.10.0 + workbox-build: 7.3.0 + workbox-precaching: 7.3.0 + workbox-window: 7.3.0 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@docusaurus/plugin-content-docs' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@types/babel__core' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + '@docusaurus/plugin-sitemap@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/logger': 3.6.1 + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/utils-common': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + fs-extra: 11.2.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + sitemap: 7.1.2 + tslib: 2.6.3 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + '@docusaurus/preset-classic@3.6.1(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)(typescript@5.2.2)': + dependencies: + '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-content-blog': 3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-content-pages': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-debug': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-google-analytics': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-google-gtag': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-google-tag-manager': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-sitemap': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/theme-classic': 3.6.1(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/theme-common': 3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/theme-search-algolia': 3.6.1(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)(typescript@5.2.2) + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@algolia/client-search' + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - search-insights + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + '@docusaurus/react-loadable@6.0.0(react@18.3.1)': + dependencies: + '@types/react': 18.3.3 + react: 18.3.1 + + '@docusaurus/theme-classic@3.6.1(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/logger': 3.6.1 + '@docusaurus/mdx-loader': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/module-type-aliases': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-blog': 3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-content-docs': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/plugin-content-pages': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/theme-common': 3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/theme-translations': 3.6.1 + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/utils-common': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@mdx-js/react': 3.0.1(@types/react@18.3.3)(react@18.3.1) + clsx: 2.1.1 + copy-text-to-clipboard: 3.2.0 + infima: 0.2.0-alpha.45 + lodash: 4.17.21 + nprogress: 0.2.0 + postcss: 8.4.39 + prism-react-renderer: 2.3.1(react@18.3.1) + prismjs: 1.29.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router-dom: 5.3.4(react@18.3.1) + rtlcss: 4.1.1 + tslib: 2.6.3 + utility-types: 3.11.0 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + '@docusaurus/theme-common@3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/mdx-loader': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/module-type-aliases': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/utils': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/utils-common': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/history': 4.7.11 + '@types/react': 18.3.3 + '@types/react-router-config': 5.0.11 + clsx: 2.1.1 + parse-numeric-range: 1.3.0 + prism-react-renderer: 2.3.1(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.6.3 + utility-types: 3.11.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - supports-color + - typescript + - uglify-js + - webpack-cli + + '@docusaurus/theme-mermaid@3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/module-type-aliases': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + mermaid: 10.9.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.6.3 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@docusaurus/plugin-content-docs' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + '@docusaurus/theme-search-algolia@3.6.1(@algolia/client-search@4.24.0)(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)(typescript@5.2.2)': + dependencies: + '@docsearch/react': 3.6.0(@algolia/client-search@4.24.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0) + '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/logger': 3.6.1 + '@docusaurus/plugin-content-docs': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/theme-common': 3.6.1(@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/theme-translations': 3.6.1 + '@docusaurus/utils': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/utils-validation': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + algoliasearch: 4.24.0 + algoliasearch-helper: 3.22.2(algoliasearch@4.24.0) + clsx: 2.1.1 + eta: 2.2.0 + fs-extra: 11.2.0 + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.6.3 + utility-types: 3.11.0 + transitivePeerDependencies: + - '@algolia/client-search' + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - esbuild + - eslint + - lightningcss + - search-insights + - supports-color + - typescript + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + + '@docusaurus/theme-translations@3.6.1': + dependencies: + fs-extra: 11.2.0 + tslib: 2.6.3 + + '@docusaurus/tsconfig@3.6.1': {} + + '@docusaurus/types@3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@mdx-js/mdx': 3.0.1 + '@types/history': 4.7.11 + '@types/react': 18.3.3 + commander: 5.1.0 + joi: 17.13.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + utility-types: 3.11.0 + webpack: 5.96.1 + webpack-merge: 5.10.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/utils-common@3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tslib: 2.6.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - react + - react-dom + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/utils-validation@3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/logger': 3.6.1 + '@docusaurus/utils': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@docusaurus/utils-common': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + fs-extra: 11.2.0 + joi: 17.13.3 + js-yaml: 4.1.0 + lodash: 4.17.21 + tslib: 2.6.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - react + - react-dom + - supports-color + - typescript + - uglify-js + - webpack-cli + + '@docusaurus/utils@3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@docusaurus/logger': 3.6.1 + '@docusaurus/types': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@svgr/webpack': 8.1.0(typescript@5.2.2) + escape-string-regexp: 4.0.0 + file-loader: 6.2.0(webpack@5.96.1) + fs-extra: 11.2.0 + github-slugger: 1.5.0 + globby: 11.1.0 + gray-matter: 4.0.3 + jiti: 1.21.6 + js-yaml: 4.1.0 + lodash: 4.17.21 + micromatch: 4.0.7 + prompts: 2.4.2 + resolve-pathname: 3.0.0 + shelljs: 0.8.5 + tslib: 2.6.3 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.96.1))(webpack@5.96.1) + utility-types: 3.11.0 + webpack: 5.96.1 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - react + - react-dom + - supports-color + - typescript + - uglify-js + - webpack-cli + + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.14.9 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@mdx-js/mdx@3.0.1': + dependencies: + '@types/estree': 1.0.6 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 + periscopic: 3.1.0 + remark-mdx: 3.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + source-map: 0.7.4 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + + '@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 18.3.3 + react: 18.3.1 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@2.2.2': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@polka/url@1.0.0-next.25': {} + + '@rollup/plugin-babel@5.3.1(@babel/core@7.26.0)(rollup@2.79.2)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + rollup: 2.79.2 + transitivePeerDependencies: + - supports-color + + '@rollup/plugin-node-resolve@15.3.0(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@2.79.2) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.8 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/plugin-replace@2.4.2(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + magic-string: 0.25.9 + rollup: 2.79.2 + + '@rollup/plugin-terser@0.4.4(rollup@2.79.2)': + dependencies: + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.31.1 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/pluginutils@3.1.0(rollup@2.79.2)': + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.2 + + '@rollup/pluginutils@5.1.3(rollup@2.79.2)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 2.79.2 + + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + + '@sinclair/typebox@0.27.8': {} + + '@sindresorhus/is@4.6.0': {} + + '@sindresorhus/is@5.6.0': {} + + '@slorber/remark-comment@1.0.0': + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + + '@surma/rollup-plugin-off-main-thread@2.2.3': + dependencies: + ejs: 3.1.10 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.11 + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-preset@8.1.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.26.0) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.26.0) + + '@svgr/core@8.1.0(typescript@5.2.2)': + dependencies: + '@babel/core': 7.26.0 + '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@5.2.2) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + + '@svgr/hast-util-to-babel-ast@8.0.0': + dependencies: + '@babel/types': 7.26.0 + entities: 4.5.0 + + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.2.2))': + dependencies: + '@babel/core': 7.26.0 + '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0) + '@svgr/core': 8.1.0(typescript@5.2.2) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.2.2))(typescript@5.2.2)': + dependencies: + '@svgr/core': 8.1.0(typescript@5.2.2) + cosmiconfig: 8.3.6(typescript@5.2.2) + deepmerge: 4.3.1 + svgo: 3.3.2 + transitivePeerDependencies: + - typescript + + '@svgr/webpack@8.1.0(typescript@5.2.2)': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-constant-elements': 7.24.7(@babel/core@7.26.0) + '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + '@babel/preset-react': 7.25.9(@babel/core@7.26.0) + '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) + '@svgr/core': 8.1.0(typescript@5.2.2) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.2.2)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.2.2))(typescript@5.2.2) + transitivePeerDependencies: + - supports-color + - typescript + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@trysound/sax@0.2.0': {} + + '@types/acorn@4.0.6': + dependencies: + '@types/estree': 1.0.6 + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.14.9 + + '@types/bonjour@3.5.13': + dependencies: + '@types/node': 20.14.9 + + '@types/connect-history-api-fallback@1.5.4': + dependencies: + '@types/express-serve-static-core': 4.19.5 + '@types/node': 20.14.9 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 20.14.9 + + '@types/d3-scale-chromatic@3.0.3': {} + + '@types/d3-scale@4.0.8': + dependencies: + '@types/d3-time': 3.0.3 + + '@types/d3-time@3.0.3': {} + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 8.56.10 + '@types/estree': 1.0.6 + + '@types/eslint@8.56.10': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.6 + + '@types/estree@0.0.39': {} + + '@types/estree@1.0.6': {} + + '@types/express-serve-static-core@4.19.5': + dependencies: + '@types/node': 20.14.9 + '@types/qs': 6.9.15 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.5 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 + + '@types/gtag.js@0.0.12': {} + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.10 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.2 + + '@types/history@4.7.11': {} + + '@types/html-minifier-terser@6.1.0': {} + + '@types/http-cache-semantics@4.0.4': {} + + '@types/http-errors@2.0.4': {} + + '@types/http-proxy@1.17.14': + dependencies: + '@types/node': 20.14.9 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.10 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.2 + + '@types/mdx@2.0.13': {} + + '@types/mime@1.3.5': {} + + '@types/ms@0.7.34': {} + + '@types/node-forge@1.3.11': + dependencies: + '@types/node': 20.14.9 + + '@types/node@17.0.45': {} + + '@types/node@20.14.9': + dependencies: + undici-types: 5.26.5 + + '@types/parse-json@4.0.2': {} + + '@types/parse5@5.0.3': {} + + '@types/prismjs@1.26.4': {} + + '@types/prop-types@15.7.12': {} + + '@types/qs@6.9.15': {} + + '@types/range-parser@1.2.7': {} + + '@types/react-router-config@5.0.11': + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.3.3 + '@types/react-router': 5.1.20 + + '@types/react-router-dom@5.3.3': + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.3.3 + '@types/react-router': 5.1.20 + + '@types/react-router@5.1.20': + dependencies: + '@types/history': 4.7.11 + '@types/react': 18.3.3 + + '@types/react@18.3.3': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@types/resolve@1.20.2': {} + + '@types/retry@0.12.0': {} + + '@types/sax@1.2.7': + dependencies: + '@types/node': 20.14.9 + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.14.9 + + '@types/serve-index@1.9.4': + dependencies: + '@types/express': 4.17.21 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 20.14.9 + '@types/send': 0.17.4 + + '@types/sockjs@0.3.36': + dependencies: + '@types/node': 20.14.9 + + '@types/trusted-types@2.0.7': {} + + '@types/unist@2.0.10': {} + + '@types/unist@3.0.2': {} + + '@types/ws@8.5.10': + dependencies: + '@types/node': 20.14.9 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.32': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@ungap/structured-clone@1.2.0': {} + + '@webassemblyjs/ast@1.12.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + + '@webassemblyjs/helper-api-error@1.11.6': {} + + '@webassemblyjs/helper-buffer@1.12.1': {} + + '@webassemblyjs/helper-numbers@1.11.6': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + + '@webassemblyjs/helper-wasm-section@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + + '@webassemblyjs/ieee754@1.11.6': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.11.6': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.11.6': {} + + '@webassemblyjs/wasm-edit@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + + '@webassemblyjs/wasm-gen@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wasm-opt@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + '@webassemblyjs/wasm-parser@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wast-printer@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + abbrev@1.1.1: {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn-walk@8.3.3: + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + address@1.2.2: {} + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv-formats@2.1.1(ajv@8.16.0): + optionalDependencies: + ajv: 8.16.0 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.16.0): + dependencies: + ajv: 8.16.0 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.16.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + algoliasearch-helper@3.22.2(algoliasearch@4.24.0): + dependencies: + '@algolia/events': 4.0.1 + algoliasearch: 4.24.0 + + algoliasearch@4.24.0: + dependencies: + '@algolia/cache-browser-local-storage': 4.24.0 + '@algolia/cache-common': 4.24.0 + '@algolia/cache-in-memory': 4.24.0 + '@algolia/client-account': 4.24.0 + '@algolia/client-analytics': 4.24.0 + '@algolia/client-common': 4.24.0 + '@algolia/client-personalization': 4.24.0 + '@algolia/client-search': 4.24.0 + '@algolia/logger-common': 4.24.0 + '@algolia/logger-console': 4.24.0 + '@algolia/recommend': 4.24.0 + '@algolia/requester-browser-xhr': 4.24.0 + '@algolia/requester-common': 4.24.0 + '@algolia/requester-node-http': 4.24.0 + '@algolia/transporter': 4.24.0 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-html-community@0.0.8: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + aproba@2.0.0: {} + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-flatten@1.1.1: {} + + array-union@2.1.0: {} + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.5 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + astring@1.8.6: {} + + async@3.2.6: {} + + at-least-node@1.0.0: {} + + autocomplete.js@0.37.1: + dependencies: + immediate: 3.3.0 + + autocomplete.js@0.38.1: + dependencies: + immediate: 3.3.0 + + autoprefixer@10.4.19(postcss@8.4.39): + dependencies: + browserslist: 4.23.1 + caniuse-lite: 1.0.30001640 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.96.1): + dependencies: + '@babel/core': 7.26.0 + find-cache-dir: 4.0.0 + schema-utils: 4.2.0 + webpack: 5.96.1 + + babel-plugin-dynamic-import-node@2.3.3: + dependencies: + object.assign: 4.1.5 + + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.26.0): + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + core-js-compat: 3.39.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + bail@1.0.5: {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + batch@0.6.1: {} + + bcp-47-match@1.0.3: {} + + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + body-parser@1.20.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + bonjour-service@1.2.1: + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + + boolbase@1.0.0: {} + + boxen@6.2.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + + boxen@7.1.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.1: + dependencies: + caniuse-lite: 1.0.30001640 + electron-to-chromium: 1.4.816 + node-releases: 2.0.14 + update-browserslist-db: 1.1.0(browserslist@4.23.1) + + browserslist@4.24.2: + dependencies: + caniuse-lite: 1.0.30001680 + electron-to-chromium: 1.5.62 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) + + buffer-from@1.1.2: {} + + bytes@3.0.0: {} + + bytes@3.1.2: {} + + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.1 + responselike: 3.0.0 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.3 + + camelcase-css@2.0.1: {} + + camelcase@6.3.0: {} + + camelcase@7.0.1: {} + + caniuse-api@3.0.0: + dependencies: + browserslist: 4.24.2 + caniuse-lite: 1.0.30001680 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + + caniuse-lite@1.0.30001640: {} + + caniuse-lite@1.0.30001680: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + char-regex@1.0.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + + cheerio@1.0.0-rc.12: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chrome-trace-event@1.0.4: {} + + ci-info@3.9.0: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + clean-stack@2.2.0: {} + + cli-boxes@3.0.0: {} + + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + clsx@1.2.1: {} + + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-support@1.1.3: {} + + colord@2.9.3: {} + + colorette@2.0.20: {} + + combine-promises@1.2.0: {} + + comma-separated-tokens@1.0.8: {} + + comma-separated-tokens@2.0.3: {} + + commander@10.0.1: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + commander@5.1.0: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + common-path-prefix@3.0.0: {} + + common-tags@1.8.2: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.52.0 + + compression@1.7.4: + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + concat-map@0.0.1: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + configstore@6.0.0: + dependencies: + dot-prop: 6.0.1 + graceful-fs: 4.2.11 + unique-string: 3.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 5.1.0 + + connect-history-api-fallback@2.0.0: {} + + consola@3.2.3: {} + + console-control-strings@1.1.0: {} + + content-disposition@0.5.2: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.0.6: {} + + cookie@0.6.0: {} + + copy-text-to-clipboard@3.2.0: {} + + copy-webpack-plugin@11.0.0(webpack@5.96.1): + dependencies: + fast-glob: 3.3.2 + glob-parent: 6.0.2 + globby: 13.2.2 + normalize-path: 3.0.0 + schema-utils: 4.2.0 + serialize-javascript: 6.0.2 + webpack: 5.96.1 + + core-js-compat@3.39.0: + dependencies: + browserslist: 4.24.2 + + core-js-pure@3.37.1: {} + + core-js@3.37.1: {} + + core-util-is@1.0.3: {} + + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cosmiconfig@6.0.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cosmiconfig@8.3.6(typescript@5.2.2): + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.2.2 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-random-string@2.0.0: {} + + crypto-random-string@4.0.0: + dependencies: + type-fest: 1.4.0 + + css-declaration-sorter@7.2.0(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + + css-loader@6.11.0(webpack@5.96.1): + dependencies: + icss-utils: 5.1.0(postcss@8.4.39) + postcss: 8.4.39 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.39) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.39) + postcss-modules-scope: 3.2.0(postcss@8.4.39) + postcss-modules-values: 4.0.0(postcss@8.4.39) + postcss-value-parser: 4.2.0 + semver: 7.6.2 + optionalDependencies: + webpack: 5.96.1 + + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.96.1): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + cssnano: 6.1.2(postcss@8.4.39) + jest-worker: 29.7.0 + postcss: 8.4.39 + schema-utils: 4.2.0 + serialize-javascript: 6.0.2 + webpack: 5.96.1 + optionalDependencies: + clean-css: 5.3.3 + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + css-selector-parser@1.4.1: {} + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.0 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.0 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + cssnano-preset-advanced@6.1.2(postcss@8.4.39): + dependencies: + autoprefixer: 10.4.19(postcss@8.4.39) + browserslist: 4.24.2 + cssnano-preset-default: 6.1.2(postcss@8.4.39) + postcss: 8.4.39 + postcss-discard-unused: 6.0.5(postcss@8.4.39) + postcss-merge-idents: 6.0.3(postcss@8.4.39) + postcss-reduce-idents: 6.0.3(postcss@8.4.39) + postcss-zindex: 6.0.2(postcss@8.4.39) + + cssnano-preset-default@6.1.2(postcss@8.4.39): + dependencies: + browserslist: 4.24.2 + css-declaration-sorter: 7.2.0(postcss@8.4.39) + cssnano-utils: 4.0.2(postcss@8.4.39) + postcss: 8.4.39 + postcss-calc: 9.0.1(postcss@8.4.39) + postcss-colormin: 6.1.0(postcss@8.4.39) + postcss-convert-values: 6.1.0(postcss@8.4.39) + postcss-discard-comments: 6.0.2(postcss@8.4.39) + postcss-discard-duplicates: 6.0.3(postcss@8.4.39) + postcss-discard-empty: 6.0.3(postcss@8.4.39) + postcss-discard-overridden: 6.0.2(postcss@8.4.39) + postcss-merge-longhand: 6.0.5(postcss@8.4.39) + postcss-merge-rules: 6.1.1(postcss@8.4.39) + postcss-minify-font-values: 6.1.0(postcss@8.4.39) + postcss-minify-gradients: 6.0.3(postcss@8.4.39) + postcss-minify-params: 6.1.0(postcss@8.4.39) + postcss-minify-selectors: 6.0.4(postcss@8.4.39) + postcss-normalize-charset: 6.0.2(postcss@8.4.39) + postcss-normalize-display-values: 6.0.2(postcss@8.4.39) + postcss-normalize-positions: 6.0.2(postcss@8.4.39) + postcss-normalize-repeat-style: 6.0.2(postcss@8.4.39) + postcss-normalize-string: 6.0.2(postcss@8.4.39) + postcss-normalize-timing-functions: 6.0.2(postcss@8.4.39) + postcss-normalize-unicode: 6.1.0(postcss@8.4.39) + postcss-normalize-url: 6.0.2(postcss@8.4.39) + postcss-normalize-whitespace: 6.0.2(postcss@8.4.39) + postcss-ordered-values: 6.0.2(postcss@8.4.39) + postcss-reduce-initial: 6.1.0(postcss@8.4.39) + postcss-reduce-transforms: 6.0.2(postcss@8.4.39) + postcss-svgo: 6.0.3(postcss@8.4.39) + postcss-unique-selectors: 6.0.4(postcss@8.4.39) + + cssnano-utils@4.0.2(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + + cssnano@6.1.2(postcss@8.4.39): + dependencies: + cssnano-preset-default: 6.1.2(postcss@8.4.39) + lilconfig: 3.1.2 + postcss: 8.4.39 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + csstype@3.1.3: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.30.0): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.30.0 + + cytoscape@3.30.0: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.10: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + dayjs@1.11.11: {} + + debounce@1.2.1: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.5: + dependencies: + ms: 2.1.2 + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-extend@0.6.0: {} + + deepmerge@4.3.1: {} + + default-gateway@6.0.3: + dependencies: + execa: 5.1.1 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + del@6.1.1: + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + + depd@1.1.2: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + detect-node@2.1.0: {} + + detect-port-alt@1.1.6: + dependencies: + address: 1.2.2 + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + + detect-port@1.6.1: + dependencies: + address: 1.2.2 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + didyoumean@1.2.2: {} + + diff@5.2.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + direction@1.0.4: {} + + dlv@1.1.3: {} + + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + + docusaurus-lunr-search@3.4.0(@docusaurus/core@3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + autocomplete.js: 0.37.1 + clsx: 1.2.1 + gauge: 3.0.2 + hast-util-select: 4.0.2 + hast-util-to-text: 2.0.1 + hogan.js: 3.0.2 + lunr: 2.3.9 + lunr-languages: 1.14.0 + mark.js: 8.11.1 + minimatch: 3.1.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rehype-parse: 7.0.1 + to-vfile: 6.1.0 + unified: 9.2.2 + unist-util-is: 4.1.0 + + dom-converter@0.2.0: + dependencies: + utila: 0.4.0 + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + dompurify@3.1.6: {} + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.3 + + dot-prop@6.0.1: + dependencies: + is-obj: 2.0.0 + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-to-chromium@1.4.816: {} + + electron-to-chromium@1.5.62: {} + + elkjs@0.9.3: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojilib@2.4.0: {} + + emojis-list@3.0.0: {} + + emoticon@4.0.1: {} + + encodeurl@1.0.2: {} + + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@2.2.0: {} + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.5: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.3 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.3 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-module-lexer@1.5.4: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + escalade@3.1.2: {} + + escalade@3.2.0: {} + + escape-goat@4.0.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + esprima@4.0.1: {} + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.6 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.8.6 + source-map: 0.7.4 + + estree-util-value-to-estree@3.1.2: + dependencies: + '@types/estree': 1.0.6 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.2 + + estree-walker@1.0.1: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + esutils@2.0.3: {} + + eta@2.2.0: {} + + etag@1.8.1: {} + + eval@0.1.8: + dependencies: + '@types/node': 20.14.9 + require-like: 0.1.2 + + eventemitter3@4.0.7: {} + + events@3.3.0: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + express@4.19.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + faye-websocket@0.11.4: + dependencies: + websocket-driver: 0.7.4 + + feed@4.2.2: + dependencies: + xml-js: 1.6.11 + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + file-loader@6.2.0(webpack@5.96.1): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.96.1 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + filesize@8.0.7: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.2.0: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-cache-dir@4.0.0: + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-up@6.3.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + + flat@5.0.2: {} + + follow-redirects@1.15.6: {} + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.2.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fork-ts-checker-webpack-plugin@6.5.3(typescript@5.2.2)(webpack@5.96.1): + dependencies: + '@babel/code-frame': 7.26.2 + '@types/json-schema': 7.0.15 + chalk: 4.1.2 + chokidar: 3.6.0 + cosmiconfig: 6.0.0 + deepmerge: 4.3.1 + fs-extra: 9.1.0 + glob: 7.2.3 + memfs: 3.5.3 + minimatch: 3.1.2 + schema-utils: 2.7.0 + semver: 7.6.2 + tapable: 1.1.3 + typescript: 5.2.2 + webpack: 5.96.1 + + form-data-encoder@2.1.4: {} + + format@0.2.2: {} + + forwarded@0.2.0: {} + + fraction.js@4.3.7: {} + + fresh@0.5.2: {} + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-monkey@1.0.6: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.5 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + gauge@3.0.2: + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-own-enumerable-property-symbols@3.0.2: {} + + get-stream@6.0.1: {} + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + github-slugger@1.5.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@10.4.2: + dependencies: + foreground-child: 3.2.1 + jackspeak: 3.4.0 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-dirs@3.0.1: + dependencies: + ini: 2.0.0 + + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + globals@11.12.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 4.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + got@12.6.1: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + graceful-fs@4.2.10: {} + + graceful-fs@4.2.11: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + handle-thing@2.0.1: {} + + has-bigints@1.0.2: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + has-unicode@2.0.1: {} + + has-yarn@3.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-parse5@6.0.1: + dependencies: + '@types/parse5': 5.0.3 + hastscript: 6.0.0 + property-information: 5.6.0 + vfile: 4.2.1 + vfile-location: 3.2.0 + web-namespaces: 1.1.4 + + hast-util-from-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.5.0 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 + + hast-util-has-property@1.0.4: {} + + hast-util-is-element@1.1.0: {} + + hast-util-parse-selector@2.2.5: {} + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + '@ungap/structured-clone': 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-select@4.0.2: + dependencies: + bcp-47-match: 1.0.3 + comma-separated-tokens: 1.0.8 + css-selector-parser: 1.4.1 + direction: 1.0.4 + hast-util-has-property: 1.0.4 + hast-util-is-element: 1.1.0 + hast-util-to-string: 1.0.4 + hast-util-whitespace: 1.0.4 + not: 0.1.0 + nth-check: 2.1.1 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + unist-util-visit: 2.0.3 + zwitch: 1.0.5 + + hast-util-to-estree@3.1.0: + dependencies: + '@types/estree': 1.0.6 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-jsx-runtime@2.3.0: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.6 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@1.0.4: {} + + hast-util-to-text@2.0.1: + dependencies: + hast-util-is-element: 1.1.0 + repeat-string: 1.6.1 + unist-util-find-after: 3.0.0 + + hast-util-whitespace@1.0.4: {} + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@6.0.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 1.0.8 + hast-util-parse-selector: 2.2.5 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + + hastscript@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + he@1.2.0: {} + + history@4.10.1: + dependencies: + '@babel/runtime': 7.26.0 + loose-envify: 1.4.0 + resolve-pathname: 3.0.0 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + value-equal: 1.0.1 + + hogan.js@3.0.2: + dependencies: + mkdirp: 0.3.0 + nopt: 1.0.10 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + hpack.js@2.1.6: + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + + html-entities@2.5.2: {} + + html-escaper@2.0.2: {} + + html-minifier-terser@6.1.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.31.1 + + html-minifier-terser@7.2.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.31.1 + + html-tags@3.3.1: {} + + html-url-attributes@3.0.1: {} + + html-void-elements@3.0.0: {} + + html-webpack-plugin@5.6.0(webpack@5.96.1): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + optionalDependencies: + webpack: 5.96.1 + + htmlparser2@6.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + + http-cache-semantics@4.1.1: {} + + http-deceiver@1.2.7: {} + + http-errors@1.6.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-parser-js@0.5.8: {} + + http-proxy-middleware@2.0.6(@types/express@4.17.21): + dependencies: + '@types/http-proxy': 1.17.14 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.7 + optionalDependencies: + '@types/express': 4.17.21 + transitivePeerDependencies: + - debug + + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.6 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + human-signals@2.1.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + icss-utils@5.1.0(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + + idb@7.1.1: {} + + ignore@5.3.1: {} + + image-size@1.1.1: + dependencies: + queue: 6.0.2 + + immediate@3.3.0: {} + + immer@9.0.21: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@4.0.0: {} + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + infima@0.2.0-alpha.45: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.3: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@2.0.0: {} + + inline-style-parser@0.1.1: {} + + inline-style-parser@0.2.3: {} + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + interpret@1.4.0: {} + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + ipaddr.js@1.9.1: {} + + ipaddr.js@2.2.0: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.2.1: {} + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-buffer@2.0.5: {} + + is-callable@1.2.7: {} + + is-ci@3.0.1: + dependencies: + ci-info: 3.9.0 + + is-core-module@2.14.0: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-decimal@2.0.1: {} + + is-docker@2.2.1: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-installed-globally@0.4.0: + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + + is-module@1.0.0: {} + + is-negative-zero@2.0.3: {} + + is-npm@6.0.0: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-obj@1.0.1: {} + + is-obj@2.0.0: {} + + is-path-cwd@2.2.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@2.1.0: {} + + is-plain-obj@3.0.0: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-reference@3.0.2: + dependencies: + '@types/estree': 1.0.6 + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-regexp@1.0.0: {} + + is-root@2.1.0: {} + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-stream@2.0.1: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + + is-typedarray@1.0.0: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-yarn-global@0.4.1: {} + + isarray@0.0.1: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + jackspeak@3.4.0: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.14.9 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-worker@27.5.1: + dependencies: + '@types/node': 20.14.9 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest-worker@29.7.0: + dependencies: + '@types/node': 20.14.9 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jiti@1.21.6: {} + + joi@17.13.3: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.0.2: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonpointer@5.0.1: {} + + katex@0.16.11: + dependencies: + commander: 8.3.0 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + khroma@2.1.0: {} + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + latest-version@7.0.0: + dependencies: + package-json: 8.1.1 + + launch-editor@2.8.0: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.1 + + layout-base@1.0.2: {} + + leven@3.1.0: {} + + lilconfig@2.1.0: {} + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + loader-runner@4.3.0: {} + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + loader-utils@3.3.1: {} + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash-es@4.17.21: {} + + lodash.debounce@4.0.8: {} + + lodash.memoize@4.1.2: {} + + lodash.sortby@4.7.0: {} + + lodash.uniq@4.5.0: {} + + lodash@4.17.21: {} + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lower-case@2.0.2: + dependencies: + tslib: 2.6.3 + + lowercase-keys@3.0.0: {} + + lru-cache@10.3.0: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lunr-languages@1.14.0: {} + + lunr@2.3.9: {} + + magic-string@0.25.9: + dependencies: + sourcemap-codec: 1.4.8 + + mark.js@8.11.1: {} + + markdown-extensions@2.0.0: {} + + markdown-table@2.0.0: + dependencies: + repeat-string: 1.6.1 + + markdown-table@3.0.3: {} + + mdast-util-directive@3.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@1.3.1: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + mdast-util-from-markdown@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.0 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.1 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.1.2: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.4 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.1 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + + mdast-util-to-markdown@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@3.2.0: + dependencies: + '@types/mdast': 3.0.15 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + + media-typer@0.3.0: {} + + memfs@3.5.3: + dependencies: + fs-monkey: 1.0.6 + + merge-descriptors@1.0.1: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + mermaid@10.9.1: + dependencies: + '@braintree/sanitize-url': 6.0.4 + '@types/d3-scale': 4.0.8 + '@types/d3-scale-chromatic': 3.0.3 + cytoscape: 3.30.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.30.0) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.10 + dayjs: 1.11.11 + dompurify: 3.1.6 + elkjs: 0.9.3 + katex: 0.16.11 + khroma: 2.1.0 + lodash-es: 4.17.21 + mdast-util-from-markdown: 1.3.1 + non-layered-tidy-tree-layout: 2.0.2 + stylis: 4.3.2 + ts-dedent: 2.2.0 + uuid: 9.0.1 + web-worker: 1.3.0 + transitivePeerDependencies: + - supports-color + + methods@1.1.2: {} + + micromark-core-commonmark@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-core-commonmark@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-directive@3.0.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + parse-entities: 4.0.1 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-mdx-expression@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-mdx-jsx@3.0.0: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.0 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-destination@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-destination@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-label@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-factory-label@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-mdx-expression@2.0.1: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + + micromark-factory-space@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + + micromark-factory-title@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-title@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-whitespace@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-whitespace@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-character@2.1.0: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-chunked@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-chunked@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-classify-character@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-combine-extensions@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-combine-extensions@2.0.0: + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-decode-numeric-character-reference@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-decode-numeric-character-reference@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-decode-string@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + + micromark-util-decode-string@2.0.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + micromark-util-encode@1.1.0: {} + + micromark-util-encode@2.0.0: {} + + micromark-util-events-to-acorn@2.0.2: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + '@types/unist': 3.0.2 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@1.2.0: {} + + micromark-util-html-tag-name@2.0.0: {} + + micromark-util-normalize-identifier@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-normalize-identifier@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@1.1.0: + dependencies: + micromark-util-types: 1.1.0 + + micromark-util-resolve-all@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-util-sanitize-uri@1.2.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-subtokenize@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-util-subtokenize@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-symbol@1.1.0: {} + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@1.1.0: {} + + micromark-util-types@2.0.0: {} + + micromark@3.2.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.5 + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + micromark@4.0.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.5 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.33.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.18: + dependencies: + mime-db: 1.33.0 + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} + + mini-css-extract-plugin@2.9.2(webpack@5.96.1): + dependencies: + schema-utils: 4.2.0 + tapable: 2.2.1 + webpack: 5.96.1 + + minimalistic-assert@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mkdirp@0.3.0: {} + + mri@1.2.0: {} + + mrmime@2.0.0: {} + + ms@2.0.0: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + multicast-dns@7.2.5: + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.6.3 + + node-emoji@2.1.3: + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + + node-forge@1.3.1: {} + + node-releases@2.0.14: {} + + node-releases@2.0.18: {} + + non-layered-tidy-tree-layout@2.0.2: {} + + nopt@1.0.10: + dependencies: + abbrev: 1.1.1 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + normalize-url@8.0.1: {} + + not@0.1.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + null-loader@4.0.1(webpack@5.96.1): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.96.1 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.3: {} + + object-keys@1.1.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + obuf@1.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + opener@1.5.2: {} + + p-cancelable@3.0.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-retry@4.6.2: + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.0: {} + + package-json@8.1.1: + dependencies: + got: 12.6.1 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + semver: 7.6.2 + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.6.3 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.1: + dependencies: + '@types/unist': 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-numeric-range@1.3.0: {} + + parse5-htmlparser2-tree-adapter@7.0.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + + parse5@6.0.1: {} + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + + parseurl@1.3.3: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.6.3 + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-is-absolute@1.0.1: {} + + path-is-inside@1.0.2: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.3.0 + minipass: 7.1.2 + + path-to-regexp@0.1.7: {} + + path-to-regexp@1.8.0: + dependencies: + isarray: 0.0.1 + + path-to-regexp@3.3.0: {} + + path-type@4.0.0: {} + + periscopic@3.1.0: + dependencies: + '@types/estree': 1.0.6 + estree-walker: 3.0.3 + is-reference: 3.0.2 + + picocolors@1.0.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pify@2.3.0: {} + + pirates@4.0.6: {} + + pkg-dir@7.0.0: + dependencies: + find-up: 6.3.0 + + pkg-up@3.1.0: + dependencies: + find-up: 3.0.0 + + possible-typed-array-names@1.0.0: {} + + postcss-calc@9.0.1(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-selector-parser: 6.1.0 + postcss-value-parser: 4.2.0 + + postcss-colormin@6.1.0(postcss@8.4.39): + dependencies: + browserslist: 4.24.2 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-convert-values@6.1.0(postcss@8.4.39): + dependencies: + browserslist: 4.24.2 + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-discard-comments@6.0.2(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + + postcss-discard-duplicates@6.0.3(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + + postcss-discard-empty@6.0.3(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + + postcss-discard-overridden@6.0.2(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + + postcss-discard-unused@6.0.5(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-selector-parser: 6.1.0 + + postcss-import@15.1.0(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.39): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.39 + + postcss-load-config@4.0.2(postcss@8.4.39): + dependencies: + lilconfig: 3.1.2 + yaml: 2.4.5 + optionalDependencies: + postcss: 8.4.39 + + postcss-loader@7.3.4(postcss@8.4.39)(typescript@5.2.2)(webpack@5.96.1): + dependencies: + cosmiconfig: 8.3.6(typescript@5.2.2) + jiti: 1.21.6 + postcss: 8.4.39 + semver: 7.6.2 + webpack: 5.96.1 + transitivePeerDependencies: + - typescript + + postcss-merge-idents@6.0.3(postcss@8.4.39): + dependencies: + cssnano-utils: 4.0.2(postcss@8.4.39) + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-merge-longhand@6.0.5(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + stylehacks: 6.1.1(postcss@8.4.39) + + postcss-merge-rules@6.1.1(postcss@8.4.39): + dependencies: + browserslist: 4.24.2 + caniuse-api: 3.0.0 + cssnano-utils: 4.0.2(postcss@8.4.39) + postcss: 8.4.39 + postcss-selector-parser: 6.1.0 + + postcss-minify-font-values@6.1.0(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@6.0.3(postcss@8.4.39): + dependencies: + colord: 2.9.3 + cssnano-utils: 4.0.2(postcss@8.4.39) + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-minify-params@6.1.0(postcss@8.4.39): + dependencies: + browserslist: 4.24.2 + cssnano-utils: 4.0.2(postcss@8.4.39) + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@6.0.4(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-selector-parser: 6.1.0 + + postcss-modules-extract-imports@3.1.0(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + + postcss-modules-local-by-default@4.0.5(postcss@8.4.39): + dependencies: + icss-utils: 5.1.0(postcss@8.4.39) + postcss: 8.4.39 + postcss-selector-parser: 6.1.0 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.0(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-selector-parser: 6.1.0 + + postcss-modules-values@4.0.0(postcss@8.4.39): + dependencies: + icss-utils: 5.1.0(postcss@8.4.39) + postcss: 8.4.39 + + postcss-nested@6.0.1(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-selector-parser: 6.1.0 + + postcss-normalize-charset@6.0.2(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + + postcss-normalize-display-values@6.0.2(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@6.0.2(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@6.0.2(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@6.0.2(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@6.0.2(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@6.1.0(postcss@8.4.39): + dependencies: + browserslist: 4.24.2 + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@6.0.2(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@6.0.2(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@6.0.2(postcss@8.4.39): + dependencies: + cssnano-utils: 4.0.2(postcss@8.4.39) + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-reduce-idents@6.0.3(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-reduce-initial@6.1.0(postcss@8.4.39): + dependencies: + browserslist: 4.24.2 + caniuse-api: 3.0.0 + postcss: 8.4.39 + + postcss-reduce-transforms@6.0.2(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + + postcss-selector-parser@6.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-sort-media-queries@5.2.0(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + sort-css-media-queries: 2.2.0 + + postcss-svgo@6.0.3(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + svgo: 3.3.2 + + postcss-unique-selectors@6.0.4(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + postcss-selector-parser: 6.1.0 + + postcss-value-parser@4.2.0: {} + + postcss-zindex@6.0.2(postcss@8.4.39): + dependencies: + postcss: 8.4.39 + + postcss@8.4.39: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + pretty-bytes@5.6.0: {} + + pretty-error@4.0.0: + dependencies: + lodash: 4.17.21 + renderkid: 3.0.0 + + pretty-time@1.1.0: {} + + prism-react-renderer@2.3.1(react@18.3.1): + dependencies: + '@types/prismjs': 1.26.4 + clsx: 2.1.1 + react: 18.3.1 + + prismjs@1.29.0: {} + + process-nextick-args@2.0.1: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@5.6.0: + dependencies: + xtend: 4.0.2 + + property-information@6.5.0: {} + + proto-list@1.2.4: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + punycode@2.3.1: {} + + pupa@3.1.0: + dependencies: + escape-goat: 4.0.0 + + qs@6.11.0: + dependencies: + side-channel: 1.0.6 + + queue-microtask@1.2.3: {} + + queue@6.0.2: + dependencies: + inherits: 2.0.4 + + quick-lru@5.1.1: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.0: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-dev-utils@12.0.1(typescript@5.2.2)(webpack@5.96.1): + dependencies: + '@babel/code-frame': 7.26.2 + address: 1.2.2 + browserslist: 4.24.2 + chalk: 4.1.2 + cross-spawn: 7.0.3 + detect-port-alt: 1.1.6 + escape-string-regexp: 4.0.0 + filesize: 8.0.7 + find-up: 5.0.0 + fork-ts-checker-webpack-plugin: 6.5.3(typescript@5.2.2)(webpack@5.96.1) + global-modules: 2.0.0 + globby: 11.1.0 + gzip-size: 6.0.0 + immer: 9.0.21 + is-root: 2.1.0 + loader-utils: 3.3.1 + open: 8.4.2 + pkg-up: 3.1.0 + prompts: 2.4.2 + react-error-overlay: 6.0.11 + recursive-readdir: 2.2.3 + shell-quote: 1.8.1 + strip-ansi: 6.0.1 + text-table: 0.2.0 + webpack: 5.96.1 + optionalDependencies: + typescript: 5.2.2 + transitivePeerDependencies: + - eslint + - supports-color + - vue-template-compiler + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-error-overlay@6.0.11: {} + + react-fast-compare@3.2.2: {} + + react-helmet-async@1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + invariant: 2.2.4 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-fast-compare: 3.2.2 + shallowequal: 1.1.0 + + react-helmet-async@2.0.5(react@18.3.1): + dependencies: + invariant: 2.2.4 + react: 18.3.1 + react-fast-compare: 3.2.2 + shallowequal: 1.1.0 + + react-is@16.13.1: {} + + react-json-view-lite@1.4.0(react@18.3.1): + dependencies: + react: 18.3.1 + + react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.96.1): + dependencies: + '@babel/runtime': 7.26.0 + react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' + webpack: 5.96.1 + + react-markdown@9.0.1(@types/react@18.3.3)(react@18.3.1): + dependencies: + '@types/hast': 3.0.4 + '@types/react': 18.3.3 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.0 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.0 + react: 18.3.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + + react-router-config@5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 + react-router: 5.3.4(react@18.3.1) + + react-router-dom@5.3.4(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + history: 4.10.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-router: 5.3.4(react@18.3.1) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + react-router@5.3.4(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + history: 4.10.1 + hoist-non-react-statics: 3.3.2 + loose-envify: 1.4.0 + path-to-regexp: 1.8.0 + prop-types: 15.8.1 + react: 18.3.1 + react-is: 16.13.1 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + reading-time@1.5.0: {} + + rechoir@0.6.2: + dependencies: + resolve: 1.22.8 + + recursive-readdir@2.2.3: + dependencies: + minimatch: 3.1.2 + + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.14.1: {} + + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.26.0 + + regexp.prototype.flags@1.5.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + regexpu-core@6.1.1: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.11.2 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + + registry-auth-token@5.0.2: + dependencies: + '@pnpm/npm-conf': 2.2.2 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + + regjsgen@0.8.0: {} + + regjsparser@0.11.2: + dependencies: + jsesc: 3.0.2 + + rehype-parse@7.0.1: + dependencies: + hast-util-from-parse5: 6.0.1 + parse5: 6.0.1 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.0.4 + vfile: 6.0.1 + + relateurl@0.2.7: {} + + remark-directive@3.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.0.0 + micromark-extension-directive: 3.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-emoji@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + emoticon: 4.0.1 + mdast-util-find-and-replace: 3.0.1 + node-emoji: 2.1.3 + unified: 11.0.5 + + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.0.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.1 + micromark-util-types: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.1 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.5 + + renderkid@3.0.0: + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 6.0.1 + + repeat-string@1.6.1: {} + + require-from-string@2.0.2: {} + + require-like@0.1.2: {} + + requires-port@1.0.0: {} + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + resolve-pathname@3.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.14.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + + retry@0.13.1: {} + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + robust-predicates@3.0.2: {} + + rollup@2.79.2: + optionalDependencies: + fsevents: 2.3.3 + + rtl-detect@1.1.2: {} + + rtlcss@4.1.1: + dependencies: + escalade: 3.2.0 + picocolors: 1.1.1 + postcss: 8.4.39 + strip-json-comments: 3.1.1 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rw@1.3.3: {} + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + schema-utils@2.7.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.2.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.16.0 + ajv-formats: 2.1.1(ajv@8.16.0) + ajv-keywords: 5.1.0(ajv@8.16.0) + + search-insights@2.14.0: {} + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + select-hose@2.0.0: {} + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + + semver-diff@4.0.0: + dependencies: + semver: 7.6.2 + + semver@6.3.1: {} + + semver@7.6.2: {} + + send@0.18.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-handler@6.1.6: + dependencies: + bytes: 3.0.0 + content-disposition: 0.5.2 + mime-types: 2.1.18 + minimatch: 3.1.2 + path-is-inside: 1.0.2 + path-to-regexp: 3.3.0 + range-parser: 1.2.0 + + serve-index@1.9.1: + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + + serve-static@1.15.0: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + setprototypeof@1.1.0: {} + + setprototypeof@1.2.0: {} + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shallowequal@1.1.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.1: {} + + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.3 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sirv@2.0.4: + dependencies: + '@polka/url': 1.0.0-next.25 + mrmime: 2.0.0 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + sitemap@7.1.2: + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.4.1 + + skin-tone@2.0.0: + dependencies: + unicode-emoji-modifier-base: 1.0.0 + + slash@3.0.0: {} + + slash@4.0.0: {} + + smob@1.5.0: {} + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.6.3 + + sockjs@0.3.24: + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + + sort-css-media-queries@2.2.0: {} + + source-map-js@1.2.0: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + sourcemap-codec@1.4.8: {} + + space-separated-tokens@1.1.5: {} + + space-separated-tokens@2.0.2: {} + + spdy-transport@3.0.0: + dependencies: + debug: 4.3.5 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + + spdy@4.0.2: + dependencies: + debug: 4.3.5 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + + sprintf-js@1.0.3: {} + + srcset@4.0.0: {} + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + std-env@3.7.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.matchall@4.0.11: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.5 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.3 + set-function-name: 2.0.2 + side-channel: 1.0.6 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.5 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + stringify-object@3.3.0: + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom-string@1.0.0: {} + + strip-comments@2.0.1: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + style-to-object@0.4.4: + dependencies: + inline-style-parser: 0.1.1 + + style-to-object@1.0.6: + dependencies: + inline-style-parser: 0.2.3 + + stylehacks@6.1.1(postcss@8.4.39): + dependencies: + browserslist: 4.24.2 + postcss: 8.4.39 + postcss-selector-parser: 6.1.0 + + stylis@4.3.2: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.2 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-parser@2.0.4: {} + + svgo@3.3.2: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + css-what: 6.1.0 + csso: 5.0.5 + picocolors: 1.1.1 + + tailwindcss@3.4.4: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.7 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.39 + postcss-import: 15.1.0(postcss@8.4.39) + postcss-js: 4.0.1(postcss@8.4.39) + postcss-load-config: 4.0.2(postcss@8.4.39) + postcss-nested: 6.0.1(postcss@8.4.39) + postcss-selector-parser: 6.1.0 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tapable@1.1.3: {} + + tapable@2.2.1: {} + + temp-dir@2.0.0: {} + + tempy@0.6.0: + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + + terser-webpack-plugin@5.3.10(webpack@5.96.1): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.1 + webpack: 5.96.1 + + terser@5.31.1: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + thunky@1.1.0: {} + + tiny-invariant@1.3.3: {} + + tiny-warning@1.0.3: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + to-vfile@6.1.0: + dependencies: + is-buffer: 2.0.5 + vfile: 4.2.1 + + toidentifier@1.0.1: {} + + totalist@3.0.1: {} + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + trim-lines@3.0.1: {} + + trough@1.0.5: {} + + trough@2.2.0: {} + + ts-dedent@2.2.0: {} + + ts-interface-checker@0.1.13: {} + + tslib@2.6.3: {} + + type-fest@0.16.0: {} + + type-fest@0.21.3: {} + + type-fest@1.4.0: {} + + type-fest@2.19.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + + typescript@5.2.2: {} + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + undici-types@5.26.5: {} + + unicode-canonical-property-names-ecmascript@2.0.0: {} + + unicode-emoji-modifier-base@1.0.0: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.1.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.1 + + unified@9.2.2: + dependencies: + '@types/unist': 2.0.10 + bail: 1.0.5 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 2.1.0 + trough: 1.0.5 + vfile: 4.2.1 + + unique-string@2.0.0: + dependencies: + crypto-random-string: 2.0.0 + + unique-string@3.0.0: + dependencies: + crypto-random-string: 4.0.0 + + unist-util-find-after@3.0.0: + dependencies: + unist-util-is: 4.1.0 + + unist-util-is@4.1.0: {} + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@2.0.3: + dependencies: + '@types/unist': 2.0.10 + + unist-util-stringify-position@3.0.3: + dependencies: + '@types/unist': 2.0.10 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-visit-parents@3.1.1: + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 4.1.0 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + + unist-util-visit@2.0.3: + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 4.1.0 + unist-util-visit-parents: 3.1.1 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + upath@1.2.0: {} + + update-browserslist-db@1.1.0(browserslist@4.23.1): + dependencies: + browserslist: 4.23.1 + escalade: 3.1.2 + picocolors: 1.0.1 + + update-browserslist-db@1.1.1(browserslist@4.24.2): + dependencies: + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + update-notifier@6.0.2: + dependencies: + boxen: 7.1.1 + chalk: 5.3.0 + configstore: 6.0.0 + has-yarn: 3.0.0 + import-lazy: 4.0.0 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + is-npm: 6.0.0 + is-yarn-global: 0.4.1 + latest-version: 7.0.0 + pupa: 3.1.0 + semver: 7.6.2 + semver-diff: 4.0.0 + xdg-basedir: 5.1.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-loader@4.1.1(file-loader@6.2.0(webpack@5.96.1))(webpack@5.96.1): + dependencies: + loader-utils: 2.0.4 + mime-types: 2.1.35 + schema-utils: 3.3.0 + webpack: 5.96.1 + optionalDependencies: + file-loader: 6.2.0(webpack@5.96.1) + + util-deprecate@1.0.2: {} + + utila@0.4.0: {} + + utility-types@3.11.0: {} + + utils-merge@1.0.1: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.0 + kleur: 4.1.5 + sade: 1.8.1 + + value-equal@1.0.1: {} + + vary@1.1.2: {} + + vfile-location@3.2.0: {} + + vfile-location@5.0.2: + dependencies: + '@types/unist': 3.0.2 + vfile: 6.0.1 + + vfile-message@2.0.4: + dependencies: + '@types/unist': 2.0.10 + unist-util-stringify-position: 2.0.3 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + + vfile@4.2.1: + dependencies: + '@types/unist': 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 2.0.3 + vfile-message: 2.0.4 + + vfile@6.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + + watchpack@2.4.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wbuf@1.7.3: + dependencies: + minimalistic-assert: 1.0.1 + + web-namespaces@1.1.4: {} + + web-namespaces@2.0.1: {} + + web-worker@1.3.0: {} + + webidl-conversions@4.0.2: {} + + webpack-bundle-analyzer@4.10.2: + dependencies: + '@discoveryjs/json-ext': 0.5.7 + acorn: 8.14.0 + acorn-walk: 8.3.3 + commander: 7.2.0 + debounce: 1.2.1 + escape-string-regexp: 4.0.0 + gzip-size: 6.0.0 + html-escaper: 2.0.2 + opener: 1.5.2 + picocolors: 1.1.1 + sirv: 2.0.4 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + webpack-dev-middleware@5.3.4(webpack@5.96.1): + dependencies: + colorette: 2.0.20 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.96.1 + + webpack-dev-server@4.15.2(webpack@5.96.1): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.21 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.10 + ansi-html-community: 0.0.8 + bonjour-service: 1.2.1 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.7.4 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.19.2 + graceful-fs: 4.2.11 + html-entities: 2.5.2 + http-proxy-middleware: 2.0.6(@types/express@4.17.21) + ipaddr.js: 2.2.0 + launch-editor: 2.8.0 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.2.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 5.3.4(webpack@5.96.1) + ws: 8.18.0 + optionalDependencies: + webpack: 5.96.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + webpack-merge@5.10.0: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-merge@6.0.1: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@3.2.3: {} + + webpack@5.96.1: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.14.0 + browserslist: 4.24.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.96.1) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpackbar@6.0.1(webpack@5.96.1): + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + consola: 3.2.3 + figures: 3.2.0 + markdown-table: 2.0.0 + pretty-time: 1.1.0 + std-env: 3.7.0 + webpack: 5.96.1 + wrap-ansi: 7.0.0 + + websocket-driver@0.7.4: + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + websocket-extensions@0.1.4: {} + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + + widest-line@4.0.1: + dependencies: + string-width: 5.1.2 + + wildcard@2.0.1: {} + + workbox-background-sync@7.3.0: + dependencies: + idb: 7.1.1 + workbox-core: 7.3.0 + + workbox-broadcast-update@7.3.0: + dependencies: + workbox-core: 7.3.0 + + workbox-build@7.3.0: + dependencies: + '@apideck/better-ajv-errors': 0.3.6(ajv@8.16.0) + '@babel/core': 7.26.0 + '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + '@babel/runtime': 7.26.0 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.26.0)(rollup@2.79.2) + '@rollup/plugin-node-resolve': 15.3.0(rollup@2.79.2) + '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) + '@rollup/plugin-terser': 0.4.4(rollup@2.79.2) + '@surma/rollup-plugin-off-main-thread': 2.2.3 + ajv: 8.16.0 + common-tags: 1.8.2 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + lodash: 4.17.21 + pretty-bytes: 5.6.0 + rollup: 2.79.2 + source-map: 0.8.0-beta.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 7.3.0 + workbox-broadcast-update: 7.3.0 + workbox-cacheable-response: 7.3.0 + workbox-core: 7.3.0 + workbox-expiration: 7.3.0 + workbox-google-analytics: 7.3.0 + workbox-navigation-preload: 7.3.0 + workbox-precaching: 7.3.0 + workbox-range-requests: 7.3.0 + workbox-recipes: 7.3.0 + workbox-routing: 7.3.0 + workbox-strategies: 7.3.0 + workbox-streams: 7.3.0 + workbox-sw: 7.3.0 + workbox-window: 7.3.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + + workbox-cacheable-response@7.3.0: + dependencies: + workbox-core: 7.3.0 + + workbox-core@7.3.0: {} + + workbox-expiration@7.3.0: + dependencies: + idb: 7.1.1 + workbox-core: 7.3.0 + + workbox-google-analytics@7.3.0: + dependencies: + workbox-background-sync: 7.3.0 + workbox-core: 7.3.0 + workbox-routing: 7.3.0 + workbox-strategies: 7.3.0 + + workbox-navigation-preload@7.3.0: + dependencies: + workbox-core: 7.3.0 + + workbox-precaching@7.3.0: + dependencies: + workbox-core: 7.3.0 + workbox-routing: 7.3.0 + workbox-strategies: 7.3.0 + + workbox-range-requests@7.3.0: + dependencies: + workbox-core: 7.3.0 + + workbox-recipes@7.3.0: + dependencies: + workbox-cacheable-response: 7.3.0 + workbox-core: 7.3.0 + workbox-expiration: 7.3.0 + workbox-precaching: 7.3.0 + workbox-routing: 7.3.0 + workbox-strategies: 7.3.0 + + workbox-routing@7.3.0: + dependencies: + workbox-core: 7.3.0 + + workbox-strategies@7.3.0: + dependencies: + workbox-core: 7.3.0 + + workbox-streams@7.3.0: + dependencies: + workbox-core: 7.3.0 + workbox-routing: 7.3.0 + + workbox-sw@7.3.0: {} + + workbox-window@7.3.0: + dependencies: + '@types/trusted-types': 2.0.7 + workbox-core: 7.3.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + ws@7.5.10: {} + + ws@8.18.0: {} + + xdg-basedir@5.1.0: {} + + xml-js@1.6.11: + dependencies: + sax: 1.4.1 + + xtend@4.0.2: {} + + yallist@3.1.1: {} + + yaml@1.10.2: {} + + yaml@2.4.5: {} + + yocto-queue@0.1.0: {} + + yocto-queue@1.1.1: {} + + zwitch@1.0.5: {} + + zwitch@2.0.4: {} diff --git a/old/sidebars.ts b/old/sidebars.ts new file mode 100644 index 0000000..7dfdcb5 --- /dev/null +++ b/old/sidebars.ts @@ -0,0 +1,31 @@ +import type { SidebarsConfig } from "@docusaurus/plugin-content-docs"; + +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ +const sidebars: SidebarsConfig = { + // By default, Docusaurus generates a sidebar from the docs folder structure + tutorialSidebar: [{ type: "autogenerated", dirName: "." }], + + // But you can create a sidebar manually + /* + tutorialSidebar: [ + 'intro', + 'hello', + { + type: 'category', + label: 'Tutorial', + items: ['tutorial-basics/create-a-document'], + }, + ], + */ +}; + +export default sidebars; diff --git a/old/src/components/Button/index.tsx b/old/src/components/Button/index.tsx new file mode 100644 index 0000000..235b031 --- /dev/null +++ b/old/src/components/Button/index.tsx @@ -0,0 +1,38 @@ +import clsx from "clsx"; + +type CommonProps = { + children: React.ReactNode; + className?: string; +}; + +type ButtonProps = CommonProps & + ( + | { + href: string; + onClick?: never; + } + | { + href?: never; + onClick: () => void; + } + ); + +const Button = (props: ButtonProps) => { + const Component = props.href ? "a" : ("button" as React.ElementType); + + const buttonClassNames = ["button", "max-w-full", "w-fit"]; + + return ( + <Component + className={clsx(buttonClassNames, props.className)} + href={props.href} + onClick={props.onClick} + target={props.href ? "_blank" : undefined} + rel={props.href ? "noopener noreferrer" : undefined} + > + {props.children} + </Component> + ); +}; + +export default Button; diff --git a/old/src/components/HomepageFeatures/index.tsx b/old/src/components/HomepageFeatures/index.tsx new file mode 100644 index 0000000..b875f83 --- /dev/null +++ b/old/src/components/HomepageFeatures/index.tsx @@ -0,0 +1,79 @@ +import type { ComponentProps } from "react"; + +import Heading from "@theme/Heading"; + +type FeatureItem = { + title: string; + Svg: React.ComponentType<ComponentProps<"svg">>; + description: JSX.Element; +}; + +const FeatureList: FeatureItem[] = [ + { + title: "Compétences clés", + Svg: require("@site/static/illustrations/coding.svg").default, + description: ( + <> + Trouvez toutes les compétences essentielles à maîtriser pour vos + examens, soigneusement organisées pour que vous sachiez exactement quoi + apprendre. + </> + ), + }, + { + title: "Guides et ressources", + Svg: require("@site/static/illustrations/map.svg").default, + description: ( + <> + Explorez des guides et des ressources partagés par la communauté. + Profitez de l'expertise collective pour réviser chaque sujet de manière + efficace. + </> + ), + }, + { + title: "Plateforme communautaire", + Svg: require("@site/static/illustrations/diversity.svg").default, + description: ( + <> + Participez et contribuez à l'amélioration de la plateforme. Rejoignez + notre communauté open-source et aidez à créer une documentation encore + plus riche et complète. + </> + ), + }, +]; + +const HomepageFeatures = () => { + return ( + <section className="flex items-center py-24 w-full"> + <div className="container"> + <div className="grid md:grid-cols-3 gap-8"> + {FeatureList.map((props, idx) => ( + <Feature key={idx} {...props} /> + ))} + </div> + </div> + </section> + ); +}; + +const Feature = (props: FeatureItem) => { + return ( + <div className="flex flex-col items-center gap-2"> + <div className="text-center"> + <props.Svg className="w-48 h-48" role="img" /> + </div> + + <div className="text-center"> + <Heading as="h2" className="text-xl font-bold mb-2"> + {props.title} + </Heading> + + <p className="text-balance">{props.description}</p> + </div> + </div> + ); +}; + +export default HomepageFeatures; diff --git a/old/src/components/ICalLink/index.tsx b/old/src/components/ICalLink/index.tsx new file mode 100644 index 0000000..cca4957 --- /dev/null +++ b/old/src/components/ICalLink/index.tsx @@ -0,0 +1,55 @@ +import Link from "@docusaurus/Link"; +import clsx from "clsx"; + +type ICalLinkProps = { + className?: string; + date: string; + title: string; + description?: string; + children: React.ReactNode; +}; + +const ICalLink = (props: ICalLinkProps) => { + const createGoogleCalendarLink = () => { + const startDate = new Date(props.date) + .toISOString() + .replace(/-|:|\.\d+/g, ""); + + const endDate = new Date(props.date) + .toISOString() + .replace(/-|:|\.\d+/g, ""); + + const descriptionEncoded = encodeURIComponent(props.description || ""); + const titleEncoded = encodeURIComponent(props.title); + + return `https://www.google.com/calendar/render?action=TEMPLATE&text=${titleEncoded}&dates=${startDate}/${endDate}&details=${descriptionEncoded}`; + }; + + const handleClick = ( + event: React.MouseEvent<HTMLButtonElement, MouseEvent> + ) => { + event.preventDefault(); + const link = createGoogleCalendarLink(); + window.open(link, "_blank"); + }; + + return ( + <button + onClick={handleClick} + className={clsx( + "font-bold", + "inline-flex", + "gap-2", + "items-center", + "transition-colors", + "hover:bg-violet-200", + "hover:dark:text-violet-300", + props.className + )} + > + 📅 {props.children} 📅 + </button> + ); +}; + +export default ICalLink; diff --git a/old/src/components/PwaBanner/index.tsx b/old/src/components/PwaBanner/index.tsx new file mode 100644 index 0000000..08d3155 --- /dev/null +++ b/old/src/components/PwaBanner/index.tsx @@ -0,0 +1,33 @@ +import useDeviceDetector from "@site/src/hooks/useDeviceDetector"; +import usePwaInstaller from "@site/src/hooks/usePwaInstaller"; + +const PwaBanner = () => { + const { isInstalled, installPwa, isClosed, closeBanner } = usePwaInstaller(); + const device = useDeviceDetector(); + + if (isInstalled || device !== "mobile" || isClosed) return null; + + return ( + <div className="fixed bottom-0 right-0 z-50 w-max max-w-full"> + <div className="bg-violet-100/75 backdrop-blur-sm p-4 m-4 rounded shadow-lg"> + <div className="flex gap-4 items-center"> + <span className="text-6xl">🚀</span> + <p className="text-2xl text-center py-6"> + Installez l'application Memento Dev pour un meilleur confort ! + </p> + </div> + + <div className="flex items-center gap-4"> + <button className="button shrink-0" onClick={closeBanner}> + Fermer + </button> + <button className="button button--primary grow" onClick={installPwa}> + Installer + </button> + </div> + </div> + </div> + ); +}; + +export default PwaBanner; diff --git a/old/src/components/Quiz/index.tsx b/old/src/components/Quiz/index.tsx new file mode 100644 index 0000000..5296f86 --- /dev/null +++ b/old/src/components/Quiz/index.tsx @@ -0,0 +1,164 @@ +import { useState } from "react"; +import clsx from "clsx"; + +type QuizAnswer = { + value: string; + label: string; +}; + +type QuizProps = { + question: string; + answers: QuizAnswer[]; + correctAnswer: string; + children: React.ReactNode; +}; + +type QuizQuestionProps = { + question: string; +}; + +type QuizAnswerProps = { + answer: QuizAnswer; + correctAnswer: string; + selectedAnswer: string | null; + setSelectedAnswer: (answer: string) => void; +}; + +type QuizAnswersProps = { + selectedAnswer: string | null; + correctAnswer: string; + answers: QuizAnswer[]; + setSelectedAnswer: (answer: string) => void; +}; + +type QuizResultProps = { + children: React.ReactNode; + correctAnswer: string; + selectedAnswer: string | null; +}; + +const Quiz = (props: QuizProps) => { + const [selectedAnswer, setSelectedAnswer] = useState<string | null>(null); + + return ( + <div> + <QuizQuestion {...props} /> + <QuizAnswers + selectedAnswer={selectedAnswer} + setSelectedAnswer={setSelectedAnswer} + {...props} + /> + <QuizResult selectedAnswer={selectedAnswer} {...props} /> + </div> + ); +}; + +const QuizQuestion = (props: QuizQuestionProps) => { + return ( + <strong className="flex items-center gap-2"> + <svg + stroke="currentColor" + fill="currentColor" + className="shrink-0 h-6 w-6" + strokeWidth="0" + viewBox="0 0 24 24" + height="1em" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + <path d="M12 19C12.8284 19 13.5 19.6716 13.5 20.5C13.5 21.3284 12.8284 22 12 22C11.1716 22 10.5 21.3284 10.5 20.5C10.5 19.6716 11.1716 19 12 19ZM12 2C15.3137 2 18 4.68629 18 8C18 10.1646 17.2474 11.2907 15.3259 12.9231C13.3986 14.5604 13 15.2969 13 17H11C11 14.526 11.787 13.3052 14.031 11.3989C15.5479 10.1102 16 9.43374 16 8C16 5.79086 14.2091 4 12 4C9.79086 4 8 5.79086 8 8V9H6V8C6 4.68629 8.68629 2 12 2Z"></path> + </svg> + + {props.question} + </strong> + ); +}; + +const QuizAnswer = (props: QuizAnswerProps) => { + const handleAnswerClick = () => { + if (props.selectedAnswer === props.answer.label) { + props.setSelectedAnswer(null); + return; + } + + props.setSelectedAnswer(props.answer.label); + }; + + return ( + <button + onClick={handleAnswerClick} + className={clsx( + "!mt-0", + "p-2", + "border", + "rounded-md", + "cursor-pointer", + "transition-colors", + { "border-gray-300 dark:border-gray-500": !props.selectedAnswer }, + { + "hover:border-gray-500 dark:hover:border-gray-400": + !props.selectedAnswer, + }, + { + "hover:bg-gray-50 dark:hover:bg-gray-800": !props.selectedAnswer, + }, + { + "border-green-500": + props.selectedAnswer && props.correctAnswer === props.answer.label, + }, + { + "border-red-500": + props.selectedAnswer && props.correctAnswer !== props.answer.label, + }, + { + "bg-green-100 dark:bg-green-900": + props.selectedAnswer && + props.correctAnswer === props.answer.label && + props.selectedAnswer === props.answer.label, + }, + { + "bg-red-100 dark:bg-red-900": + props.selectedAnswer && + props.correctAnswer !== props.answer.label && + props.selectedAnswer === props.answer.label, + } + )} + > + <span className="font-bold">{props.answer.label}</span> -{" "} + {props.answer.value} + </button> + ); +}; + +const QuizResult = (props: QuizResultProps) => { + if (!props.selectedAnswer) return null; + + return ( + <div className="mt-4 flex flex-col gap-4 p-4 bg-gray-100 dark:bg-gray-800 rounded-md"> + <p className="font-bold text-lg"> + {props.selectedAnswer === props.correctAnswer + ? "Correct !" + : "Incorrect !"} + </p> + {props.children} + </div> + ); +}; + +const QuizAnswers = (props: QuizAnswersProps) => { + return ( + <div className="flex flex-wrap gap-4 items-stretch no-mt"> + {props.answers.map((answer) => ( + <QuizAnswer + key={answer.value} + answer={answer} + correctAnswer={props.correctAnswer} + selectedAnswer={props.selectedAnswer} + setSelectedAnswer={props.setSelectedAnswer} + /> + ))} + </div> + ); +}; + +export default Quiz; diff --git a/old/src/components/TestimonialCardButton/index.tsx b/old/src/components/TestimonialCardButton/index.tsx new file mode 100644 index 0000000..edff7ce --- /dev/null +++ b/old/src/components/TestimonialCardButton/index.tsx @@ -0,0 +1,33 @@ +import type { Testimonial } from "../../data/testimonials"; + +type TestimonialProps = { + testimonial: Testimonial; + setSelectedTestimonial: (testimonial: Testimonial) => void; +}; + +const TestimonialCardButton = (props: TestimonialProps) => { + const handleClick = () => { + props.setSelectedTestimonial(props.testimonial); + }; + + return ( + <button onClick={handleClick} className="button w-full h-full"> + <h3 className="text-center text-wrap"> + {props.testimonial.name || "Anonyme"} + </h3> + + <time + className="italic text-sm" + dateTime={props.testimonial.date.toISOString()} + > + {props.testimonial.date.toLocaleDateString("fr-FR", { + year: "numeric", + month: "long", + day: "numeric", + })} + </time> + </button> + ); +}; + +export default TestimonialCardButton; diff --git a/old/src/components/Testimonials/index.tsx b/old/src/components/Testimonials/index.tsx new file mode 100644 index 0000000..251d2a5 --- /dev/null +++ b/old/src/components/Testimonials/index.tsx @@ -0,0 +1,225 @@ +import type { Testimonial } from "../../data/testimonials"; +import type { Options } from "react-markdown"; + +import TestimonialCardButton from "../TestimonialCardButton"; +import { + candidateTestimonials, + juryTestimonials, +} from "../../data/testimonials"; +import { useState, useMemo } from "react"; +import Markdown from "react-markdown"; +import clsx from "clsx"; + +const markdownOptions: Options = { + allowedElements: ["strong", "em", "p"], +}; + +type TestimonialsProps = { + type: "candidates" | "jury"; +}; + +const Testimonials = (props: TestimonialsProps) => { + const [selectedTestimonial, setSelectedTestimonial] = + useState<Testimonial | null>(null); + const [isOpened, setIsOpened] = useState(false); + + const handleCloseFromContainer = ( + event: React.MouseEvent<HTMLDivElement> + ) => { + if (event.target === event.currentTarget) { + setIsOpened(null); + } + }; + + const testimonials = useMemo(() => { + switch (props.type) { + case "candidates": + return candidateTestimonials; + case "jury": + return juryTestimonials; + default: + return []; + } + }, [props.type]); + + const changeSelectedTestimonial = (testimonial: Testimonial) => { + setSelectedTestimonial(testimonial); + setIsOpened(true); + }; + + const previousSelectedTestimonial = useMemo(() => { + if (!selectedTestimonial) return null; + + const currentTestimonialIndex = testimonials.findIndex( + (testimonial) => testimonial === selectedTestimonial + ); + + const previousTestimonialIndex = + (currentTestimonialIndex - 1 + testimonials.length) % testimonials.length; + + return testimonials[previousTestimonialIndex] || null; + }, [selectedTestimonial]); + + const nextSelectedTestimonial = useMemo(() => { + if (!selectedTestimonial) return null; + + const currentTestimonialIndex = testimonials.findIndex( + (testimonial) => testimonial === selectedTestimonial + ); + + const nextTestimonialIndex = + (currentTestimonialIndex + 1) % testimonials.length; + + return testimonials[nextTestimonialIndex] || null; + }, [selectedTestimonial]); + + const shouldShowPreviousAndNextButtons = testimonials.length > 1; + + return ( + <> + <ul className="list-none !m-0 grid sm:grid-cols-2 xl:grid-cols-3 gap-2"> + {testimonials.map((testimonial, index) => ( + <li className="!m-0" key={index}> + <TestimonialCardButton + setSelectedTestimonial={changeSelectedTestimonial} + testimonial={testimonial} + /> + </li> + ))} + </ul> + + <div + className={clsx( + "fixed", + "flex", + "items-center", + "justify-center", + "w-screen", + "h-screen", + "bg-black/50", + "backdrop-blur", + "inset-0", + "m-0", + "p-4", + "z-50", + "no-mt", + "transition-opacity", + "duration-300", + { "opacity-0": !isOpened }, + { "opacity-100": isOpened }, + { "pointer-events-none": !isOpened }, + { "pointer-events-auto": isOpened } + )} + onClick={handleCloseFromContainer} + > + {isOpened && selectedTestimonial && ( + <section className="relative max-w-full max-h-[calc(100vh-10rem)] w-max p-4 rounded dark:bg-gray-800 bg-gray-200 overflow-auto"> + <button + title="Fermer la fenêtre" + onClick={() => setIsOpened(false)} + > + <svg + xmlns="http://www.w3.org/2000/svg" + className="h-6 w-6" + fill="none" + viewBox="0 0 24 24" + stroke="currentColor" + onClick={() => setIsOpened(false)} + > + <path + strokeLinecap="round" + strokeLinejoin="round" + strokeWidth={2} + d="M6 18L18 6M6 6l12 12" + /> + </svg> + </button> + + <header className="flex items-center gap-8 justify-between mb-6"> + {previousSelectedTestimonial && + shouldShowPreviousAndNextButtons && ( + <button + className="button" + onClick={() => + setSelectedTestimonial(previousSelectedTestimonial) + } + title="Témoignage précédent" + > + {"<"} + </button> + )} + + <div className="grow w-full text-center"> + <h2> + {selectedTestimonial.name && + `Témoignage de ${selectedTestimonial.name}`} + {!selectedTestimonial.name && "Témoignage anonyme"} + </h2> + <time + className="italic text-sm" + dateTime={selectedTestimonial?.date.toISOString()} + > + Rédigé le{" "} + {selectedTestimonial.date.toLocaleDateString("fr-FR", { + year: "numeric", + month: "long", + day: "numeric", + })} + </time> + </div> + + {nextSelectedTestimonial && shouldShowPreviousAndNextButtons && ( + <button + className="button" + onClick={() => + setSelectedTestimonial(nextSelectedTestimonial) + } + title="Témoignage suivant" + > + {">"} + </button> + )} + </header> + + <div className="grid md:grid-cols-3 gap-8"> + <section> + <h3>Avant la soutenance</h3> + <div className="p-2 rounded dark:bg-gray-700 bg-gray-300"> + {selectedTestimonial.before.map((paragraph, index) => ( + <Markdown key={index} {...markdownOptions}> + {paragraph} + </Markdown> + ))} + </div> + </section> + + <section> + <h3>Pendant la soutenance</h3> + <div className="p-2 rounded dark:bg-gray-700 bg-gray-300"> + {selectedTestimonial.during.map((paragraph, index) => ( + <Markdown key={index} {...markdownOptions}> + {paragraph} + </Markdown> + ))} + </div> + </section> + + <section> + <h3>Après la soutenance</h3> + <div className="p-2 rounded dark:bg-gray-700 bg-gray-300"> + {selectedTestimonial.after.map((paragraph, index) => ( + <Markdown key={index} {...markdownOptions}> + {paragraph} + </Markdown> + ))} + </div> + </section> + </div> + </section> + )} + </div> + </> + ); +}; + +export default Testimonials; diff --git a/old/src/css/custom.css b/old/src/css/custom.css new file mode 100644 index 0000000..b54ac87 --- /dev/null +++ b/old/src/css/custom.css @@ -0,0 +1,240 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@font-face { + font-family: "Luciole"; + font-weight: normal; + src: url("@site/static/fonts/Luciole/Luciole-Regular.ttf") format("truetype"); +} + +@font-face { + font-family: "Luciole"; + font-weight: bold; + src: url("@site/static/fonts/Luciole/Luciole-Bold.ttf") format("truetype"); +} + +:root { + --ifm-heading-font-family: "Luciole", sans-serif; + --ifm-color-primary: #6d28d9; + --ifm-color-primary-dark: #6223c5; + --ifm-color-primary-darker: #5c21ba; + --ifm-color-primary-darkest: #4c1b99; + --ifm-color-primary-light: #7c3edd; + --ifm-color-primary-lighter: #8349df; + --ifm-color-primary-lightest: #996ae5; + + --ifm-alert-background-color-highlight: #ffffff; + --ifm-background-color: #f8f6fb; + + --docusaurus-highlighted-code-line-bg: #f3e8ff; + + --admonition-example-background: #f3e8ff; + --admonition-example-foreground: #23043b; + + --admonition-quote-background: #e5e7eb; + --admonition-quote-foreground: #111827; +} + +:root[data-theme="dark"] { + --ifm-color-primary: #a78bfa; + --ifm-color-primary-dark: #8b66f8; + --ifm-color-primary-darker: #7d53f8; + --ifm-color-primary-darkest: #dacefd; + --ifm-color-primary-light: #c3b0fc; + --ifm-color-primary-lighter: #d1c3fc; + --ifm-color-primary-lightest: #fcfbff; + + --ifm-alert-background-color-highlight: #2f2f30; + + --docusaurus-highlighted-code-line-bg: #26212e; + + --admonition-example-background: #21102e; + --admonition-example-foreground: #faf5ff; + + --admonition-quote-background: #21242b; + --admonition-quote-foreground: #e5e7eb; +} + +::selection { + @apply bg-violet-400 text-black; +} + +.button { + @apply font-normal bg-violet-200 rounded-md text-violet-800 px-4 py-2 text-lg hover:no-underline hover:bg-violet-50 transition-colors hover:text-violet-950; +} + +.navbar__link::after { + @apply !top-[5px]; +} + +.navbar__item .dropdown__menu { + @apply w-full; +} + +.footer__link-item, +.navbar__brand, +.navbar__link, +.navbar__item { + @apply inline-flex gap-1 items-center text-white/80 transition-colors; +} + +.footer__link-item:hover, +.navbar__brand:hover, +.navbar__link:hover, +.navbar__item:hover { + @apply text-white no-underline; +} + +.theme-edit-this-page { + @apply inline-flex gap-1 items-center hover:no-underline; +} + +.breadcrumbs { + @apply text-sm text-gray-500 flex flex-wrap gap-2 items-center; +} + +.breadcrumbs__item { + @apply flex items-center gap-1; +} + +.markdown h1 { + @apply text-4xl font-bold mt-4; +} + +.markdown * + h2 { + @apply !mt-10; +} +.markdown h2 { + @apply text-2xl font-bold; +} + +.markdown h3 { + @apply text-xl font-bold; +} + +.markdown h4 { + @apply font-bold; +} + +.markdown p { + @apply leading-7; +} + +.markdown p + p, +.markdown p + details { + @apply !mt-4; +} + +.markdown ul.tabs { + @apply ml-0 relative p-2 z-10; +} +.markdown ul.tabs .tabs__item { + @apply bg-white dark:bg-gray-700 shadow-md rounded-md overflow-hidden px-4 py-2; +} +.markdown ul.tabs .tabs__item:not(.tabs__item--active):hover { + @apply bg-gray-200 dark:bg-gray-600; +} +.markdown ul.tabs .tabs__item:first-of-type { + @apply ml-0; +} +.markdown ul.tabs .tabs__item { + @apply ml-2; +} +.markdown ul.tabs .tabs__item--active { + @apply bg-violet-100 dark:bg-violet-950 dark:text-white; +} +.markdown .tabs-holder + * { + @apply relative p-4 !mt-0 z-0; +} +.markdown .tabs-holder + * > * { + @apply !mt-0; +} +.markdown .tabs-holder + * > * > * + .admonition { + @apply mt-4; +} +.markdown .tabs-holder + *::before { + @apply absolute -z-10 content-[''] w-full bg-violet-50 dark:bg-gray-50/5 h-[calc(100%+2em)] bottom-0 left-0 rounded-md; +} + +.markdown ol, +.markdown ul { + @apply ml-4; +} + +.markdown ul { + @apply list-disc; +} + +.markdown ol { + @apply list-decimal; +} + +.markdown ol li, +.markdown ul li { + @apply ml-4; +} +.markdown ol li + li, +.markdown ul li + li:not(.\!m-0) { + @apply !mt-1; +} +.markdown ul li + li:not(.theme-code-block).\!m-0 { + margin: 0 !important; +} + +.markdown + *:not(summary, .tabs__item, .tabs, .tab-content *, .no-mt, .no-mt *, p, li *) + + *:not(br, ul, ol, h1, h2, h3, h4, h5, h6, li, .no-mt) { + @apply !mt-4; +} +.token-line, +.token-line * { + @apply !mt-0; +} + +.tabs-container { + @apply !mb-0; +} + +.markdown hr { + @apply h-px; +} + +.theme-admonition > div:first-child, +.admonition-heading { + @apply flex items-center gap-1 mb-4; +} + +.theme-code-block { + @apply !m-0; +} +.theme-code-block + * { + @apply !mt-4; +} + +.alert--quote { + --ifm-alert-background-color: var(--admonition-quote-background); + --ifm-alert-foreground-color: var(--admonition-quote-foreground); + --ifm-alert-border-color: #4b5563; +} + +.alert--example { + --ifm-alert-background-color: var(--admonition-example-background); + --ifm-alert-foreground-color: var(--admonition-example-foreground); + --ifm-alert-border-color: #9333ea; +} + +nav.navbar.navbar--dark { + --ifm-navbar-background-color: #1f1c23; +} +footer.footer.footer--dark { + --ifm-footer-background-color: #211e25; +} + +button.button.button--primary { + @apply bg-violet-800 text-violet-200 hover:bg-violet-900; +} + +ul.list-none li { + list-style: none; +} diff --git a/old/src/data/testimonials.ts b/old/src/data/testimonials.ts new file mode 100644 index 0000000..92d66e4 --- /dev/null +++ b/old/src/data/testimonials.ts @@ -0,0 +1,105 @@ +export type Testimonial = { + name?: string; + date: Date; + before: string[]; + during: string[]; + after: string[]; +}; + +export const candidateTestimonials: Testimonial[] = [ + { + name: "Christian HUMBERT", + date: new Date("2024-11-18"), + before: [ + "Comme j'ai l'habitude de donner des conférences, me retrouver devant un jury ne me faisait pas très peur.", + "La plus grosse appréhension que j'avais, c'était de me dire que j'avais des pros devant moi, et dans mon esprit, **Jury = Sélection** : si ça ne plaît pas, tu es automatiquement recalé...", + ], + during: [ + "J'ai eu la chance d'avoir un jury qui a su me mettre à l'aise. J'ai également eu la présence d'un accompagnateur _(aménagement d'épreuves)_, ce qui a contribué à me sentir plus serein.", + "Les premières secondes semblent toujours un peu longues, mais une fois lancé on oublie qu'on est jugé.", + "C'est surtout lors des questions du jury qu'il faut bien s'accrocher.", + ], + after: [ + 'Tu te dis "J\'ai gagné la finale !!".', + "Tant de temps de formation, des heures de travail pour écrire les dossiers...", + "Le tout, c'est d'être fier de ton taf, quelque soit le résultat. Et même si tu ne l'as pas du premier coup, les échecs forment à la réussite 😉", + ], + }, + { + date: new Date("2024-11-18"), + before: [ + "Stress !!!", + "C'était vraiment l'inconnu pour moi et je me rappelle m'être dit qu'en plus de six mois, je ne suis plus derrière un écran mais je vais bien être évalué par des professionnels, physiquement, sur un lieu de rendez-vous bien réel !", + "Je peux ajouter que j'avais quand même un sentiment d'être préparé et d'avoir vraiment travaillé dur entre la fin de ma formation et le TP.", + ], + during: [ + "C'est allé assez vite une fois qu'on y est. Tout était programmé dans ma tête, je savais que j'allais :", + "Me présenter, présenter mon projet puis répondre aux questions.", + "Lors des questions, j'ai été assez frustré par moment car je connaissais la réponse, mais je ne savais pas comment l'expliquer.", + "Le jury a été bienveillant et a essayé de me guider sans me donner la réponse pour autant.", + ], + after: [ + "Sentiment de soulagement sur 2-3 jours, puis montage russe d'émotions car le processus de reconversion n'est pas fini.", + ], + }, + { + name: "Florence CARLIN", + date: new Date("2024-11-19"), + before: [ + "Je suis du genre pas à l'aise en public, d'autant plus en présentation (j'ai un TDAH et beaucoup de mal à trouver mes mots en situation de stress...).", + "Du coup j'appréhendais juuuste un peu le passage devant le jury.", + "Par contre, j'étais plutôt fière de mon dossier projet donc ça compensait un peu le stress quand même !", + ], + during: [ + "Les jurés m'ont mis plus à l'aise que je ne l'aurais pensé, mais ce qui m'a destabilisé c'est leur côté totalement inexpressifs pendant la présentation !", + "J'ai réussi à plutôt bien gérer quand même, mais ça fait vraiment bizarre.", + "J'ai bien aimé le passage des questions, où ils n'ont pas cherché à me \"piéger\" en posant la question de différentes manières pour s'assurer que je comprenais ce que je faisais au-delà du bafouillage.", + "On a eu des échanges très intéressants, notamment sur la façon dont j'avais un point de notre BDD et c'était cool !", + ], + after: [ + "Très fière, très soulagée et plus de confiance en moi qu'avant le passage !", + ], + }, + { + date: new Date("2024-11-20"), + before: [ + "Je suis timide et pas du tout à l’aise à parler devant un « public », on conseille souvent de ne pas apprendre par cœur son texte mais c’est ce que j’ai fait.", + "Venant du monde de la logistique, je ne suis également pas à l'aise avec tout ce qui est logiciel de traitement de texte. J'ai passé énormément de temps à faire mes dossiers et ma présentation, mais le principal c'est de montrer au jury que vous avez bossé.", + "D'autant plus que j'avais repris mon poste en même temps, ce n'était pas évident. J'ai fini ma présentation PowerPoint 2 jours avant ma soutenance.", + ], + during: [ + "Ayant beaucoup répété, je finissais en 25 minutes en général, ce qui m'a donné un peu de temps pour de l'improvisation. J'ai finalement terminé ma présentation en 29 minutes.", + "Ça m'a déstressé pour les questions ! Ça s'est même terminé en discussion, c'était franchement cool 😎", + "Je pense que ça ne se serait pas passé comme ça si je n'avais pas répété autant !", + "Le jury m'a félicité pour la soutenance en me reprochant uniquement mon ton monotone pendant la soutenance (l'inconvénient de tout apprendre par cœur).", + ], + after: [ + "Je suis sorti avec un bon sentiment, même si j'ai beaucoup galéré à monter mes dossiers. Mais comme avec mon équipe nous avons beaucoup bossé sur le projet, je savais au fond de moi que c'était bon !", + "Fierté d'avoir réussi, surtout quand on n'est pas à l'aise.", + "J'espère que mon témoignage peut aider des personnes qui sont dans la même situation que moi. À savoir que j'ai redoublé mon bac à l'époque, parce que je ne travaillais pas assez avant l'examen.", + "Je me suis promis de ne plus refaire la même erreur !", + ], + }, +]; + +export const juryTestimonials: Testimonial[] = [ + { + name: "Gauthier DANIELS", + date: new Date("2024-11-18"), + before: [ + "Avoir été candidat m'a permis de comprendre ce que les candidats ressentent.", + "J'essaye de mettre les candidats à l'aise, de les rassurer, de les guider.", + "En prenant le temps de bien lire les dossiers, je prends note des points à aborder lors de l'oral.", + ], + during: [ + "J'essaye de poser des questions ouvertes, de ne pas donner la réponse, mais de guider le candidat.", + "Je veux m'assurer que le candidat a compris ce qu'il a fait, qu'il est capable de l'expliquer.", + 'Il n\'y a pas de piège ni de "bonne réponse" _(selon les cas)_, je souhaite comprendre la réflexion du candidat à une situation donnée.', + ], + after: [ + "Peu importe le ressenti et/ou le résultat de la soutenance, je prends le temps de donner un retour au candidat, de lui expliquer pourquoi j'ai posé telle question.", + "Je lui donne des pistes d'amélioration, des axes de travail pour la suite.", + "Il est important de partager son expérience aux candidats et de leur permettre d'avancer efficacement dans leur projet professionnel.", + ], + }, +]; diff --git a/old/src/hooks/useDeviceDetector.tsx b/old/src/hooks/useDeviceDetector.tsx new file mode 100644 index 0000000..65590e6 --- /dev/null +++ b/old/src/hooks/useDeviceDetector.tsx @@ -0,0 +1,31 @@ +import { useEffect, useState } from "react"; + +type Device = "desktop" | "mobile"; + +const mobileUserAgentRegex = + /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i; + +const useDeviceDetector = () => { + const [device, setDevice] = useState<Device>("desktop"); + + useEffect(() => { + const handleResize = () => { + const isMobileUserAgent = mobileUserAgentRegex.test(navigator.userAgent); + const isMobileScreen = window.innerWidth < 768; + + setDevice(isMobileUserAgent || isMobileScreen ? "mobile" : "desktop"); + }; + + handleResize(); + + window.addEventListener("resize", handleResize); + + return () => { + window.removeEventListener("resize", handleResize); + }; + }, []); + + return device; +}; + +export default useDeviceDetector; diff --git a/old/src/hooks/usePwaInstaller.tsx b/old/src/hooks/usePwaInstaller.tsx new file mode 100644 index 0000000..2d6af87 --- /dev/null +++ b/old/src/hooks/usePwaInstaller.tsx @@ -0,0 +1,51 @@ +import { useEffect, useState } from "react"; + +const usePwaInstaller = () => { + const [deferredPrompt, setDeferredPrompt] = useState(null); + const [isInstalled, setIsInstalled] = useState(false); + const [isClosed, setIsClosed] = useState(false); + + useEffect(() => { + const installed = + (window.navigator as Navigator & { standalone?: any }).standalone || + window.matchMedia("(display-mode: standalone)").matches; + + setIsInstalled(installed); + + const handleBeforeInstallPrompt = (event: Event) => { + if (!installed) { + event.preventDefault(); + setDeferredPrompt(event); + } + }; + + window.addEventListener("beforeinstallprompt", handleBeforeInstallPrompt); + + return () => { + window.removeEventListener( + "beforeinstallprompt", + handleBeforeInstallPrompt + ); + }; + }, []); + + const installPwa = () => { + if (!deferredPrompt) return; + + deferredPrompt.prompt(); + deferredPrompt.userChoice.then((choiceResult: { outcome: string }) => { + if (choiceResult.outcome === "accepted") { + setIsInstalled(true); + } + setDeferredPrompt(null); + }); + }; + + const closeBanner = () => { + setIsClosed(true); + }; + + return { isInstalled, installPwa, isClosed, closeBanner }; +}; + +export default usePwaInstaller; diff --git a/old/src/pages/index.tsx b/old/src/pages/index.tsx new file mode 100644 index 0000000..2ef1489 --- /dev/null +++ b/old/src/pages/index.tsx @@ -0,0 +1,52 @@ +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import HomepageFeatures from "@site/src/components/HomepageFeatures"; +import HeaderIllustration from "@site/static/illustrations/notes.svg"; +import PwaBanner from "../components/PwaBanner"; +import Heading from "@theme/Heading"; +import Link from "@docusaurus/Link"; +import Layout from "@theme/Layout"; + +const Home = () => { + return ( + <> + <Layout + title={`Synthèses et ressources pour développeurs`} + description="Découvrez des synthèses et ressources open-source dans le développement informatique, rédigées par une communauté de développeurs." + > + <HomepageHeader /> + <main> + <HomepageFeatures /> + </main> + </Layout> + {/* <PwaBanner /> */} + </> + ); +}; + +const HomepageHeader = () => { + const { siteConfig } = useDocusaurusContext(); + + return ( + <header className="bg-violet-600"> + <div className="container flex flex-col-reverse md:flex-row items-center gap-12 text-center md:text-left mx-auto max-w-5xl py-16"> + <div className="md:w-1/2"> + <Heading as="h1" className="text-5xl font-bold text-white"> + {siteConfig.title} + </Heading> + + <p className="text-xl py-6 text-white">{siteConfig.tagline}</p> + + <div className="md:py-10"> + <Link className="button" to="/intro"> + Accédez aux ressources 🚀 + </Link> + </div> + </div> + + <HeaderIllustration role="img" className="hidden md:block !w-1/2" /> + </div> + </header> + ); +}; + +export default Home; diff --git a/old/src/pages/markdown-page.md b/old/src/pages/markdown-page.md new file mode 100644 index 0000000..9756c5b --- /dev/null +++ b/old/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. diff --git a/old/src/pages/mentions-legales.tsx b/old/src/pages/mentions-legales.tsx new file mode 100644 index 0000000..71bd136 --- /dev/null +++ b/old/src/pages/mentions-legales.tsx @@ -0,0 +1,113 @@ +import Heading from "@theme/Heading"; +import Layout from "@theme/Layout"; + +const Legal = () => { + return ( + <Layout + title={`Mentions légales`} + description="Mentions légales du site Memento Dev" + > + <main className="container py-16 flex flex-col gap-8"> + <Heading as="h1" className="text-4xl font-bold uppercase"> + Mentions légales + </Heading> + + <section className="flex flex-col gap-2"> + <Heading as="h2" className="text-2xl font-bold mb-2"> + Éditeur du service + </Heading> + + <div> + <p> + <span className="font-bold">Nom de l'éditeur</span> :{" "} + <strong className="font-normal">Gauthier Daniels EI</strong> + </p> + + <p> + <span className="font-bold">Forme juridique</span> :{" "} + <strong className="font-normal">Entrepreneur individuel</strong> + </p> + </div> + + <div> + <p> + <span className="font-bold">Adresse physique</span> :{" "} + <strong className="font-normal"> + 689 Chemin Latéral, 45240 La Ferté Saint-Aubin + </strong> + </p> + + <p> + <span className="font-bold">Adresse email</span> :{" "} + <strong className="font-normal"> + gauthier@gauthierdaniels.fr + </strong> + </p> + </div> + + <div> + <p> + <span className="font-bold">SIREN</span> :{" "} + <strong className="font-normal">851745141</strong> + </p> + + <p> + <span className="font-bold">SIRET</span> :{" "} + <strong className="font-normal">85174514100057</strong> + </p> + </div> + </section> + + <section className="flex flex-col gap-2"> + <Heading as="h2" className="text-2xl font-bold mb-2"> + Directeur de la publication + </Heading> + + <div> + <p> + <span className="font-bold"> + Nom du directeur de la publication + </span>{" "} + : <strong className="font-normal">Gauthier Daniels</strong> + </p> + + <p> + <span className="font-bold">Adresse email</span> :{" "} + <strong className="font-normal"> + gauthier@gauthierdaniels.fr + </strong> + </p> + </div> + </section> + + <section className="flex flex-col gap-2"> + <Heading as="h2" className="text-2xl font-bold mb-2"> + Hébergement + </Heading> + + <div> + <p> + <span className="font-bold">Nom de l'hébergeur</span> :{" "} + <strong className="font-normal">Infomaniak Network SA</strong> + </p> + + <p> + <span className="font-bold">Adresse web de l'hébergeur</span> :{" "} + <strong className="font-normal">www.infomaniak.com</strong> + </p> + + <p> + <span className="font-bold">Adresse physique de l'hébergeur</span>{" "} + :{" "} + <strong className="font-normal"> + Rue Eugène Marziano 25, 1227 Les Acacias (GE), Suisse + </strong> + </p> + </div> + </section> + </main> + </Layout> + ); +}; + +export default Legal; diff --git a/old/src/theme/Admonition/Types.tsx b/old/src/theme/Admonition/Types.tsx new file mode 100644 index 0000000..6071dd9 --- /dev/null +++ b/old/src/theme/Admonition/Types.tsx @@ -0,0 +1,63 @@ +import DefaultAdmonitionTypes from "@docusaurus/theme-classic/lib/theme/Admonition/Types"; +import clsx from "clsx"; + +interface QuoteAdmonitionProps { + children: React.ReactNode; + title: string; +} + +const headingClasses = ["mb-4", "uppercase", "font-bold", "text-sm"]; + +const QuoteAdmonition = (props: QuoteAdmonitionProps) => { + return ( + <div className="admonition admonition-quote alert alert--quote"> + <div className={clsx("admonition-heading", headingClasses)}> + <svg + stroke="currentColor" + fill="currentColor" + strokeWidth="0" + viewBox="0 0 24 24" + className="inline-block w-4 mr-2 shrink-0" + xmlns="http://www.w3.org/2000/svg" + > + <path d="M20.309 17.708C22.196 15.66 22.006 13.03 22 13V5a1 1 0 0 0-1-1h-6c-1.103 0-2 .897-2 2v7a1 1 0 0 0 1 1h3.078a2.89 2.89 0 0 1-.429 1.396c-.508.801-1.465 1.348-2.846 1.624l-.803.16V20h1c2.783 0 4.906-.771 6.309-2.292zm-11.007 0C11.19 15.66 10.999 13.03 10.993 13V5a1 1 0 0 0-1-1h-6c-1.103 0-2 .897-2 2v7a1 1 0 0 0 1 1h3.078a2.89 2.89 0 0 1-.429 1.396c-.508.801-1.465 1.348-2.846 1.624l-.803.16V20h1c2.783 0 4.906-.771 6.309-2.292z"></path> + </svg> + + {props.title || "Citation"} + </div> + + <div className="admonition-content">{props.children}</div> + </div> + ); +}; + +const ExampleAdmonition = (props: QuoteAdmonitionProps) => { + return ( + <div className="admonition admonition-quote alert alert--example"> + <div className={clsx("admonition-heading", headingClasses)}> + <svg + stroke="currentColor" + fill="currentColor" + strokeWidth="0" + viewBox="0 0 256 256" + className="inline-block w-4 mr-2 shrink-0" + xmlns="http://www.w3.org/2000/svg" + > + <path d="M237.66,86.34l-60-60a8,8,0,0,0-11.32,0L37.11,155.57a44.77,44.77,0,0,0,63.32,63.32L212.32,107l22.21-7.4a8,8,0,0,0,3.13-13.25Zm-32.19,6.07a8,8,0,0,0-3.13,1.93l-39.57,39.57c-8.47,2.9-21.75,4-39.07-5-10.6-5.54-20.18-8-28.56-8.73L172,43.31,217.19,88.5Z"></path> + </svg> + + {props.title || "Exemple"} + </div> + + <div className="admonition-content">{props.children}</div> + </div> + ); +}; + +const AdmonitionTypes = { + ...DefaultAdmonitionTypes, + quote: QuoteAdmonition, + example: ExampleAdmonition, +}; + +export default AdmonitionTypes; diff --git a/old/src/theme/DocTagDocListPage/index.tsx b/old/src/theme/DocTagDocListPage/index.tsx new file mode 100644 index 0000000..6012c65 --- /dev/null +++ b/old/src/theme/DocTagDocListPage/index.tsx @@ -0,0 +1,113 @@ +import type { Props } from "@theme/DocTagDocListPage"; + +import { + PageMetadata, + HtmlClassNameProvider, + ThemeClassNames, +} from "@docusaurus/theme-common"; + +import SearchMetadata from "@theme/SearchMetadata"; +import Translate from "@docusaurus/Translate"; +// import Unlisted from "@theme/Unlisted"; +import Heading from "@theme/Heading"; +import Link from "@docusaurus/Link"; +import clsx from "clsx"; + +const DocItem = (props: { doc: Props["tag"]["items"][number] }) => { + return ( + <article className="p-2 md:p-4 flex flex-col gap-2 border border-gray-200 dark:border-gray-900 bg-violet-50/10 rounded-md shadow"> + <Link to={props.doc.permalink}> + <Heading as="h3" className="font-bold text-lg"> + {props.doc.title} + </Heading> + </Link> + + {props.doc.description && <p>{props.doc.description}</p>} + + <Link + to={props.doc.permalink} + className="flex items-center gap-2 hover:no-underline" + > + <svg + stroke="currentColor" + fill="currentColor" + strokeWidth="0" + viewBox="0 0 256 256" + xmlns="http://www.w3.org/2000/svg" + width="1.25em" + height="1.25em" + > + <path d="M247.31,124.76c-.35-.79-8.82-19.58-27.65-38.41C194.57,61.26,162.88,48,128,48S61.43,61.26,36.34,86.35C17.51,105.18,9,124,8.69,124.76a8,8,0,0,0,0,6.5c.35.79,8.82,19.57,27.65,38.4C61.43,194.74,93.12,208,128,208s66.57-13.26,91.66-38.34c18.83-18.83,27.3-37.61,27.65-38.4A8,8,0,0,0,247.31,124.76ZM128,192c-30.78,0-57.67-11.19-79.93-33.25A133.47,133.47,0,0,1,25,128,133.33,133.33,0,0,1,48.07,97.25C70.33,75.19,97.22,64,128,64s57.67,11.19,79.93,33.25A133.46,133.46,0,0,1,231.05,128C223.84,141.46,192.43,192,128,192Zm0-112a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Z"></path> + </svg> + Lire la documentation + </Link> + </article> + ); +}; + +const DocTagDocListPageMetadata = (props: Props & { title: string }) => { + return ( + <> + <PageMetadata title={props.title} description={props.tag.description} /> + <SearchMetadata tag="doc_tag_doc_list" /> + </> + ); +}; + +const DocTagDocListPageContent = (props: Props & { title: string }) => { + return ( + <HtmlClassNameProvider + className={clsx(ThemeClassNames.page.docsTagDocListPage)} + > + <div className="container margin-vert--lg"> + <div className="row"> + <main className="col col--8 col--offset-2"> + {/* {props.tag.unlisted && <Unlisted />} */} + {props.tag.unlisted && <p>Non listé</p>} + + <header className="mb-8"> + <Heading as="h1" className="font-bold text-4xl mb-2"> + {props.title} + </Heading> + + {props.tag.description && <p>{props.tag.description}</p>} + + <Link href={props.tag.allTagsPath} className="italic"> + {"> "} + <Translate + id="theme.tags.tagsPageLink" + description="The label of the link targeting the tag list page" + > + Voir tous les tags + </Translate> + </Link> + </header> + + <section className="flex flex-col gap-4"> + <Heading as="h2" className="font-bold text-2xl mb-2"> + Liste des documentations + </Heading> + + <section className="grid lg:grid-cols-2 gap-2"> + {props.tag.items.map((doc) => ( + <DocItem key={doc.id} doc={doc} /> + ))} + </section> + </section> + </main> + </div> + </div> + </HtmlClassNameProvider> + ); +}; + +export default function DocTagDocListPage(props: Props): JSX.Element { + const title = `Documentations avec le tag "${props.tag.label}"`; + + return ( + <> + <DocTagDocListPageMetadata {...props} title={title} /> + <DocTagDocListPageContent {...props} title={title} /> + </> + ); +} diff --git a/old/src/theme/DocTagsListPage/index.tsx b/old/src/theme/DocTagsListPage/index.tsx new file mode 100644 index 0000000..275ec1b --- /dev/null +++ b/old/src/theme/DocTagsListPage/index.tsx @@ -0,0 +1,63 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from "react"; +import clsx from "clsx"; +import { + PageMetadata, + HtmlClassNameProvider, + ThemeClassNames, + translateTagsPageTitle, +} from "@docusaurus/theme-common"; +import TagsListByLetter from "@theme/TagsListByLetter"; +import SearchMetadata from "@theme/SearchMetadata"; +import type { Props } from "@theme/DocTagsListPage"; +import Heading from "@theme/Heading"; + +function DocTagsListPageMetadata({ + title, +}: Props & { title: string }): JSX.Element { + return ( + <> + <PageMetadata title={title} /> + <SearchMetadata tag="doc_tags_list" /> + </> + ); +} + +function DocTagsListPageContent({ + tags, + title, +}: Props & { title: string }): JSX.Element { + return ( + <HtmlClassNameProvider + className={clsx(ThemeClassNames.page.docsTagsListPage)} + > + <div className="container margin-vert--lg"> + <div className="row"> + <main className="col col--8 col--offset-2"> + <Heading as="h1" className="mb-4 font-bold text-3xl"> + {title} + </Heading> + + <TagsListByLetter tags={tags} /> + </main> + </div> + </div> + </HtmlClassNameProvider> + ); +} + +export default function DocTagsListPage(props: Props): JSX.Element { + const title = translateTagsPageTitle(); + return ( + <> + <DocTagsListPageMetadata {...props} title={title} /> + <DocTagsListPageContent {...props} title={title} /> + </> + ); +} diff --git a/old/src/theme/NotFound/Content/index.tsx b/old/src/theme/NotFound/Content/index.tsx new file mode 100644 index 0000000..4cdfdf9 --- /dev/null +++ b/old/src/theme/NotFound/Content/index.tsx @@ -0,0 +1,51 @@ +import type { Props } from "@theme/NotFound/Content"; + +import Translate from "@docusaurus/Translate"; +import Heading from "@theme/Heading"; +import clsx from "clsx"; +import Link from "@docusaurus/Link"; + +export default function NotFoundContent({ className }: Props): JSX.Element { + return ( + <main + className={clsx( + "container mt-16 flex items-center justify-center", + className + )} + > + <div className="max-w-2xl flex flex-col gap-4"> + <Heading as="h1" className="font-bold text-4xl mb-4"> + <Translate + id="theme.NotFound.title" + description="The title of the 404 page" + > + Page Not Found + </Translate> + </Heading> + + <p> + <Translate + id="theme.NotFound.p1" + description="The first paragraph of the 404 page" + > + We could not find what you were looking for. + </Translate> + </p> + + <p> + <Translate + id="theme.NotFound.p2" + description="The 2nd paragraph of the 404 page" + > + Please contact the owner of the site that linked you to the original + URL and let them know their link is broken. + </Translate> + </p> + + <Link to="/" className="self-center mt-8 button"> + Retourner à la page d'accueil + </Link> + </div> + </main> + ); +} diff --git a/old/src/theme/NotFound/index.tsx b/old/src/theme/NotFound/index.tsx new file mode 100644 index 0000000..10de0ce --- /dev/null +++ b/old/src/theme/NotFound/index.tsx @@ -0,0 +1,20 @@ +import { PageMetadata } from "@docusaurus/theme-common"; +import { translate } from "@docusaurus/Translate"; +import NotFoundContent from "./Content"; +import Layout from "@theme/Layout"; + +export default function Index(): JSX.Element { + const title = translate({ + id: "theme.NotFound.title", + message: "Page Not Found", + }); + + return ( + <> + <PageMetadata title={title} /> + <Layout> + <NotFoundContent /> + </Layout> + </> + ); +} diff --git a/old/src/theme/SearchBar/DocSearch.js b/old/src/theme/SearchBar/DocSearch.js new file mode 100644 index 0000000..77a53de --- /dev/null +++ b/old/src/theme/SearchBar/DocSearch.js @@ -0,0 +1,310 @@ +import Hogan from "hogan.js"; +import LunrSearchAdapter from "./lunar-search"; +import autocomplete from "autocomplete.js"; +import templates from "./templates"; +import utils from "./utils"; +import $ from "autocomplete.js/zepto"; + +class DocSearch { + constructor({ + searchDocs, + searchIndex, + inputSelector, + debug = false, + baseUrl = '/', + queryDataCallback = null, + autocompleteOptions = { + debug: false, + hint: false, + autoselect: true + }, + transformData = false, + queryHook = false, + handleSelected = false, + enhancedSearchInput = false, + layout = "column", + maxHits = 5 + }) { + this.input = DocSearch.getInputFromSelector(inputSelector); + this.queryDataCallback = queryDataCallback || null; + const autocompleteOptionsDebug = + autocompleteOptions && autocompleteOptions.debug + ? autocompleteOptions.debug + : false; + // eslint-disable-next-line no-param-reassign + autocompleteOptions.debug = debug || autocompleteOptionsDebug; + this.autocompleteOptions = autocompleteOptions; + this.autocompleteOptions.cssClasses = + this.autocompleteOptions.cssClasses || {}; + this.autocompleteOptions.cssClasses.prefix = + this.autocompleteOptions.cssClasses.prefix || "ds"; + const inputAriaLabel = + this.input && + typeof this.input.attr === "function" && + this.input.attr("aria-label"); + this.autocompleteOptions.ariaLabel = + this.autocompleteOptions.ariaLabel || inputAriaLabel || "search input"; + + this.isSimpleLayout = layout === "simple"; + + this.client = new LunrSearchAdapter(searchDocs, searchIndex, baseUrl, maxHits); + + if (enhancedSearchInput) { + this.input = DocSearch.injectSearchBox(this.input); + } + this.autocomplete = autocomplete(this.input, autocompleteOptions, [ + { + source: this.getAutocompleteSource(transformData, queryHook), + templates: { + suggestion: DocSearch.getSuggestionTemplate(this.isSimpleLayout), + footer: templates.footer, + empty: DocSearch.getEmptyTemplate() + } + } + ]); + + const customHandleSelected = handleSelected; + this.handleSelected = customHandleSelected || this.handleSelected; + + // We prevent default link clicking if a custom handleSelected is defined + if (customHandleSelected) { + $(".algolia-autocomplete").on("click", ".ds-suggestions a", event => { + event.preventDefault(); + }); + } + + this.autocomplete.on( + "autocomplete:selected", + this.handleSelected.bind(null, this.autocomplete.autocomplete) + ); + + this.autocomplete.on( + "autocomplete:shown", + this.handleShown.bind(null, this.input) + ); + + if (enhancedSearchInput) { + DocSearch.bindSearchBoxEvent(); + } + + // Ctrl/Cmd + K should focus the search bar, emulating the Algolia search UI + document.addEventListener('keydown', (e) => { + if ((e.ctrlKey || e.metaKey) && e.key == 'k') { + this.input.focus(); + + // By default, using Ctrl + K in Chrome will open the location bar, so disable this + e.preventDefault(); + } + }); + } + + static injectSearchBox(input) { + input.before(templates.searchBox); + const newInput = input + .prev() + .prev() + .find("input"); + input.remove(); + return newInput; + } + + static bindSearchBoxEvent() { + $('.searchbox [type="reset"]').on("click", function () { + $("input#docsearch").focus(); + $(this).addClass("hide"); + autocomplete.autocomplete.setVal(""); + }); + + $("input#docsearch").on("keyup", () => { + const searchbox = document.querySelector("input#docsearch"); + const reset = document.querySelector('.searchbox [type="reset"]'); + reset.className = "searchbox__reset"; + if (searchbox.value.length === 0) { + reset.className += " hide"; + } + }); + } + + /** + * Returns the matching input from a CSS selector, null if none matches + * @function getInputFromSelector + * @param {string} selector CSS selector that matches the search + * input of the page + * @returns {void} + */ + static getInputFromSelector(selector) { + const input = $(selector).filter("input"); + return input.length ? $(input[0]) : null; + } + + /** + * Returns the `source` method to be passed to autocomplete.js. It will query + * the Algolia index and call the callbacks with the formatted hits. + * @function getAutocompleteSource + * @param {function} transformData An optional function to transform the hits + * @param {function} queryHook An optional function to transform the query + * @returns {function} Method to be passed as the `source` option of + * autocomplete + */ + getAutocompleteSource(transformData, queryHook) { + return (query, callback) => { + if (queryHook) { + // eslint-disable-next-line no-param-reassign + query = queryHook(query) || query; + } + this.client.search(query).then(hits => { + if ( + this.queryDataCallback && + typeof this.queryDataCallback == "function" + ) { + this.queryDataCallback(hits); + } + if (transformData) { + hits = transformData(hits) || hits; + } + callback(DocSearch.formatHits(hits)); + }); + }; + } + + // Given a list of hits returned by the API, will reformat them to be used in + // a Hogan template + static formatHits(receivedHits) { + const clonedHits = utils.deepClone(receivedHits); + const hits = clonedHits.map(hit => { + if (hit._highlightResult) { + // eslint-disable-next-line no-param-reassign + hit._highlightResult = utils.mergeKeyWithParent( + hit._highlightResult, + "hierarchy" + ); + } + return utils.mergeKeyWithParent(hit, "hierarchy"); + }); + + // Group hits by category / subcategory + let groupedHits = utils.groupBy(hits, "lvl0"); + $.each(groupedHits, (level, collection) => { + const groupedHitsByLvl1 = utils.groupBy(collection, "lvl1"); + const flattenedHits = utils.flattenAndFlagFirst( + groupedHitsByLvl1, + "isSubCategoryHeader" + ); + groupedHits[level] = flattenedHits; + }); + groupedHits = utils.flattenAndFlagFirst(groupedHits, "isCategoryHeader"); + + // Translate hits into smaller objects to be send to the template + return groupedHits.map(hit => { + const url = DocSearch.formatURL(hit); + const category = utils.getHighlightedValue(hit, "lvl0"); + const subcategory = utils.getHighlightedValue(hit, "lvl1") || category; + const displayTitle = utils + .compact([ + utils.getHighlightedValue(hit, "lvl2") || subcategory, + utils.getHighlightedValue(hit, "lvl3"), + utils.getHighlightedValue(hit, "lvl4"), + utils.getHighlightedValue(hit, "lvl5"), + utils.getHighlightedValue(hit, "lvl6") + ]) + .join( + '<span class="aa-suggestion-title-separator" aria-hidden="true"> › </span>' + ); + const text = utils.getSnippetedValue(hit, "content"); + const isTextOrSubcategoryNonEmpty = + (subcategory && subcategory !== "") || + (displayTitle && displayTitle !== ""); + const isLvl1EmptyOrDuplicate = + !subcategory || subcategory === "" || subcategory === category; + const isLvl2 = + displayTitle && displayTitle !== "" && displayTitle !== subcategory; + const isLvl1 = + !isLvl2 && + (subcategory && subcategory !== "" && subcategory !== category); + const isLvl0 = !isLvl1 && !isLvl2; + const version = hit.version; + + return { + isLvl0, + isLvl1, + isLvl2, + isLvl1EmptyOrDuplicate, + isCategoryHeader: hit.isCategoryHeader, + isSubCategoryHeader: hit.isSubCategoryHeader, + isTextOrSubcategoryNonEmpty, + category, + subcategory, + title: displayTitle, + text, + url, + version + }; + }); + } + + static formatURL(hit) { + const { url, anchor } = hit; + if (url) { + const containsAnchor = url.indexOf("#") !== -1; + if (containsAnchor) return url; + else if (anchor) return `${hit.url}#${hit.anchor}`; + return url; + } else if (anchor) return `#${hit.anchor}`; + /* eslint-disable */ + console.warn("no anchor nor url for : ", JSON.stringify(hit)); + /* eslint-enable */ + return null; + } + + static getEmptyTemplate() { + return args => Hogan.compile(templates.empty).render(args); + } + + static getSuggestionTemplate(isSimpleLayout) { + const stringTemplate = isSimpleLayout + ? templates.suggestionSimple + : templates.suggestion; + const template = Hogan.compile(stringTemplate); + return suggestion => template.render(suggestion); + } + + handleSelected(input, event, suggestion, datasetNumber, context = {}) { + // Do nothing if click on the suggestion, as it's already a <a href>, the + // browser will take care of it. This allow Ctrl-Clicking on results and not + // having the main window being redirected as well + if (context.selectionMethod === "click") { + return; + } + + input.setVal(""); + window.location.assign(suggestion.url); + } + + handleShown(input) { + const middleOfInput = input.offset().left + input.width() / 2; + let middleOfWindow = $(document).width() / 2; + + if (isNaN(middleOfWindow)) { + middleOfWindow = 900; + } + + const alignClass = + middleOfInput - middleOfWindow >= 0 + ? "algolia-autocomplete-right" + : "algolia-autocomplete-left"; + const otherAlignClass = + middleOfInput - middleOfWindow < 0 + ? "algolia-autocomplete-right" + : "algolia-autocomplete-left"; + const autocompleteWrapper = $(".algolia-autocomplete"); + if (!autocompleteWrapper.hasClass(alignClass)) { + autocompleteWrapper.addClass(alignClass); + } + + if (autocompleteWrapper.hasClass(otherAlignClass)) { + autocompleteWrapper.removeClass(otherAlignClass); + } + } +} + +export default DocSearch; diff --git a/old/src/theme/SearchBar/HighlightSearchResults.jsx b/old/src/theme/SearchBar/HighlightSearchResults.jsx new file mode 100644 index 0000000..8e70399 --- /dev/null +++ b/old/src/theme/SearchBar/HighlightSearchResults.jsx @@ -0,0 +1,53 @@ +//copied from https://github.com/cmfcmf/docusaurus-search-local +import Mark from "mark.js"; +import { useEffect, useState } from "react"; +import { useLocation } from "@docusaurus/router"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { useHistory } from "@docusaurus/router"; + +export function HighlightSearchResults() { + const location = useLocation(); + const history = useHistory(); + const { + siteConfig: { baseUrl }, + } = useDocusaurusContext(); + + const [highlightData, setHighlightData] = useState({ wordToHighlight: '', isTitleSuggestion: false , titleText: '' }); + + useEffect(() => { + if ( + !location.state?.highlightState || + location.state.highlightState.wordToHighlight.length === 0 + ) { + return; + } + setHighlightData(location.state.highlightState); + + const { highlightState, ...state } = location.state; + history.replace({ + ...location, + state, + }); + }, [location.state?.highlightState, history, location]); + + useEffect(() => { + if (highlightData.wordToHighlight.length === 0) { + return; + } + + // Make sure to also adjust parse.js if you change the top element here. + const root = document.getElementsByTagName("article")[0] ?? document.getElementsByTagName("main")[0] ; + if (!root) { + return; + } + + const mark = new Mark(root); + const options = { + ignoreJoiners: true, + }; + mark.mark(highlightData.wordToHighlight , options); + return () => mark.unmark(options); + }, [highlightData, baseUrl]); + + return null; +} diff --git a/old/src/theme/SearchBar/algolia.css b/old/src/theme/SearchBar/algolia.css new file mode 100644 index 0000000..4cf5bdc --- /dev/null +++ b/old/src/theme/SearchBar/algolia.css @@ -0,0 +1,560 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/* Bottom border of each suggestion */ +.algolia-docsearch-suggestion { + border-bottom-color: #3a3dd1; +} +/* Main category headers */ +.algolia-docsearch-suggestion--category-header { + background-color: #4b54de; +} +/* Highlighted search terms */ +.algolia-docsearch-suggestion--highlight { + color: #3a33d1; +} +/* Highligted search terms in the main category headers */ +.algolia-docsearch-suggestion--category-header + .algolia-docsearch-suggestion--highlight { + background-color: #4d47d5; +} +/* Currently selected suggestion */ +.aa-cursor .algolia-docsearch-suggestion--content { + color: #272296; +} +.aa-cursor .algolia-docsearch-suggestion { + background: #ebebfb; +} + +/* For bigger screens, when displaying results in two columns */ +@media (min-width: 768px) { + /* Bottom border of each suggestion */ + .algolia-docsearch-suggestion { + border-bottom-color: #7671df; + } + /* Left column, with secondary category header */ + .algolia-docsearch-suggestion--subcategory-column { + border-right-color: #7671df; + color: #4e4726; + } +} + +.searchbox { + display: inline-block; + position: relative; + width: 200px; + height: 32px !important; + white-space: nowrap; + box-sizing: border-box; + visibility: visible !important; +} + +.searchbox .algolia-autocomplete { + display: block; + width: 100%; + height: 100%; +} + +.searchbox__wrapper { + width: 100%; + height: 100%; + z-index: 999; + position: relative; +} + +.searchbox__input { + display: inline-block; + box-sizing: border-box; + -webkit-transition: box-shadow 0.4s ease, background 0.4s ease; + transition: box-shadow 0.4s ease, background 0.4s ease; + border: 0; + border-radius: 16px; + box-shadow: inset 0 0 0 1px #cccccc; + background: #ffffff !important; + padding: 0; + padding-right: 26px; + padding-left: 32px; + width: 100%; + height: 100%; + vertical-align: middle; + white-space: normal; + font-size: 12px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.searchbox__input::-webkit-search-decoration, +.searchbox__input::-webkit-search-cancel-button, +.searchbox__input::-webkit-search-results-button, +.searchbox__input::-webkit-search-results-decoration { + display: none; +} + +.searchbox__input:hover { + box-shadow: inset 0 0 0 1px #b3b3b3; +} + +.searchbox__input:focus, +.searchbox__input:active { + outline: 0; + box-shadow: inset 0 0 0 1px #aaaaaa; + background: #ffffff; +} + +.searchbox__input::-webkit-input-placeholder { + color: #aaaaaa; +} + +.searchbox__input::-moz-placeholder { + color: #aaaaaa; +} + +.searchbox__input:-ms-input-placeholder { + color: #aaaaaa; +} + +.searchbox__input::placeholder { + color: #aaaaaa; +} + +.searchbox__submit { + position: absolute; + top: 0; + margin: 0; + border: 0; + border-radius: 16px 0 0 16px; + background-color: rgba(69, 142, 225, 0); + padding: 0; + width: 32px; + height: 100%; + vertical-align: middle; + text-align: center; + font-size: inherit; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + right: inherit; + left: 0; +} + +.searchbox__submit::before { + display: inline-block; + margin-right: -4px; + height: 100%; + vertical-align: middle; + content: ''; +} + +.searchbox__submit:hover, +.searchbox__submit:active { + cursor: pointer; +} + +.searchbox__submit:focus { + outline: 0; +} + +.searchbox__submit svg { + width: 14px; + height: 14px; + vertical-align: middle; + fill: #6d7e96; +} + +.searchbox__reset { + display: block; + position: absolute; + top: 8px; + right: 8px; + margin: 0; + border: 0; + background: none; + cursor: pointer; + padding: 0; + font-size: inherit; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + fill: rgba(0, 0, 0, 0.5); +} + +.searchbox__reset.hide { + display: none; +} + +.searchbox__reset:focus { + outline: 0; +} + +.searchbox__reset svg { + display: block; + margin: 4px; + width: 8px; + height: 8px; +} + +.searchbox__input:valid ~ .searchbox__reset { + display: block; + -webkit-animation-name: sbx-reset-in; + animation-name: sbx-reset-in; + -webkit-animation-duration: 0.15s; + animation-duration: 0.15s; +} + +@-webkit-keyframes sbx-reset-in { + 0% { + -webkit-transform: translate3d(-20%, 0, 0); + transform: translate3d(-20%, 0, 0); + opacity: 0; + } + 100% { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes sbx-reset-in { + 0% { + -webkit-transform: translate3d(-20%, 0, 0); + transform: translate3d(-20%, 0, 0); + opacity: 0; + } + 100% { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.algolia-autocomplete .ds-dropdown-menu:before { + display: block; + position: absolute; + content: ''; + width: 14px; + height: 14px; + background: #373940; + z-index: 1000; + top: -7px; + border-top: 1px solid #373940; + border-right: 1px solid #373940; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + border-radius: 2px; +} + +.algolia-autocomplete .ds-dropdown-menu { + box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.2), 0 2px 3px 0 rgba(0, 0, 0, 0.1); +} + +@media (min-width: 601px) { + .algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu { + right: 0 !important; + left: inherit !important; + } + + .algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before { + right: 48px; + } + + .algolia-autocomplete .ds-dropdown-menu { + position: relative; + top: -6px; + border-radius: 4px; + margin: 6px 0 0; + padding: 0; + text-align: left; + height: auto; + position: relative; + background: transparent; + border: none; + z-index: 999; + max-width: 600px; + min-width: 500px; + } +} + +@media (max-width: 600px) { + .algolia-autocomplete .ds-dropdown-menu { + z-index: 100; + position: fixed !important; + top: 50px !important; + left: auto !important; + right: 1rem !important; + width: 600px; + max-width: calc(100% - 2rem); + max-height: calc(100% - 5rem); + display: block; + } + + .algolia-autocomplete .ds-dropdown-menu:before { + right: 6rem; + } +} + +.algolia-autocomplete .ds-dropdown-menu .ds-suggestions { + position: relative; + z-index: 1000; +} + +.algolia-autocomplete .ds-dropdown-menu .ds-suggestion { + cursor: pointer; +} + +.algolia-autocomplete .ds-dropdown-menu [class^='ds-dataset-'] { + position: relative; + border-radius: 4px; + overflow: auto; + padding: 0; + background: #ffffff; +} + +.algolia-autocomplete .ds-dropdown-menu * { + box-sizing: border-box; +} + +.algolia-autocomplete .algolia-docsearch-suggestion { + display: block; + position: relative; + padding: 0; + overflow: hidden; + text-decoration: none; +} + +.algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--wrapper { + background: #f1f1f1; + box-shadow: inset -2px 0 0 #61dafb; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--highlight { + background: #ffe564; + padding: 0.1em 0.05em; +} + +.algolia-autocomplete + .algolia-docsearch-suggestion--category-header + .algolia-docsearch-suggestion--category-header-lvl0 + .algolia-docsearch-suggestion--highlight, +.algolia-autocomplete + .algolia-docsearch-suggestion--category-header + .algolia-docsearch-suggestion--category-header-lvl1 + .algolia-docsearch-suggestion--highlight { + color: inherit; + background: inherit; +} + +.algolia-autocomplete + .algolia-docsearch-suggestion--text + .algolia-docsearch-suggestion--highlight { + padding: 0 0 1px; + background: inherit; + box-shadow: inset 0 -2px 0 0 rgba(69, 142, 225, 0.8); + color: inherit; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--content { + display: block; + float: right; + width: 70%; + position: relative; + padding: 5.33333px 0 5.33333px 10.66667px; + cursor: pointer; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--content:before { + content: ''; + position: absolute; + display: block; + top: 0; + height: 100%; + width: 1px; + background: #ececec; + left: -1px; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--category-header { + position: relative; + display: none; + font-size: 14px; + letter-spacing: 0.08em; + font-weight: 700; + background-color: #373940; + text-transform: uppercase; + color: #fff; + margin: 0; + padding: 5px 8px; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--wrapper { + background-color: #fff; + width: 100%; + float: left; + padding: 8px 0 0 0; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column { + float: left; + width: 30%; + display: none; + padding-left: 0; + text-align: right; + position: relative; + padding: 5.33333px 10.66667px; + color: #777; + font-size: 0.9em; + word-wrap: break-word; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before { + content: ''; + position: absolute; + display: block; + top: 0; + height: 100%; + width: 1px; + background: #ececec; + right: 0; +} + +.algolia-autocomplete + .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main + .algolia-docsearch-suggestion--category-header, +.algolia-autocomplete + .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary { + display: block; +} + +.algolia-autocomplete + .algolia-docsearch-suggestion--subcategory-column + .algolia-docsearch-suggestion--highlight { + background-color: inherit; + color: inherit; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline { + display: none; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--title { + margin-bottom: 4px; + color: #02060c; + font-size: 0.9em; + font-weight: bold; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--text { + display: block; + line-height: 1.2em; + font-size: 0.85em; + color: #63676d; + padding-right: 2px; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--version { + display: block; + font-size: 0.65em; + color: #a6aab1; + padding-top: 2px; + padding-right: 2px; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--no-results { + width: 100%; + padding: 8px 0; + text-align: center; + font-size: 1.2em; + background-color: #373940; + margin-top: -8px; +} + +.algolia-autocomplete + .algolia-docsearch-suggestion--no-results + .algolia-docsearch-suggestion--text { + color: #ffffff; + margin-top: 4px; +} + +.algolia-autocomplete .algolia-docsearch-suggestion--no-results::before { + display: none; +} + +.algolia-autocomplete .algolia-docsearch-suggestion code { + padding: 1px 5px; + font-size: 90%; + border: none; + color: #222222; + background-color: #ebebeb; + border-radius: 3px; + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} + +.algolia-autocomplete + .algolia-docsearch-suggestion + code + .algolia-docsearch-suggestion--highlight { + background: none; +} + +.algolia-autocomplete + .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main + .algolia-docsearch-suggestion--category-header { + color: white; + display: block; +} + +.algolia-autocomplete + .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary + .algolia-docsearch-suggestion--subcategory-column { + display: block; +} + +.algolia-autocomplete .algolia-docsearch-footer { + background-color: #fff; + width: 100%; + height: 30px; + z-index: 2000; + float: right; + font-size: 0; + line-height: 0; +} + +.algolia-autocomplete .algolia-docsearch-footer--logo { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 130 18'%3E%3Cdefs%3E%3ClinearGradient id='a' x1='-36.87%25' x2='129.43%25' y1='134.94%25' y2='-27.7%25'%3E%3Cstop stop-color='%252300AEFF' offset='0%25'/%3E%3Cstop stop-color='%25233369E7' offset='100%25'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='url(%2523a)' d='M59.4.02h13.3a2.37 2.37 0 0 1 2.38 2.37V15.6a2.37 2.37 0 0 1-2.38 2.36H59.4a2.37 2.37 0 0 1-2.38-2.36V2.38A2.37 2.37 0 0 1 59.4.02z'/%3E%3Cpath fill='%2523FFF' d='M66.26 4.56c-2.82 0-5.1 2.27-5.1 5.08 0 2.8 2.28 5.07 5.1 5.07 2.8 0 5.1-2.26 5.1-5.07 0-2.8-2.28-5.07-5.1-5.07zm0 8.65c-2 0-3.6-1.6-3.6-3.56 0-1.97 1.6-3.58 3.6-3.58 1.98 0 3.6 1.6 3.6 3.58a3.58 3.58 0 0 1-3.6 3.57zm0-6.4v2.66c0 .07.08.13.15.1l2.4-1.24c.04-.02.06-.1.03-.14a2.96 2.96 0 0 0-2.46-1.5c-.06 0-.1.05-.1.1zm-3.33-1.96l-.3-.3a.78.78 0 0 0-1.12 0l-.36.36a.77.77 0 0 0 0 1.1l.3.3c.05.05.13.04.17 0 .2-.25.4-.5.6-.7.23-.23.46-.43.7-.6.07-.04.07-.1.03-.16zm5-.8V3.4a.78.78 0 0 0-.78-.78h-1.83a.78.78 0 0 0-.78.78v.63c0 .07.06.12.14.1a5.74 5.74 0 0 1 1.58-.22c.52 0 1.04.07 1.54.2a.1.1 0 0 0 .13-.1z'/%3E%3Cpath fill='%2523182359' d='M102.16 13.76c0 1.46-.37 2.52-1.12 3.2-.75.67-1.9 1-3.44 1-.56 0-1.74-.1-2.67-.3l.34-1.7c.78.17 1.82.2 2.36.2.86 0 1.48-.16 1.84-.5.37-.36.55-.88.55-1.57v-.35a6.37 6.37 0 0 1-.84.3 4.15 4.15 0 0 1-1.2.17 4.5 4.5 0 0 1-1.6-.28 3.38 3.38 0 0 1-1.26-.82 3.74 3.74 0 0 1-.8-1.35c-.2-.54-.3-1.5-.3-2.2 0-.67.1-1.5.3-2.06a3.92 3.92 0 0 1 .9-1.43 4.12 4.12 0 0 1 1.45-.92 5.3 5.3 0 0 1 1.94-.37c.7 0 1.35.1 1.97.2a15.86 15.86 0 0 1 1.6.33v8.46zm-5.95-4.2c0 .9.2 1.88.6 2.3.4.4.9.62 1.53.62.34 0 .66-.05.96-.15a2.75 2.75 0 0 0 .73-.33V6.7a8.53 8.53 0 0 0-1.42-.17c-.76-.02-1.36.3-1.77.8-.4.5-.62 1.4-.62 2.23zm16.13 0c0 .72-.1 1.26-.32 1.85a4.4 4.4 0 0 1-.9 1.53c-.38.42-.85.75-1.4.98-.54.24-1.4.37-1.8.37-.43 0-1.27-.13-1.8-.36a4.1 4.1 0 0 1-1.4-.97 4.5 4.5 0 0 1-.92-1.52 5.04 5.04 0 0 1-.33-1.84c0-.72.1-1.4.32-2 .22-.6.53-1.1.92-1.5.4-.43.86-.75 1.4-.98a4.55 4.55 0 0 1 1.78-.34 4.7 4.7 0 0 1 1.8.34c.54.23 1 .55 1.4.97.38.42.68.92.9 1.5.23.6.35 1.3.35 2zm-2.2 0c0-.92-.2-1.7-.6-2.22-.38-.54-.94-.8-1.64-.8-.72 0-1.27.26-1.67.8-.4.54-.58 1.3-.58 2.22 0 .93.2 1.56.6 2.1.38.54.94.8 1.64.8s1.25-.26 1.65-.8c.4-.55.6-1.17.6-2.1zm6.97 4.7c-3.5.02-3.5-2.8-3.5-3.27L113.57.92l2.15-.34v10c0 .25 0 1.87 1.37 1.88v1.8zm3.77 0h-2.15v-9.2l2.15-.33v9.54zM119.8 3.74c.7 0 1.3-.58 1.3-1.3 0-.7-.58-1.3-1.3-1.3-.73 0-1.3.6-1.3 1.3 0 .72.58 1.3 1.3 1.3zm6.43 1c.7 0 1.3.1 1.78.27.5.18.88.42 1.17.73.28.3.5.74.6 1.18.13.46.2.95.2 1.5v5.47a25.24 25.24 0 0 1-1.5.25c-.67.1-1.42.15-2.25.15a6.83 6.83 0 0 1-1.52-.16 3.2 3.2 0 0 1-1.18-.5 2.46 2.46 0 0 1-.76-.9c-.18-.37-.27-.9-.27-1.44 0-.52.1-.85.3-1.2.2-.37.48-.67.83-.9a3.6 3.6 0 0 1 1.23-.5 7.07 7.07 0 0 1 2.2-.1l.83.16v-.35c0-.25-.03-.48-.1-.7a1.5 1.5 0 0 0-.3-.58c-.15-.18-.34-.3-.58-.4a2.54 2.54 0 0 0-.92-.17c-.5 0-.94.06-1.35.13-.4.08-.75.16-1 .25l-.27-1.74c.27-.1.67-.18 1.2-.28a9.34 9.34 0 0 1 1.65-.14zm.18 7.74c.66 0 1.15-.04 1.5-.1V10.2a5.1 5.1 0 0 0-2-.1c-.23.03-.45.1-.64.2a1.17 1.17 0 0 0-.47.38c-.13.17-.18.26-.18.52 0 .5.17.8.5.98.32.2.74.3 1.3.3zM84.1 4.8c.72 0 1.3.08 1.8.26.48.17.87.42 1.15.73.3.3.5.72.6 1.17.14.45.2.94.2 1.47v5.48a25.24 25.24 0 0 1-1.5.26c-.67.1-1.42.14-2.25.14a6.83 6.83 0 0 1-1.52-.16 3.2 3.2 0 0 1-1.18-.5 2.46 2.46 0 0 1-.76-.9c-.18-.38-.27-.9-.27-1.44 0-.53.1-.86.3-1.22.2-.36.5-.65.84-.88a3.6 3.6 0 0 1 1.24-.5 7.07 7.07 0 0 1 2.2-.1c.26.03.54.08.84.15v-.35c0-.24-.03-.48-.1-.7a1.5 1.5 0 0 0-.3-.58c-.15-.17-.34-.3-.58-.4a2.54 2.54 0 0 0-.9-.15c-.5 0-.96.05-1.37.12-.4.07-.75.15-1 .24l-.26-1.75c.27-.08.67-.17 1.18-.26a8.9 8.9 0 0 1 1.66-.15zm.2 7.73c.65 0 1.14-.04 1.48-.1v-2.17a5.1 5.1 0 0 0-1.98-.1c-.24.03-.46.1-.65.18a1.17 1.17 0 0 0-.47.4c-.12.17-.17.26-.17.52 0 .5.18.8.5.98.32.2.75.3 1.3.3zm8.68 1.74c-3.5 0-3.5-2.82-3.5-3.28L89.45.92 91.6.6v10c0 .25 0 1.87 1.38 1.88v1.8z'/%3E%3Cpath fill='%25231D3657' d='M5.03 11.03c0 .7-.26 1.24-.76 1.64-.5.4-1.2.6-2.1.6-.88 0-1.6-.14-2.17-.42v-1.2c.36.16.74.3 1.14.38.4.1.78.15 1.13.15.5 0 .88-.1 1.12-.3a.94.94 0 0 0 .35-.77.98.98 0 0 0-.33-.74c-.22-.2-.68-.44-1.37-.72-.72-.3-1.22-.62-1.52-1C.23 8.27.1 7.82.1 7.3c0-.65.22-1.17.7-1.55.46-.37 1.08-.56 1.86-.56.76 0 1.5.16 2.25.48l-.4 1.05c-.7-.3-1.32-.44-1.87-.44-.4 0-.73.08-.94.26a.9.9 0 0 0-.33.72c0 .2.04.38.12.52.08.15.22.3.42.4.2.14.55.3 1.06.52.58.24 1 .47 1.27.67.27.2.47.44.6.7.12.26.18.57.18.92zM9 13.27c-.92 0-1.64-.27-2.16-.8-.52-.55-.78-1.3-.78-2.24 0-.97.24-1.73.72-2.3.5-.54 1.15-.82 2-.82.78 0 1.4.25 1.85.72.46.48.7 1.14.7 1.97v.67H7.35c0 .58.17 1.02.46 1.33.3.3.7.47 1.24.47.36 0 .68-.04.98-.1a5.1 5.1 0 0 0 .98-.33v1.02a3.87 3.87 0 0 1-.94.32 5.72 5.72 0 0 1-1.08.1zm-.22-5.2c-.4 0-.73.12-.97.38s-.37.62-.42 1.1h2.7c0-.48-.13-.85-.36-1.1-.23-.26-.54-.38-.94-.38zm7.7 5.1l-.26-.84h-.05c-.28.36-.57.6-.86.74-.28.13-.65.2-1.1.2-.6 0-1.05-.16-1.38-.48-.32-.32-.5-.77-.5-1.34 0-.62.24-1.08.7-1.4.45-.3 1.14-.47 2.07-.5l1.02-.03V9.2c0-.37-.1-.65-.27-.84-.17-.2-.45-.28-.82-.28-.3 0-.6.04-.88.13a6.68 6.68 0 0 0-.8.33l-.4-.9a4.4 4.4 0 0 1 1.05-.4 4.86 4.86 0 0 1 1.08-.12c.76 0 1.33.18 1.7.5.4.33.6.85.6 1.56v4h-.9zm-1.9-.87c.47 0 .83-.13 1.1-.38.3-.26.43-.62.43-1.08v-.52l-.76.03c-.6.03-1.02.13-1.3.3s-.4.45-.4.82c0 .26.08.47.24.6.16.16.4.23.7.23zm7.57-5.2c.25 0 .46.03.62.06l-.12 1.18a2.38 2.38 0 0 0-.56-.06c-.5 0-.92.16-1.24.5-.3.32-.47.75-.47 1.27v3.1h-1.27V7.23h1l.16 1.05h.05c.2-.36.45-.64.77-.85a1.83 1.83 0 0 1 1.02-.3zm4.12 6.17c-.9 0-1.58-.27-2.05-.8-.47-.52-.7-1.27-.7-2.25 0-1 .24-1.77.73-2.3.5-.54 1.2-.8 2.12-.8.63 0 1.2.1 1.7.34l-.4 1c-.52-.2-.96-.3-1.3-.3-1.04 0-1.55.68-1.55 2.05 0 .67.13 1.17.38 1.5.26.34.64.5 1.13.5a3.23 3.23 0 0 0 1.6-.4v1.1a2.53 2.53 0 0 1-.73.28 4.36 4.36 0 0 1-.93.08zm8.28-.1h-1.27V9.5c0-.45-.1-.8-.28-1.02-.18-.23-.47-.34-.88-.34-.53 0-.9.16-1.16.48-.25.3-.38.85-.38 1.6v2.94h-1.26V4.8h1.26v2.12c0 .34-.02.7-.06 1.1h.08a1.76 1.76 0 0 1 .72-.67c.3-.16.66-.24 1.07-.24 1.43 0 2.15.74 2.15 2.2v3.86zM42.2 7.1c.74 0 1.32.28 1.73.82.4.53.62 1.3.62 2.26 0 .97-.2 1.73-.63 2.27-.42.54-1 .82-1.75.82s-1.33-.27-1.75-.8h-.08l-.23.7h-.94V4.8h1.26v2l-.02.64-.03.56h.05c.4-.6 1-.9 1.78-.9zm-.33 1.04c-.5 0-.88.15-1.1.45-.22.3-.34.8-.35 1.5v.08c0 .72.12 1.24.35 1.57.23.32.6.48 1.12.48.44 0 .78-.17 1-.53.24-.35.36-.87.36-1.53 0-1.35-.47-2.03-1.4-2.03zm3.24-.92h1.4l1.2 3.37c.18.47.3.92.36 1.34h.04l.18-.72 1.37-4H51l-2.53 6.73c-.46 1.23-1.23 1.85-2.3 1.85-.3 0-.56-.03-.83-.1v-1c.2.05.4.08.65.08.6 0 1.03-.36 1.28-1.06l.22-.56-2.4-5.94z'/%3E%3C/g%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: center; + background-size: 100%; + overflow: hidden; + text-indent: -9000px; + width: 110px; + height: 100%; + display: block; + margin-left: auto; + margin-right: 5px; +} + +html[data-theme='dark'] .algolia-docsearch-suggestion--category-header, +html[data-theme='dark'] .algolia-docsearch-suggestion--wrapper, +html[data-theme='dark'] .algolia-docsearch-footer { + background: var(--ifm-background-color) !important; + color: var(--ifm-font-color-base) !important; +} + +html[data-theme='dark'] .algolia-docsearch-suggestion--title { + color: var(--ifm-font-color-base) !important; +} + +html[data-theme='dark'] .ds-cursor .algolia-docsearch-suggestion--wrapper { + background: var(--ifm-background-surface-color) !important; +} + +mark{ + background-color: lightblue; +} diff --git a/old/src/theme/SearchBar/index.jsx b/old/src/theme/SearchBar/index.jsx new file mode 100644 index 0000000..acefa77 --- /dev/null +++ b/old/src/theme/SearchBar/index.jsx @@ -0,0 +1,165 @@ +import { useRef, useCallback, useState, useEffect } from "react"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { HighlightSearchResults } from "./HighlightSearchResults"; +import { usePluginData } from "@docusaurus/useGlobalData"; +import useIsBrowser from "@docusaurus/useIsBrowser"; +import { useHistory } from "@docusaurus/router"; +import clsx from "clsx"; + +const Search = (props) => { + const initialized = useRef(false); + const searchBarRef = useRef(null); + const [indexReady, setIndexReady] = useState(false); + const history = useHistory(); + const { siteConfig = {} } = useDocusaurusContext(); + const pluginConfig = (siteConfig.plugins || []).find( + (plugin) => + Array.isArray(plugin) && + typeof plugin[0] === "string" && + plugin[0].includes("docusaurus-lunr-search") + ); + const isBrowser = useIsBrowser(); + const { baseUrl } = siteConfig; + const assetUrl = (pluginConfig && pluginConfig[1]?.assetUrl) || baseUrl; + + const initAlgolia = (searchDocs, searchIndex, DocSearch, options) => { + new DocSearch({ + searchDocs, + searchIndex, + baseUrl, + inputSelector: "#search_input_react", + // Override algolia's default selection event, allowing us to do client-side + // navigation and avoiding a full page refresh. + handleSelected: (_input, _event, suggestion) => { + const url = suggestion.url || "/"; + // Use an anchor tag to parse the absolute url into a relative url + // Alternatively, we can use new URL(suggestion.url) but its not supported in IE + const a = document.createElement("a"); + a.href = url; + _input.setVal(""); // clear value + _event.target.blur(); // remove focus + + // Get the highlight word from the suggestion. + let wordToHighlight = ""; + if (options.highlightResult) { + try { + const matchedLine = + suggestion.text || suggestion.subcategory || suggestion.title; + const matchedWordResult = matchedLine.match( + new RegExp("<span.+span>\\w*", "g") + ); + if (matchedWordResult && matchedWordResult.length > 0) { + const tempDoc = document.createElement("div"); + tempDoc.innerHTML = matchedWordResult[0]; + wordToHighlight = tempDoc.textContent; + } + } catch (e) { + console.log(e); + } + } + + history.push(url, { + highlightState: { wordToHighlight }, + }); + }, + maxHits: options.maxHits, + }); + }; + + const pluginData = usePluginData("docusaurus-lunr-search"); + + const getSearchDoc = () => + process.env.NODE_ENV === "production" + ? fetch(`${assetUrl}${pluginData.fileNames.searchDoc}`).then((content) => + content.json() + ) + : Promise.resolve({}); + + const getLunrIndex = () => + process.env.NODE_ENV === "production" + ? fetch(`${assetUrl}${pluginData.fileNames.lunrIndex}`).then((content) => + content.json() + ) + : Promise.resolve([]); + + const loadAlgolia = () => { + if (!initialized.current) { + Promise.all([ + getSearchDoc(), + getLunrIndex(), + import("./DocSearch"), + import("./algolia.css"), + ]).then(([searchDocFile, searchIndex, { default: DocSearch }]) => { + const { searchDocs, options } = searchDocFile; + if (!searchDocs || searchDocs.length === 0) { + return; + } + initAlgolia(searchDocs, searchIndex, DocSearch, options); + setIndexReady(true); + }); + initialized.current = true; + } + }; + + const toggleSearchIconClick = useCallback( + (e) => { + if (!searchBarRef.current.contains(e.target)) { + searchBarRef.current.focus(); + } + + props.handleSearchBarToggle && + props.handleSearchBarToggle(!props.isSearchBarExpanded); + }, + [props.isSearchBarExpanded] + ); + + let placeholder; + if (isBrowser) { + loadAlgolia(); + placeholder = window.navigator.platform.startsWith("Mac") + ? "Rechercher ⌘+K" + : "Rechercher Ctrl+K"; + } + + // auto focus search bar on page load + useEffect(() => { + if (props.autoFocus && indexReady) { + searchBarRef.current.focus(); + } + }, [indexReady]); + + return ( + <div className="navbar__search" key="search-box"> + <span + aria-label="Aggrandir la barre de recherche" + role="button" + className={clsx("search-icon", { + "search-icon-hidden": props.isSearchBarExpanded, + })} + onClick={toggleSearchIconClick} + onKeyDown={toggleSearchIconClick} + tabIndex={0} + /> + <input + id="search_input_react" + type="search" + placeholder={indexReady ? placeholder : "Chargement..."} + aria-label="Rechercher" + className={clsx( + "navbar__search-input", + { "search-bar-expanded": props.isSearchBarExpanded }, + { "search-bar": !props.isSearchBarExpanded } + )} + onClick={loadAlgolia} + onMouseOver={loadAlgolia} + onFocus={toggleSearchIconClick} + onBlur={toggleSearchIconClick} + ref={searchBarRef} + disabled={!indexReady} + /> + <HighlightSearchResults /> + </div> + ); +}; + +export default Search; diff --git a/old/src/theme/SearchBar/lunar-search.js b/old/src/theme/SearchBar/lunar-search.js new file mode 100644 index 0000000..2419309 --- /dev/null +++ b/old/src/theme/SearchBar/lunar-search.js @@ -0,0 +1,156 @@ +/* +Aloglia DocSearch Adapter for Lunr.js +==================================== +Written by: Praveen N +github: praveenn77 +*/ + +import lunr from "@generated/lunr.client"; +lunr.tokenizer.separator = /[\s\-/]+/; + +class LunrSearchAdapter { + constructor(searchDocs, searchIndex, baseUrl = '/', maxHits) { + this.searchDocs = searchDocs; + this.lunrIndex = lunr.Index.load(searchIndex); + this.baseUrl = baseUrl; + this.maxHits = maxHits; + } + + getLunrResult(input) { + return this.lunrIndex.query(function (query) { + const tokens = lunr.tokenizer(input); + query.term(tokens, { + boost: 10 + }); + query.term(tokens, { + wildcard: lunr.Query.wildcard.TRAILING + }); + }); + } + + getHit(doc, formattedTitle, formattedContent) { + return { + hierarchy: { + lvl0: doc.pageTitle || doc.title, + lvl1: doc.type === 0 ? null : doc.title + }, + url: doc.url, + version: doc.version, + _snippetResult: formattedContent ? { + content: { + value: formattedContent, + matchLevel: "full" + } + } : null, + _highlightResult: { + hierarchy: { + lvl0: { + value: doc.type === 0 ? formattedTitle || doc.title : doc.pageTitle, + }, + lvl1: + doc.type === 0 + ? null + : { + value: formattedTitle || doc.title + } + } + } + }; + } + getTitleHit(doc, position, length) { + const start = position[0]; + const end = position[0] + length; + let formattedTitle = doc.title.substring(0, start) + '<span class="algolia-docsearch-suggestion--highlight">' + doc.title.substring(start, end) + '</span>' + doc.title.substring(end, doc.title.length); + return this.getHit(doc, formattedTitle) + } + + getKeywordHit(doc, position, length) { + const start = position[0]; + const end = position[0] + length; + let formattedTitle = doc.title + '<br /><i>Keywords: ' + doc.keywords.substring(0, start) + '<span class="algolia-docsearch-suggestion--highlight">' + doc.keywords.substring(start, end) + '</span>' + doc.keywords.substring(end, doc.keywords.length) + '</i>' + return this.getHit(doc, formattedTitle) + } + + getContentHit(doc, position) { + const start = position[0]; + const end = position[0] + position[1]; + let previewStart = start; + let previewEnd = end; + let ellipsesBefore = true; + let ellipsesAfter = true; + for (let k = 0; k < 3; k++) { + const nextSpace = doc.content.lastIndexOf(' ', previewStart - 2); + const nextDot = doc.content.lastIndexOf('.', previewStart - 2); + if ((nextDot > 0) && (nextDot > nextSpace)) { + previewStart = nextDot + 1; + ellipsesBefore = false; + break; + } + if (nextSpace < 0) { + previewStart = 0; + ellipsesBefore = false; + break; + } + previewStart = nextSpace + 1; + } + for (let k = 0; k < 10; k++) { + const nextSpace = doc.content.indexOf(' ', previewEnd + 1); + const nextDot = doc.content.indexOf('.', previewEnd + 1); + if ((nextDot > 0) && (nextDot < nextSpace)) { + previewEnd = nextDot; + ellipsesAfter = false; + break; + } + if (nextSpace < 0) { + previewEnd = doc.content.length; + ellipsesAfter = false; + break; + } + previewEnd = nextSpace; + } + let preview = doc.content.substring(previewStart, start); + if (ellipsesBefore) { + preview = '... ' + preview; + } + preview += '<span class="algolia-docsearch-suggestion--highlight">' + doc.content.substring(start, end) + '</span>'; + preview += doc.content.substring(end, previewEnd); + if (ellipsesAfter) { + preview += ' ...'; + } + return this.getHit(doc, null, preview); + + } + search(input) { + return new Promise((resolve, rej) => { + const results = this.getLunrResult(input); + const hits = []; + results.length > this.maxHits && (results.length = this.maxHits); + this.titleHitsRes = [] + this.contentHitsRes = [] + results.forEach(result => { + const doc = this.searchDocs[result.ref]; + const { metadata } = result.matchData; + for (let i in metadata) { + if (metadata[i].title) { + if (!this.titleHitsRes.includes(result.ref)) { + const position = metadata[i].title.position[0] + hits.push(this.getTitleHit(doc, position, input.length)); + this.titleHitsRes.push(result.ref); + } + } else if (metadata[i].content) { + const position = metadata[i].content.position[0] + hits.push(this.getContentHit(doc, position)) + } else if (metadata[i].keywords) { + const position = metadata[i].keywords.position[0] + hits.push(this.getKeywordHit(doc, position, input.length)); + this.titleHitsRes.push(result.ref); + } + } + }); + hits.length > this.maxHits && (hits.length = this.maxHits); + resolve(hits); + }); + } +} + +export default LunrSearchAdapter; diff --git a/old/src/theme/SearchBar/styles.css b/old/src/theme/SearchBar/styles.css new file mode 100644 index 0000000..047517e --- /dev/null +++ b/old/src/theme/SearchBar/styles.css @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2017-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +.search-icon { + background-image: var(--ifm-navbar-search-input-icon); + height: auto; + width: 24px; + cursor: pointer; + padding: 8px; + line-height: 32px; + background-repeat: no-repeat; + background-position: center; + display: none; +} + +.search-icon-hidden { + visibility: hidden; +} + +@media (max-width: 360px) { + .search-bar { + width: 0 !important; + background: none !important; + padding: 0 !important; + transition: none !important; + } + + .search-bar-expanded { + width: 9rem !important; + } + + .search-icon { + display: inline; + vertical-align: sub; + } +} diff --git a/old/src/theme/SearchBar/templates.js b/old/src/theme/SearchBar/templates.js new file mode 100644 index 0000000..5a61f1a --- /dev/null +++ b/old/src/theme/SearchBar/templates.js @@ -0,0 +1,115 @@ +const prefix = "algolia-docsearch"; +const suggestionPrefix = `${prefix}-suggestion`; +const footerPrefix = `${prefix}-footer`; + +/* eslint-disable max-len */ + +const templates = { + suggestion: ` + <a class="${suggestionPrefix} + {{#isCategoryHeader}}${suggestionPrefix}__main{{/isCategoryHeader}} + {{#isSubCategoryHeader}}${suggestionPrefix}__secondary{{/isSubCategoryHeader}} + " + aria-label="Lien vers le résultat" + href="{{{url}}}" + > + <div class="${suggestionPrefix}--category-header"> + <span class="${suggestionPrefix}--category-header-lvl0">{{{category}}}</span> + </div> + <div class="${suggestionPrefix}--wrapper"> + <div class="${suggestionPrefix}--subcategory-column"> + <span class="${suggestionPrefix}--subcategory-column-text">{{{subcategory}}}</span> + </div> + {{#isTextOrSubcategoryNonEmpty}} + <div class="${suggestionPrefix}--content"> + <div class="${suggestionPrefix}--subcategory-inline">{{{subcategory}}}</div> + <div class="${suggestionPrefix}--title">{{{title}}}</div> + {{#text}}<div class="${suggestionPrefix}--text">{{{text}}}</div>{{/text}} + {{#version}}<div class="${suggestionPrefix}--version">{{version}}</div>{{/version}} + </div> + {{/isTextOrSubcategoryNonEmpty}} + </div> + </a> + `, + suggestionSimple: ` + <div class="${suggestionPrefix} + {{#isCategoryHeader}}${suggestionPrefix}__main{{/isCategoryHeader}} + {{#isSubCategoryHeader}}${suggestionPrefix}__secondary{{/isSubCategoryHeader}} + suggestion-layout-simple + "> + <div class="${suggestionPrefix}--category-header"> + {{^isLvl0}} + <span class="${suggestionPrefix}--category-header-lvl0 ${suggestionPrefix}--category-header-item">{{{category}}}</span> + {{^isLvl1}} + {{^isLvl1EmptyOrDuplicate}} + <span class="${suggestionPrefix}--category-header-lvl1 ${suggestionPrefix}--category-header-item"> + {{{subcategory}}} + </span> + {{/isLvl1EmptyOrDuplicate}} + {{/isLvl1}} + {{/isLvl0}} + <div class="${suggestionPrefix}--title ${suggestionPrefix}--category-header-item"> + {{#isLvl2}} + {{{title}}} + {{/isLvl2}} + {{#isLvl1}} + {{{subcategory}}} + {{/isLvl1}} + {{#isLvl0}} + {{{category}}} + {{/isLvl0}} + </div> + </div> + <div class="${suggestionPrefix}--wrapper"> + {{#text}} + <div class="${suggestionPrefix}--content"> + <div class="${suggestionPrefix}--text">{{{text}}}</div> + </div> + {{/text}} + </div> + </div> + `, + footer: ` + <div class="${footerPrefix}"> + </div> + `, + empty: ` + <div class="${suggestionPrefix}"> + <div class="${suggestionPrefix}--wrapper"> + <div class="${suggestionPrefix}--content ${suggestionPrefix}--no-results"> + <div class="${suggestionPrefix}--title"> + <div class="${suggestionPrefix}--text"> + Aucun résultats pour la recherche <b>"{{query}}"</b> + </div> + </div> + </div> + </div> + </div> + `, + searchBox: ` + <form novalidate="novalidate" onsubmit="return false;" class="searchbox"> + <div role="search" class="searchbox__wrapper"> + <input id="docsearch" type="search" name="search" placeholder="Recherche dans la documentation" autocomplete="off" required="required" class="searchbox__input"/> + <button type="submit" title="Lancer la recherche" class="searchbox__submit" > + <svg width=12 height=12 role="img" aria-label="Recherche"> + <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sbx-icon-search-13"></use> + </svg> + </button> + <button type="reset" title="Réinitialiser la recherche" class="searchbox__reset hide"> + <svg width=12 height=12 role="img" aria-label="Reset"> + <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sbx-icon-clear-3"></use> + </svg> + </button> + </div> +</form> + +<div class="svg-icons" style="height: 0; width: 0; position: absolute; visibility: hidden"> + <svg xmlns="http://www.w3.org/2000/svg"> + <symbol id="sbx-icon-clear-3" viewBox="0 0 40 40"><path d="M16.228 20L1.886 5.657 0 3.772 3.772 0l1.885 1.886L20 16.228 34.343 1.886 36.228 0 40 3.772l-1.886 1.885L23.772 20l14.342 14.343L40 36.228 36.228 40l-1.885-1.886L20 23.772 5.657 38.114 3.772 40 0 36.228l1.886-1.885L16.228 20z" fill-rule="evenodd"></symbol> + <symbol id="sbx-icon-search-13" viewBox="0 0 40 40"><path d="M26.806 29.012a16.312 16.312 0 0 1-10.427 3.746C7.332 32.758 0 25.425 0 16.378 0 7.334 7.333 0 16.38 0c9.045 0 16.378 7.333 16.378 16.38 0 3.96-1.406 7.593-3.746 10.426L39.547 37.34c.607.608.61 1.59-.004 2.203a1.56 1.56 0 0 1-2.202.004L26.807 29.012zm-10.427.627c7.322 0 13.26-5.938 13.26-13.26 0-7.324-5.938-13.26-13.26-13.26-7.324 0-13.26 5.936-13.26 13.26 0 7.322 5.936 13.26 13.26 13.26z" fill-rule="evenodd"></symbol> + </svg> +</div> + `, +}; + +export default templates; diff --git a/old/src/theme/SearchBar/utils.js b/old/src/theme/SearchBar/utils.js new file mode 100644 index 0000000..0807500 --- /dev/null +++ b/old/src/theme/SearchBar/utils.js @@ -0,0 +1,270 @@ +import $ from "autocomplete.js/zepto"; + +const utils = { + /* + * Move the content of an object key one level higher. + * eg. + * { + * name: 'My name', + * hierarchy: { + * lvl0: 'Foo', + * lvl1: 'Bar' + * } + * } + * Will be converted to + * { + * name: 'My name', + * lvl0: 'Foo', + * lvl1: 'Bar' + * } + * @param {Object} object Main object + * @param {String} property Main object key to move up + * @return {Object} + * @throws Error when key is not an attribute of Object or is not an object itself + */ + mergeKeyWithParent(object, property) { + if (object[property] === undefined) { + return object; + } + if (typeof object[property] !== 'object') { + return object; + } + const newObject = $.extend({}, object, object[property]); + delete newObject[property]; + return newObject; + }, + /* + * Group all objects of a collection by the value of the specified attribute + * If the attribute is a string, use the lowercase form. + * + * eg. + * groupBy([ + * {name: 'Tim', category: 'dev'}, + * {name: 'Vincent', category: 'dev'}, + * {name: 'Ben', category: 'sales'}, + * {name: 'Jeremy', category: 'sales'}, + * {name: 'AlexS', category: 'dev'}, + * {name: 'AlexK', category: 'sales'} + * ], 'category'); + * => + * { + * 'devs': [ + * {name: 'Tim', category: 'dev'}, + * {name: 'Vincent', category: 'dev'}, + * {name: 'AlexS', category: 'dev'} + * ], + * 'sales': [ + * {name: 'Ben', category: 'sales'}, + * {name: 'Jeremy', category: 'sales'}, + * {name: 'AlexK', category: 'sales'} + * ] + * } + * @param {array} collection Array of objects to group + * @param {String} property The attribute on which apply the grouping + * @return {array} + * @throws Error when one of the element does not have the specified property + */ + groupBy(collection, property) { + const newCollection = {}; + $.each(collection, (index, item) => { + if (item[property] === undefined) { + throw new Error(`[groupBy]: Object has no key ${property}`); + } + let key = item[property]; + if (typeof key === 'string') { + key = key.toLowerCase(); + } + // fix #171 the given data type of docsearch hits might be conflict with the properties of the native Object, + // such as the constructor, so we need to do this check. + if (!Object.prototype.hasOwnProperty.call(newCollection, key)) { + newCollection[key] = []; + } + newCollection[key].push(item); + }); + return newCollection; + }, + /* + * Return an array of all the values of the specified object + * eg. + * values({ + * foo: 42, + * bar: true, + * baz: 'yep' + * }) + * => + * [42, true, yep] + * @param {object} object Object to extract values from + * @return {array} + */ + values(object) { + return Object.keys(object).map(key => object[key]); + }, + /* + * Flattens an array + * eg. + * flatten([1, 2, [3, 4], [5, 6]]) + * => + * [1, 2, 3, 4, 5, 6] + * @param {array} array Array to flatten + * @return {array} + */ + flatten(array) { + const results = []; + array.forEach(value => { + if (!Array.isArray(value)) { + results.push(value); + return; + } + value.forEach(subvalue => { + results.push(subvalue); + }); + }); + return results; + }, + /* + * Flatten all values of an object into an array, marking each first element of + * each group with a specific flag + * eg. + * flattenAndFlagFirst({ + * 'devs': [ + * {name: 'Tim', category: 'dev'}, + * {name: 'Vincent', category: 'dev'}, + * {name: 'AlexS', category: 'dev'} + * ], + * 'sales': [ + * {name: 'Ben', category: 'sales'}, + * {name: 'Jeremy', category: 'sales'}, + * {name: 'AlexK', category: 'sales'} + * ] + * , 'isTop'); + * => + * [ + * {name: 'Tim', category: 'dev', isTop: true}, + * {name: 'Vincent', category: 'dev', isTop: false}, + * {name: 'AlexS', category: 'dev', isTop: false}, + * {name: 'Ben', category: 'sales', isTop: true}, + * {name: 'Jeremy', category: 'sales', isTop: false}, + * {name: 'AlexK', category: 'sales', isTop: false} + * ] + * @param {object} object Object to flatten + * @param {string} flag Flag to set to true on first element of each group + * @return {array} + */ + flattenAndFlagFirst(object, flag) { + const values = this.values(object).map(collection => + collection.map((item, index) => { + // eslint-disable-next-line no-param-reassign + item[flag] = index === 0; + return item; + }) + ); + return this.flatten(values); + }, + /* + * Removes all empty strings, null, false and undefined elements array + * eg. + * compact([42, false, null, undefined, '', [], 'foo']); + * => + * [42, [], 'foo'] + * @param {array} array Array to compact + * @return {array} + */ + compact(array) { + const results = []; + array.forEach(value => { + if (!value) { + return; + } + results.push(value); + }); + return results; + }, + /* + * Returns the highlighted value of the specified key in the specified object. + * If no highlighted value is available, will return the key value directly + * eg. + * getHighlightedValue({ + * _highlightResult: { + * text: { + * value: '<mark>foo</mark>' + * } + * }, + * text: 'foo' + * }, 'text'); + * => + * '<mark>foo</mark>' + * @param {object} object Hit object returned by the Algolia API + * @param {string} property Object key to look for + * @return {string} + **/ + getHighlightedValue(object, property) { + if ( + object._highlightResult && + object._highlightResult.hierarchy_camel && + object._highlightResult.hierarchy_camel[property] && + object._highlightResult.hierarchy_camel[property].matchLevel && + object._highlightResult.hierarchy_camel[property].matchLevel !== 'none' && + object._highlightResult.hierarchy_camel[property].value + ) { + return object._highlightResult.hierarchy_camel[property].value; + } + if ( + object._highlightResult && + object._highlightResult && + object._highlightResult[property] && + object._highlightResult[property].value + ) { + return object._highlightResult[property].value; + } + return object[property]; + }, + /* + * Returns the snippeted value of the specified key in the specified object. + * If no highlighted value is available, will return the key value directly. + * Will add starting and ending ellipsis (…) if we detect that a sentence is + * incomplete + * eg. + * getSnippetedValue({ + * _snippetResult: { + * text: { + * value: '<mark>This is an unfinished sentence</mark>' + * } + * }, + * text: 'This is an unfinished sentence' + * }, 'text'); + * => + * '<mark>This is an unfinished sentence</mark>…' + * @param {object} object Hit object returned by the Algolia API + * @param {string} property Object key to look for + * @return {string} + **/ + getSnippetedValue(object, property) { + if ( + !object._snippetResult || + !object._snippetResult[property] || + !object._snippetResult[property].value + ) { + return object[property]; + } + let snippet = object._snippetResult[property].value; + + if (snippet[0] !== snippet[0].toUpperCase()) { + snippet = `…${snippet}`; + } + if (['.', '!', '?'].indexOf(snippet[snippet.length - 1]) === -1) { + snippet = `${snippet}…`; + } + return snippet; + }, + /* + * Deep clone an object. + * Note: This will not clone functions and dates + * @param {object} object Object to clone + * @return {object} + */ + deepClone(object) { + return JSON.parse(JSON.stringify(object)); + }, +}; + +export default utils; diff --git a/old/src/theme/Tabs/index.tsx b/old/src/theme/Tabs/index.tsx new file mode 100644 index 0000000..bf760fe --- /dev/null +++ b/old/src/theme/Tabs/index.tsx @@ -0,0 +1,188 @@ +import type { TabItemProps } from "@docusaurus/theme-common/internal"; +import type { ReactElement } from "react"; +import type { Props } from "@theme/Tabs"; + +import { + useScrollPositionBlocker, + sanitizeTabsChildren, + useTabs, +} from "@docusaurus/theme-common/internal"; + +import useIsBrowser from "@docusaurus/useIsBrowser"; +import { cloneElement, useRef } from "react"; +import styles from "./styles.module.css"; +import clsx from "clsx"; + +const TabList = ({ + className, + block, + selectedValue, + selectValue, + tabValues, +}: Props & ReturnType<typeof useTabs>) => { + const tabsHolderRef = useRef<HTMLDivElement | null>(null); + const tabRefs: (HTMLLIElement | null)[] = []; + const { blockElementScrollPositionUntilNextRender } = + useScrollPositionBlocker(); + + const scrollIntoTab = (tab: HTMLLIElement) => { + const tabsHolder = tabsHolderRef.current; + if (!tabsHolder) return; + + const { offsetLeft, offsetWidth } = tab; + + const tabLeft = offsetLeft - tabsHolder.offsetLeft; + const scrollLeft = tabsHolder.scrollLeft; + + const tabRight = tabLeft + offsetWidth; + const scrollRight = scrollLeft + tabsHolder.offsetWidth; + + const paddingWidth = 16; + const spaceBetweenTabs = 8; + + const scrollOptions = { + left: tabLeft + paddingWidth - spaceBetweenTabs, + right: + tabRight - tabsHolder.offsetWidth + paddingWidth + spaceBetweenTabs, + }; + + if (tabLeft < scrollLeft || tabRight > scrollRight) { + tabsHolder.scrollTo({ + left: tabLeft < scrollLeft ? scrollOptions.left : scrollOptions.right, + behavior: "smooth", + }); + } + }; + + const handleTabChange = ( + event: + | React.FocusEvent<HTMLLIElement> + | React.MouseEvent<HTMLLIElement> + | React.KeyboardEvent<HTMLLIElement> + ) => { + const newTab = event.currentTarget; + const newTabIndex = tabRefs.indexOf(newTab); + const newTabValue = tabValues[newTabIndex]!.value; + + if (newTabValue !== selectedValue) { + blockElementScrollPositionUntilNextRender(newTab); + selectValue(newTabValue); + scrollIntoTab(newTab); + } + }; + + const handleKeydown = (event: React.KeyboardEvent<HTMLLIElement>) => { + let focusElement: HTMLLIElement | null = null; + + switch (event.key) { + case "Enter": { + handleTabChange(event); + break; + } + case "ArrowRight": { + const nextTab = tabRefs.indexOf(event.currentTarget) + 1; + focusElement = tabRefs[nextTab] ?? tabRefs[0]!; + break; + } + case "ArrowLeft": { + const prevTab = tabRefs.indexOf(event.currentTarget) - 1; + focusElement = tabRefs[prevTab] ?? tabRefs[tabRefs.length - 1]!; + break; + } + default: + break; + } + + focusElement?.focus(); + }; + + return ( + <div + className="tabs-holder -mb-4 max-w-full overflow-auto" + ref={tabsHolderRef} + > + <ul + role="tablist" + aria-orientation="horizontal" + className={clsx("w-max tabs", { "tabs--block": block }, className)} + > + {tabValues.map(({ value, label, attributes }) => ( + <li + role="tab" + tabIndex={selectedValue === value ? 0 : -1} + aria-selected={selectedValue === value} + key={value} + ref={(tabControl) => tabRefs.push(tabControl)} + onKeyDown={handleKeydown} + onClick={handleTabChange} + {...attributes} + className={clsx( + "tabs__item", + styles.tabItem, + attributes?.className as string, + { "tabs__item--active": selectedValue === value } + )} + > + {label ?? value} + </li> + ))} + </ul> + </div> + ); +}; + +const TabContent = ({ + lazy, + children, + selectedValue, +}: Props & ReturnType<typeof useTabs>) => { + const childTabs = (Array.isArray(children) ? children : [children]).filter( + Boolean + ) as ReactElement<TabItemProps>[]; + if (lazy) { + const selectedTabItem = childTabs.find( + (tabItem) => tabItem.props.value === selectedValue + ); + if (!selectedTabItem) { + // fail-safe or fail-fast? not sure what's best here + return null; + } + return cloneElement(selectedTabItem, { className: "margin-top--md" }); + } + return ( + <div className="tab-content"> + {childTabs.map((tabItem, i) => + cloneElement(tabItem, { + key: i, + hidden: tabItem.props.value !== selectedValue, + }) + )} + </div> + ); +}; + +const TabsComponent = (props: Props): JSX.Element => { + const tabs = useTabs(props); + return ( + <div className={clsx("tabs-container", styles.tabList)}> + <TabList {...tabs} {...props} /> + <TabContent {...tabs} {...props} /> + </div> + ); +}; + +const Tabs = (props: Props): JSX.Element => { + const isBrowser = useIsBrowser(); + return ( + <TabsComponent + // Remount tabs after hydration + // Temporary fix for https://github.com/facebook/docusaurus/issues/5653 + key={String(isBrowser)} + {...props} + > + {sanitizeTabsChildren(props.children)} + </TabsComponent> + ); +}; + +export default Tabs; diff --git a/old/src/theme/Tabs/styles.module.css b/old/src/theme/Tabs/styles.module.css new file mode 100644 index 0000000..6d264fa --- /dev/null +++ b/old/src/theme/Tabs/styles.module.css @@ -0,0 +1,14 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +.tabList { + margin-bottom: var(--ifm-leading); +} + +.tabItem { + margin-top: 0 !important; +} diff --git a/old/src/theme/Tag/index.tsx b/old/src/theme/Tag/index.tsx new file mode 100644 index 0000000..5f7cc1e --- /dev/null +++ b/old/src/theme/Tag/index.tsx @@ -0,0 +1,23 @@ +import type { Props } from "@theme/Tag"; + +import Link from "@docusaurus/Link"; + +const Tag = ({ permalink, label, count, description }: Props) => { + const getCountString = () => { + if (count > 1) return `(${count} références)`; + return `(${count} référence)`; + }; + + return ( + <Link + href={permalink} + title={description} + className="px-2 py-1 inline-flex gap-2 hover:no-underline rounded-full bg-violet-50 dark:bg-violet-800" + > + {label} + {count && <span className="italic">{getCountString()}</span>} + </Link> + ); +}; + +export default Tag; diff --git a/old/src/theme/TagsListByLetter/index.tsx b/old/src/theme/TagsListByLetter/index.tsx new file mode 100644 index 0000000..f6d13fb --- /dev/null +++ b/old/src/theme/TagsListByLetter/index.tsx @@ -0,0 +1,49 @@ +import type { TagLetterEntry } from "@docusaurus/theme-common"; +import type { Props } from "@theme/TagsListByLetter"; + +import { listTagsByLetters } from "@docusaurus/theme-common"; +import Heading from "@theme/Heading"; +import Tag from "@theme/Tag"; + +const TagLetterEntryItem = ({ + letterEntry, +}: { + letterEntry: TagLetterEntry; +}) => { + return ( + <article> + <Heading + as="h2" + id={letterEntry.letter} + className="mb-2 font-bold text-xl" + > + {letterEntry.letter} + </Heading> + + <ul className="flex flex-wrap gap-2 ml-4"> + {letterEntry.tags.map((tag) => ( + <li key={tag.permalink}> + <Tag {...tag} /> + </li> + ))} + </ul> + </article> + ); +}; + +const TagsListByLetter = ({ tags }: Props): JSX.Element => { + const letterList = listTagsByLetters(tags); + + return ( + <section className="flex flex-col gap-4"> + {letterList.map((letterEntry) => ( + <TagLetterEntryItem + key={letterEntry.letter} + letterEntry={letterEntry} + /> + ))} + </section> + ); +}; + +export default TagsListByLetter; diff --git a/old/src/theme/TagsListByLetter/styles.module.css b/old/src/theme/TagsListByLetter/styles.module.css new file mode 100644 index 0000000..bb3203e --- /dev/null +++ b/old/src/theme/TagsListByLetter/styles.module.css @@ -0,0 +1,11 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +.tag { + display: inline-block; + margin: 0.5rem 0.5rem 0 1rem; +} diff --git a/old/src/theme/TagsListInline/index.tsx b/old/src/theme/TagsListInline/index.tsx new file mode 100644 index 0000000..40c9e9d --- /dev/null +++ b/old/src/theme/TagsListInline/index.tsx @@ -0,0 +1,18 @@ +import type { Props } from "@theme/TagsListInline"; + +import Tag from "@theme/Tag"; + +export default function TagsListInline({ tags }: Props): JSX.Element { + return ( + <ul className="flex flex-wrap gap-2 mb-4"> + {tags.map((tag) => ( + <li + key={tag.permalink} + className="transition-colors rounded-md text-sm" + > + <Tag {...tag} /> + </li> + ))} + </ul> + ); +} diff --git a/old/static/.nojekyll b/old/static/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/old/static/design_patterns/mvc.svg b/old/static/design_patterns/mvc.svg new file mode 100644 index 0000000..3f56f58 --- /dev/null +++ b/old/static/design_patterns/mvc.svg @@ -0,0 +1 @@ +<svg aria-roledescription="sequence" role="graphics-document document" viewBox="-50 -10 1455 697" style="max-width: 1455px;" xmlns="http://www.w3.org/2000/svg" width="100%" id="__mermaid_0"><g><rect class="rect" height="676" width="849" stroke="rgb(0,0,0, 0.5)" fill="Purple" y="0" x="296"></rect><text class="text" alignment-baseline="central" dominant-baseline="central" style="text-anchor: middle; font-size: 16px; font-weight: 400;" y="9.5" x="720.5"><tspan dy="0" x="720.5">Serveur</tspan></text></g><g><rect class="rect" height="676" width="160" stroke="rgb(0,0,0, 0.5)" fill="Green" y="0" x="0"></rect><text class="text" alignment-baseline="central" dominant-baseline="central" style="text-anchor: middle; font-size: 16px; font-weight: 400;" y="9.5" x="80"><tspan dy="0" x="80">Navigateur</tspan></text></g><g><rect class="actor actor-bottom" ry="3" rx="3" name="Base de données" height="65" width="150" stroke="#666" fill="#eaeaea" y="601" x="1205"></rect><text class="actor" alignment-baseline="central" dominant-baseline="central" style="text-anchor: middle; font-size: 16px; font-weight: 400;" y="633.5" x="1280"><tspan dy="0" x="1280">Base de données</tspan></text></g><g><rect class="actor actor-bottom" ry="3" rx="3" name="Vue" height="65" width="150" stroke="#666" fill="#eaeaea" y="601" x="990"></rect><text class="actor" alignment-baseline="central" dominant-baseline="central" style="text-anchor: middle; font-size: 16px; font-weight: 400;" y="633.5" x="1065"><tspan dy="0" x="1065">Vue</tspan></text></g><g><rect class="actor actor-bottom" ry="3" rx="3" name="Modèle" height="65" width="150" stroke="#666" fill="#eaeaea" y="601" x="790"></rect><text class="actor" alignment-baseline="central" dominant-baseline="central" style="text-anchor: middle; font-size: 16px; font-weight: 400;" y="633.5" x="865"><tspan dy="0" x="865">Modèle</tspan></text></g><g><rect class="actor actor-bottom" ry="3" rx="3" name="Contrôleur" height="65" width="150" stroke="#666" fill="#eaeaea" y="601" x="562"></rect><text class="actor" alignment-baseline="central" dominant-baseline="central" style="text-anchor: middle; font-size: 16px; font-weight: 400;" y="633.5" x="637"><tspan dy="0" x="637">Contrôleur</tspan></text></g><g><rect class="actor actor-bottom" ry="3" rx="3" name="Routeur" height="65" width="150" stroke="#666" fill="#eaeaea" y="601" x="301"></rect><text class="actor" alignment-baseline="central" dominant-baseline="central" style="text-anchor: middle; font-size: 16px; font-weight: 400;" y="633.5" x="376"><tspan dy="0" x="376">Routeur</tspan></text></g><g><line stroke="#999" stroke-width="0.5px" class="200" y2="601" x2="1280" y1="34" x1="1280" id="actor5"></line><g id="root-5"><rect class="actor actor-top" ry="3" rx="3" name="Base de données" height="65" width="150" stroke="#666" fill="#eaeaea" y="29" x="1205"></rect><text class="actor" alignment-baseline="central" dominant-baseline="central" style="text-anchor: middle; font-size: 16px; font-weight: 400;" y="61.5" x="1280"><tspan dy="0" x="1280">Base de données</tspan></text></g></g><g><line stroke="#999" stroke-width="0.5px" class="200" y2="601" x2="1065" y1="34" x1="1065" id="actor4"></line><g id="root-4"><rect class="actor actor-top" ry="3" rx="3" name="Vue" height="65" width="150" stroke="#666" fill="#eaeaea" y="29" x="990"></rect><text class="actor" alignment-baseline="central" dominant-baseline="central" style="text-anchor: middle; font-size: 16px; font-weight: 400;" y="61.5" x="1065"><tspan dy="0" x="1065">Vue</tspan></text></g></g><g><line stroke="#999" stroke-width="0.5px" class="200" y2="601" x2="865" y1="34" x1="865" id="actor3"></line><g id="root-3"><rect class="actor actor-top" ry="3" rx="3" name="Modèle" height="65" width="150" stroke="#666" fill="#eaeaea" y="29" x="790"></rect><text class="actor" alignment-baseline="central" dominant-baseline="central" style="text-anchor: middle; font-size: 16px; font-weight: 400;" y="61.5" x="865"><tspan dy="0" x="865">Modèle</tspan></text></g></g><g><line stroke="#999" stroke-width="0.5px" class="200" y2="601" x2="637" y1="34" x1="637" id="actor2"></line><g id="root-2"><rect class="actor actor-top" ry="3" rx="3" name="Contrôleur" height="65" width="150" stroke="#666" fill="#eaeaea" y="29" x="562"></rect><text class="actor" alignment-baseline="central" dominant-baseline="central" style="text-anchor: middle; font-size: 16px; font-weight: 400;" y="61.5" x="637"><tspan dy="0" x="637">Contrôleur</tspan></text></g></g><g><line stroke="#999" stroke-width="0.5px" class="200" y2="601" x2="376" y1="34" x1="376" id="actor1"></line><g id="root-1"><rect class="actor actor-top" ry="3" rx="3" name="Routeur" height="65" width="150" stroke="#666" fill="#eaeaea" y="29" x="301"></rect><text class="actor" alignment-baseline="central" dominant-baseline="central" style="text-anchor: middle; font-size: 16px; font-weight: 400;" y="61.5" x="376"><tspan dy="0" x="376">Routeur</tspan></text></g></g><style>#__mermaid_0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#__mermaid_0 .error-icon{fill:#552222;}#__mermaid_0 .error-text{fill:#552222;stroke:#552222;}#__mermaid_0 .edge-thickness-normal{stroke-width:2px;}#__mermaid_0 .edge-thickness-thick{stroke-width:3.5px;}#__mermaid_0 .edge-pattern-solid{stroke-dasharray:0;}#__mermaid_0 .edge-pattern-dashed{stroke-dasharray:3;}#__mermaid_0 .edge-pattern-dotted{stroke-dasharray:2;}#__mermaid_0 .marker{fill:#333333;stroke:#333333;}#__mermaid_0 .marker.cross{stroke:#333333;}#__mermaid_0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#__mermaid_0 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#__mermaid_0 text.actor>tspan{fill:black;stroke:none;}#__mermaid_0 .actor-line{stroke:grey;}#__mermaid_0 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#__mermaid_0 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#__mermaid_0 #arrowhead path{fill:#333;stroke:#333;}#__mermaid_0 .sequenceNumber{fill:white;}#__mermaid_0 #sequencenumber{fill:#333;}#__mermaid_0 #crosshead path{fill:#333;stroke:#333;}#__mermaid_0 .messageText{fill:#333;stroke:none;}#__mermaid_0 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#__mermaid_0 .labelText,#__mermaid_0 .labelText>tspan{fill:black;stroke:none;}#__mermaid_0 .loopText,#__mermaid_0 .loopText>tspan{fill:black;stroke:none;}#__mermaid_0 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#__mermaid_0 .note{stroke:#aaaa33;fill:#fff5ad;}#__mermaid_0 .noteText,#__mermaid_0 .noteText>tspan{fill:black;stroke:none;}#__mermaid_0 .activation0{fill:#f4f4f4;stroke:#666;}#__mermaid_0 .activation1{fill:#f4f4f4;stroke:#666;}#__mermaid_0 .activation2{fill:#f4f4f4;stroke:#666;}#__mermaid_0 .actorPopupMenu{position:absolute;}#__mermaid_0 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#__mermaid_0 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#__mermaid_0 .actor-man circle,#__mermaid_0 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#__mermaid_0 .node circle,#__mermaid_0 .node ellipse,#__mermaid_0 .node path,#__mermaid_0 .node polygon,#__mermaid_0 .node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color);}#__mermaid_0 marker{fill:var(--md-mermaid-edge-color)!important;}#__mermaid_0 .edgeLabel .label rect{fill:#0000;}#__mermaid_0 .label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family);}#__mermaid_0 .label foreignObject{line-height:normal;overflow:visible;}#__mermaid_0 .label div .edgeLabel{color:var(--md-mermaid-label-fg-color);}#__mermaid_0 .edgeLabel,#__mermaid_0 .edgeLabel rect,#__mermaid_0 .label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color);}#__mermaid_0 .edgeLabel,#__mermaid_0 .edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color);}#__mermaid_0 .edgePath .path,#__mermaid_0 .flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem;}#__mermaid_0 .edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none;}#__mermaid_0 .cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter);}#__mermaid_0 .cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family);}#__mermaid_0 g #flowchart-circleEnd,#__mermaid_0 g #flowchart-circleStart,#__mermaid_0 g #flowchart-crossEnd,#__mermaid_0 g #flowchart-crossStart,#__mermaid_0 g #flowchart-pointEnd,#__mermaid_0 g #flowchart-pointStart{stroke:none;}#__mermaid_0 g.classGroup line,#__mermaid_0 g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color);}#__mermaid_0 g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family);}#__mermaid_0 .classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1;}#__mermaid_0 .classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family);}#__mermaid_0 .node .divider{stroke:var(--md-mermaid-node-fg-color);}#__mermaid_0 .relation{stroke:var(--md-mermaid-edge-color);}#__mermaid_0 .cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family);}#__mermaid_0 .cardinality text{fill:inherit!important;}#__mermaid_0 defs #classDiagram-compositionEnd,#__mermaid_0 defs #classDiagram-compositionStart,#__mermaid_0 defs #classDiagram-dependencyEnd,#__mermaid_0 defs #classDiagram-dependencyStart,#__mermaid_0 defs #classDiagram-extensionEnd,#__mermaid_0 defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important;}#__mermaid_0 defs #classDiagram-aggregationEnd,#__mermaid_0 defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important;}#__mermaid_0 g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color);}#__mermaid_0 g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family);}#__mermaid_0 g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color);}#__mermaid_0 .nodeLabel,#__mermaid_0 .nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family);}#__mermaid_0 .node circle.state-end,#__mermaid_0 .node circle.state-start,#__mermaid_0 .start-state{fill:var(--md-mermaid-edge-color);stroke:none;}#__mermaid_0 .end-state-inner,#__mermaid_0 .end-state-outer{fill:var(--md-mermaid-edge-color);}#__mermaid_0 .end-state-inner,#__mermaid_0 .node circle.state-end{stroke:var(--md-mermaid-label-bg-color);}#__mermaid_0 .transition{stroke:var(--md-mermaid-edge-color);}#__mermaid_0 [id^=state-fork] rect,#__mermaid_0 [id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important;}#__mermaid_0 .statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color);}#__mermaid_0 .statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color);}#__mermaid_0 .statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter);}#__mermaid_0 defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color);}#__mermaid_0 .attributeBoxEven,#__mermaid_0 .attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color);}#__mermaid_0 .entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color);}#__mermaid_0 .entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family);}#__mermaid_0 .relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1;}#__mermaid_0 .relationshipLabel{fill:var(--md-mermaid-label-fg-color);}#__mermaid_0 .relationshipLine{stroke:var(--md-mermaid-edge-color);}#__mermaid_0 defs #ONE_OR_MORE_END *,#__mermaid_0 defs #ONE_OR_MORE_START *,#__mermaid_0 defs #ONLY_ONE_END *,#__mermaid_0 defs #ONLY_ONE_START *,#__mermaid_0 defs #ZERO_OR_MORE_END *,#__mermaid_0 defs #ZERO_OR_MORE_START *,#__mermaid_0 defs #ZERO_OR_ONE_END *,#__mermaid_0 defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important;}#__mermaid_0 defs #ZERO_OR_MORE_END circle,#__mermaid_0 defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color);}#__mermaid_0 .actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color);}#__mermaid_0 text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family);}#__mermaid_0 line{stroke:var(--md-mermaid-sequence-actor-line-color);}#__mermaid_0 .actor-man circle,#__mermaid_0 .actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color);}#__mermaid_0 .messageLine0,#__mermaid_0 .messageLine1{stroke:var(--md-mermaid-sequence-message-line-color);}#__mermaid_0 .note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color);}#__mermaid_0 .loopText,#__mermaid_0 .loopText>tspan,#__mermaid_0 .messageText,#__mermaid_0 .noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important;}#__mermaid_0 .messageText{fill:var(--md-mermaid-sequence-message-fg-color);}#__mermaid_0 .loopText,#__mermaid_0 .loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color);}#__mermaid_0 .noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color);}#__mermaid_0 #arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none;}#__mermaid_0 .loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color);}#__mermaid_0 .labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none;}#__mermaid_0 .labelText,#__mermaid_0 .labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family);}#__mermaid_0 .sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color);}#__mermaid_0 rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none;}#__mermaid_0 rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color);}#__mermaid_0 defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important;}#__mermaid_0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g></g><defs><symbol height="24" width="24" id="computer"><path d="M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z" transform="scale(.5)"></path></symbol></defs><defs><symbol clip-rule="evenodd" fill-rule="evenodd" id="database"><path d="M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z" transform="scale(.5)"></path></symbol></defs><defs><symbol height="24" width="24" id="clock"><path d="M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z" transform="scale(.5)"></path></symbol></defs><defs><marker orient="auto" markerHeight="12" markerWidth="12" markerUnits="userSpaceOnUse" refY="5" refX="7.9" id="arrowhead"><path d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs><defs><marker refY="4.5" refX="4" orient="auto" markerHeight="8" markerWidth="15" id="crosshead"><path d="M 1,2 L 6,7 M 6,2 L 1,7" stroke-width="1pt" style="stroke-dasharray: 0px, 0px;" stroke="#000000" fill="none"></path></marker></defs><defs><marker orient="auto" markerHeight="28" markerWidth="20" refY="7" refX="15.5" id="filled-head"><path d="M 18,7 L9,13 L14,7 L9,1 Z"></path></marker></defs><defs><marker orient="auto" markerHeight="40" markerWidth="60" refY="15" refX="15" id="sequencenumber"><circle r="6" cy="15" cx="15"></circle></marker></defs><g><line class="loopLine" y2="200" x2="1291" y1="200" x1="626"></line><line class="loopLine" y2="437" x2="1291" y1="200" x1="1291"></line><line class="loopLine" y2="437" x2="1291" y1="437" x1="626"></line><line class="loopLine" y2="437" x2="626" y1="200" x1="626"></line><polygon class="labelBox" points="626,200 676,200 676,213 667.6,220 626,220"></polygon><text class="labelText" style="font-size: 16px; font-weight: 400;" alignment-baseline="middle" dominant-baseline="middle" text-anchor="middle" y="213" x="651">alt</text><text class="loopText" style="font-size: 16px; font-weight: 400;" text-anchor="middle" y="218" x="983.5"><tspan x="983.5">[Si des données sont nécessaires]</tspan></text></g><line stroke="#999" stroke-width="0.5px" class="200" y2="601" x2="80" y1="109" x1="80" id="actor0"></line><g name="Utilisateur" class="actor-man actor-top"><line y2="74" x2="80" y1="54" x1="80" id="actor-man-torso0"></line><line y2="62" x2="98" y1="62" x1="62" id="actor-man-arms0"></line><line y2="74" x2="80" y1="89" x1="62"></line><line y2="89" x2="96" y1="74" x1="80"></line><circle height="65" width="150" r="15" cy="39" cx="80"></circle><text class="actor" alignment-baseline="central" dominant-baseline="central" style="text-anchor: middle; font-size: 16px; font-weight: 400;" y="96.5" x="80"><tspan dy="0" x="80">Utilisateur</tspan></text></g><text dy="1em" class="messageText" style="font-size: 16px; font-weight: 400;" alignment-baseline="middle" dominant-baseline="middle" text-anchor="middle" y="109" x="227">Je veux voir la page d'accueil</text><line marker-start="url(#sequencenumber)" marker-end="url(#arrowhead)" style="fill: none;" stroke="none" stroke-width="2" class="messageLine0" y2="142" x2="372" y1="142" x1="81"></line><text class="sequenceNumber" text-anchor="middle" font-size="12px" font-family="sans-serif" y="146" x="81">1</text><text dy="1em" class="messageText" style="font-size: 16px; font-weight: 400;" alignment-baseline="middle" dominant-baseline="middle" text-anchor="middle" y="157" x="505">Appelle la méthode `home`</text><line marker-start="url(#sequencenumber)" marker-end="url(#arrowhead)" style="fill: none;" stroke="none" stroke-width="2" class="messageLine0" y2="190" x2="633" y1="190" x1="377"></line><text class="sequenceNumber" text-anchor="middle" font-size="12px" font-family="sans-serif" y="194" x="377">2</text><text dy="1em" class="messageText" style="font-size: 16px; font-weight: 400;" alignment-baseline="middle" dominant-baseline="middle" text-anchor="middle" y="250" x="750">Demande les données</text><line marker-start="url(#sequencenumber)" marker-end="url(#arrowhead)" style="fill: none;" stroke="none" stroke-width="2" class="messageLine0" y2="283" x2="861" y1="283" x1="638"></line><text class="sequenceNumber" text-anchor="middle" font-size="12px" font-family="sans-serif" y="287" x="638">3</text><text dy="1em" class="messageText" style="font-size: 16px; font-weight: 400;" alignment-baseline="middle" dominant-baseline="middle" text-anchor="middle" y="298" x="1071">Récupère les données</text><line marker-start="url(#sequencenumber)" marker-end="url(#arrowhead)" style="fill: none;" stroke="none" stroke-width="2" class="messageLine0" y2="331" x2="1276" y1="331" x1="866"></line><text class="sequenceNumber" text-anchor="middle" font-size="12px" font-family="sans-serif" y="335" x="866">4</text><text dy="1em" class="messageText" style="font-size: 16px; font-weight: 400;" alignment-baseline="middle" dominant-baseline="middle" text-anchor="middle" y="346" x="1074">Retourne les données</text><line marker-start="url(#sequencenumber)" marker-end="url(#arrowhead)" stroke="none" stroke-width="2" class="messageLine1" style="stroke-dasharray: 3px, 3px; fill: none;" y2="379" x2="869" y1="379" x1="1279"></line><text class="sequenceNumber" text-anchor="middle" font-size="12px" font-family="sans-serif" y="383" x="1279">5</text><text dy="1em" class="messageText" style="font-size: 16px; font-weight: 400;" alignment-baseline="middle" dominant-baseline="middle" text-anchor="middle" y="394" x="753">Retourne les données</text><line marker-start="url(#sequencenumber)" marker-end="url(#arrowhead)" stroke="none" stroke-width="2" class="messageLine1" style="stroke-dasharray: 3px, 3px; fill: none;" y2="427" x2="641" y1="427" x1="864"></line><text class="sequenceNumber" text-anchor="middle" font-size="12px" font-family="sans-serif" y="431" x="864">6</text><text dy="1em" class="messageText" style="font-size: 16px; font-weight: 400;" alignment-baseline="middle" dominant-baseline="middle" text-anchor="middle" y="452" x="850">Demande le HTML</text><line marker-start="url(#sequencenumber)" marker-end="url(#arrowhead)" style="fill: none;" stroke="none" stroke-width="2" class="messageLine0" y2="485" x2="1061" y1="485" x1="638"></line><text class="sequenceNumber" text-anchor="middle" font-size="12px" font-family="sans-serif" y="489" x="638">7</text><text dy="1em" class="messageText" style="font-size: 16px; font-weight: 400;" alignment-baseline="middle" dominant-baseline="middle" text-anchor="middle" y="500" x="853">Retourne le HTML généré</text><line marker-start="url(#sequencenumber)" marker-end="url(#arrowhead)" stroke="none" stroke-width="2" class="messageLine1" style="stroke-dasharray: 3px, 3px; fill: none;" y2="533" x2="641" y1="533" x1="1064"></line><text class="sequenceNumber" text-anchor="middle" font-size="12px" font-family="sans-serif" y="537" x="1064">8</text><text dy="1em" class="messageText" style="font-size: 16px; font-weight: 400;" alignment-baseline="middle" dominant-baseline="middle" text-anchor="middle" y="548" x="360">Retourne le HTML généré</text><line marker-start="url(#sequencenumber)" marker-end="url(#arrowhead)" style="fill: none;" stroke="none" stroke-width="2" class="messageLine0" y2="581" x2="84" y1="581" x1="636"></line><text class="sequenceNumber" text-anchor="middle" font-size="12px" font-family="sans-serif" y="585" x="636">9</text><g name="Utilisateur" class="actor-man actor-bottom"><line y2="646" x2="80" y1="626" x1="80" id="actor-man-torso5"></line><line y2="634" x2="98" y1="634" x1="62" id="actor-man-arms5"></line><line y2="646" x2="80" y1="661" x1="62"></line><line y2="661" x2="96" y1="646" x1="80"></line><circle height="65" width="150" r="15" cy="611" cx="80"></circle><text class="actor" alignment-baseline="central" dominant-baseline="central" style="text-anchor: middle; font-size: 16px; font-weight: 400;" y="668.5" x="80"><tspan dy="0" x="80">Utilisateur</tspan></text></g></svg> \ No newline at end of file diff --git a/old/static/fonts/Luciole/Luciole-Bold-Italic.ttf b/old/static/fonts/Luciole/Luciole-Bold-Italic.ttf new file mode 100644 index 0000000..7926c7b Binary files /dev/null and b/old/static/fonts/Luciole/Luciole-Bold-Italic.ttf differ diff --git a/old/static/fonts/Luciole/Luciole-Bold.ttf b/old/static/fonts/Luciole/Luciole-Bold.ttf new file mode 100644 index 0000000..2a0f075 Binary files /dev/null and b/old/static/fonts/Luciole/Luciole-Bold.ttf differ diff --git a/old/static/fonts/Luciole/Luciole-Regular-Italic.ttf b/old/static/fonts/Luciole/Luciole-Regular-Italic.ttf new file mode 100644 index 0000000..4f95be0 Binary files /dev/null and b/old/static/fonts/Luciole/Luciole-Regular-Italic.ttf differ diff --git a/old/static/fonts/Luciole/Luciole-Regular.ttf b/old/static/fonts/Luciole/Luciole-Regular.ttf new file mode 100644 index 0000000..2055e8a Binary files /dev/null and b/old/static/fonts/Luciole/Luciole-Regular.ttf differ diff --git a/old/static/icons/icon-128x128.png b/old/static/icons/icon-128x128.png new file mode 100644 index 0000000..4f709f9 Binary files /dev/null and b/old/static/icons/icon-128x128.png differ diff --git a/old/static/icons/icon-128x128.webp b/old/static/icons/icon-128x128.webp new file mode 100644 index 0000000..7aa46c0 Binary files /dev/null and b/old/static/icons/icon-128x128.webp differ diff --git a/old/static/icons/icon-144x144.png b/old/static/icons/icon-144x144.png new file mode 100644 index 0000000..cfaf8f7 Binary files /dev/null and b/old/static/icons/icon-144x144.png differ diff --git a/old/static/icons/icon-144x144.webp b/old/static/icons/icon-144x144.webp new file mode 100644 index 0000000..fbe2c66 Binary files /dev/null and b/old/static/icons/icon-144x144.webp differ diff --git a/old/static/icons/icon-152x152.png b/old/static/icons/icon-152x152.png new file mode 100644 index 0000000..5f57f83 Binary files /dev/null and b/old/static/icons/icon-152x152.png differ diff --git a/old/static/icons/icon-152x152.webp b/old/static/icons/icon-152x152.webp new file mode 100644 index 0000000..c7d85b9 Binary files /dev/null and b/old/static/icons/icon-152x152.webp differ diff --git a/old/static/icons/icon-192x192.png b/old/static/icons/icon-192x192.png new file mode 100644 index 0000000..b30a43b Binary files /dev/null and b/old/static/icons/icon-192x192.png differ diff --git a/old/static/icons/icon-192x192.webp b/old/static/icons/icon-192x192.webp new file mode 100644 index 0000000..dc9f6e5 Binary files /dev/null and b/old/static/icons/icon-192x192.webp differ diff --git a/old/static/icons/icon-384x384.png b/old/static/icons/icon-384x384.png new file mode 100644 index 0000000..6ce60de Binary files /dev/null and b/old/static/icons/icon-384x384.png differ diff --git a/old/static/icons/icon-384x384.webp b/old/static/icons/icon-384x384.webp new file mode 100644 index 0000000..48a2cbc Binary files /dev/null and b/old/static/icons/icon-384x384.webp differ diff --git a/old/static/icons/icon-512x512.png b/old/static/icons/icon-512x512.png new file mode 100644 index 0000000..2fd8b09 Binary files /dev/null and b/old/static/icons/icon-512x512.png differ diff --git a/old/static/icons/icon-512x512.webp b/old/static/icons/icon-512x512.webp new file mode 100644 index 0000000..8d69605 Binary files /dev/null and b/old/static/icons/icon-512x512.webp differ diff --git a/old/static/icons/icon-72x72.png b/old/static/icons/icon-72x72.png new file mode 100644 index 0000000..dce8745 Binary files /dev/null and b/old/static/icons/icon-72x72.png differ diff --git a/old/static/icons/icon-72x72.webp b/old/static/icons/icon-72x72.webp new file mode 100644 index 0000000..e8c983e Binary files /dev/null and b/old/static/icons/icon-72x72.webp differ diff --git a/old/static/icons/icon-96x96.png b/old/static/icons/icon-96x96.png new file mode 100644 index 0000000..80f8a47 Binary files /dev/null and b/old/static/icons/icon-96x96.png differ diff --git a/old/static/icons/icon-96x96.webp b/old/static/icons/icon-96x96.webp new file mode 100644 index 0000000..1ebf4af Binary files /dev/null and b/old/static/icons/icon-96x96.webp differ diff --git a/old/static/illustrations/coding.svg b/old/static/illustrations/coding.svg new file mode 100644 index 0000000..c07ca1f --- /dev/null +++ b/old/static/illustrations/coding.svg @@ -0,0 +1 @@ +<svg id="_0177_coding_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 500 500" data-imageid="coding-1-37" imageName="Coding 1" class="illustrations_image" style="width: 188px;"><defs><style>.cls-1_coding-1-37{fill:url(#linear-gradient);}.cls-1_coding-1-37,.cls-2_coding-1-37,.cls-3_coding-1-37,.cls-4_coding-1-37,.cls-5_coding-1-37,.cls-6_coding-1-37,.cls-7_coding-1-37,.cls-8_coding-1-37,.cls-9_coding-1-37,.cls-10_coding-1-37,.cls-11_coding-1-37,.cls-12_coding-1-37,.cls-13_coding-1-37,.cls-14_coding-1-37,.cls-15_coding-1-37,.cls-16_coding-1-37,.cls-17_coding-1-37,.cls-18_coding-1-37,.cls-19_coding-1-37,.cls-20_coding-1-37,.cls-21_coding-1-37,.cls-22_coding-1-37,.cls-23_coding-1-37,.cls-24_coding-1-37,.cls-25_coding-1-37,.cls-26_coding-1-37,.cls-27_coding-1-37,.cls-28_coding-1-37,.cls-29_coding-1-37,.cls-30_coding-1-37,.cls-31_coding-1-37,.cls-32_coding-1-37,.cls-33_coding-1-37,.cls-34_coding-1-37,.cls-35_coding-1-37,.cls-36_coding-1-37,.cls-37_coding-1-37,.cls-38_coding-1-37,.cls-39_coding-1-37,.cls-40_coding-1-37,.cls-41_coding-1-37,.cls-42_coding-1-37,.cls-43_coding-1-37,.cls-44_coding-1-37,.cls-45_coding-1-37,.cls-46_coding-1-37,.cls-47_coding-1-37,.cls-48_coding-1-37,.cls-49_coding-1-37,.cls-50_coding-1-37,.cls-51_coding-1-37,.cls-52_coding-1-37,.cls-53_coding-1-37,.cls-54_coding-1-37,.cls-55_coding-1-37,.cls-56_coding-1-37,.cls-57_coding-1-37,.cls-58_coding-1-37,.cls-59_coding-1-37,.cls-60_coding-1-37,.cls-61_coding-1-37,.cls-62_coding-1-37,.cls-63_coding-1-37,.cls-64_coding-1-37,.cls-65_coding-1-37,.cls-66_coding-1-37,.cls-67_coding-1-37,.cls-68_coding-1-37,.cls-69_coding-1-37,.cls-70_coding-1-37,.cls-71_coding-1-37{stroke-width:0px;}.cls-2_coding-1-37,.cls-72_coding-1-37{opacity:.52;}.cls-2_coding-1-37,.cls-67_coding-1-37,.cls-68_coding-1-37{isolation:isolate;}.cls-2_coding-1-37,.cls-68_coding-1-37,.cls-71_coding-1-37{fill:#68e1fd;}.cls-3_coding-1-37{fill:url(#linear-gradient-38-coding-1-37);}.cls-4_coding-1-37{fill:url(#linear-gradient-33-coding-1-37);}.cls-5_coding-1-37{fill:url(#linear-gradient-29-coding-1-37);}.cls-6_coding-1-37{fill:url(#linear-gradient-32-coding-1-37);}.cls-7_coding-1-37{fill:url(#linear-gradient-30-coding-1-37);}.cls-8_coding-1-37{fill:url(#linear-gradient-31-coding-1-37);}.cls-9_coding-1-37{fill:url(#linear-gradient-36-coding-1-37);}.cls-10_coding-1-37{fill:url(#linear-gradient-39-coding-1-37);}.cls-11_coding-1-37{fill:url(#linear-gradient-34-coding-1-37);}.cls-12_coding-1-37{fill:url(#linear-gradient-37-coding-1-37);}.cls-13_coding-1-37{fill:url(#linear-gradient-35-coding-1-37);}.cls-14_coding-1-37{fill:url(#linear-gradient-28-coding-1-37);}.cls-15_coding-1-37{fill:url(#linear-gradient-25-coding-1-37);}.cls-16_coding-1-37{fill:url(#linear-gradient-11-coding-1-37);}.cls-17_coding-1-37{fill:url(#linear-gradient-12-coding-1-37);}.cls-18_coding-1-37{fill:url(#linear-gradient-13-coding-1-37);}.cls-19_coding-1-37{fill:url(#linear-gradient-10-coding-1-37);}.cls-20_coding-1-37{fill:url(#linear-gradient-17-coding-1-37);}.cls-21_coding-1-37{fill:url(#linear-gradient-16-coding-1-37);}.cls-22_coding-1-37{fill:url(#linear-gradient-19-coding-1-37);}.cls-23_coding-1-37{fill:url(#linear-gradient-15-coding-1-37);}.cls-24_coding-1-37{fill:url(#linear-gradient-23-coding-1-37);}.cls-25_coding-1-37{fill:url(#linear-gradient-21-coding-1-37);}.cls-26_coding-1-37{fill:url(#linear-gradient-18-coding-1-37);}.cls-27_coding-1-37{fill:url(#linear-gradient-14-coding-1-37);}.cls-28_coding-1-37{fill:url(#linear-gradient-22-coding-1-37);}.cls-29_coding-1-37{fill:url(#linear-gradient-20-coding-1-37);}.cls-30_coding-1-37{fill:url(#linear-gradient-27-coding-1-37);}.cls-31_coding-1-37{fill:url(#linear-gradient-24-coding-1-37);}.cls-32_coding-1-37{fill:url(#linear-gradient-26-coding-1-37);}.cls-33_coding-1-37{fill:url(#linear-gradient-45-coding-1-37);}.cls-34_coding-1-37{fill:url(#linear-gradient-46-coding-1-37);}.cls-35_coding-1-37{fill:url(#linear-gradient-44-coding-1-37);}.cls-36_coding-1-37{fill:url(#linear-gradient-48-coding-1-37);}.cls-37_coding-1-37{fill:url(#linear-gradient-49-coding-1-37);}.cls-38_coding-1-37{fill:url(#linear-gradient-47-coding-1-37);}.cls-39_coding-1-37{fill:url(#linear-gradient-42-coding-1-37);}.cls-40_coding-1-37{fill:url(#linear-gradient-43-coding-1-37);}.cls-41_coding-1-37{fill:url(#linear-gradient-40-coding-1-37);}.cls-42_coding-1-37{fill:url(#linear-gradient-41-coding-1-37);}.cls-43_coding-1-37{fill:url(#linear-gradient-59-coding-1-37);}.cls-44_coding-1-37{fill:url(#linear-gradient-57-coding-1-37);}.cls-45_coding-1-37{fill:url(#linear-gradient-58-coding-1-37);}.cls-46_coding-1-37{fill:url(#linear-gradient-55-coding-1-37);}.cls-47_coding-1-37{fill:url(#linear-gradient-56-coding-1-37);}.cls-48_coding-1-37{fill:url(#linear-gradient-53-coding-1-37);}.cls-49_coding-1-37{fill:url(#linear-gradient-51-coding-1-37);}.cls-50_coding-1-37{fill:url(#linear-gradient-52-coding-1-37);}.cls-51_coding-1-37{fill:url(#linear-gradient-50-coding-1-37);}.cls-52_coding-1-37{fill:url(#linear-gradient-54-coding-1-37);}.cls-53_coding-1-37{fill:url(#linear-gradient-60-coding-1-37);}.cls-54_coding-1-37{fill:url(#linear-gradient-61-coding-1-37);}.cls-55_coding-1-37{fill:url(#linear-gradient-62-coding-1-37);}.cls-56_coding-1-37{fill:url(#linear-gradient-65-coding-1-37);}.cls-57_coding-1-37{fill:url(#linear-gradient-63-coding-1-37);}.cls-58_coding-1-37{fill:url(#linear-gradient-64-coding-1-37);}.cls-59_coding-1-37{fill:url(#linear-gradient-4-coding-1-37);}.cls-60_coding-1-37{fill:url(#linear-gradient-2-coding-1-37);}.cls-61_coding-1-37{fill:url(#linear-gradient-3-coding-1-37);}.cls-62_coding-1-37{fill:url(#linear-gradient-8-coding-1-37);}.cls-63_coding-1-37{fill:url(#linear-gradient-9-coding-1-37);}.cls-64_coding-1-37{fill:url(#linear-gradient-7-coding-1-37);}.cls-65_coding-1-37{fill:url(#linear-gradient-5-coding-1-37);}.cls-66_coding-1-37{fill:url(#linear-gradient-6-coding-1-37);}.cls-67_coding-1-37{opacity:.27;}.cls-67_coding-1-37,.cls-69_coding-1-37{fill:#fff;}.cls-68_coding-1-37{opacity:.24;}.cls-70_coding-1-37{fill:#ffb4a3;}</style><linearGradient id="linear-gradient-coding-1-37" x1="264.57" y1="2538.53" x2="266.58" y2="2475.27" gradientTransform="translate(-31 2871.49) scale(1 -1)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#231f20" stop-opacity="0"/><stop offset="1" stop-color="#231f20"/></linearGradient><linearGradient id="linear-gradient-2-coding-1-37" x1="203.42" y1="2574.44" x2="221.4" y2="2520.48" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-3-coding-1-37" x1="203.42" y1="2565.35" x2="221.4" y2="2511.38" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-4-coding-1-37" x1="203.42" y1="2556.25" x2="221.4" y2="2502.29" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-5-coding-1-37" x1="203.42" y1="2547.16" x2="221.4" y2="2493.19" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-6-coding-1-37" x1="215.14" y1="2574.44" x2="233.13" y2="2520.48" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-7-coding-1-37" x1="215.14" y1="2565.34" x2="233.13" y2="2511.38" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-8-coding-1-37" x1="215.14" y1="2556.25" x2="233.13" y2="2502.29" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-9-coding-1-37" x1="215.13" y1="2547.16" x2="233.13" y2="2493.19" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-10-coding-1-37" x1="226.87" y1="2574.44" x2="244.85" y2="2520.48" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-11-coding-1-37" x1="226.87" y1="2565.35" x2="244.85" y2="2511.38" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-12-coding-1-37" x1="226.87" y1="2556.25" x2="244.85" y2="2502.29" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-13-coding-1-37" x1="226.86" y1="2547.16" x2="244.85" y2="2493.19" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-14-coding-1-37" x1="238.58" y1="2574.44" x2="256.58" y2="2520.48" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-15-coding-1-37" x1="238.58" y1="2565.34" x2="256.58" y2="2511.38" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-16-coding-1-37" x1="238.58" y1="2556.25" x2="256.58" y2="2502.29" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-17-coding-1-37" x1="250.31" y1="2574.44" x2="268.3" y2="2520.48" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-18-coding-1-37" x1="250.31" y1="2565.35" x2="268.3" y2="2511.38" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-19-coding-1-37" x1="250.31" y1="2556.25" x2="268.3" y2="2502.29" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-20-coding-1-37" x1="262.03" y1="2574.44" x2="280.02" y2="2520.48" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-21-coding-1-37" x1="262.03" y1="2565.34" x2="280.02" y2="2511.38" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-22-coding-1-37" x1="262.03" y1="2556.25" x2="280.02" y2="2502.29" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-23-coding-1-37" x1="273.76" y1="2574.44" x2="291.74" y2="2520.48" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-24-coding-1-37" x1="273.76" y1="2565.35" x2="291.74" y2="2511.38" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-25-coding-1-37" x1="273.76" y1="2556.25" x2="291.74" y2="2502.29" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-26-coding-1-37" x1="285.47" y1="2574.44" x2="303.47" y2="2520.48" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-27-coding-1-37" x1="285.47" y1="2565.34" x2="303.47" y2="2511.38" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-28-coding-1-37" x1="285.47" y1="2556.25" x2="303.47" y2="2502.29" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-29-coding-1-37" x1="297.2" y1="2574.44" x2="315.18" y2="2520.47" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-30-coding-1-37" x1="297.2" y1="2565.34" x2="315.18" y2="2511.38" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-31-coding-1-37" x1="297.2" y1="2556.25" x2="315.18" y2="2502.29" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-32-coding-1-37" x1="297.19" y1="2547.15" x2="315.18" y2="2493.19" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-33-coding-1-37" x1="308.92" y1="2574.44" x2="326.91" y2="2520.48" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-34-coding-1-37" x1="308.92" y1="2565.35" x2="326.91" y2="2511.38" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-35-coding-1-37" x1="308.92" y1="2556.25" x2="326.91" y2="2502.29" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-36-coding-1-37" x1="308.92" y1="2547.16" x2="326.9" y2="2493.19" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-37-coding-1-37" x1="320.64" y1="2574.44" x2="338.63" y2="2520.48" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-38-coding-1-37" x1="320.64" y1="2565.34" x2="338.63" y2="2511.38" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-39-coding-1-37" x1="320.64" y1="2556.25" x2="338.63" y2="2502.29" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-40-coding-1-37" x1="320.64" y1="2547.16" x2="338.63" y2="2493.19" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-41-coding-1-37" x1="258.65" y1="2554.23" x2="258.18" y2="2472.72" xlink:href="#linear-gradient-coding-1-37"/><linearGradient id="linear-gradient-42-coding-1-37" x1="291.77" y1="-753.45" x2="288.24" y2="-564.55" gradientTransform="translate(-119.24 791.63)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff" stop-opacity="0"/><stop offset=".99" stop-color="#fff"/></linearGradient><linearGradient id="linear-gradient-43-coding-1-37" x1="282.41" y1="-743.5" x2="279.14" y2="-568.85" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-44-coding-1-37" x1="377.21" y1="-744.08" x2="373.88" y2="-566.32" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-45-coding-1-37" x1="311.25" y1="-734.17" x2="308.18" y2="-571.26" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-46-coding-1-37" x1="333.16" y1="-725.76" x2="330.29" y2="-573.04" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-47-coding-1-37" x1="390.41" y1="-724.38" x2="387.57" y2="-572.17" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-48-coding-1-37" x1="327.66" y1="-717.12" x2="325" y2="-574.86" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-49-coding-1-37" x1="398.12" y1="-718.81" x2="395.4" y2="-573.31" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-50-coding-1-37" x1="303.42" y1="-673.73" x2="300.97" y2="-542.74" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-51-coding-1-37" x1="295.31" y1="-667.18" x2="293.05" y2="-545.91" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-52-coding-1-37" x1="373.07" y1="-671.49" x2="370.65" y2="-542.69" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-53-coding-1-37" x1="318.73" y1="-662.84" x2="316.56" y2="-547.18" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-54-coding-1-37" x1="336.73" y1="-658.68" x2="334.65" y2="-548.27" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-55-coding-1-37" x1="384.25" y1="-656.89" x2="382.21" y2="-547.82" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-56-coding-1-37" x1="332" y1="-653.11" x2="330.07" y2="-549.71" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-57-coding-1-37" x1="390.9" y1="-656.4" x2="388.88" y2="-548.28" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-58-coding-1-37" x1="311.48" y1="-623.18" x2="309.66" y2="-525.92" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-59-coding-1-37" x1="304.36" y1="-618.33" x2="302.68" y2="-528.48" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-60-coding-1-37" x1="370.26" y1="-624.25" x2="368.39" y2="-525.09" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-61-coding-1-37" x1="324.06" y1="-616.39" x2="322.41" y2="-529.21" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-62-coding-1-37" x1="339.32" y1="-614.37" x2="337.73" y2="-529.95" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-63-coding-1-37" x1="379.93" y1="-612.44" x2="378.39" y2="-529.73" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-64-coding-1-37" x1="335.18" y1="-610.41" x2="333.7" y2="-531.17" xlink:href="#linear-gradient-42-coding-1-37"/><linearGradient id="linear-gradient-65-coding-1-37" x1="385.78" y1="-614.38" x2="384.2" y2="-529.87" xlink:href="#linear-gradient-42-coding-1-37"/></defs><path id="background_coding-1-37" class="cls-68_coding-1-37 targetColor" d="M381.42,351.48c-12.21,4.69-25.11,7.55-37.08,12.81-19.54,8.63-35.74,23.3-54.22,33.99-7.97,4.63-16.4,8.42-25.15,11.33-8.64,2.87-17.54,4.9-26.57,6.06-11.99,1.55-24.11,1.84-36.16.88-11.61-.89-23.13-2.65-34.48-5.26-17.09-3.94-33.87-9.14-50.19-15.54-50.66-19.52-83.74-120.68-61.66-168.5,9.72-21.09,28.74-36.22,42.45-54.96,25.41-34.79,33.06-82.56,66.41-109.85,21.61-17.67,51.02-23.51,78.83-21.33,27.81,2.18,54.47,11.74,80.4,22.05,12.51,4.96,25.19,10.28,35.31,19.19,17.84,15.66,25.05,39.74,36.33,60.63,18.44,34.19,49.62,62.91,55.63,101.21,7.11,45.6-26.79,90.72-69.85,107.29Z" style="fill: rgb(124, 58, 237);"/><g id="keyboard_coding-1-37"><rect class="cls-71_coding-1-37 targetColor" x="165.82" y="297.18" width="134.88" height="52.1" style="fill: rgb(124, 58, 237);"/><rect class="cls-1_coding-1-37" x="165.82" y="297.18" width="134.88" height="52.1"/><rect class="cls-71_coding-1-37 targetColor" x="165.82" y="293.95" width="134.88" height="52.1" style="fill: rgb(124, 58, 237);"/><rect class="cls-60_coding-1-37" x="171.1" y="302.61" width="8.89" height="7.68"/><rect class="cls-61_coding-1-37" x="171.1" y="311.7" width="8.89" height="7.68"/><rect class="cls-59_coding-1-37" x="171.1" y="320.79" width="8.89" height="7.68"/><rect class="cls-65_coding-1-37" x="171.1" y="329.9" width="8.89" height="7.68"/><rect class="cls-66_coding-1-37" x="182.82" y="302.61" width="8.89" height="7.68"/><rect class="cls-64_coding-1-37" x="182.82" y="311.7" width="8.89" height="7.68"/><rect class="cls-62_coding-1-37" x="182.82" y="320.79" width="8.89" height="7.68"/><rect class="cls-63_coding-1-37" x="182.82" y="329.9" width="8.89" height="7.68"/><rect class="cls-19_coding-1-37" x="194.55" y="302.61" width="8.89" height="7.68"/><rect class="cls-16_coding-1-37" x="194.55" y="311.7" width="8.89" height="7.68"/><rect class="cls-17_coding-1-37" x="194.55" y="320.79" width="8.89" height="7.68"/><rect class="cls-18_coding-1-37" x="194.55" y="329.9" width="8.89" height="7.68"/><rect class="cls-27_coding-1-37" x="206.27" y="302.61" width="8.89" height="7.68"/><rect class="cls-23_coding-1-37" x="206.27" y="311.7" width="8.89" height="7.68"/><rect class="cls-21_coding-1-37" x="206.27" y="320.79" width="8.89" height="7.68"/><rect class="cls-20_coding-1-37" x="218" y="302.61" width="8.89" height="7.68"/><rect class="cls-26_coding-1-37" x="218" y="311.7" width="8.89" height="7.68"/><rect class="cls-22_coding-1-37" x="218" y="320.79" width="8.89" height="7.68"/><rect class="cls-29_coding-1-37" x="229.72" y="302.61" width="8.89" height="7.68"/><rect class="cls-25_coding-1-37" x="229.72" y="311.7" width="8.89" height="7.68"/><rect class="cls-28_coding-1-37" x="229.72" y="320.79" width="8.89" height="7.68"/><rect class="cls-24_coding-1-37" x="241.44" y="302.61" width="8.89" height="7.68"/><rect class="cls-31_coding-1-37" x="241.44" y="311.7" width="8.89" height="7.68"/><rect class="cls-15_coding-1-37" x="241.44" y="320.79" width="8.89" height="7.68"/><rect class="cls-32_coding-1-37" x="253.16" y="302.61" width="8.89" height="7.68"/><rect class="cls-30_coding-1-37" x="253.16" y="311.7" width="8.89" height="7.68"/><rect class="cls-14_coding-1-37" x="253.16" y="320.79" width="8.89" height="7.68"/><rect class="cls-5_coding-1-37" x="264.88" y="302.61" width="8.89" height="7.68"/><rect class="cls-7_coding-1-37" x="264.88" y="311.7" width="8.89" height="7.68"/><rect class="cls-8_coding-1-37" x="264.88" y="320.79" width="8.89" height="7.68"/><rect class="cls-6_coding-1-37" x="264.88" y="329.9" width="8.89" height="7.68"/><rect class="cls-4_coding-1-37" x="276.61" y="302.61" width="8.89" height="7.68"/><rect class="cls-11_coding-1-37" x="276.61" y="311.7" width="8.89" height="7.68"/><rect class="cls-13_coding-1-37" x="276.61" y="320.79" width="8.89" height="7.68"/><rect class="cls-9_coding-1-37" x="276.61" y="329.9" width="8.89" height="7.68"/><rect class="cls-12_coding-1-37" x="288.33" y="302.61" width="8.89" height="7.68"/><rect class="cls-3_coding-1-37" x="288.33" y="311.7" width="8.89" height="7.68"/><rect class="cls-10_coding-1-37" x="288.33" y="320.79" width="8.89" height="7.68"/><rect class="cls-41_coding-1-37" x="288.33" y="329.9" width="8.89" height="7.68"/><rect class="cls-42_coding-1-37" x="192.8" y="330.4" width="69.52" height="7.53"/></g><g id="screen_coding-1-37"><polygon class="cls-2_coding-1-37 targetColor" points="335.89 267.85 112.76 267.85 52.4 142 411.35 142 335.89 267.85" style="fill: rgb(124, 58, 237);"/><path class="cls-67_coding-1-37" d="M162.87,255.03h-87.71c-5.1,0-10.56-2.85-12.21-6.37l-15.08-32.29c-1.64-3.52,1.16-6.37,6.26-6.37h87.72c5.09,0,10.55,2.85,12.2,6.37l15.08,32.26c1.65,3.52-1.16,6.4-6.26,6.4Z"/><path class="cls-69_coding-1-37" d="M157.21,263.09h-87.72c-5.09,0-10.56-2.85-12.2-6.37l-15.08-32.26c-1.62-3.52,1.16-6.4,6.26-6.4h87.71c5.1,0,10.56,2.86,12.21,6.38l15.12,32.28c1.6,3.52-1.2,6.37-6.29,6.37Z"/><path class="cls-67_coding-1-37" d="M319.51,226.61h87.72c5.1,0,10.56-2.86,12.21-6.37l15.07-32.27c1.65-3.51-1.16-6.37-6.25-6.37h-87.72c-5.09,0-10.56,2.86-12.21,6.37l-15.11,32.27c-1.61,3.51,1.19,6.37,6.28,6.37Z"/><path class="cls-69_coding-1-37" d="M319.51,237.93h87.72c5.1,0,10.56-2.86,12.21-6.38l15.07-32.26c1.65-3.51-1.16-6.37-6.25-6.37h-87.72c-5.09,0-10.56,2.86-12.21,6.37l-15.11,32.26c-1.61,3.52,1.19,6.38,6.28,6.38Z"/><polygon class="cls-39_coding-1-37" points="136.82 165.94 202.64 165.94 203.38 170.66 138.99 170.66 136.82 165.94"/><polygon class="cls-40_coding-1-37" points="140.94 174.9 179.45 174.9 180.58 178.98 142.82 178.98 140.94 174.9"/><polygon class="cls-35_coding-1-37" points="194.99 174.9 316.18 174.9 314.6 179 195.81 179 194.99 174.9"/><polygon class="cls-33_coding-1-37" points="163.97 183.16 214.82 183.16 215.24 187.12 165.41 187.12 163.97 183.16"/><polygon class="cls-34_coding-1-37" points="182.44 190.76 240.7 190.76 240.61 194.48 183.48 194.48 182.44 190.76"/><polygon class="cls-38_coding-1-37" points="244.5 190.76 293.34 190.76 292.12 194.88 244.33 194.88 244.5 190.76"/><polygon class="cls-36_coding-1-37" points="184.34 197.82 227.67 197.82 227.83 201.06 185.25 201.06 184.34 197.82"/><polygon class="cls-37_coding-1-37" points="231.83 197.82 321.25 197.82 319.6 201.39 231.92 201.39 231.83 197.82"/><polygon class="cls-51_coding-1-37" points="155.52 206.57 208.98 206.57 209.47 209.69 156.97 209.69 155.52 206.57"/><polygon class="cls-49_coding-1-37" points="158.27 212.52 189.78 212.52 190.54 215.26 159.53 215.26 158.27 212.52"/><polygon class="cls-50_coding-1-37" points="202.5 212.52 301.69 212.52 300.63 215.28 203.05 215.28 202.5 212.52"/><polygon class="cls-48_coding-1-37" points="176.68 218.08 218.6 218.08 218.89 220.79 177.66 220.79 176.68 218.08"/><polygon class="cls-52_coding-1-37" points="191.6 223.3 239.96 223.3 239.91 225.86 192.33 225.86 191.6 223.3"/><polygon class="cls-46_coding-1-37" points="243.12 223.3 283.65 223.3 282.81 226.14 243 226.14 243.12 223.3"/><polygon class="cls-47_coding-1-37" points="192.92 228.18 229.11 228.18 229.22 230.46 193.55 230.46 192.92 228.18"/><polygon class="cls-44_coding-1-37" points="232.58 228.18 307.26 228.18 306.11 230.69 232.65 230.69 232.58 228.18"/><polygon class="cls-45_coding-1-37" points="168.31 234.34 213.31 234.34 213.65 236.57 169.34 236.57 168.31 234.34"/><polygon class="cls-43_coding-1-37" points="170.26 238.58 196.94 238.58 197.49 240.55 171.18 240.55 170.26 238.58"/><polygon class="cls-53_coding-1-37" points="207.7 238.58 291.65 238.58 290.89 240.56 208.1 240.56 207.7 238.58"/><polygon class="cls-54_coding-1-37" points="185.6 242.58 221.25 242.58 221.46 244.55 186.31 244.55 185.6 242.58"/><polygon class="cls-55_coding-1-37" points="198.11 246.37 239.45 246.37 239.4 248.25 198.64 248.25 198.11 246.37"/><polygon class="cls-57_coding-1-37" points="242.14 246.37 276.78 246.37 276.16 248.45 242.05 248.45 242.14 246.37"/><polygon class="cls-58_coding-1-37" points="199.06 249.97 230.13 249.97 230.21 251.64 199.53 251.64 199.06 249.97"/><polygon class="cls-56_coding-1-37" points="233.12 249.97 297.23 249.97 296.38 251.81 233.16 251.81 233.12 249.97"/><g class="cls-72_coding-1-37"><polygon class="cls-71_coding-1-37 targetColor" points="50.23 226.77 84.02 226.77 84.4 228.56 51.35 228.56 50.23 226.77" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="52.35 230.17 72.12 230.17 72.7 231.72 53.32 231.72 52.35 230.17" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="80.09 230.17 142.32 230.17 141.5 231.73 80.52 231.73 80.09 230.17" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="64.17 233.31 90.28 233.31 90.5 234.82 64.91 234.82 64.17 233.31" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="73.65 236.21 103.57 236.21 103.52 237.61 74.19 237.61 73.65 236.21" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="105.52 236.21 130.59 236.21 129.96 237.77 105.42 237.77 105.52 236.21" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="74.63 238.89 96.88 238.89 96.96 240.12 75.1 240.12 74.63 238.89" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="99.01 238.89 144.91 238.89 144.07 240.24 99.06 240.24 99.01 238.89" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="59.84 242.21 87.27 242.21 87.53 243.41 60.57 243.41 59.84 242.21" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="61.24 244.48 77.42 244.48 77.81 245.52 61.9 245.52 61.24 244.48" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="83.96 244.48 134.88 244.48 134.33 245.52 84.23 245.52 83.96 244.48" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="70.69 246.58 92.22 246.58 92.37 247.62 71.2 247.62 70.69 246.58" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="78.37 248.57 103.19 248.57 103.16 249.54 78.73 249.54 78.37 248.57" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="104.81 248.57 125.62 248.57 125.18 249.65 104.74 249.65 104.81 248.57" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="79.03 250.43 97.62 250.43 97.67 251.29 79.36 251.29 79.03 250.43" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="99.4 250.43 137.74 250.43 137.14 251.38 99.43 251.38 99.4 250.43" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="66.41 252.77 89.5 252.77 89.69 253.62 66.92 253.62 66.41 252.77" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="67.4 254.38 81.1 254.38 81.38 255.13 67.88 255.13 67.4 254.38" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="86.63 254.38 129.72 254.38 129.33 255.13 86.83 255.13 86.63 254.38" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="75.28 255.9 93.58 255.9 93.69 256.65 75.64 256.65 75.28 255.9" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="81.7 257.34 102.92 257.34 102.89 258.05 81.97 258.05 81.7 257.34" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="104.31 257.34 122.09 257.34 121.77 258.14 104.26 258.14 104.31 257.34" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="82.19 258.71 98.14 258.71 98.18 259.35 82.43 259.35 82.19 258.71" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="99.68 258.71 132.59 258.71 132.15 259.41 99.69 259.41 99.68 258.71" style="fill: rgb(124, 58, 237);"/></g><g class="cls-72_coding-1-37"><polygon class="cls-71_coding-1-37 targetColor" points="346.63 202.52 374.41 202.52 373.64 204.05 346.47 204.05 346.63 202.52" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="346.33 205.44 362.58 205.44 362.12 206.77 346.19 206.77 346.33 205.44" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="369.14 205.44 420.28 205.44 418.67 206.78 368.54 206.78 369.14 205.44" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="354.15 208.13 375.61 208.13 374.88 209.42 353.86 209.42 354.15 208.13" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="360.21 210.61 384.8 210.61 383.91 211.82 359.8 211.82 360.21 210.61" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="386.4 210.61 407.01 210.61 405.56 211.95 385.39 211.95 386.4 210.61" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="359.4 212.91 377.68 212.91 377.01 213.96 359.04 213.96 359.4 212.91" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="379.44 212.91 417.18 212.91 415.67 214.07 378.66 214.07 379.44 212.91" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="345.24 215.75 367.79 215.75 367.29 216.78 345.13 216.78 345.24 215.75" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="345.03 217.69 358.33 217.69 358.03 218.59 344.94 218.59 345.03 217.69" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="363.7 217.69 405.56 217.69 404.48 218.59 363.3 218.59 363.7 217.69" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="351.53 219.51 369.22 219.51 368.73 220.39 351.33 220.39 351.53 219.51" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="356.64 221.21 377.05 221.21 376.44 222.04 356.35 222.04 356.64 221.21" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="378.38 221.21 395.48 221.21 394.48 222.13 377.67 222.13 378.38 221.21" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="356.07 222.8 371.34 222.8 370.87 223.54 355.83 223.54 356.07 222.8" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="372.81 222.8 404.33 222.8 403.27 223.62 372.27 223.62 372.81 222.8" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="344.28 224.8 363.28 224.8 362.91 225.53 344.2 225.53 344.28 224.8" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="344.14 226.19 355.39 226.19 355.17 226.83 344.07 226.83 344.14 226.19" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="359.94 226.19 395.36 226.19 394.59 226.83 359.65 226.83 359.94 226.19" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="349.69 227.49 364.74 227.49 364.38 228.13 349.54 228.13 349.69 227.49" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="354.11 228.73 371.55 228.73 371.1 229.34 353.9 229.34 354.11 228.73" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="372.68 228.73 387.3 228.73 386.57 229.4 372.18 229.4 372.68 228.73" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="353.68 229.89 366.8 229.89 366.45 230.44 353.5 230.44 353.68 229.89" style="fill: rgb(124, 58, 237);"/><polygon class="cls-71_coding-1-37 targetColor" points="368.05 229.89 395.11 229.89 394.34 230.5 367.66 230.5 368.05 229.89" style="fill: rgb(124, 58, 237);"/></g></g><g id="hands_coding-1-37"><path class="cls-70_coding-1-37" d="M185.13,329.89c.24-1.03.92-2.31,1.96-1.98.55.18.81.78,1.02,1.31.56,1.47,2.77,3.48,3.31,4.96.1-3.7.24-13.05,2.46-18.4.29-.7,1.1-1.03,1.8-.74.45.19.76.6.83,1.08.86,6.08,1.42,15.92,1.77,13.91.45-2.54,1.85-22.94,5.67-20.61,1.2,3.62.35,17.64-.1,21.43,1.02-5.02,2.93-24.87,6.77-22.75,2.43,6.34-2.61,22.56-.3,28.94.43,1.17,1.34,2.43,2.6,2.34s1.91-1.42,1.99-2.62-.26-2.38-.17-3.58c0-.66.35-1.27.92-1.6,1.11-.48,2.05.92,2.37,2.12,1.5,5.59,1.4,11.49-.28,17.02-1.76,5.78-5.17,10.89-8.52,15.9-.44.74-1.01,1.4-1.68,1.93-.36.24-.75.42-1.16.55-2.89.96-5.92,1.39-8.96,1.28-13.1-.72-11.9-9.16-12.94-16.38-1.34-8.01-1.12-16.2.63-24.13Z"/><path class="cls-69_coding-1-37" d="M185.31,371.09c.53-1.22,1.48-2.2,2.68-2.77.7-.22,1.44-.32,2.18-.3,6.09-.12,12.17.39,18.16,1.52.58.04,1.12.3,1.52.71.21.33.33.7.34,1.09.37,2.98.05,6.01-.92,8.85-.1.43-.35.81-.7,1.07-.39.17-.82.21-1.23.11-6.17-.7-12.37-1.04-18.58-1.02-6.25-.03-6.16-4.32-3.46-9.27Z"/><path class="cls-71_coding-1-37 targetColor" d="M208.64,416.53c-12.08-.93-24.08-2.76-35.89-5.48-.36-1.18-.44-2.43-.23-3.65,1.48-9.17,4.61-17.99,9.24-26.04.39-.85,1.04-1.57,1.85-2.04.64-.27,1.33-.39,2.01-.34,7.6-.18,15.2.41,22.68,1.75,1.12.05,2.17.55,2.92,1.38.4.69.59,1.49.55,2.29.42,10.81-.63,21.62-3.12,32.14Z" style="fill: rgb(124, 58, 237);"/><path class="cls-70_coding-1-37" d="M235.78,367.57c-.5-.92-.88-2.23,0-2.77.43-.23.94-.29,1.41-.16,1.72.28,3.36.95,4.79,1.95,2.21,1.54,4.62,4.01,7.1,2.9,2.14-.97,2.33-3.89,2.19-6.25-.47-7.89-.94-15.78-1.42-23.67,0-.79,0-1.75.68-2.13,1.04-.56,2.06.78,2.5,1.85l5.66,14.32c1.08-3.45-.18-15.29.35-20.54.08-.84.83-1.46,1.67-1.38.56.05,1.04.41,1.26.93,1.71,4.11,3.57,14.79,3.89,17.32.92,7.54,1.4.92,1.67-.34.67-3.14-.2-13.86,1.69-14.68,2.77.2,3.7,3.81,3.76,6.6.06,2.79-1.4,13.6,1.32,14.25,1.2-3.01,1.11-8.49,2.73-8.7,2.53,1.16.3,12.69-.51,15.36-2.4,8-.86,6.95-3.25,14.94-.46,2.01-1.35,3.9-2.59,5.54-1.58,1.6-3.58,2.71-5.78,3.19-13.34,3.72-23.35-8.08-29.13-18.54Z"/><path class="cls-69_coding-1-37" d="M251.85,396.96c0,.71.3,1.38.82,1.85.32.17.67.27,1.04.3,5.44.65,10.96.24,16.25-1.21.56-.1,1.09-.36,1.52-.73.41-.48.65-1.07.7-1.69.52-3.58-1.07-7.08-2.62-10.34-.09-.24-.24-.44-.44-.59-.26-.1-.54-.12-.8-.05-2.59.43-5.19.73-7.81.92-1.9.13-5.03-.48-6.79.25-3.46,1.43-2.2,8.16-1.86,11.29Z"/><path class="cls-71_coding-1-37 targetColor" d="M276.15,408.62c-9.02,2.99-18.3,5.11-27.72,6.32.12-3.7.23-7.52.55-11.23.26-3.16,3.39-9.39,7.24-9.39,3.85-1.66,8.19-1.78,12.37-1.89,1.47,0,3.11,0,4.22.97s1.32,2.36,1.55,3.7c.67,3.8,1.33,7.65,1.79,11.52Z" style="fill: rgb(124, 58, 237);"/></g></svg> \ No newline at end of file diff --git a/old/static/illustrations/diversity.svg b/old/static/illustrations/diversity.svg new file mode 100644 index 0000000..98310c8 --- /dev/null +++ b/old/static/illustrations/diversity.svg @@ -0,0 +1 @@ +<svg id="_0212_diversity" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 500 500" data-imageid="diversity-90" imageName="Diversity" class="illustrations_image" style="width: 188px;"><defs><style>.cls-1_diversity-90{fill:url(#linear-gradient);}.cls-1_diversity-90,.cls-2_diversity-90,.cls-3_diversity-90,.cls-4_diversity-90,.cls-5_diversity-90,.cls-6_diversity-90,.cls-7_diversity-90,.cls-8_diversity-90,.cls-9_diversity-90,.cls-10_diversity-90,.cls-11_diversity-90,.cls-12_diversity-90,.cls-13_diversity-90,.cls-14_diversity-90,.cls-15_diversity-90,.cls-16_diversity-90,.cls-17_diversity-90{stroke-width:0px;}.cls-2_diversity-90{fill:url(#linear-gradient-11-diversity-90);}.cls-3_diversity-90{fill:url(#linear-gradient-10-diversity-90);}.cls-4_diversity-90{fill:url(#linear-gradient-4-diversity-90);}.cls-5_diversity-90{fill:url(#linear-gradient-2-diversity-90);}.cls-6_diversity-90{fill:url(#linear-gradient-3-diversity-90);}.cls-7_diversity-90{fill:url(#linear-gradient-8-diversity-90);}.cls-8_diversity-90{fill:url(#linear-gradient-9-diversity-90);}.cls-9_diversity-90{fill:url(#linear-gradient-7-diversity-90);}.cls-10_diversity-90{fill:url(#linear-gradient-5-diversity-90);}.cls-11_diversity-90{fill:url(#linear-gradient-6-diversity-90);}.cls-12_diversity-90{isolation:isolate;opacity:.24;}.cls-12_diversity-90,.cls-17_diversity-90{fill:#68e1fd;}.cls-13_diversity-90{fill:#c14834;}.cls-14_diversity-90{fill:#ffaa71;}.cls-15_diversity-90{fill:#ffb4a3;}.cls-16_diversity-90{fill:#f1b475;}</style><linearGradient id="linear-gradient-diversity-90" x1="-1860.21" y1="1912.58" x2="-1883.21" y2="1805.73" gradientTransform="translate(228.24 2819.53) rotate(47.32) scale(1 -1)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#231f20" stop-opacity="0"/><stop offset="1" stop-color="#231f20"/></linearGradient><linearGradient id="linear-gradient-2-diversity-90" x1="-962.08" y1="3906.31" x2="-606.17" y2="4362.03" gradientTransform="translate(1229.59 4167.44) scale(1 -1)" xlink:href="#linear-gradient-diversity-90"/><linearGradient id="linear-gradient-3-diversity-90" x1="-879.89" y1="3964.89" x2="-886.01" y2="4188.98" gradientTransform="translate(1229.59 4167.44) scale(1 -1)" xlink:href="#linear-gradient-diversity-90"/><linearGradient id="linear-gradient-4-diversity-90" x1="-1059.6" y1="3954.18" x2="-1133.52" y2="3729.62" gradientTransform="translate(1229.59 4167.44) scale(1 -1)" xlink:href="#linear-gradient-diversity-90"/><linearGradient id="linear-gradient-5-diversity-90" x1="-1082.77" y1="3896.69" x2="-1174.41" y2="3334.28" gradientTransform="translate(1229.59 4167.44) scale(1 -1)" xlink:href="#linear-gradient-diversity-90"/><linearGradient id="linear-gradient-6-diversity-90" x1="-1107.95" y1="3881.39" x2="-1105.44" y2="3693.4" gradientTransform="translate(1229.59 4167.44) scale(1 -1)" xlink:href="#linear-gradient-diversity-90"/><linearGradient id="linear-gradient-7-diversity-90" x1="-938.46" y1="3923.62" x2="-889.5" y2="3719.61" gradientTransform="translate(1229.59 4167.44) scale(1 -1)" xlink:href="#linear-gradient-diversity-90"/><linearGradient id="linear-gradient-8-diversity-90" x1="-936.21" y1="3865.71" x2="-746.96" y2="3744.88" gradientTransform="translate(1229.59 4167.44) scale(1 -1)" xlink:href="#linear-gradient-diversity-90"/><linearGradient id="linear-gradient-9-diversity-90" x1="-1050.11" y1="4040.41" x2="-1073.1" y2="3933.56" gradientTransform="translate(1229.59 4167.44) scale(1 -1)" xlink:href="#linear-gradient-diversity-90"/><linearGradient id="linear-gradient-10-diversity-90" x1="-1086.28" y1="4038.48" x2="-998.41" y2="3899.12" gradientTransform="translate(1229.59 4167.44) scale(1 -1)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff" stop-opacity="0"/><stop offset=".95" stop-color="#fff"/></linearGradient><linearGradient id="linear-gradient-11-diversity-90" x1="-1121.58" y1="4015.77" x2="-1190.55" y2="3995.06" gradientTransform="translate(1229.59 4167.44) scale(1 -1)" xlink:href="#linear-gradient-diversity-90"/></defs><path id="background_diversity-90" class="cls-12_diversity-90 targetColor" d="M499.7,249c-3.27,42.77-33.78,81.86-30.86,124.03.12,1.77.29,3.54.53,5.25.55,4.18,1.45,8.31,2.34,12.4,1.2,5.57,2.35,11.14,2.53,16.83.21,6.76-1.33,14.01-5.04,19.49-1.72,2.56-4.01,4.68-6.69,6.2-.62.34-1.26.65-1.91.93-3.65,1.4-7.49,2.27-11.39,2.57-56.52,5.95-112.73-14.28-169.59-13.61-47.84.57-94.79,15.95-142.13,21.37-7.09.83-14.17,1.44-21.26,1.7-6.56.31-13.12.31-19.69,0-2.48-.13-4.92-.3-7.35-.5-3.29-.27-6.56-.67-9.84-1.18-18.39-2.66-36.41-8.69-50.85-20.23C-.25,401.27-9.33,358.66,2.5,323.74c7.69-22.71,23.15-43.31,24.34-67.21,1.34-26.72-15.38-50.76-20.89-76.95-2.38-11.1-2.66-22.55-2.35-33.87.56-17.93,3.54-37.46,16.62-49.7,3.55-3.2,7.5-5.93,11.74-8.13,2.34-1.27,4.68-2.44,7.09-3.61,9.29-4.59,18.69-9.1,28.09-13.45,33.66-15.82,67.8-30.54,102.4-44.14,20.67-8.12,41.8-15.98,63.93-18.08,40.57-3.82,80.3,11.9,117.09,29.52,19.63,9.43,39.02,19.49,59.19,27.9,5.18,2.14,10.4,4.18,15.69,6.02,4.58,1.65,9.23,3.18,13.91,4.51,5.98,1.77,14.05,2.29,20.38,4.59l1.3.5c1.72.69,3.31,1.66,4.7,2.88l.27.24c12.46,11.76,17.21,43.93,20.84,60.16,4.62,20.59,7.45,41.56,10.23,62.47,1.82,13.81,3.68,27.75,2.63,41.63Z" style="fill: rgb(124, 58, 237);"/><g id="character_4_diversity-90"><path class="cls-1_diversity-90" d="M293.53,235.46l33.18-7.54s4.71,15.3,12.16,17.82c3.92,1.32,8.2.22,11.01-1.25,0,0,7.59-4.68,8.15-5.75,1-1.97-4.79-2.01-5.36-4.88-1.84-9.41-5.81-10.01-5.81-10.01l43.04-9.81,8.55-5.32-37.74-74.5-66.97,5.32-21.32.1-8.54,5.32,12.27,36.49s26.01-6.05,22.73,8.91c-1.63,7.49-7.51,7.09-8.24,3.33l-8.55,5.32"/><path class="cls-17_diversity-90 targetColor" d="M302.29,134.23l-29.87,5.42,12.3,36.48s20.42-5.17,22.74,8.91c2.11,12.85-16.79,8.65-16.79,8.65l11.4,36.45,33.18-7.54s4.71,15.29,12.16,17.82,15.65-2.47,13.78-11.9-5.82-10-5.82-10l43.05-9.81-29.16-79.79-66.97,5.32Z" style="fill: rgb(124, 58, 237);"/><path class="cls-5_diversity-90" d="M361.19,228.52c1.84,9.4-6.35,14.41-13.81,11.87-7.46-2.54-12.17-17.79-12.17-17.79l-33.18,7.52-11.4-36.45s18.9,4.21,16.79-8.63c-2.3-14.11-22.74-8.93-22.74-8.93l-12.27-36.48,29.86-5.42,35-2.76,31.97-2.54,14.68,40.13,1.3,3.54,5.32,14.55,7.86,21.6-43.04,9.8s4.06.6,5.83,9.98Z"/><path class="cls-6_diversity-90" d="M342.44,179.25l-4.85,7.09c3.17-.56,6.51.35,9.63-.45,1.5-.47,2.95-1.1,4.33-1.86,3.5-1.58,7.11-2.9,10.81-3.94l15.34-4.72c2.56-.79,5.86-1.37,7.49.74l-3.93-17.04c-.1-.77-.41-1.5-.89-2.11-.68-.55-1.53-.86-2.41-.89-6.71-.83-14.49.7-19.49-3.87-2.45-2.25-3.89-5.78-7.02-6.9-2.66-.95-5.63.24-7.78,2.04s-3.76,4.17-5.73,6.16c-7.33,7.34-19.42,9.08-25.32,17.61,10.13,2.31,19.32-7.58,29.71-7.77-2.99.05-8.69,5.63-11,7.44-2.52,1.99-7.09,4.6-7.27,8.17-.51,9.48,14.61,2.04,18.37.31Z"/><path class="cls-14_diversity-90" d="M466.56,83.81c-.29.23-.57.47-.89.7-11.03,8.8-22.08,17.59-33.13,26.38-3.59,2.73-6.99,5.71-10.17,8.9-17.22,18.13-18.39,46.47-31.84,67.38l-5.32-14.55c.3-1.03.1-2.14-.53-3.01-.22-.24-.48-.43-.77-.57-1.2-.64-2.91-.3-4.31.17-13.84,4.39-27.04,10.59-39.25,18.43-2.95,1.9-6.66,3.98-9.74,2.3-.5-.2-.9-.59-1.13-1.07-.5-1.13.5-2.37,1.44-3.21,6.63-6.05,13.75-11.54,21.31-16.39-8.3,2.76-16.25,6.48-23.68,11.1-3.71,2.35-8.03,5.02-12.21,3.71-.69-.14-1.29-.55-1.67-1.13-.67-1.27.43-2.71,1.5-3.68,8.66-8.12,17.61-15.95,26.83-23.48-4.62.64-8.66,3.24-12.54,5.78l-14.78,9.74c-1.44.94-2.91,1.88-4.62,1.94s-3.54-1.2-3.45-2.87c.1-.77.4-1.5.89-2.11,6.52-9.87,18.83-14.55,26.02-23.92l-20.03,13.29c-.97.64-2.11,1.34-3.24,1.07-1.54-.34-2.28-2.24-1.9-3.77s1.53-2.75,2.66-3.88c7.58-7.61,16.44-13.57,25.3-19.62,2.35-1.57,4.65-3.18,6.95-4.82,10.34-7.3,21.77-12.89,33.88-16.58,2.05-.6,4.12-1.17,6.12-1.94,6.09-2.3,11.3-6.42,16.19-10.7,8.93-7.86,17.02-16.58,24.98-25.38,4.58,1.64,9.23,3.18,13.91,4.52,5.99,1.77,14.04,2.28,20.38,4.58l1.3.5,5.57,2.17Z"/></g><g id="character_3_diversity-90"><path class="cls-17_diversity-90 targetColor" d="M145.44,361.61l29.06,8.77,9.1-5.02-3.45-33.06s-25.91-6.44-16.19-18.29c9.73-11.84,18.89-.06,18.89-.06l9.13-5.02-2.66-32.62-35.21-9.16s13.29-19.25,5.65-27.3c-5.43-5.7-21.39,1.77-23.92,10.98-1.07,3.74-1.46,7.64-1.15,11.52l-31.89-15.84-9.1,5.06-19,90.6,70.73,19.45Z" style="fill: rgb(124, 58, 237);"/><path class="cls-4_diversity-90" d="M145.44,361.61l29.06,8.77,9.1-5.02-3.45-33.06s-25.91-6.44-16.19-18.29c9.73-11.84,18.89-.06,18.89-.06l9.13-5.02-2.66-32.62-35.21-9.16s13.29-19.25,5.65-27.3c-5.43-5.7-21.39,1.77-23.92,10.98-1.07,3.74-1.46,7.64-1.15,11.52l-31.89-15.84-9.1,5.06-19,90.6,70.73,19.45Z"/><path class="cls-17_diversity-90 targetColor" d="M154.54,356.58l29.06,8.77,5.66-38.09s-25.91-6.45-16.19-18.29c9.72-11.84,18.89-.06,18.89-.06l6.43-37.64-35.16-9.16s7.13-12.57-.54-20.62c-5.42-5.7-15.19-4.95-17.72,4.3-1.07,3.74-1.46,7.64-1.14,11.52l-41.02-10.82-18.99,90.65,70.73,19.45Z" style="fill: rgb(124, 58, 237);"/><path class="cls-10_diversity-90" d="M154.54,356.58l29.06,8.77,5.66-38.09s-25.91-6.45-16.19-18.29c9.72-11.84,18.89-.06,18.89-.06l6.43-37.64-35.16-9.16s7.13-12.57-.54-20.62c-5.42-5.7-15.19-4.95-17.72,4.3-1.07,3.74-1.46,7.64-1.14,11.52l-41.02-10.82-18.99,90.65,70.73,19.45Z"/><path class="cls-11_diversity-90" d="M96.97,338.49c7.19-13.1,12.99-27.35,23.47-38.01,1.5-1.52,3.93-3.02,5.57-1.64,1.36,1.15.89,3.32.34,5.01l-5.23,15.36,10.63-17.43c1.77-2.84,3.71-5.88,6.85-7.02.94-.4,2.01-.4,2.95,0,1.56.8,1.77,2.88,1.77,4.62-.03,4.74-.6,9.46-1.72,14.06,2.91-4.9,6.58-9.31,10.86-13.08,1.58,1.16,1.82,3.39,1.77,5.32-.2,6.87-2.52,13.49-4.81,19.98-1.24,3.54-2.52,7.09-4.81,10.05-4.14,5.32-10.92,7.71-17.5,9.09s-13.39,2.02-19.49,4.85c-2.42,1.13-4.73,2.61-7.36,3.07-2.87.5-9.38-1.04-10.13-4.6-.33-1.91,5.4-7.03,6.83-9.64Z"/><path class="cls-16_diversity-90" d="M167.84,318.46c-2.66,13.35-8.59,25.52-13.55,38.19-4.62,11.77-11.1,22.72-19.2,32.44-1.37,1.64-2.81,3.24-4.05,4.98-3.81,5.32-5.94,11.57-7.65,17.82-2.11,7.76-4.85,21.63-7.09,34.28-6.56.3-13.12.3-19.69,0-2.48-.13-4.92-.3-7.36-.5-3.28-.28-6.56-.67-9.83-1.18,3.69-9.5,7.42-19.06,9.74-26.21,1.5-4.25,2.71-8.59,3.61-13.01,3.69-20.38-5.68-40.51-9.14-60.94,0,0,7.42,2.96,12.25,1.77,1.77-.43,4.35-4.25,5.48-5.66,9.18-11.26,16.81-23.68,22.71-36.95,1.4-3.21,3.38-6.95,6.85-7.29.53-.07,1.08.03,1.54.3,1.07.67.89,2.24.57,3.48-2.21,8.7-5.15,17.19-8.8,25.38,5.44-6.85,10.04-14.32,13.71-22.25,1.84-4.01,3.95-8.63,8.16-9.83.66-.25,1.4-.23,2.05.07,1.27.66,1.1,2.51.76,3.87-2.81,11.54-5.99,22.99-9.52,34.35,3.54-3.04,5.45-7.46,7.28-11.7,2.36-5.42,4.7-10.84,7.03-16.26.67-1.57,1.41-3.17,2.77-4.15s3.61-.93,4.43.5c.35.69.51,1.47.46,2.24-.06,11.84-7.75,22.47-8.63,34.28,3.14-7.39,6.29-14.75,9.43-22.15.43-1.07,1-2.28,2.11-2.66,1.47-.57,3.14.64,3.68,2.11.39,1.54.35,3.15-.12,4.67Z"/></g><g id="character_2_diversity-90"><path class="cls-17_diversity-90 targetColor" d="M360.12,306.81l6.52-29.65-1.41-6.59-36.99,3.86s-4.43,26.34-17,17.54c-12.57-8.8-1.51-18.83-1.51-18.83l-1.41-6.59-36.61,3.07-6.44,35.75s-15.68-10.23-23.12-1.97c-5.26,5.85-1.18,19.61,8.23,21.4,3.81.79,7.74.89,11.59.28l-9.05,35.13,1.41,6.59,91.81,12,13.99-72.01Z" style="fill: rgb(124, 58, 237);"/><path class="cls-9_diversity-90" d="M360.12,306.81l6.52-29.65-1.41-6.59-36.99,3.86s-4.43,26.34-17,17.54c-12.57-8.8-1.51-18.83-1.51-18.83l-1.41-6.59-36.61,3.07-6.44,35.75s-15.68-10.23-23.12-1.97c-5.26,5.85-1.18,19.61,8.23,21.4,3.81.79,7.74.89,11.59.28l-9.05,35.13,1.41,6.59,91.81,12,13.99-72.01Z"/><path class="cls-17_diversity-90 targetColor" d="M358.71,300.21l6.52-29.65-38.4-2.73s-4.43,26.34-16.99,17.54-1.51-18.83-1.51-18.83l-38.02-3.54-6.45,35.75s-13.08-6.15-20.52,2.12c-5.26,5.85-3.78,15.53,5.63,17.32,3.81.79,7.73.88,11.57.27l-7.65,41.73,91.82,12.02,13.99-71.99Z" style="fill: rgb(124, 58, 237);"/><path class="cls-7_diversity-90" d="M327.89,288.26c-2.12-.93-5.32-1.85-6.2.28-.45,1.06.07,2.26.58,3.29l5.67,11.39-13.69-5.13c-.88-.45-1.89-.57-2.85-.35-2.2.82-1.47,4.08-.35,6.14l8.35,15.39c-3.7.54-7.25-4.15-10.63-2.46-2.66,1.33-2.21,5.22-1.1,7.97,4.92,11.82,14.99,20.68,22.16,31.31,2.48,3.67,4.68,8.26,3.02,12.35-.73,1.77-2.1,4-.78,5.42.63.53,1.41.84,2.22.89,7.02,1.2,14.18,1.42,21.26.65.77-24.16,1.95-48.3,3.54-72.41.14-2.14.26-4.43-.82-6.28-1-1.46-2.35-2.66-3.92-3.48-3.39-2.14-6.73-4.43-10.21-6.45-3.81-2.21-4.78-1.2-4.61,3.06-3.72.91-8.21-.05-11.65-1.57Z"/><path class="cls-15_diversity-90" d="M474.25,407.58c.21,6.76-1.33,14.01-5.04,19.49-1.72,2.56-4.01,4.68-6.69,6.2-.62.34-1.26.65-1.91.93-12.22-9.74-25.2-20.08-32.98-26-4.15-3.31-8.53-6.32-13.1-9.03-27.46-15.38-62.9-6.36-91.81-18.83-1.2-.5-2.54-1.27-2.74-2.54s.66-2.3,1.64-3.07c5.32-4.34,13.08-3.07,19.96-2.66,1.77.13,3.95,0,4.99-1.47,1.24-1.77.13-4.11-1-5.92-9.03-14.58-19.97-27.89-32.5-39.59-3.05-2.84-6.45-6.45-5.48-10.51.1-.62.41-1.19.89-1.6,1.18-.89,2.84-.1,4.08.71,8.85,5.82,17.2,12.37,24.96,19.59-5.57-8.7-12.15-16.7-19.61-23.84-3.77-3.61-8.09-7.73-7.83-12.94-.02-.84.3-1.64.89-2.24,1.23-1.17,3.21-.26,4.64.64,11.76,7.55,23.31,15.49,34.64,23.81-2.07-5.06-6.2-8.94-10.29-12.64-5.15-4.68-10.26-9.4-15.42-14.11-1.47-1.35-3-2.78-3.54-4.68s.3-4.39,2.24-4.83c.91-.09,1.82.05,2.66.41,13.16,4.59,22.1,17.29,34.9,22.8-7.02-6.35-14.03-12.71-21.03-19.06-1.04-.89-2.14-2-2.21-3.4-.07-1.88,1.9-3.28,3.77-3.31,1.87-.04,3.59.97,5.19,1.9,13.84,8.1,25.14,19.4,37.35,29.79,11.36,9.71,21.09,21.19,28.82,33.98,1.3,2.14,2.54,4.35,3.99,6.42,4.43,6.28,10.63,11.06,16.96,15.41,9.43,6.44,25.02,15.9,38.09,23.36,1.2,5.58,2.36,11.15,2.54,16.84Z"/></g><g id="character_1_diversity-90"><path class="cls-8_diversity-90" d="M113.9,174.66l-14.38,15.76-1.89,9.89,35.15,15.7s13.18-23.23,21.97-10.68c4.43,6.28.1,10.31-3.14,8.32l-1.89,9.89,34.55,16.32,16.95-29.5s14.44,6.9,21.34,3.14c3.63-1.98,5.73-5.88,6.56-8.95,0,0,1.71-8.74,1.29-9.89-.76-2.06-4.73,2.17-7.22.63-8.16-5.02-11.3-2.51-11.3-2.51l21.96-38.29,1.89-9.89-80.34-22.76-41.51,52.82Z"/><path class="cls-17_diversity-90 targetColor" d="M115.8,164.78l-16.28,25.65,35.14,15.7s10.05-18.52,21.97-10.63c10.88,7.16-5.01,18.21-5.01,18.21l34.55,16.32,16.95-29.5s14.43,6.9,21.34,3.14,8.79-13.18.62-18.21-11.3-2.51-11.3-2.51l21.97-38.29-78.49-32.71-41.46,52.84Z" style="fill: rgb(124, 58, 237);"/><path class="cls-3_diversity-90" d="M115.8,164.78l-16.28,25.65,35.14,15.7s10.05-18.52,21.97-10.63c10.88,7.16-5.01,18.21-5.01,18.21l34.55,16.32,16.95-29.5s14.43,6.9,21.34,3.14,8.79-13.18.62-18.21-11.3-2.51-11.3-2.51l21.97-38.29-78.49-32.71-41.46,52.84Z"/><path class="cls-13_diversity-90" d="M190.98,175.36c.06,1.7-1.77,2.94-3.45,2.88-1.67-.22-3.26-.89-4.58-1.94-4.95-3.24-9.9-6.49-14.81-9.74-3.88-2.54-7.97-5.15-12.51-5.78,9.16,7.53,18.13,15.39,26.78,23.48,1.07.97,2.21,2.41,1.51,3.68-.38.58-.97,1-1.64,1.17-4.21,1.31-8.52-1.4-12.23-3.71-7.42-4.64-15.37-8.38-23.68-11.14,7.55,4.85,14.68,10.34,21.31,16.39.89.83,1.94,2.07,1.44,3.21-.23.48-.62.87-1.1,1.11-3.12,1.64-6.79-.43-9.74-2.3-12.21-7.87-25.41-14.07-39.25-18.46-.77-.24-1.94-.77-3.01-1.11-.67-.27-1.41-.31-2.11-.13l-9.97,11.81-3.61-8.27c-6.52-16.45-10.21-34.55-20.97-48.15-.98-1.23-2.01-2.42-3.11-3.54-3.18-3.18-6.58-6.14-10.17-8.86-10.1-8.06-23.31-19.27-34.07-28.03,2.34-1.27,4.68-2.44,7.09-3.61,9.27-4.62,18.67-9.12,28.07-13.47,9.03,9.9,22.1,23.77,31.01,31.63,4.88,4.29,10.1,8.4,16.19,10.7,2,.77,4.08,1.34,6.12,1.94,12.1,3.69,23.53,9.29,33.87,16.59,11.11,7.86,22.71,14.78,32.27,24.48,1.23,1.01,2.15,2.34,2.66,3.84.41,1.53-.33,3.47-1.9,3.81-1.13.24-2.28-.47-3.24-1.1l-20.03-13.29c7.18,9.4,19.49,14.05,26.02,23.92.47.58.77,1.27.88,2.01Z"/><path class="cls-2_diversity-90" d="M116.61,172.52l-.64.6-12.07,11.68-3.61-8.27c-6.52-16.45-10.21-34.55-20.97-48.15.43.23,1.77,1,6.2,3.47,6.46,3.61,17.89,28.9,21.33,34.55,2.17,3.39,5.75,5.64,9.75,6.11Z"/></g></svg> \ No newline at end of file diff --git a/old/static/illustrations/map.svg b/old/static/illustrations/map.svg new file mode 100644 index 0000000..399032a --- /dev/null +++ b/old/static/illustrations/map.svg @@ -0,0 +1,144 @@ +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 500 500" style="width: 188px;" xml:space="preserve" data-imageid="map-65" imageName="Map" class="illustrations_image"> +<style type="text/css"> + .st0_map-65{fill:#C9C9C9;} + .st1_map-65{fill:#FFF3D9;} + .st2_map-65{fill:#68E1FD;} + .st3_map-65{opacity:0.1;enable-background:new ;} + .st4_map-65{fill:#C66B28;} + .st5_map-65{opacity:0.28;fill:url(#SVGID_1_);enable-background:new ;} + .st6_map-65{opacity:0.28;fill:url(#SVGID_00000153668436356504484050000017830292499136827835_);enable-background:new ;} + .st7_map-65{opacity:0.28;fill:url(#SVGID_00000070110525778476587440000005937872663609708439_);enable-background:new ;} + .st8_map-65{opacity:0.28;fill:url(#SVGID_00000068638473910666737010000002250221640752491684_);enable-background:new ;} + .st9_map-65{opacity:0.28;fill:url(#SVGID_00000064323111427756917110000000138958643804819844_);enable-background:new ;} + .st10_map-65{opacity:0.28;fill:url(#SVGID_00000156570892646706066930000008479480797020132236_);enable-background:new ;} + .st11_map-65{opacity:0.28;fill:url(#SVGID_00000045612006554486669600000014057045565086049672_);enable-background:new ;} + .st12_map-65{opacity:0.28;fill:url(#SVGID_00000038414550693205571940000009625315874861916817_);enable-background:new ;} + .st13_map-65{opacity:0.28;fill:url(#SVGID_00000171694218645532401660000012757667007662884233_);enable-background:new ;} + .st14_map-65{fill:#2C9135;} + .st15_map-65{fill:#E55151;} + .st16_map-65{fill:#B3B3B3;} + .st17_map-65{fill:#156819;} + .st18_map-65{fill:#D3894C;} +</style> +<polyline id="Shadow_map-65" class="st0_map-65" points="17.8,288.4 220.4,409.1 373.2,325.1 476.8,265.8 277.8,150.9 "/> +<g id="Map_map-65"> + <polygon class="st1_map-65" points="17.8,288.4 220.9,404.3 362.5,324.2 471.1,224.1 275.2,106.8 176.6,196.9 "/> + <polygon class="st2_map-65 targetColor" points="36.4,285.8 222.8,392.1 352.8,318.6 452.6,226.7 272.7,119 182.1,201.7 " style="fill: rgb(124, 58, 237);"/> + <polygon class="st3_map-65" points="272.7,119 182.1,201.7 352.8,318.6 452.6,226.7 "/> + <polyline class="st1_map-65" points="419.7,206.9 388.3,232.9 307.3,213.1 169.4,302.2 158.7,355.6 138.1,343.8 152.9,291.6 301.9,189.9 381.9,211.6 398.7,194.4 "/> + <path class="st4_map-65" d="M409.4,206.2c-0.8,0-1.5-0.7-1.5-1.5c0-0.5,0.2-0.9,0.6-1.2l2.8-2.2c0.6-0.5,1.6-0.4,2.1,0.2s0.4,1.6-0.2,2.1 c0,0,0,0-0.1,0.1l-2.8,2.2C410,206.1,409.7,206.2,409.4,206.2z"/> + <path class="st4_map-65" d="M391.8,219.9c-0.8,0-1.5-0.7-1.5-1.5c0-0.5,0.2-0.9,0.6-1.2l0.1-0.1c0.6-0.5,1.6-0.4,2.1,0.2s0.4,1.6-0.2,2.1 c0,0,0,0-0.1,0.1l-0.1,0.1C392.5,219.8,392.1,219.9,391.8,219.9z M397.5,215.5c-0.8,0-1.5-0.7-1.5-1.5c0-0.5,0.2-0.9,0.6-1.2l4-3.1 c0.6-0.5,1.6-0.4,2.1,0.2s0.4,1.6-0.2,2.1c0,0,0,0-0.1,0.1l-4,3.1C398.1,215.4,397.8,215.5,397.5,215.5z"/> + <path class="st4_map-65" d="M385.4,225.4l-4.2-1.3c-0.8-0.2-1.3-1-1.1-1.8c0.2-0.8,1-1.3,1.8-1.1c0,0,0.1,0,0.1,0l2.7,0.8l2.2-1.7 c0.6-0.5,1.6-0.4,2.1,0.2s0.4,1.6-0.2,2.1c0,0,0,0-0.1,0.1L385.4,225.4z"/> + <path class="st4_map-65" d="M372.4,221.4c-0.1,0-0.3,0-0.4-0.1l-4.6-1.3c-0.8-0.2-1.2-1.1-1-1.9c0.2-0.8,1.1-1.2,1.9-1c0,0,0,0,0,0 l4.6,1.4c0.8,0.2,1.2,1.1,1,1.9C373.6,221,373,221.4,372.4,221.4L372.4,221.4z M361.3,218.1c-0.1,0-0.3,0-0.4-0.1l-4.6-1.4 c-0.8-0.2-1.3-1-1.1-1.8c0.2-0.8,1-1.3,1.8-1.1c0,0,0.1,0,0.1,0l4.6,1.4c0.8,0.2,1.3,1.1,1,1.9C362.6,217.6,362,218.1,361.3,218.1 L361.3,218.1z M350.3,214.7c-0.1,0-0.3,0-0.4-0.1l-4.6-1.4c-0.8-0.2-1.3-1-1.1-1.8c0.2-0.8,1-1.3,1.8-1.1c0,0,0.1,0,0.1,0l4.6,1.4 c0.8,0.2,1.3,1.1,1,1.9C351.5,214.3,350.9,214.8,350.3,214.7L350.3,214.7z M339.2,211.4c-0.1,0-0.3,0-0.4-0.1l-4.6-1.4 c-0.8-0.2-1.2-1.1-1-1.9s1.1-1.2,1.9-1l0,0l4.6,1.4c0.8,0.3,1.2,1.1,1,1.9C340.4,211,339.8,211.4,339.2,211.4L339.2,211.4z M328.1,208.1c-0.1,0-0.3,0-0.4-0.1l-4.6-1.4c-0.8-0.2-1.3-1-1-1.8c0.2-0.8,1-1.3,1.8-1c0,0,0.1,0,0.1,0l4.6,1.4 c0.8,0.2,1.3,1.1,1,1.9C329.4,207.7,328.8,208.1,328.1,208.1L328.1,208.1z M317.1,204.8c-0.1,0-0.3,0-0.4-0.1l-3.4-1 c-0.8-0.2-1.2-1.1-1-1.9s1.1-1.2,1.9-1l3.4,1c0.8,0.2,1.3,1.1,1,1.9C318.3,204.3,317.7,204.8,317.1,204.8L317.1,204.8z"/> + <path class="st4_map-65" d="M302.7,203.4c-0.8,0-1.5-0.7-1.5-1.5c0-0.5,0.2-0.9,0.6-1.2l3.5-2.5l4.1,1.2c0.8,0.3,1.2,1.1,1,1.9 c-0.3,0.8-1.1,1.2-1.8,1l-2.7-0.8l-2.3,1.6C303.3,203.3,303,203.4,302.7,203.4z"/> + <path class="st4_map-65" d="M239,248c-0.5,0-1-0.2-1.2-0.6c-0.5-0.7-0.3-1.6,0.4-2.1c0,0,0,0,0,0l3.1-2.2c0.7-0.5,1.6-0.3,2.1,0.4 c0.5,0.7,0.3,1.6-0.4,2.1l-3.1,2.2C239.6,247.9,239.3,248,239,248z M248.2,241.6c-0.5,0-0.9-0.2-1.2-0.6c-0.5-0.7-0.3-1.6,0.4-2.1 c0,0,0,0,0,0l4.3-3c0.7-0.5,1.6-0.3,2.1,0.4c0.5,0.7,0.3,1.6-0.4,2.1l-4.3,3C248.8,241.5,248.5,241.6,248.2,241.6L248.2,241.6z M258.6,234.3c-0.5,0-0.9-0.2-1.2-0.6c-0.5-0.7-0.3-1.6,0.4-2.1c0,0,0,0,0,0l4.3-3c0.7-0.5,1.6-0.3,2.1,0.4 c0.5,0.7,0.3,1.6-0.4,2.1l-4.3,3C259.2,234.2,258.9,234.3,258.6,234.3L258.6,234.3z M269,227c-0.8,0-1.5-0.7-1.5-1.5 c0-0.5,0.2-1,0.6-1.2l4.3-3c0.7-0.5,1.6-0.3,2.1,0.4c0.5,0.7,0.3,1.6-0.4,2.1l0,0l-4.3,3C269.6,226.9,269.3,227,269,227z M279.4,219.7c-0.5,0-1-0.2-1.2-0.6c-0.5-0.7-0.3-1.6,0.4-2.1l4.3-3c0.7-0.5,1.6-0.3,2.1,0.4c0.5,0.7,0.3,1.6-0.4,2.1l0,0l-4.3,3 C280,219.7,279.7,219.8,279.4,219.7L279.4,219.7z M289.8,212.4c-0.8,0-1.5-0.6-1.5-1.5c0-0.5,0.2-1,0.6-1.2l4.3-3 c0.7-0.5,1.6-0.3,2.1,0.4c0.5,0.7,0.3,1.6-0.4,2.1l0,0l-4.3,3C290.4,212.4,290.1,212.5,289.8,212.4L289.8,212.4z"/> + <path class="st4_map-65" d="M231.7,253.1c-0.8,0-1.5-0.7-1.5-1.5c0-0.5,0.2-1,0.6-1.2l2.9-2.1c0.7-0.5,1.6-0.3,2.1,0.4 c0.5,0.7,0.3,1.6-0.4,2.1l-2.9,2.1C232.3,253,232,253.1,231.7,253.1z"/> + <polyline class="st1_map-65" points="281.9,229.5 301.9,288.9 385,288.9 376.9,296.4 297.1,296.4 275,233.9 "/> + <polygon class="st1_map-65" points="272.7,119 301.9,189.9 312.5,192.8 284.3,125.9 "/> + <polyline class="st1_map-65" points="112.9,240.4 173,280 180.6,272.7 119.7,235.6 "/> + <path class="st1_map-65" d="M67.3,302.3c-0.5,0.9,72.9-43.8,72.9-43.8l60.1-39.2l-5.2-29.4l-3.1,2.9l4.8,25.2L62.4,300.6"/> + <path class="st1_map-65" d="M169.4,302.3c0,0,76.7-14.1,97.2,19.2s6.1,42.4,6.1,42.4l13-7.4c0,0,0.7-39.6-37.6-55.9s-71.5-6.8-71.5-6.8"/> +</g> +<g id="Shadow_map_map-65"> + + <linearGradient id="SVGID_1_-map-65" gradientUnits="userSpaceOnUse" x1="188.1009" y1="-1374.0389" x2="209.7309" y2="-1391.1688" gradientTransform="matrix(1 0 0 1 0 1745.78)"> + <stop offset="0" style="stop-color:#000000;stop-opacity:0"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path class="st5_map-65" d="M179.8,367.6c0.8-0.4,23.7-8.5,23.7-8.5l4.3,7.7l-13.9,8.9L179.8,367.6z"/> + + <linearGradient id="SVGID_00000137847148422755415670000014132205337715100069_-map-65" gradientUnits="userSpaceOnUse" x1="228.8603" y1="-1371.1196" x2="257.1103" y2="-1386.7495" gradientTransform="matrix(1 0 0 1 0 1745.78)"> + <stop offset="0" style="stop-color:#000000;stop-opacity:0"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path style="opacity:0.28;fill:url(#SVGID_00000137847148422755415670000014132205337715100069_);enable-background:new ;" d=" M214.6,374.8c0.8-0.4,31.5-11.6,31.5-11.6l3.4,3.6l-22.1,16.4L214.6,374.8z"/> + + <linearGradient id="SVGID_00000167394970338471065880000012027168729956780947_-map-65" gradientUnits="userSpaceOnUse" x1="204.2222" y1="-1392.0908" x2="226.7222" y2="-1406.2307" gradientTransform="matrix(1 0 0 1 0 1745.78)"> + <stop offset="0" style="stop-color:#000000;stop-opacity:0"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path style="opacity:0.28;fill:url(#SVGID_00000167394970338471065880000012027168729956780947_);enable-background:new ;" d=" M193,349.9c1.3-0.6,34.6-12.4,34.6-12.4l4.1,6.8l-25.4,18.9L193,349.9z"/> + + <linearGradient id="SVGID_00000167371556804665732100000004697880309964834956_-map-65" gradientUnits="userSpaceOnUse" x1="313.8863" y1="-1464.2057" x2="342.1363" y2="-1482.2758" gradientTransform="matrix(1 0 0 1 0 1745.78)"> + <stop offset="0" style="stop-color:#000000;stop-opacity:0"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path style="opacity:0.28;fill:url(#SVGID_00000167371556804665732100000004697880309964834956_);enable-background:new ;" d=" M329.5,269.5c-9.1,3.4-22.5,8.2-23,8.5l12.9,8.3l14.8-11C332.3,273.7,330.7,271.8,329.5,269.5z"/> + + <linearGradient id="SVGID_00000098926656279441162040000011659742614298501822_-map-65" gradientUnits="userSpaceOnUse" x1="67.244" y1="-1463.2806" x2="102.594" y2="-1488.7706" gradientTransform="matrix(1 0 0 1 0 1745.78)"> + <stop offset="0" style="stop-color:#000000;stop-opacity:0"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path style="opacity:0.28;fill:url(#SVGID_00000098926656279441162040000011659742614298501822_);enable-background:new ;" d=" M61.2,278c0.8-0.4,31.5-11.6,31.5-11.6l3.4,3.6l-22,16.4L61.2,278z"/> + + <linearGradient id="SVGID_00000047770142776223710810000008068446228515822220_-map-65" gradientUnits="userSpaceOnUse" x1="127.4952" y1="-1498.6277" x2="154.9352" y2="-1516.1775" gradientTransform="matrix(1 0 0 1 0 1745.78)"> + <stop offset="0" style="stop-color:#000000;stop-opacity:0"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path style="opacity:0.28;fill:url(#SVGID_00000047770142776223710810000008068446228515822220_);enable-background:new ;" d=" M143.6,235.6c-9.1,3.4-22.4,8.2-23,8.5l11.7,7.5l14-12.2C144.2,237.8,144.7,237.8,143.6,235.6z"/> + + <linearGradient id="SVGID_00000029020610434928304420000010910803853688822195_-map-65" gradientUnits="userSpaceOnUse" x1="152.1151" y1="-1480.7677" x2="179.5551" y2="-1498.3177" gradientTransform="matrix(1 0 0 1 0 1745.78)"> + <stop offset="0" style="stop-color:#000000;stop-opacity:0"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path style="opacity:0.28;fill:url(#SVGID_00000029020610434928304420000010910803853688822195_);enable-background:new ;" d=" M168.2,253.4c-9.1,3.4-22.4,8.2-23,8.5l11.7,7.5l14-12.2C168.9,255.7,169.4,255.7,168.2,253.4z"/> + + <linearGradient id="SVGID_00000067234575120928732410000017698517272901659779_-map-65" gradientUnits="userSpaceOnUse" x1="149.8081" y1="-1510.7629" x2="177.2581" y2="-1528.313" gradientTransform="matrix(1 0 0 1 0 1745.78)"> + <stop offset="0" style="stop-color:#000000;stop-opacity:0"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path style="opacity:0.28;fill:url(#SVGID_00000067234575120928732410000017698517272901659779_);enable-background:new ;" d=" M165.9,223.4c-9.1,3.4-22.4,8.2-23,8.5l11.7,7.5l14-12.2C166.6,225.7,167.1,225.7,165.9,223.4z"/> + + <linearGradient id="SVGID_00000151503864024711635310000002946853378232446111_-map-65" gradientUnits="userSpaceOnUse" x1="200.1089" y1="-1476.3618" x2="246.5889" y2="-1506.0818" gradientTransform="matrix(1 0 0 1 0 1745.78)"> + <stop offset="0" style="stop-color:#000000;stop-opacity:0"/> + <stop offset="1" style="stop-color:#000000"/> + </linearGradient> + <path style="opacity:0.28;fill:url(#SVGID_00000151503864024711635310000002946853378232446111_);enable-background:new ;" d=" M226.6,248.1c-15.3,6.2-37.5,15.2-38.4,15.7l19.5,13.9l23.3-22.5C227.7,252.2,228.5,252.2,226.6,248.1z"/> +</g> +<g id="Place_map-65"> + <path class="st14_map-65" d="M229.2,264.4c-13.7,0-24.4-5.1-24.4-11.6s10.7-11.6,24.4-11.6s24.4,5.1,24.4,11.6 C253.7,259.3,243,264.4,229.2,264.4z M229.2,243.3c-12.2,0-22.4,4.4-22.4,9.6s10.3,9.6,22.4,9.6s22.4-4.4,22.4-9.6 S241.4,243.3,229.2,243.3L229.2,243.3z"/> + <path class="st15_map-65" d="M270.2,171.2c0-0.4,0-0.8-0.1-1.3c-1.1-13.9-10.4-25.9-22.8-31.8c-18.8-8.7-41.1-0.5-49.8,18.3 c-1.1,2.4-1.9,4.8-2.5,7.4c-2.9,13.1,1.8,26.5,6.6,38.5c7.5,18.8,17.3,36.7,29,53.3c6.3-8.7,12.1-17.7,17.5-27 C258.3,211.2,271.4,192.3,270.2,171.2z"/> + <circle class="st1_map-65" cx="231.8" cy="173.6" r="22.8"/> +</g> +<g id="Road_Sign_map-65"> + <ellipse class="st16_map-65" cx="94.2" cy="268.7" rx="12.2" ry="5.6"/> + <path class="st0_map-65" d="M96.4,269.8l0.1-0.2V211h-4.6v58.7c0.8,1.3,2.5,1.6,3.8,0.8C95.9,270.3,96.2,270.1,96.4,269.8z"/> + <path class="st16_map-65" d="M96.4,269.8l0.1-0.2V211h-2.1v59.9C95.2,270.8,95.9,270.4,96.4,269.8z"/> + + <ellipse transform="matrix(0.2292 -0.9734 0.9734 0.2292 -134.1693 255.9081)" class="st15_map-65" cx="94.5" cy="212.7" rx="15.4" ry="13.5"/> + + <ellipse transform="matrix(0.2292 -0.9734 0.9734 0.2292 -134.0473 256.4551)" class="st1_map-65" cx="94.9" cy="212.9" rx="12.7" ry="11.1"/> + <path class="st15_map-65" d="M101.2,201.1l-13.3,22.1c0,0,2.1,5.4,3.1,3s13.4-22.8,13.4-22.8L101.2,201.1z"/> +</g> +<g id="Trees_map-65"> + <path class="st4_map-65" d="M169,243.2L169,243.2c1.5,0,2.7,1.2,2.7,2.7v9.9c0,1.5-1.2,2.7-2.7,2.7h0c-1.5,0-2.7-1.2-2.7-2.7v-9.9 C166.3,244.4,167.5,243.2,169,243.2z"/> + <circle class="st14_map-65" cx="169" cy="243.2" r="10.3"/> + <path class="st17_map-65" d="M169,232.9c-0.6,0-1.2,0-1.7,0.1c4.2,2.4,6.6,7.1,6,11.9c-0.5,3.7-3,6.9-6.5,8.2c5.5,1.3,11.1-2,12.4-7.6 s-2-11.1-7.6-12.4c-0.1,0-0.3-0.1-0.4-0.1C170.5,233,169.7,232.9,169,232.9L169,232.9z"/> + <path class="st4_map-65" d="M142.2,221.9h1.3c1.5,0,2.7,1.2,2.7,2.7v13.7c0,1.5-1.2,2.7-2.7,2.7h-1.3c-1.5,0-2.7-1.2-2.7-2.7v-13.7 C139.6,223.1,140.7,221.9,142.2,221.9z"/> + <circle class="st14_map-65" cx="142.9" cy="221.9" r="12.8"/> + <path class="st17_map-65" d="M142.9,209.1c-0.7,0-1.4,0.1-2.2,0.2c5.3,3,8.3,8.9,7.6,14.9c-0.6,4.7-3.7,8.6-8.1,10.2 c7,1.3,13.7-3.3,15-10.2c1.2-6.5-2.7-12.9-9-14.8C145.1,209.2,144,209.1,142.9,209.1z"/> + <path class="st4_map-65" d="M166.8,212.7L166.8,212.7c1.5,0,2.7,1.2,2.7,2.7v9.9c0,1.5-1.2,2.7-2.7,2.7h0c-1.5,0-2.7-1.2-2.7-2.7v-9.9 C164.1,213.9,165.3,212.7,166.8,212.7z"/> + <circle class="st14_map-65" cx="166.8" cy="212.7" r="10.3"/> + <path class="st17_map-65" d="M166.8,202.4c-0.6,0-1.2,0.1-1.7,0.2c4.2,2.4,6.6,7.1,6,11.9c-0.5,3.7-3,6.9-6.5,8.2c5.5,1.3,11.1-2,12.4-7.6 c1.3-5.5-2-11.1-7.6-12.4c-0.1,0-0.3-0.1-0.4-0.1C168.3,202.5,167.5,202.4,166.8,202.4L166.8,202.4z"/> +</g> +<g id="Trees-2_map-65"> + <path class="st4_map-65" d="M228.5,297.8h1.4c1.6,0,2.9,1.3,2.9,2.9v41.7c0,1.6-1.3,2.9-2.9,2.9h-1.4c-1.6,0-2.9-1.3-2.9-2.9v-41.7 C225.7,299.1,227,297.8,228.5,297.8z"/> + <path class="st14_map-65" d="M246.9,307.5c-1.6-7.1-9-38.7-22-29.4c-6.6,4.8-8.6,12.2-11.2,19.4c-2.4,6-3.8,12.3-4.1,18.8 c-0.2,13.1,13.2,14.7,23.4,14.7c5.9,0,14.3-3.5,15.7-9.9c0.8-3.9-0.6-8.4-1.4-12.2L246.9,307.5z"/> + <path class="st17_map-65" d="M247.5,308.9l-0.3-1.4c-1.4-6.3-7.4-31.7-17.7-31.1c3.1,13.4,7.6,27.5,5.2,41.2c-0.8,4.8-2.6,9.3-5.5,13.3 c1.4,0,2.7,0.1,4,0.1c5.9,0,14.3-3.5,15.7-9.9C249.8,317.2,248.4,312.6,247.5,308.9z"/> + <path class="st4_map-65" d="M247.1,334.8L247.1,334.8c1.4,0,2.5,1.1,2.5,2.5v28.1c0,1.4-1.1,2.5-2.5,2.5h0c-1.4,0-2.5-1.1-2.5-2.5v-28.1 C244.6,335.9,245.7,334.8,247.1,334.8z"/> + <path class="st14_map-65" d="M259.4,341.5c-1.2-5-6.3-27-15.3-20.5c-4.6,3.3-6,8.5-7.8,13.5c-1.7,4.2-2.6,8.6-2.9,13.1 c-0.1,9.1,9.2,10.3,16.3,10.2c4.1,0,10-2.4,10.9-6.9c0.6-2.7-0.4-5.9-1-8.5L259.4,341.5z"/> + <path class="st17_map-65" d="M259.9,342.5l-0.2-1c-1-4.4-5.1-22.1-12.3-21.7c2.1,9.3,5.3,19.2,3.6,28.8c-0.5,3.3-1.8,6.5-3.8,9.2h2.9 c4.1,0,10-2.5,10.9-6.9C261.4,348.3,260.4,345.2,259.9,342.5z"/> + <path class="st4_map-65" d="M204.6,322.5h1.1c1.6,0,2.9,1.3,2.9,2.9V365c0,1.6-1.3,2.9-2.9,2.9h-1.1c-1.6,0-2.9-1.3-2.9-2.9v-39.6 C201.7,323.8,203,322.5,204.6,322.5z"/> + <path class="st14_map-65" d="M222,331.8c-1.6-6.8-8.6-37-21-28.1c-6.4,4.5-8.2,11.6-10.7,18.6c-2.3,5.7-3.7,11.8-4,18 c-0.2,12.5,12.6,14.1,22.3,14c5.6,0,13.6-3.4,15-9.5c0.8-3.7-0.6-8-1.3-11.6L222,331.8z"/> + <path class="st17_map-65" d="M222.6,333.1l-0.3-1.3c-1.4-6-7-30.3-16.9-29.7c2.9,12.8,7.2,26.3,4.9,39.4c-0.7,4.6-2.5,8.9-5.2,12.7 c1.3,0,2.6,0.1,3.8,0.1c5.6,0,13.7-3.4,15-9.5C224.8,341.1,223.4,336.7,222.6,333.1z"/> +</g> +<g id="Road_Sign-2_map-65"> + <path class="st18_map-65" d="M334.1,275.9l0.2-0.2V217h-7.7v58.7C328.8,277.3,331.8,277.4,334.1,275.9z"/> + <polygon class="st18_map-65" points="330.5,237.1 317.8,244.9 313.3,242.3 315.1,236.6 327.4,229.4 "/> + <polygon class="st4_map-65" points="327.4,230.9 316.3,237.5 314.3,242.9 317.8,244.9 327.2,239.1 "/> + <polyline class="st18_map-65" points="331.3,224.3 341.9,218.7 346.7,221.7 341.9,226.7 334.5,228.4 "/> + <path class="st4_map-65" d="M334.1,275.9l0.2-0.2V217h-3.4v60C332,276.9,333.1,276.5,334.1,275.9z"/> + <polyline class="st4_map-65" points="330.9,226.4 344.1,219.8 346.7,221.7 345.7,225.7 332.9,233 "/> + <ellipse class="st4_map-65" cx="330.5" cy="217.1" rx="3.8" ry="1.9"/> +</g> +</svg> \ No newline at end of file diff --git a/old/static/illustrations/notes.svg b/old/static/illustrations/notes.svg new file mode 100644 index 0000000..92ef315 --- /dev/null +++ b/old/static/illustrations/notes.svg @@ -0,0 +1 @@ +<svg id="_0070_notes" data-name="0070_notes" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 500 500" data-imageid="notes-58" imageName="Notes" class="illustrations_image" style="width: 188px;"><defs><style>.cls-1_notes-58{fill:#faefec;}.cls-14_notes-58,.cls-2_notes-58,.cls-3_notes-58,.cls-4_notes-58{isolation:isolate;}.cls-2_notes-58,.cls-3_notes-58,.cls-4_notes-58{opacity:0.32;}.cls-2_notes-58{fill:url(#linear-gradient);}.cls-3_notes-58{fill:url(#linear-gradient-2-notes-58);}.cls-4_notes-58{fill:url(#linear-gradient-3-notes-58);}.cls-5_notes-58{fill:#ffc3ca;}.cls-6_notes-58{fill:#ff876a;}.cls-7_notes-58{fill:#ffc65a;}.cls-8_notes-58{fill:#68e1fd;}.cls-9_notes-58{fill:#aa6800;}.cls-10_notes-58{fill:#fa8e00;}.cls-11_notes-58{fill:#ff9d27;}.cls-12_notes-58{fill:#ffac99;}.cls-13_notes-58{opacity:0.55;}.cls-14_notes-58{fill:#505a63;opacity:0.52;}</style><linearGradient id="linear-gradient-notes-58" x1="134.14" y1="1856.86" x2="194.86" y2="1896.67" gradientTransform="matrix(1, 0, 0, -1, 0, 2164.63)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#faefec" stop-opacity="0"/><stop offset="0.98" stop-color="#aa6800"/></linearGradient><linearGradient id="linear-gradient-2-notes-58" x1="272.55" y1="1751.44" x2="289.1" y2="1764.47" xlink:href="#linear-gradient-notes-58"/><linearGradient id="linear-gradient-3-notes-58" x1="219.46" y1="1790.53" x2="246.79" y2="1826.16" xlink:href="#linear-gradient-notes-58"/></defs><polygon id="Base_notes-58" class="cls-1_notes-58" points="48.83 291.34 308.63 436.17 451.17 340.66 205.32 205.2 48.83 291.34"/><g id="Shadow_notes-58"><path class="cls-2_notes-58" d="M187.3,259,109,303l28.66,17.12,76.59-43.53C203.89,269.54,196.33,267.7,187.3,259Z"/><path class="cls-3_notes-58" d="M334.71,359.27l-77.54,45.51,18.06,10,76.6-43.53C341.47,364.24,343.68,367.92,334.71,359.27Z"/><path class="cls-4_notes-58" d="M269.47,289l-97.58,61.91,59.05,33.6,81.4-46.2C302,331.27,278.43,297.67,269.47,289Z"/></g><g id="Note_notes-58"><polygon class="cls-5_notes-58" points="451.17 229.1 373.53 185.63 373.53 244.27 451.17 288.96 451.17 229.1"/><polygon class="cls-6_notes-58" points="310.26 175.45 353.83 200.93 353.83 261.26 310.26 235.16 310.26 175.45"/><path class="cls-7_notes-58" d="M315.33,126.73s.11,31.82-5.67,38.15l24.1,14a25.1,25.1,0,0,0,4.87-11c.51-3.59,2.26-27.29,2.26-27.29Z"/><path class="cls-7_notes-58" d="M344.73,143.75s.11,31.83-5.67,38.15l24.1,14a25,25,0,0,0,4.87-11c.58-3.47,2.33-27.27,2.33-27.27Z"/><path class="cls-8_notes-58 targetColor" d="M209.93,68.07l91.75,53s2.1,79.26-20.87,99.63l-90-52.22S213.56,127.58,209.93,68.07Z" style="fill: rgb(255, 255, 255);"/><polygon class="cls-7_notes-58" points="283.36 107.66 292.11 101.6 308.63 147.76 298.18 151.87 283.36 107.66"/><polygon class="cls-7_notes-58" points="203.89 91.52 233.04 71.6 224.05 63.83 200.73 81.31 203.89 91.52"/><polygon class="cls-8_notes-58 targetColor" points="389.21 189.23 389.21 200.92 433.3 224.91 433.3 214.27 389.21 189.23" style="fill: rgb(255, 255, 255);"/><circle class="cls-9_notes-58" cx="358.14" cy="150.42" r="4.06"/><circle class="cls-9_notes-58" cx="327.99" cy="133.25" r="4.06"/></g><g id="Note-2_notes-58" data-name="Note"><path class="cls-7_notes-58" d="M228.11,295.08c.76,1.23,59.64,34.22,59.64,34.22l40.77-22.87L347,295.67l-22.72-13.18c-5.25-3-36.68-21.22-36.68-21.22Z"/><polygon class="cls-10_notes-58" points="287.75 329.28 287.75 352.12 347 317.82 347 295.67 287.75 329.28"/><polygon class="cls-11_notes-58" points="228.11 295.08 228.11 317.87 287.75 352.12 287.75 329.28 228.11 295.08"/><path class="cls-11_notes-58" d="M323.89,282.12s8,11.76,5.4,23.61c0,0,11.06-7.72,14-20.59C343.23,285.07,331.4,285,323.89,282.12Z"/></g><g id="Character_notes-58"><path class="cls-12_notes-58" d="M211.21,142.38s-.64-4.35,0-6a37,37,0,0,0,1-6.36,1.77,1.77,0,0,1,2,1.11c.62,1.4-.66,5.07-.66,5.07s3.61,7.5,0,10.9S211.21,142.38,211.21,142.38Z"/><path class="cls-5_notes-58" d="M187.24,165.79l24-23.39s5.43,11.8,0,17.2l-22,21.87"/><path class="cls-9_notes-58" d="M182.76,262.56s-3.31,4.59-3,7.28,4.49,7.21,5.44,9.13,1.22,2.8,0,4.2-11.53-7.61-11.77-9.05,1.4-7,1.4-7l-4.58,5.8-3.29-2L174,259"/><path class="cls-9_notes-58" d="M184.07,283.25c-.28-.28-8.4-3.11-8.4-3.11s-3.84-4-3.74-5.51,1.51-7.58,2.95-7.52,1.6,8.08,1.6,8.08Z"/><path class="cls-9_notes-58" d="M193.8,270.16l1,12.24s2.64,1.93,3.29,1.76,2.59-.67,2.62-1-.94-8.65-.66-8.86,4.32,6.37,5.6,6.51,11-5.5,10-7.65-5.6-1-7.93-1a8.11,8.11,0,0,1-7.28-5.28"/><path class="cls-6_notes-58" d="M199.93,237l5.92,31.36s-3.41,4.47-15.65,3.91l-9.09-22.22"/><path class="cls-6_notes-58" d="M202.55,187.83s9.13,13.31,6.31,34.87c-2.49,19.11-21.57,41.62-21.57,41.62s-5.7,2.55-17.56-8.65l13.12-20.85s-12.78-29.59,2.31-48.41"/><g class="cls-13_notes-58"><path class="cls-1_notes-58" d="M227.51,159.07c-.65-7.62,2.5-13.89,7.17-14.28s8.82,5.26,9.46,12.88-2.5,14-7.21,14.34S228.15,166.74,227.51,159.07Zm2.53-.21c.51,6,3.59,10.82,6.72,10.56s5.37-5.6,4.86-11.54-3.58-10.82-6.72-10.56-5.37,5.6-4.87,11.6Z"/></g><path class="cls-12_notes-58" d="M228.28,162.28a1.4,1.4,0,0,1,2.66,0V165l.29-.58a39.07,39.07,0,0,0,2.33-7.7c.32-1.71,2.8-.94,2.56.71a27.88,27.88,0,0,1-.81,3.84l.26-.12a1.75,1.75,0,0,1,2.21,1.12l0,.12a2.45,2.45,0,0,1,0,1.26h.2a1.93,1.93,0,0,1,1.24,2.43,2.4,2.4,0,0,1-.27.53,1.81,1.81,0,0,1,.64,1,2.59,2.59,0,0,1-1.13,2.44c-.93.75-1.92,1.75-2.8,2.56-1.1,1.06-2.34,2.13-3.38,3s-2.71-2-2.8-2.92a1.22,1.22,0,0,1-1.54-.78,1.07,1.07,0,0,1-.05-.47A77.26,77.26,0,0,0,228.28,162.28Z"/><path class="cls-9_notes-58" d="M233.6,165.12q.93-2,1.74-4c.11-.28.57-.17.46.12-.54,1.39-1.14,2.76-1.79,4.11C233.88,165.65,233.46,165.4,233.6,165.12Z"/><path class="cls-5_notes-58" d="M201.16,158.43a43.22,43.22,0,0,1,6.16,6.8c1.72,2.8,8.62,10.4,11.47,8.11s7.88-6.67,7.88-6.67,7.18,4.94,6.44,10.1c0,0-6.38,13-16.34,10.16s-12.43-6.64-12.43-6.64l-1.5,8.49s-12.35,3.86-18.07-1.88c0,0-3.77-24.37-1-28"/><path class="cls-12_notes-58" d="M202.53,143.67c.1.28.31,9.13-2.7,10s-8.12-1.26-9.44-4.06.58-11.73,5.31-12.25S201.69,141.09,202.53,143.67Z"/><path class="cls-9_notes-58" d="M198.89,145.31c-2,1.4-.73,3.89.12,5.53a8.51,8.51,0,0,1,.88,4,5.25,5.25,0,0,0,1.29,3.56,14.88,14.88,0,0,1,1.68,2.68,39.8,39.8,0,0,1-13.29.17,101,101,0,0,1-10.82-1.4,6.53,6.53,0,0,1,.51-2.22c.86-1.95,2.26-3,1.92-5.3a10.77,10.77,0,0,1-.08-5.26c.64-1.81,2.17-2.65,3.62-3.71a8.45,8.45,0,0,0,1.19-1l.31-.51a25.91,25.91,0,0,1,2.68-4.54,7.89,7.89,0,0,1,4.28-2.2,12.8,12.8,0,0,1,9.8,2.24s2.58,2.48,1.76,5.14S200.67,144.1,198.89,145.31Z"/><path class="cls-9_notes-58" d="M201.16,243.49s-10.44,18.09-13.86,20.83l2.91,7.95S202.34,255.25,201.16,243.49Z"/><path class="cls-9_notes-58" d="M183,233.8a56.86,56.86,0,0,0,5.45-22.48.48.48,0,0,1,1,0,58.07,58.07,0,0,1-5.6,23C183.61,234.85,182.76,234.36,183,233.8Z"/></g><g id="Pencil_notes-58"><polyline class="cls-7_notes-58" points="382.19 333.19 407.24 329.28 385.44 351.5"/><ellipse class="cls-8_notes-58 targetColor" cx="382.2" cy="342.82" rx="7.43" ry="9.65" style="fill: rgb(255, 255, 255);"/><polygon class="cls-8_notes-58 targetColor" points="297.1 402.31 385.44 351.5 379.41 333.89 290.76 384.89 297.1 402.31" style="fill: rgb(255, 255, 255);"/><ellipse class="cls-8_notes-58 targetColor" cx="294.21" cy="393.43" rx="7.43" ry="9.65" style="fill: rgb(255, 255, 255);"/><ellipse class="cls-14_notes-58" cx="294.21" cy="393.43" rx="7.43" ry="9.65"/><path class="cls-9_notes-58" d="M407.24,329.28l-9.46,1.47s3.54,1.19,2.52,5.6Z"/></g></svg> \ No newline at end of file diff --git a/old/static/img/favicon.webp b/old/static/img/favicon.webp new file mode 100644 index 0000000..b825c3d Binary files /dev/null and b/old/static/img/favicon.webp differ diff --git a/old/static/img/logo.webp b/old/static/img/logo.webp new file mode 100644 index 0000000..258d7ab Binary files /dev/null and b/old/static/img/logo.webp differ diff --git a/old/static/img/undraw_docusaurus_mountain.svg b/old/static/img/undraw_docusaurus_mountain.svg new file mode 100644 index 0000000..af961c4 --- /dev/null +++ b/old/static/img/undraw_docusaurus_mountain.svg @@ -0,0 +1,171 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="1088" height="687.962" viewBox="0 0 1088 687.962"> + <title>Easy to Use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/old/static/img/undraw_docusaurus_react.svg b/old/static/img/undraw_docusaurus_react.svg new file mode 100644 index 0000000..94b5cf0 --- /dev/null +++ b/old/static/img/undraw_docusaurus_react.svg @@ -0,0 +1,170 @@ + + Powered by React + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/old/static/img/undraw_docusaurus_tree.svg b/old/static/img/undraw_docusaurus_tree.svg new file mode 100644 index 0000000..d9161d3 --- /dev/null +++ b/old/static/img/undraw_docusaurus_tree.svg @@ -0,0 +1,40 @@ + + Focus on What Matters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/old/static/manifest.json b/old/static/manifest.json new file mode 100644 index 0000000..5740903 --- /dev/null +++ b/old/static/manifest.json @@ -0,0 +1,93 @@ +{ + "name": "Synthèses et ressources pour développeurs | Memento Dev", + "lang": "fr", + "description": "Découvrez des synthèses et ressources open-source dans le développement informatique, rédigées par une communauté de développeurs.", + "orientation": "any", + "short_name": "Memento Dev", + "start_url": "/", + "display": "standalone", + "background_color": "#f8f6fb", + "theme_color": "#7c3aed", + "icons": [ + { + "src": "/icons/icon-72x72.png", + "sizes": "72x72", + "type": "image/png" + }, + { + "src": "/icons/icon-72x72.webp", + "sizes": "72x72", + "type": "image/webp" + }, + { + "src": "/icons/icon-96x96.png", + "sizes": "96x96", + "type": "image/png" + }, + { + "src": "/icons/icon-96x96.webp", + "sizes": "96x96", + "type": "image/webp" + }, + { + "src": "/icons/icon-128x128.png", + "sizes": "128x128", + "type": "image/png" + }, + { + "src": "/icons/icon-128x128.webp", + "sizes": "128x128", + "type": "image/webp" + }, + { + "src": "/icons/icon-144x144.png", + "sizes": "144x144", + "type": "image/png" + }, + { + "src": "/icons/icon-144x144.webp", + "sizes": "144x144", + "type": "image/webp" + }, + { + "src": "/icons/icon-152x152.png", + "sizes": "152x152", + "type": "image/png" + }, + { + "src": "/icons/icon-152x152.webp", + "sizes": "152x152", + "type": "image/webp" + }, + { + "src": "/icons/icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/icons/icon-192x192.webp", + "sizes": "192x192", + "type": "image/webp" + }, + { + "src": "/icons/icon-384x384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "/icons/icon-384x384.webp", + "sizes": "384x384", + "type": "image/webp" + }, + { + "src": "/icons/icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "/icons/icon-512x512.webp", + "sizes": "512x512", + "type": "image/webp" + } + ] +} diff --git a/old/static/merise/mcd.webp b/old/static/merise/mcd.webp new file mode 100644 index 0000000..07f5726 Binary files /dev/null and b/old/static/merise/mcd.webp differ diff --git a/old/static/merise/mld.webp b/old/static/merise/mld.webp new file mode 100644 index 0000000..5c62b77 Binary files /dev/null and b/old/static/merise/mld.webp differ diff --git a/old/tailwind.config.js b/old/tailwind.config.js new file mode 100644 index 0000000..e9fbeed --- /dev/null +++ b/old/tailwind.config.js @@ -0,0 +1,19 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./src/**/*.{js,jsx,ts,tsx,md,mdx}", + "./docs/**/*.{md,mdx}", + "./docusaurus.config.ts", + ], + theme: { + extend: { + fontFamily: { + sans: ["Luciole", "sans-serif"], + code: ["Fira Code", "monospace"], + }, + }, + }, + darkMode: ["class", "[data-theme='dark']"], + plugins: [], + blocklist: ["container"], +}; diff --git a/old/tsconfig.json b/old/tsconfig.json new file mode 100644 index 0000000..314eab8 --- /dev/null +++ b/old/tsconfig.json @@ -0,0 +1,7 @@ +{ + // This file is not used in compilation. It is here just for a nice editor experience. + "extends": "@docusaurus/tsconfig", + "compilerOptions": { + "baseUrl": "." + } +} diff --git a/pnpm.Dockerfile b/pnpm.Dockerfile new file mode 100644 index 0000000..14c5f67 --- /dev/null +++ b/pnpm.Dockerfile @@ -0,0 +1,15 @@ +FROM node:22-alpine + +WORKDIR /app + +# COPY ./app/package.json ./app/pnpm-lock.yaml /app/ + +RUN mkdir -p /app +RUN npm install -g pnpm + +RUN chmod -R 775 /app + +EXPOSE 3000 + +ENTRYPOINT [ "pnpm" ] +CMD [ "sh", "-c", "if [ \"$NODE_ENV\" = 'production' ]; then pnpm i -P false && pnpm build && pnpm preview; else pnpm dev; fi" ] \ No newline at end of file