Mamadou DICKO 2023-11-02 19:20:07 +01:00 committed by GitHub
parent 8a8e3d1a65
commit 867904f19d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 607 additions and 21 deletions

View File

@ -0,0 +1,63 @@
{
"kind": "singleType",
"collectionName": "notification_banners",
"info": {
"singularName": "notification-banner",
"pluralName": "notification-banners",
"displayName": "Notification banner"
},
"options": {
"draftAndPublish": true
},
"pluginOptions": {
"i18n": {
"localized": true
}
},
"attributes": {
"notification_id": {
"pluginOptions": {
"i18n": {
"localized": true
}
},
"type": "uid",
"required": true
},
"text": {
"pluginOptions": {
"i18n": {
"localized": true
}
},
"type": "richtext",
"required": true
},
"dismissible": {
"pluginOptions": {
"i18n": {
"localized": false
}
},
"type": "boolean",
"default": true
},
"isSticky": {
"pluginOptions": {
"i18n": {
"localized": false
}
},
"type": "boolean",
"default": true
},
"style": {
"pluginOptions": {
"i18n": {
"localized": false
}
},
"type": "json"
}
}
}

View File

@ -0,0 +1,9 @@
'use strict';
/**
* notification-banner controller
*/
const { createCoreController } = require('@strapi/strapi').factories;
module.exports = createCoreController('api::notification-banner.notification-banner');

View File

@ -0,0 +1,9 @@
'use strict';
/**
* notification-banner router
*/
const { createCoreRouter } = require('@strapi/strapi').factories;
module.exports = createCoreRouter('api::notification-banner.notification-banner');

View File

@ -0,0 +1,9 @@
'use strict';
/**
* notification-banner service
*/
const { createCoreService } = require('@strapi/strapi').factories;
module.exports = createCoreService('api::notification-banner.notification-banner');

View File

@ -799,6 +799,81 @@ export interface ApiDiscussionDiscussion extends Schema.CollectionType {
};
}
export interface ApiNotificationBannerNotificationBanner
extends Schema.SingleType {
collectionName: 'notification_banners';
info: {
singularName: 'notification-banner';
pluralName: 'notification-banners';
displayName: 'Notification banner';
};
options: {
draftAndPublish: true;
};
pluginOptions: {
i18n: {
localized: true;
};
};
attributes: {
notification_id: Attribute.UID &
Attribute.Required &
Attribute.SetPluginOptions<{
i18n: {
localized: true;
};
}>;
text: Attribute.RichText &
Attribute.Required &
Attribute.SetPluginOptions<{
i18n: {
localized: true;
};
}>;
dismissible: Attribute.Boolean &
Attribute.SetPluginOptions<{
i18n: {
localized: false;
};
}> &
Attribute.DefaultTo<true>;
isSticky: Attribute.Boolean &
Attribute.SetPluginOptions<{
i18n: {
localized: false;
};
}> &
Attribute.DefaultTo<true>;
style: Attribute.JSON &
Attribute.SetPluginOptions<{
i18n: {
localized: false;
};
}>;
createdAt: Attribute.DateTime;
updatedAt: Attribute.DateTime;
publishedAt: Attribute.DateTime;
createdBy: Attribute.Relation<
'api::notification-banner.notification-banner',
'oneToOne',
'admin::user'
> &
Attribute.Private;
updatedBy: Attribute.Relation<
'api::notification-banner.notification-banner',
'oneToOne',
'admin::user'
> &
Attribute.Private;
localizations: Attribute.Relation<
'api::notification-banner.notification-banner',
'oneToMany',
'api::notification-banner.notification-banner'
>;
locale: Attribute.String;
};
}
export interface ApiSecurityQuestionSecurityQuestion
extends Schema.CollectionType {
collectionName: 'security_questions';
@ -1013,6 +1088,7 @@ declare module '@strapi/types' {
'api::blog.blog': ApiBlogBlog;
'api::demo-video.demo-video': ApiDemoVideoDemoVideo;
'api::discussion.discussion': ApiDiscussionDiscussion;
'api::notification-banner.notification-banner': ApiNotificationBannerNotificationBanner;
'api::security-question.security-question': ApiSecurityQuestionSecurityQuestion;
'api::testimonial.testimonial': ApiTestimonialTestimonial;
'api::use-case.use-case': ApiUseCaseUseCase;

View File

@ -11,22 +11,24 @@ const SelectedChatPage = (): JSX.Element => {
const { shouldDisplayFeedCard } = useKnowledgeToFeedContext();
return (
<div
className={`flex flex-col flex-1 items-center justify-stretch w-full h-fill-available overflow-hidden ${
shouldDisplayFeedCard ? "bg-chat-bg-gray" : "bg-white"
} dark:bg-black transition-colors ease-out duration-500`}
data-testid="chat-page"
{...getRootProps()}
>
<>
<div
className={`flex flex-col flex-1 w-full max-w-5xl h-full dark:shadow-primary/25 overflow-hidden p-2 sm:p-4 md:p-6 lg:p-8`}
className={`flex flex-col flex-1 items-center justify-stretch w-full h-full overflow-hidden ${
shouldDisplayFeedCard ? "bg-chat-bg-gray" : "bg-white"
} dark:bg-black transition-colors ease-out duration-500`}
data-testid="chat-page"
{...getRootProps()}
>
<div className="flex flex-1 flex-col overflow-y-auto">
<ChatDialogueArea />
<div
className={`flex flex-col flex-1 w-full max-w-5xl h-full dark:shadow-primary/25 overflow-hidden p-2 sm:p-4 md:p-6 lg:p-8`}
>
<div className="flex flex-1 flex-col overflow-y-auto">
<ChatDialogueArea />
</div>
<ActionsBar />
</div>
<ActionsBar />
</div>
</div>
</>
);
};

View File

@ -0,0 +1,47 @@
import { Fragment } from "react";
import { MdClose } from "react-icons/md";
import ReactMarkdown from "react-markdown";
import rehypeRaw from "rehype-raw";
import Button from "@/lib/components/ui/Button";
import { useNotificationBanner } from "./hooks/useNotificationBanner";
export const NotificationBanner = (): JSX.Element => {
const { notificationBanner, isDismissed, dismissNotification } =
useNotificationBanner();
if (isDismissed || notificationBanner === undefined) {
return <Fragment />;
}
return (
<div
style={{
position: "relative",
display: "flex",
alignItems: "center",
justifyContent: "center",
...notificationBanner.style,
}}
>
<ReactMarkdown
rehypePlugins={[
//@ts-expect-error bad typing from rehype-raw
rehypeRaw,
]}
>
{notificationBanner.text}
</ReactMarkdown>
{Boolean(notificationBanner.dismissible) && (
<Button
variant="tertiary"
onClick={dismissNotification}
className="right-2 p-0 absolute bg-white hover:bg-gray-300"
>
<MdClose size={20} />
</Button>
)}
</div>
);
};

View File

@ -0,0 +1,60 @@
import { useQuery } from "@tanstack/react-query";
import { useCallback, useEffect, useState } from "react";
import { NOTIFICATION_BANNER_DATA_KEY } from "@/lib/api/cms/config";
import { useCmsApi } from "@/lib/api/cms/useCmsApi";
import {
clearLocalStorageNotificationBanner,
getNotificationFromLocalStorage,
setNotificationAsDismissedInLocalStorage,
} from "../utils";
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export const useNotificationBanner = () => {
const [isDismissed, setIsDismissed] = useState(true);
const { getNotificationBanner } = useCmsApi();
const { data: notificationBanner } = useQuery({
queryKey: [NOTIFICATION_BANNER_DATA_KEY],
queryFn: getNotificationBanner,
});
const dismissNotification = useCallback(() => {
if (notificationBanner?.id === undefined) {
return;
}
setNotificationAsDismissedInLocalStorage(notificationBanner.id);
setIsDismissed(true);
}, [notificationBanner?.id]);
useEffect(() => {
const localStorageNotificationBanner = getNotificationFromLocalStorage();
if (notificationBanner === undefined) {
return;
}
if (localStorageNotificationBanner?.id !== notificationBanner.id) {
clearLocalStorageNotificationBanner();
setIsDismissed(false);
}
}, [dismissNotification, notificationBanner?.id]);
useEffect(() => {
const onUnmount = () => {
if (notificationBanner?.isSticky === undefined) {
return;
}
if (!notificationBanner.isSticky) {
dismissNotification();
}
};
return onUnmount;
}, [dismissNotification, notificationBanner?.isSticky]);
return {
notificationBanner,
dismissNotification,
isDismissed,
};
};

View File

@ -0,0 +1 @@
export * from "./NotificationBanner";

View File

@ -0,0 +1,33 @@
const notificationsLocalStorageKey = "homepage-notifications";
type LocalStorageNotification = {
isDismissed: boolean;
id: string;
};
export const getNotificationFromLocalStorage = ():
| LocalStorageNotification
| undefined => {
const notifications = localStorage.getItem(notificationsLocalStorageKey);
if (notifications !== null) {
return JSON.parse(notifications) as LocalStorageNotification;
}
return undefined;
};
export const setNotificationAsDismissedInLocalStorage = (id: string): void => {
const notificationPayload: LocalStorageNotification = {
isDismissed: true,
id,
};
localStorage.setItem(
notificationsLocalStorageKey,
JSON.stringify(notificationPayload)
);
};
export const clearLocalStorageNotificationBanner = (): void => {
localStorage.removeItem(notificationsLocalStorageKey);
};

View File

@ -1 +1,2 @@
export * from "./ChatsList";
export * from "./NotificationBanner";

View File

@ -6,7 +6,7 @@ import { ChatsProvider } from "@/lib/context/ChatsProvider/chats-provider";
import { useSupabase } from "@/lib/context/SupabaseProvider";
import { redirectToLogin } from "@/lib/router/redirectToLogin";
import { ChatsList } from "./components/ChatsList";
import { ChatsList, NotificationBanner } from "./components";
interface LayoutProps {
children?: ReactNode;
@ -23,6 +23,7 @@ const Layout = ({ children }: LayoutProps): JSX.Element => {
<KnowledgeToFeedProvider>
<ChatsProvider>
<ChatProvider>
<NotificationBanner />
<div className="relative h-full w-full flex justify-stretch items-stretch">
<ChatsList />
{children}

View File

@ -36,7 +36,7 @@ const RootLayout = async ({
return (
<html lang="en">
<body
className={`bg-white text-black min-h-screen flex flex-col dark:bg-black dark:text-white w-full ${inter.className}`}
className={`bg-white text-black h-screen flex flex-col dark:bg-black dark:text-white w-full ${inter.className}`}
>
<FeatureFlagsProvider>
<ToastProvider>

View File

@ -84,7 +84,6 @@ const UserPage = (): JSX.Element => {
<ApiKeyConfig />
</CardBody>
</Card>
L
</main>
</>
);

View File

@ -2,3 +2,4 @@ export const TESTIMONIALS_DATA_KEY = "testimonials";
export const USE_CASES_DATA_KEY = "useCases";
export const DEMO_VIDEO_DATA_KEY = "demoVideo";
export const SECURITY_QUESTIONS_DATA_KEY = "securityQuestions";
export const NOTIFICATION_BANNER_DATA_KEY = "notificationBanner";

View File

@ -2,10 +2,11 @@ import axios from "axios";
import { DEFAULT_CMS_URL } from "@/lib/config/CONSTANTS";
import { getDemoVideoUrl } from "./demoVideo";
import { getSecurityQuestions } from "./securityQuestion";
import { getTestimonials } from "./testimonials";
import { getUseCases } from "./useCases";
import { getDemoVideoUrl } from "./utils/demoVideo";
import { getNotificationBanner } from "./utils/notificationBanner";
import { getSecurityQuestions } from "./utils/securityQuestion";
import { getTestimonials } from "./utils/testimonials";
import { getUseCases } from "./utils/useCases";
const axiosInstance = axios.create({
baseURL: `${process.env.NEXT_PUBLIC_CMS_URL ?? DEFAULT_CMS_URL}`,
@ -18,5 +19,6 @@ export const useCmsApi = () => {
getUseCases: () => getUseCases(axiosInstance),
getDemoVideoUrl: () => getDemoVideoUrl(axiosInstance),
getSecurityQuestions: () => getSecurityQuestions(axiosInstance),
getNotificationBanner: () => getNotificationBanner(axiosInstance),
};
};

View File

@ -0,0 +1,35 @@
import { AxiosInstance } from "axios";
import { NotificationBanner } from "@/lib/types/NotificationBanner";
type CmsNotificationBanner = {
data: {
attributes: {
text: string;
notification_id: string;
style?: Record<string, string>;
dismissible?: boolean;
isSticky?: boolean;
};
};
};
const mapCmsNotificationBannerToNotificationBanner = (
cmsNotificationBanner: CmsNotificationBanner
): NotificationBanner => ({
text: cmsNotificationBanner.data.attributes.text,
id: cmsNotificationBanner.data.attributes.notification_id,
style: cmsNotificationBanner.data.attributes.style,
dismissible: cmsNotificationBanner.data.attributes.dismissible,
isSticky: cmsNotificationBanner.data.attributes.isSticky,
});
export const getNotificationBanner = async (
axiosInstance: AxiosInstance
): Promise<NotificationBanner> => {
const response = await axiosInstance.get<CmsNotificationBanner>(
"/api/notification-banner"
);
return mapCmsNotificationBannerToNotificationBanner(response.data);
};

View File

@ -42,7 +42,7 @@ export const Sidebar = ({
setOpen(false);
}
}}
className="flex flex-col fixed sm:sticky top-0 left-0 h-fill-available overflow-visible z-30 border-r border-black/10 dark:border-white/25 bg-white dark:bg-black"
className="flex flex-col fixed sm:sticky top-0 left-0 h-full overflow-visible z-30 border-r border-black/10 dark:border-white/25 bg-white dark:bg-black"
>
{!open && (
<button

View File

@ -0,0 +1,9 @@
import { HTMLAttributes } from "react";
export type NotificationBanner = {
id: string;
text: string;
style?: HTMLAttributes<HTMLDivElement>["style"];
dismissible?: boolean;
isSticky?: boolean;
};

View File

@ -79,6 +79,7 @@
"react-markdown": "^8.0.7",
"react-use": "^17.4.0",
"rehype-highlight": "^6.0.0",
"rehype-raw": "^7.0.0",
"sharp": "^0.32.4",
"tailwind-merge": "^1.12.0",
"tailwindcss": "3.3.2",

View File

@ -2475,6 +2475,13 @@
dependencies:
"@types/unist" "^2"
"@types/hast@^3.0.0":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.2.tgz#e6c1126a33955cb9493a5074ddf1873fb48248c7"
integrity sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==
dependencies:
"@types/unist" "*"
"@types/js-cookie@^2.2.6":
version "2.2.7"
resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz"
@ -2502,6 +2509,13 @@
dependencies:
"@types/unist" "^2"
"@types/mdast@^4.0.0":
version "4.0.2"
resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.2.tgz#4695661024ffbd9e52cf71e05c69a1f08c0792f6"
integrity sha512-tYR83EignvhYO9iU3kDg8V28M0jqyh9zzp5GV+EO+AYnyUl3P5ltkTeJuTiFZQFz670FSb3EwT/6LQdX+UdKfw==
dependencies:
"@types/unist" "*"
"@types/ms@*":
version "0.7.31"
resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
@ -2565,6 +2579,11 @@
resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz"
integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==
"@types/unist@*", "@types/unist@^3.0.0":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.1.tgz#778652d02ddec1bfc9e5e938fec8d407b8e56cba"
integrity sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg==
"@types/unist@^2", "@types/unist@^2.0.0":
version "2.0.7"
resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz"
@ -2661,6 +2680,11 @@
"@typescript-eslint/types" "5.62.0"
eslint-visitor-keys "^3.3.0"
"@ungap/structured-clone@^1.0.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
"@vercel/analytics@^1.0.1":
version "1.0.1"
resolved "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.1.tgz"
@ -3620,6 +3644,13 @@ detect-node-es@^1.1.0:
resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz"
integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==
devlop@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018"
integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==
dependencies:
dequal "^2.0.0"
didyoumean@^1.2.2:
version "1.2.2"
resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz"
@ -4612,6 +4643,20 @@ has@^1.0.3:
dependencies:
function-bind "^1.1.1"
hast-util-from-parse5@^8.0.0:
version "8.0.1"
resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651"
integrity sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==
dependencies:
"@types/hast" "^3.0.0"
"@types/unist" "^3.0.0"
devlop "^1.0.0"
hastscript "^8.0.0"
property-information "^6.0.0"
vfile "^6.0.0"
vfile-location "^5.0.0"
web-namespaces "^2.0.0"
hast-util-is-element@^2.0.0:
version "2.1.3"
resolved "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz"
@ -4620,6 +4665,45 @@ hast-util-is-element@^2.0.0:
"@types/hast" "^2.0.0"
"@types/unist" "^2.0.0"
hast-util-parse-selector@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27"
integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==
dependencies:
"@types/hast" "^3.0.0"
hast-util-raw@^9.0.0:
version "9.0.1"
resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.0.1.tgz#2ba8510e4ed2a1e541cde2a4ebb5c38ab4c82c2d"
integrity sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==
dependencies:
"@types/hast" "^3.0.0"
"@types/unist" "^3.0.0"
"@ungap/structured-clone" "^1.0.0"
hast-util-from-parse5 "^8.0.0"
hast-util-to-parse5 "^8.0.0"
html-void-elements "^3.0.0"
mdast-util-to-hast "^13.0.0"
parse5 "^7.0.0"
unist-util-position "^5.0.0"
unist-util-visit "^5.0.0"
vfile "^6.0.0"
web-namespaces "^2.0.0"
zwitch "^2.0.0"
hast-util-to-parse5@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed"
integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==
dependencies:
"@types/hast" "^3.0.0"
comma-separated-tokens "^2.0.0"
devlop "^1.0.0"
property-information "^6.0.0"
space-separated-tokens "^2.0.0"
web-namespaces "^2.0.0"
zwitch "^2.0.0"
hast-util-to-text@^3.0.0:
version "3.1.2"
resolved "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz"
@ -4635,6 +4719,17 @@ hast-util-whitespace@^2.0.0:
resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557"
integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==
hastscript@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-8.0.0.tgz#4ef795ec8dee867101b9f23cc830d4baf4fd781a"
integrity sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==
dependencies:
"@types/hast" "^3.0.0"
comma-separated-tokens "^2.0.0"
hast-util-parse-selector "^4.0.0"
property-information "^6.0.0"
space-separated-tokens "^2.0.0"
highlight.js@~11.8.0:
version "11.8.0"
resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz"
@ -4661,6 +4756,11 @@ html-parse-stringify@^3.0.1:
dependencies:
void-elements "3.1.0"
html-void-elements@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7"
integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==
http-proxy-agent@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz"
@ -5362,6 +5462,20 @@ mdast-util-to-hast@^12.1.0:
unist-util-position "^4.0.0"
unist-util-visit "^4.0.0"
mdast-util-to-hast@^13.0.0:
version "13.0.2"
resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz#74c0a9f014bb2340cae6118f6fccd75467792be7"
integrity sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==
dependencies:
"@types/hast" "^3.0.0"
"@types/mdast" "^4.0.0"
"@ungap/structured-clone" "^1.0.0"
devlop "^1.0.0"
micromark-util-sanitize-uri "^2.0.0"
trim-lines "^3.0.0"
unist-util-position "^5.0.0"
unist-util-visit "^5.0.0"
mdast-util-to-string@^3.1.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789"
@ -5461,6 +5575,14 @@ micromark-util-character@^1.0.0:
micromark-util-symbol "^1.0.0"
micromark-util-types "^1.0.0"
micromark-util-character@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.0.1.tgz#52b824c2e2633b6fb33399d2ec78ee2a90d6b298"
integrity sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==
dependencies:
micromark-util-symbol "^2.0.0"
micromark-util-types "^2.0.0"
micromark-util-chunked@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b"
@ -5507,6 +5629,11 @@ micromark-util-encode@^1.0.0:
resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5"
integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==
micromark-util-encode@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1"
integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==
micromark-util-html-tag-name@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588"
@ -5535,6 +5662,15 @@ micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0:
micromark-util-encode "^1.0.0"
micromark-util-symbol "^1.0.0"
micromark-util-sanitize-uri@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de"
integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==
dependencies:
micromark-util-character "^2.0.0"
micromark-util-encode "^2.0.0"
micromark-util-symbol "^2.0.0"
micromark-util-subtokenize@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1"
@ -5550,11 +5686,21 @@ micromark-util-symbol@^1.0.0:
resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142"
integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==
micromark-util-symbol@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044"
integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==
micromark-util-types@^1.0.0, micromark-util-types@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283"
integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==
micromark-util-types@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e"
integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==
micromark@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9"
@ -6005,7 +6151,7 @@ parse-json@^5.0.0:
json-parse-even-better-errors "^2.3.0"
lines-and-columns "^1.1.6"
parse5@^7.1.2:
parse5@^7.0.0, parse5@^7.1.2:
version "7.1.2"
resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz"
integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==
@ -6519,6 +6665,15 @@ rehype-highlight@^6.0.0:
unified "^10.0.0"
unist-util-visit "^4.0.0"
rehype-raw@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4"
integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==
dependencies:
"@types/hast" "^3.0.0"
hast-util-raw "^9.0.0"
vfile "^6.0.0"
remark-parse@^10.0.0:
version "10.0.2"
resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262"
@ -7421,6 +7576,13 @@ unist-util-is@^5.0.0:
dependencies:
"@types/unist" "^2.0.0"
unist-util-is@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424"
integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==
dependencies:
"@types/unist" "^3.0.0"
unist-util-position@^4.0.0:
version "4.0.4"
resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037"
@ -7428,6 +7590,13 @@ unist-util-position@^4.0.0:
dependencies:
"@types/unist" "^2.0.0"
unist-util-position@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4"
integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==
dependencies:
"@types/unist" "^3.0.0"
unist-util-stringify-position@^3.0.0:
version "3.0.3"
resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz"
@ -7435,6 +7604,13 @@ unist-util-stringify-position@^3.0.0:
dependencies:
"@types/unist" "^2.0.0"
unist-util-stringify-position@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2"
integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==
dependencies:
"@types/unist" "^3.0.0"
unist-util-visit-parents@^5.1.1:
version "5.1.3"
resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz"
@ -7443,6 +7619,14 @@ unist-util-visit-parents@^5.1.1:
"@types/unist" "^2.0.0"
unist-util-is "^5.0.0"
unist-util-visit-parents@^6.0.0:
version "6.0.1"
resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815"
integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==
dependencies:
"@types/unist" "^3.0.0"
unist-util-is "^6.0.0"
unist-util-visit@^4.0.0:
version "4.1.2"
resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz"
@ -7452,6 +7636,15 @@ unist-util-visit@^4.0.0:
unist-util-is "^5.0.0"
unist-util-visit-parents "^5.1.1"
unist-util-visit@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6"
integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==
dependencies:
"@types/unist" "^3.0.0"
unist-util-is "^6.0.0"
unist-util-visit-parents "^6.0.0"
universalify@^0.2.0:
version "0.2.0"
resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz"
@ -7522,6 +7715,14 @@ uvu@^0.5.0:
kleur "^4.0.3"
sade "^1.7.3"
vfile-location@^5.0.0:
version "5.0.2"
resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.2.tgz#220d9ca1ab6f8b2504a4db398f7ebc149f9cb464"
integrity sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==
dependencies:
"@types/unist" "^3.0.0"
vfile "^6.0.0"
vfile-message@^3.0.0:
version "3.1.4"
resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz"
@ -7530,6 +7731,14 @@ vfile-message@^3.0.0:
"@types/unist" "^2.0.0"
unist-util-stringify-position "^3.0.0"
vfile-message@^4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181"
integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==
dependencies:
"@types/unist" "^3.0.0"
unist-util-stringify-position "^4.0.0"
vfile@^5.0.0:
version "5.3.7"
resolved "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz"
@ -7540,6 +7749,15 @@ vfile@^5.0.0:
unist-util-stringify-position "^3.0.0"
vfile-message "^3.0.0"
vfile@^6.0.0:
version "6.0.1"
resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.1.tgz#1e8327f41eac91947d4fe9d237a2dd9209762536"
integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==
dependencies:
"@types/unist" "^3.0.0"
unist-util-stringify-position "^4.0.0"
vfile-message "^4.0.0"
victory-area@^36.6.11:
version "36.6.11"
resolved "https://registry.npmjs.org/victory-area/-/victory-area-36.6.11.tgz"
@ -7946,6 +8164,11 @@ watchpack@2.4.0:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
web-namespaces@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692"
integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz"
@ -8107,3 +8330,8 @@ zod@3.21.4:
version "3.21.4"
resolved "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz"
integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==
zwitch@^2.0.0:
version "2.0.4"
resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7"
integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==