From cecae298b735873114a5b0bdc7057e56083d98ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= Date: Tue, 7 May 2024 14:34:19 +0200 Subject: [PATCH 01/34] feat: adding first version of embeddable docs --- apps/web/package.json | 6 +- apps/web/src/AppRoutes.tsx | 2 + apps/web/src/pages/docs/DocsPage.tsx | 156 ++++ apps/web/src/pages/docs/Highlight.tsx | 26 + pnpm-lock.yaml | 1212 +++++++++++++++++-------- 5 files changed, 1025 insertions(+), 377 deletions(-) create mode 100644 apps/web/src/pages/docs/DocsPage.tsx create mode 100644 apps/web/src/pages/docs/Highlight.tsx diff --git a/apps/web/package.json b/apps/web/package.json index 77d69a6c834..13ed3117d79 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -129,7 +129,9 @@ "uniqid": "^5.3.0", "uuid": "8.3.2", "web-vitals": "^1.0.1", - "zod": "^3.22.4" + "zod": "^3.22.4", + "highlight.js": "11.9.0", + "mdx-bundler": "10.0.2" }, "optionalDependencies": { "@novu/ee-billing-web": "^0.24.2", @@ -207,4 +209,4 @@ } ] } -} +} \ No newline at end of file diff --git a/apps/web/src/AppRoutes.tsx b/apps/web/src/AppRoutes.tsx index e253788d20e..16bf339d36d 100644 --- a/apps/web/src/AppRoutes.tsx +++ b/apps/web/src/AppRoutes.tsx @@ -13,6 +13,7 @@ import SignUpPage from './pages/auth/SignUpPage'; import { BrandPage } from './pages/brand/BrandPage'; import { BrandingForm, LayoutsListPage } from './pages/brand/tabs'; import { PromoteChangesPage } from './pages/changes/PromoteChangesPage'; +import { DocsPage } from './pages/docs/DocsPage'; import { GetStartedPage } from './pages/get-started/GetStartedPage'; import HomePage from './pages/HomePage'; import { SelectProviderPage } from './pages/integrations/components/SelectProviderPage'; @@ -127,6 +128,7 @@ export const AppRoutes = () => { )} } /> + } /> } /> diff --git a/apps/web/src/pages/docs/DocsPage.tsx b/apps/web/src/pages/docs/DocsPage.tsx new file mode 100644 index 00000000000..1a439496de3 --- /dev/null +++ b/apps/web/src/pages/docs/DocsPage.tsx @@ -0,0 +1,156 @@ +import { PageContainer, Tabs, Text, Title, Tooltip } from '@novu/design-system'; +import { Accordion, Alert, Grid, Paper, Stack } from '@mantine/core'; +import { useEffect, useMemo } from 'react'; +import { Link, useParams } from 'react-router-dom'; +import * as mdxBundler from 'mdx-bundler/client'; +import { Highlight } from './Highlight'; +import { useQuery } from '@tanstack/react-query'; +import { useSegment } from '@novu/shared-web'; + +const getMDXComponent = mdxBundler.getMDXComponent; + +export const DocsPage = () => { + const params = useParams(); + const segment = useSegment(); + const path = useMemo(() => params['*'], [params]); + + const { isLoading, data: { code } = { code: '' } } = useQuery(['docs', path], async () => { + const response = await fetch('http://localhost:5173/' + path); + const json = await response.json(); + + return json; + }); + + useEffect(() => { + segment.track('Open Inline Documentation', { + documentationPage: path, + }); + }, [path, segment]); + + const Component = useMemo(() => { + if (code.length === 0) { + return null; + } + + return getMDXComponent(code); + }, [code]); + + if (isLoading || Component === null) { + return null; + } + + return ( + + + { + return ( +
+ + + {props.caption} + +
+ ); + }, + Info: ({ className, ...props }: any) => { + return ; + }, + Snippet: () => { + return null; + }, + Warning: ({ className, ...props }: any) => { + return ; + }, + Note: ({ className, ...props }: any) => { + return ; + }, + CardGroup: ({ className, ...props }: any) => { + return ( + + {props.children} + + ); + }, + AccordionGroup: ({ className, ...props }: any) => { + return ; + }, + Tab: () => null, + Tabs: ({ className, ...props }: any) => { + const children = Array.isArray(props.children) ? props.children : [props.children]; + + return ( + { + return { + content: tab.props.children, + value: tab.props.title, + }; + })} + defaultValue={children[0].props.title} + /> + ); + }, + Tip: ({ className, ...props }: any) => { + return ; + }, + Tooltip: ({ className, ...props }: any) => { + return ( + + {props.children} + + ); + }, + code: ({ className, ...props }: any) => { + if (className?.includes('language-')) { + return ; + } + + return ; + }, + Card: ({ className, ...props }: any) => { + const LinkComponet = props.href.includes('api-reference') ? 'a' : Link; + const LinkProps = props.href.includes('api-reference') + ? { href: `https://docs.novu.co${props.href}` } + : { to: `/docs${props.href}` }; + + return ( + + + + <LinkComponet + {...(LinkProps as any)} + rel={props.href.includes('api-reference') ? 'noopener noreferrer' : undefined} + target={props.href.includes('api-reference') ? '_blank' : '_self'} + > + {props.title} + </LinkComponet> + + + + ); + }, + Accordion: ({ className, ...props }: any) => { + return ( + + {props.title} + {props.children} + + ); + }, + p: ({ className, ...props }: any) => { + return ; + }, + h2: ({ className, ...props }: any) => { + return ; + }, + h3: ({ className, ...props }: any) => { + return <Title size={2} {...props} />; + }, + }} + /> + </Stack> + </PageContainer> + ); +}; diff --git a/apps/web/src/pages/docs/Highlight.tsx b/apps/web/src/pages/docs/Highlight.tsx new file mode 100644 index 00000000000..1d012f2e984 --- /dev/null +++ b/apps/web/src/pages/docs/Highlight.tsx @@ -0,0 +1,26 @@ +import hljs from 'highlight.js'; +import { useEffect, useRef } from 'react'; +import 'highlight.js/styles/default.css'; +import 'highlight.js/styles/atom-one-dark.css'; + +export const Highlight = (props: any) => { + const ref: any = useRef(); + + useEffect(() => { + if (!ref.current) { + return; + } + if (ref.current.children.length === 0) { + ref.current.removeAttribute('data-highlighted'); + } + + if (!ref.current || ref.current.getAttribute('data-highlighted') === 'yes') { + return; + } + + hljs.highlightBlock(ref.current); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ref.current, props.children]); + + return <code {...props} ref={ref} />; +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 357da55c641..3198ac9fcdb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -369,7 +369,7 @@ importers: version: link:../../libs/dal '@novu/echo': specifier: ^0.0.1-alpha.25 - version: 0.0.1-alpha.27 + version: 0.0.1-alpha.25 '@novu/node': specifier: ^0.24.2 version: link:../../packages/node @@ -883,6 +883,9 @@ importers: handlebars: specifier: ^4.7.7 version: 4.7.7 + highlight.js: + specifier: 11.9.0 + version: 11.9.0 html-webpack-plugin: specifier: 5.5.3 version: 5.5.3(webpack@5.78.0) @@ -916,6 +919,9 @@ importers: lodash.set: specifier: ^4.3.2 version: 4.3.2 + mdx-bundler: + specifier: 10.0.2 + version: 10.0.2(esbuild@0.20.1) monaco-editor: specifier: ^0.45.0 version: 0.45.0 @@ -1070,7 +1076,7 @@ importers: version: 7.4.2(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.5) '@storybook/react-webpack5': specifier: ^7.4.2 - version: 7.4.2(@babel/core@7.24.4)(@swc/core@1.3.107)(@types/react-dom@17.0.19)(@types/react@17.0.53)(esbuild@0.18.20)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.5)(webpack-dev-server@4.11.1) + version: 7.4.2(@babel/core@7.24.4)(@swc/core@1.3.107)(@types/react-dom@17.0.19)(@types/react@17.0.53)(esbuild@0.20.1)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.5)(webpack-dev-server@4.11.1) '@testing-library/jest-dom': specifier: ^4.2.4 version: 4.2.4 @@ -1115,16 +1121,13 @@ importers: version: 6.0.11 react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(@swc/core@1.3.107)(esbuild@0.18.20)(eslint-import-resolver-webpack@0.13.7)(eslint@8.57.0)(react@17.0.2)(ts-node@10.9.1)(typescript@4.9.5) - sinon: - specifier: 9.2.4 - version: 9.2.4 + version: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(@swc/core@1.3.107)(esbuild@0.20.1)(eslint-import-resolver-webpack@0.13.7)(eslint@8.57.0)(react@17.0.2)(ts-node@10.9.1)(typescript@4.9.5) storybook: specifier: ^7.4.2 version: 7.4.2 webpack: specifier: 5.78.0 - version: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + version: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) webpack-bundle-analyzer: specifier: ^4.9.0 version: 4.9.0 @@ -7793,8 +7796,8 @@ packages: dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.4 - '@babel/helper-compilation-targets': 7.23.6 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helpers': 7.23.2 '@babel/parser': 7.24.4 @@ -7808,7 +7811,6 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true /@babel/core@7.24.4: resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} @@ -8218,7 +8220,6 @@ packages: '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 - dev: true /@babel/helper-module-transforms@7.23.0(@babel/core@7.24.4): resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} @@ -8430,7 +8431,7 @@ packages: resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 + '@babel/template': 7.24.0 '@babel/traverse': 7.24.1 '@babel/types': 7.24.5 transitivePeerDependencies: @@ -8446,7 +8447,6 @@ packages: '@babel/types': 7.24.5 transitivePeerDependencies: - supports-color - dev: true /@babel/helpers@7.24.4: resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} @@ -12346,7 +12346,7 @@ packages: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@babel/parser': 7.23.0 '@babel/types': 7.23.0 @@ -15779,6 +15779,7 @@ packages: /@discoveryjs/json-ext@0.5.7: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} + dev: true /@edge-runtime/format@2.1.0: resolution: {integrity: sha512-gc2qbYEIIJRczBApBPznVI1c5vZgzrZQOsFZnAxxFiYah9qldHiu1YEitzSvXI8X8ZgvAguuIiyIbpWz17nlXA==} @@ -16111,7 +16112,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.21.0 + '@babel/runtime': 7.23.2 '@emotion/babel-plugin': 11.10.6 '@emotion/is-prop-valid': 1.2.0 '@emotion/react': 11.10.6(@types/react@17.0.53)(react@17.0.2) @@ -16268,14 +16269,19 @@ packages: unescape-js: 1.1.4 dev: true - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true + /@esbuild-plugins/node-resolve@0.2.2(esbuild@0.20.1): + resolution: {integrity: sha512-+t5FdX3ATQlb53UFDBRb4nqjYBz492bIrnVWvpQHpzZlu9BQL5HasMZhqc409ygUwOWCXZhrWr6NyZ6T6Y+cxw==} + peerDependencies: + esbuild: '*' + dependencies: + '@types/resolve': 1.20.2 + debug: 4.3.4(supports-color@8.1.1) + esbuild: 0.20.1 + escape-string-regexp: 4.0.0 + resolve: 1.22.2 + transitivePeerDependencies: + - supports-color + dev: false /@esbuild/aix-ppc64@0.20.1: resolution: {integrity: sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==} @@ -16283,7 +16289,6 @@ packages: cpu: [ppc64] os: [aix] requiresBuild: true - dev: true optional: true /@esbuild/android-arm64@0.18.17: @@ -16327,7 +16332,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-arm@0.18.17: @@ -16371,7 +16375,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-x64@0.18.17: @@ -16415,7 +16418,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/darwin-arm64@0.18.17: @@ -16459,7 +16461,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/darwin-x64@0.18.17: @@ -16503,7 +16504,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-arm64@0.18.17: @@ -16547,7 +16547,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-x64@0.18.17: @@ -16591,7 +16590,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm64@0.18.17: @@ -16635,7 +16633,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm@0.18.17: @@ -16679,7 +16676,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ia32@0.18.17: @@ -16723,7 +16719,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-loong64@0.18.17: @@ -16767,7 +16762,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-mips64el@0.18.17: @@ -16811,7 +16805,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ppc64@0.18.17: @@ -16855,7 +16848,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-riscv64@0.18.17: @@ -16899,7 +16891,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-s390x@0.18.17: @@ -16943,7 +16934,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-x64@0.18.17: @@ -16987,7 +16977,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/netbsd-x64@0.18.17: @@ -17031,7 +17020,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true /@esbuild/openbsd-x64@0.18.17: @@ -17075,7 +17063,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true /@esbuild/sunos-x64@0.18.17: @@ -17119,7 +17106,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true /@esbuild/win32-arm64@0.18.17: @@ -17163,7 +17149,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-ia32@0.18.17: @@ -17207,7 +17192,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-x64@0.18.17: @@ -17251,7 +17235,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@eslint-community/eslint-utils@4.4.0(eslint@8.38.0): @@ -17393,7 +17376,6 @@ packages: /@fal-works/esbuild-plugin-global-externals@2.1.2: resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} - dev: true /@fastify/busboy@1.2.1: resolution: {integrity: sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==} @@ -18654,7 +18636,7 @@ packages: resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.23.2 '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.19 babel-plugin-istanbul: 6.1.1 @@ -18799,6 +18781,7 @@ packages: /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} @@ -18820,6 +18803,7 @@ packages: /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} @@ -18829,6 +18813,7 @@ packages: dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 + dev: true /@jridgewell/trace-mapping@0.3.19: resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} @@ -19924,6 +19909,50 @@ packages: - supports-color dev: false + /@mdx-js/esbuild@3.0.1(esbuild@0.20.1): + resolution: {integrity: sha512-+KZbCKcRjFtRD6qzD+c70Vq/VPVt5LHFsOshNcsdcONkaLTCSjmM7/uj71i3BcP+170f+P4DwVEMtqR/k0t5aw==} + peerDependencies: + esbuild: '>=0.14.0' + dependencies: + '@mdx-js/mdx': 3.0.1 + '@types/unist': 3.0.2 + esbuild: 0.20.1 + vfile: 6.0.1 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@mdx-js/mdx@3.0.1: + resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.7 + 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.4 + 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 + dev: false + /@mdx-js/react@2.3.0(react@17.0.2): resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} peerDependencies: @@ -20794,8 +20823,8 @@ packages: fastq: 1.15.0 dev: true - /@novu/echo@0.0.1-alpha.27: - resolution: {integrity: sha512-ywdPdAOowMkNR2qqsEEQcb3+hvkdnkswMeF9F7WmQnbFajRvb/V5cPIz5aDEHUshMr5SCa3P59PSiZ8OLKwm2Q==} + /@novu/echo@0.0.1-alpha.25: + resolution: {integrity: sha512-l04bf3g+ZsQvQFUGgoNFSP7ipJ+EwasPSHgPKGCflOfgLEc7NWqk9EQbcfgx1ehpiW6UB8WpTHIflJQWxORsdQ==} requiresBuild: true dependencies: ajv: 8.12.0 @@ -24368,10 +24397,49 @@ packages: react-refresh: 0.11.0 schema-utils: 3.3.0 source-map: 0.7.4 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) webpack-dev-server: 4.11.1(webpack@5.78.0) dev: true + /@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(webpack@5.78.0): + resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==} + engines: {node: '>= 10.13'} + peerDependencies: + '@types/webpack': 4.x || 5.x + react-refresh: '>=0.10.0 <1.0.0' + sockjs-client: ^1.4.0 + type-fest: '>=0.17.0 <4.0.0' + webpack: '>=4.43.0 <6.0.0' + webpack-dev-server: 3.x || 4.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + '@types/webpack': + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + dependencies: + ansi-html-community: 0.0.8 + common-path-prefix: 3.0.0 + core-js-pure: 3.30.0 + error-stack-parser: 2.1.4 + find-up: 5.0.0 + html-entities: 2.3.3 + loader-utils: 2.0.4 + react-refresh: 0.11.0 + schema-utils: 3.3.0 + source-map: 0.7.4 + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + dev: true + /@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.14.0)(webpack-dev-server@4.11.1)(webpack@5.78.0): resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==} engines: {node: '>= 10.13'} @@ -24408,7 +24476,7 @@ packages: react-refresh: 0.14.0 schema-utils: 3.3.0 source-map: 0.7.4 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) webpack-dev-server: 4.11.1(webpack@5.78.0) dev: true @@ -24797,6 +24865,7 @@ packages: /@polka/url@1.0.0-next.21: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + dev: true /@polka/url@1.0.0-next.25: resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} @@ -31296,6 +31365,74 @@ packages: - webpack-cli dev: true + /@storybook/builder-webpack5@7.4.2(@types/react-dom@17.0.19)(@types/react@17.0.53)(esbuild@0.20.1)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.5): + resolution: {integrity: sha512-NmlHRU4+jie+9z4cxuXUM49JI2ypIc6JHCiuJIqF7rONrsyCExZvPnzk8mNogox+RK1C7rP60g23rywZdxQNNA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.23.2 + '@storybook/addons': 7.4.2(react-dom@17.0.2)(react@17.0.2) + '@storybook/channels': 7.4.2 + '@storybook/client-api': 7.4.2 + '@storybook/client-logger': 7.4.2 + '@storybook/components': 7.4.2(@types/react-dom@17.0.19)(@types/react@17.0.53)(react-dom@17.0.2)(react@17.0.2) + '@storybook/core-common': 7.4.2 + '@storybook/core-events': 7.4.2 + '@storybook/core-webpack': 7.4.2 + '@storybook/global': 5.0.0 + '@storybook/manager-api': 7.4.2(react-dom@17.0.2)(react@17.0.2) + '@storybook/node-logger': 7.4.2 + '@storybook/preview': 7.4.2 + '@storybook/preview-api': 7.4.2 + '@storybook/router': 7.4.2(react-dom@17.0.2)(react@17.0.2) + '@storybook/store': 7.4.2 + '@storybook/theming': 7.4.2(react-dom@17.0.2)(react@17.0.2) + '@swc/core': 1.3.107 + '@types/node': 16.11.7 + '@types/semver': 7.3.13 + babel-loader: 9.1.2(@babel/core@7.23.2)(webpack@5.78.0) + babel-plugin-named-exports-order: 0.0.2 + browser-assert: 1.2.1 + case-sensitive-paths-webpack-plugin: 2.4.0 + constants-browserify: 1.0.0 + css-loader: 6.7.3(webpack@5.78.0) + express: 4.18.2 + fork-ts-checker-webpack-plugin: 8.0.0(typescript@4.9.5)(webpack@5.78.0) + fs-extra: 11.2.0 + html-webpack-plugin: 5.5.3(webpack@5.78.0) + path-browserify: 1.0.1 + process: 0.11.10 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + semver: 7.5.4 + style-loader: 3.3.2(webpack@5.78.0) + swc-loader: 0.2.3(@swc/core@1.3.107)(webpack@5.78.0) + terser-webpack-plugin: 5.3.9(@swc/core@1.3.107)(esbuild@0.20.1)(webpack@5.78.0) + ts-dedent: 2.2.0 + typescript: 4.9.5 + url: 0.11.0 + util: 0.12.5 + util-deprecate: 1.0.2 + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) + webpack-dev-middleware: 6.1.1(webpack@5.78.0) + webpack-hot-middleware: 2.25.3 + webpack-virtual-modules: 0.5.0 + transitivePeerDependencies: + - '@swc/helpers' + - '@types/react' + - '@types/react-dom' + - encoding + - esbuild + - supports-color + - uglify-js + - webpack-cli + dev: true + /@storybook/builder-webpack5@7.4.2(@types/react-dom@17.0.20)(@types/react@17.0.62)(esbuild@0.18.20)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.5): resolution: {integrity: sha512-NmlHRU4+jie+9z4cxuXUM49JI2ypIc6JHCiuJIqF7rONrsyCExZvPnzk8mNogox+RK1C7rP60g23rywZdxQNNA==} peerDependencies: @@ -32152,7 +32289,7 @@ packages: '@types/babel__core': 7.20.0 babel-plugin-react-docgen: 4.2.1 pnp-webpack-plugin: 1.7.0(typescript@4.9.5) - react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(@swc/core@1.3.107)(esbuild@0.18.20)(eslint-import-resolver-webpack@0.13.7)(eslint@8.57.0)(react@17.0.2)(ts-node@10.9.1)(typescript@4.9.5) + react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(@swc/core@1.3.107)(esbuild@0.20.1)(eslint-import-resolver-webpack@0.13.7)(eslint@8.57.0)(react@17.0.2)(ts-node@10.9.1)(typescript@4.9.5) semver: 7.5.4 transitivePeerDependencies: - '@types/webpack' @@ -32184,7 +32321,7 @@ packages: '@babel/core': 7.24.4 '@babel/preset-flow': 7.22.15(@babel/core@7.24.4) '@babel/preset-react': 7.22.15(@babel/core@7.24.4) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.11.1)(webpack@5.78.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(webpack@5.78.0) '@storybook/core-webpack': 7.4.2 '@storybook/docs-tools': 7.4.2 '@storybook/node-logger': 7.4.2 @@ -32216,7 +32353,7 @@ packages: - webpack-plugin-serve dev: true - /@storybook/preset-react-webpack@7.4.2(@babel/core@7.24.4)(@swc/core@1.3.107)(esbuild@0.18.20)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.5)(webpack-dev-server@4.11.1): + /@storybook/preset-react-webpack@7.4.2(@babel/core@7.24.4)(@swc/core@1.3.107)(esbuild@0.20.1)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.5)(webpack-dev-server@4.11.1): resolution: {integrity: sha512-CWWiwZa3/0zHnc6zLvI9Sgj12gJDTktZO87/gfwq2VfbWqAEUYsKs6NE4Pm0Yg9O4/IG8DHoHIB+bTNlLp/lCA==} engines: {node: '>=16.0.0'} peerDependencies: @@ -32249,7 +32386,7 @@ packages: react-refresh: 0.11.0 semver: 7.6.2 typescript: 4.9.5 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) transitivePeerDependencies: - '@swc/core' - '@types/webpack' @@ -32362,7 +32499,7 @@ packages: react-docgen-typescript: 2.2.2(typescript@4.9.5) tslib: 2.6.2 typescript: 4.9.5 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) transitivePeerDependencies: - supports-color dev: true @@ -32458,7 +32595,7 @@ packages: - webpack-plugin-serve dev: true - /@storybook/react-webpack5@7.4.2(@babel/core@7.24.4)(@swc/core@1.3.107)(@types/react-dom@17.0.19)(@types/react@17.0.53)(esbuild@0.18.20)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.5)(webpack-dev-server@4.11.1): + /@storybook/react-webpack5@7.4.2(@babel/core@7.24.4)(@swc/core@1.3.107)(@types/react-dom@17.0.19)(@types/react@17.0.53)(esbuild@0.20.1)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.5)(webpack-dev-server@4.11.1): resolution: {integrity: sha512-pnl11MYKM3jRmHQz2dSnEDfDiApdH7ys3zH/FjImsTK6S8etMKlxGnZ58Puxj05qvrBRgpxnQSL+ZazfrEX/6w==} engines: {node: '>=16.0.0'} peerDependencies: @@ -32473,8 +32610,8 @@ packages: optional: true dependencies: '@babel/core': 7.24.4 - '@storybook/builder-webpack5': 7.4.2(@types/react-dom@17.0.19)(@types/react@17.0.53)(esbuild@0.18.20)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.5) - '@storybook/preset-react-webpack': 7.4.2(@babel/core@7.24.4)(@swc/core@1.3.107)(esbuild@0.18.20)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.5)(webpack-dev-server@4.11.1) + '@storybook/builder-webpack5': 7.4.2(@types/react-dom@17.0.19)(@types/react@17.0.53)(esbuild@0.20.1)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.5) + '@storybook/preset-react-webpack': 7.4.2(@babel/core@7.24.4)(@swc/core@1.3.107)(esbuild@0.20.1)(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.5)(webpack-dev-server@4.11.1) '@storybook/react': 7.4.2(react-dom@17.0.2)(react@17.0.2)(typescript@4.9.5) '@types/node': 16.11.7 react: 17.0.2 @@ -33435,6 +33572,12 @@ packages: '@types/node': 14.18.42 dev: false + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.5 + dev: false + /@types/argparse@1.0.38: resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} dev: true @@ -33805,12 +33948,6 @@ packages: dependencies: '@types/ms': 0.7.31 - /@types/debug@4.1.8: - resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} - dependencies: - '@types/ms': 0.7.31 - dev: true - /@types/detect-port@1.3.3: resolution: {integrity: sha512-bV/jQlAJ/nPY3XqSatkGpu+nGzou+uSwrH1cROhn+jBFg47yaNH+blW4C7p9KhopC7QxCv/6M86s37k8dMk0Yg==} dev: true @@ -33856,6 +33993,12 @@ packages: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 + /@types/estree-jsx@1.0.5: + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + dependencies: + '@types/estree': 1.0.5 + dev: false + /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true @@ -33871,6 +34014,7 @@ packages: /@types/estree@1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + dev: true /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -33957,6 +34101,12 @@ packages: /@types/hast@2.3.4: resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} dependencies: '@types/unist': 2.0.6 dev: false @@ -34196,14 +34346,14 @@ packages: /@types/mdast@3.0.11: resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 3.0.2 dev: true - /@types/mdast@4.0.4: - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + /@types/mdast@4.0.3: + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} dependencies: '@types/unist': 2.0.6 - dev: true + dev: false /@types/mdurl@1.0.2: resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} @@ -34523,7 +34673,6 @@ packages: /@types/resolve@1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - dev: true /@types/responselike@1.0.3: resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -34711,7 +34860,6 @@ packages: /@types/unist@3.0.2: resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - dev: true /@types/urijs@1.19.25: resolution: {integrity: sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg==} @@ -34848,7 +34996,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.5.0 + '@eslint-community/regexpp': 4.9.1 '@typescript-eslint/parser': 5.58.0(eslint@8.57.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.58.0 '@typescript-eslint/type-utils': 5.58.0(eslint@8.57.0)(typescript@4.9.5) @@ -36340,24 +36488,28 @@ packages: dependencies: '@webassemblyjs/helper-numbers': 1.11.5 '@webassemblyjs/helper-wasm-bytecode': 1.11.5 + dev: true /@webassemblyjs/floating-point-hex-parser@1.11.1: resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} /@webassemblyjs/floating-point-hex-parser@1.11.5: resolution: {integrity: sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==} + dev: true /@webassemblyjs/helper-api-error@1.11.1: resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} /@webassemblyjs/helper-api-error@1.11.5: resolution: {integrity: sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==} + dev: true /@webassemblyjs/helper-buffer@1.11.1: resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} /@webassemblyjs/helper-buffer@1.11.5: resolution: {integrity: sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==} + dev: true /@webassemblyjs/helper-numbers@1.11.1: resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} @@ -36372,12 +36524,14 @@ packages: '@webassemblyjs/floating-point-hex-parser': 1.11.5 '@webassemblyjs/helper-api-error': 1.11.5 '@xtuc/long': 4.2.2 + dev: true /@webassemblyjs/helper-wasm-bytecode@1.11.1: resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} /@webassemblyjs/helper-wasm-bytecode@1.11.5: resolution: {integrity: sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==} + dev: true /@webassemblyjs/helper-wasm-section@1.11.1: resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} @@ -36394,6 +36548,7 @@ packages: '@webassemblyjs/helper-buffer': 1.11.5 '@webassemblyjs/helper-wasm-bytecode': 1.11.5 '@webassemblyjs/wasm-gen': 1.11.5 + dev: true /@webassemblyjs/ieee754@1.11.1: resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} @@ -36404,6 +36559,7 @@ packages: resolution: {integrity: sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==} dependencies: '@xtuc/ieee754': 1.2.0 + dev: true /@webassemblyjs/leb128@1.11.1: resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} @@ -36414,12 +36570,14 @@ packages: resolution: {integrity: sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==} dependencies: '@xtuc/long': 4.2.2 + dev: true /@webassemblyjs/utf8@1.11.1: resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} /@webassemblyjs/utf8@1.11.5: resolution: {integrity: sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==} + dev: true /@webassemblyjs/wasm-edit@1.11.1: resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} @@ -36444,6 +36602,7 @@ packages: '@webassemblyjs/wasm-opt': 1.11.5 '@webassemblyjs/wasm-parser': 1.11.5 '@webassemblyjs/wast-printer': 1.11.5 + dev: true /@webassemblyjs/wasm-gen@1.11.1: resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} @@ -36462,6 +36621,7 @@ packages: '@webassemblyjs/ieee754': 1.11.5 '@webassemblyjs/leb128': 1.11.5 '@webassemblyjs/utf8': 1.11.5 + dev: true /@webassemblyjs/wasm-opt@1.11.1: resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} @@ -36478,6 +36638,7 @@ packages: '@webassemblyjs/helper-buffer': 1.11.5 '@webassemblyjs/wasm-gen': 1.11.5 '@webassemblyjs/wasm-parser': 1.11.5 + dev: true /@webassemblyjs/wasm-parser@1.11.1: resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} @@ -36498,6 +36659,7 @@ packages: '@webassemblyjs/ieee754': 1.11.5 '@webassemblyjs/leb128': 1.11.5 '@webassemblyjs/utf8': 1.11.5 + dev: true /@webassemblyjs/wast-printer@1.11.1: resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} @@ -36510,6 +36672,7 @@ packages: dependencies: '@webassemblyjs/ast': 1.11.5 '@xtuc/long': 4.2.2 + dev: true /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.82.1): resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} @@ -36520,6 +36683,7 @@ packages: dependencies: webpack: 5.82.1(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack-bundle-analyzer@4.9.0)(webpack@5.82.1) + dev: true /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.82.1): resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} @@ -36530,6 +36694,7 @@ packages: dependencies: webpack: 5.82.1(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack-bundle-analyzer@4.9.0)(webpack@5.82.1) + dev: true /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.82.1): resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} @@ -36544,6 +36709,7 @@ packages: dependencies: webpack: 5.82.1(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack-bundle-analyzer@4.9.0)(webpack@5.82.1) + dev: true /@wessberg/ts-evaluator@0.0.27(typescript@4.9.5): resolution: {integrity: sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==} @@ -36698,6 +36864,7 @@ packages: acorn: ^8 dependencies: acorn: 8.10.0 + dev: true /acorn-import-assertions@1.9.0(acorn@8.10.0): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} @@ -37689,7 +37856,6 @@ packages: /astring@1.8.6: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} hasBin: true - dev: true /astro@4.4.0(@types/node@12.20.55)(less@4.1.3)(typescript@4.9.5): resolution: {integrity: sha512-JAsMrm1Z6W4Iqg9Q7LW/6lCXrqa4jndEOlR/yu7NGNP0BrPwSM8i4+yzya6hxgsNvyyVK8ywthaNhFmqd8Z+cg==} @@ -38216,7 +38382,7 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /babel-loader@8.3.0(@babel/core@7.24.4)(webpack@5.82.1): @@ -38235,6 +38401,19 @@ packages: dev: true /babel-loader@9.1.2(@babel/core@7.23.2)(webpack@5.78.0): + resolution: {integrity: sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + dependencies: + '@babel/core': 7.23.2 + find-cache-dir: 3.3.2 + schema-utils: 4.0.0 + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) + dev: true + + /babel-loader@9.1.2(@babel/core@7.24.4)(webpack@5.78.0): resolution: {integrity: sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -38662,7 +38841,6 @@ packages: /bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: true /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -39515,7 +39693,6 @@ packages: /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: true /chai@4.3.7: resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} @@ -39684,7 +39861,7 @@ packages: /character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: true + dev: false /character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} @@ -39693,16 +39870,23 @@ packages: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} dev: true + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + /character-entities@1.2.4: resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} /character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: true /character-reference-invalid@1.1.4: resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -40141,6 +40325,10 @@ packages: resolution: {integrity: sha512-IuA8LeyLU5p1B+HyhOsqR6oxyFQ11k3i9e9aXw40CrHFTRO2Y1npNBVU3W1SvhKAbUU7R/YikUBdcYFP0RcJag==} dev: false + /collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + dev: false + /collect-v8-coverage@1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true @@ -40253,7 +40441,7 @@ packages: /comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: true + dev: false /command-line-application@0.10.1: resolution: {integrity: sha512-PWZ4nRkz09MbBRocqEe/Fil3RjTaMNqw0didl1n/i3flDcw/vecVfvsw3r+ZHhGs4BOuW7sk3cEYSdfM3Wv5/Q==} @@ -40291,6 +40479,7 @@ packages: /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + dev: true /commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} @@ -40311,6 +40500,7 @@ packages: /commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} + dev: true /commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} @@ -41456,25 +41646,8 @@ packages: postcss-modules-scope: 3.0.0(postcss@8.4.35) postcss-modules-values: 4.0.0(postcss@8.4.35) postcss-value-parser: 4.2.0 - semver: 7.6.0 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) - dev: true - - /css-loader@6.8.1(webpack@5.78.0): - resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.35) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.35) - postcss-modules-scope: 3.0.0(postcss@8.4.35) - postcss-modules-values: 4.0.0(postcss@8.4.35) - postcss-value-parser: 4.2.0 - semver: 7.6.2 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + semver: 7.5.4 + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /css-loader@6.8.1(webpack@5.88.2): @@ -41494,7 +41667,7 @@ packages: webpack: 5.88.2(esbuild@0.18.17) dev: true - /css-minimizer-webpack-plugin@3.4.1(esbuild@0.18.20)(webpack@5.78.0): + /css-minimizer-webpack-plugin@3.4.1(esbuild@0.20.1)(webpack@5.78.0): resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -41514,13 +41687,13 @@ packages: optional: true dependencies: cssnano: 5.1.15(postcss@8.4.35) - esbuild: 0.18.20 + esbuild: 0.20.1 jest-worker: 27.5.1 postcss: 8.4.35 schema-utils: 4.0.0 serialize-javascript: 6.0.1 source-map: 0.6.1 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /css-minimizer-webpack-plugin@3.4.1(webpack@5.78.0): @@ -42161,7 +42334,6 @@ packages: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dependencies: character-entities: 2.0.2 - dev: true /decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} @@ -42457,22 +42629,11 @@ packages: - supports-color dev: true - /deterministic-object-hash@2.0.2: - resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} - engines: {node: '>=18'} - dependencies: - base-64: 1.0.0 - dev: true - - /devalue@4.3.3: - resolution: {integrity: sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg==} - dev: true - /devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} dependencies: dequal: 2.0.3 - dev: true + dev: false /dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} @@ -42819,7 +42980,7 @@ packages: dev: false /ee-first@1.1.1: - resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} /ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} @@ -43053,6 +43214,7 @@ packages: resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} engines: {node: '>=4'} hasBin: true + dev: true /err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} @@ -43162,6 +43324,7 @@ packages: /es-module-lexer@1.2.1: resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} + dev: true /es-module-lexer@1.5.2: resolution: {integrity: sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==} @@ -43587,7 +43750,6 @@ packages: '@esbuild/win32-arm64': 0.20.1 '@esbuild/win32-ia32': 0.20.1 '@esbuild/win32-x64': 0.20.1 - dev: true /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} @@ -43611,7 +43773,6 @@ packages: /escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - dev: true /escodegen@1.14.3: resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} @@ -44556,7 +44717,7 @@ packages: micromatch: 4.0.5 normalize-path: 3.0.0 schema-utils: 4.0.0 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /eslint@7.32.0: @@ -44819,6 +44980,47 @@ packages: - supports-color dev: true + /estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + dev: false + + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + dev: false + + /estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.8.6 + source-map: 0.7.4 + dev: false + + /estree-util-value-to-estree@3.1.1: + resolution: {integrity: sha512-5mvUrF2suuv5f5cGDnDphIy4/gW86z82kl5qG6mM9z04SEQI4FB5Apmaw/TGEf3l55nLtMs5s51dmhUzvAHQCA==} + dependencies: + '@types/estree': 1.0.5 + is-plain-obj: 4.1.0 + dev: false + + /estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.2 + dev: false + /estree-walker@0.6.1: resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} dev: true @@ -44834,7 +45036,6 @@ packages: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: '@types/estree': 1.0.5 - dev: true /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} @@ -45409,6 +45610,7 @@ packages: /fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} + dev: true /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} @@ -45421,6 +45623,12 @@ packages: format: 0.2.2 dev: false + /fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + dependencies: + format: 0.2.2 + dev: false + /faye-websocket@0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} @@ -45562,7 +45770,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /file-selector@0.6.0: @@ -45974,7 +46182,7 @@ packages: semver: 7.6.2 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /fork-ts-checker-webpack-plugin@8.0.0(typescript@4.9.5)(webpack@5.78.0): @@ -45997,7 +46205,7 @@ packages: semver: 7.6.2 tapable: 2.2.1 typescript: 4.9.5 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.1.6)(webpack@5.88.2): @@ -47250,7 +47458,7 @@ packages: kind-of: 6.0.3 section-matter: 1.0.0 strip-bom-string: 1.0.0 - dev: true + dev: false /growl@1.10.5: resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} @@ -47312,6 +47520,7 @@ packages: engines: {node: '>=10'} dependencies: duplexer: 0.1.2 + dev: true /h3@1.11.1: resolution: {integrity: sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==} @@ -47520,70 +47729,56 @@ packages: resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} dev: false - /hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - dependencies: - '@types/hast': 3.0.4 - dev: true - - /hast-util-raw@9.0.3: - resolution: {integrity: sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ==} - 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.0.2 - 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 - dev: true - - /hast-util-to-html@9.0.1: - resolution: {integrity: sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==} + /hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - ccount: 2.0.1 comma-separated-tokens: 2.0.3 - hast-util-raw: 9.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 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.0.2 + 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 - stringify-entities: 4.0.4 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 zwitch: 2.0.4 - dev: true + transitivePeerDependencies: + - supports-color + dev: false - /hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + /hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} dependencies: + '@types/estree': 1.0.5 '@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 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: true - - /hast-util-to-string@3.0.0: - resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} - dependencies: - '@types/hast': 3.0.4 - dev: true + style-to-object: 1.0.6 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false /hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} dependencies: '@types/hast': 3.0.4 - dev: true + dev: false /hastscript@6.0.0: resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} @@ -47861,7 +48056,7 @@ packages: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: false /html-webpack-plugin@5.5.3(webpack@5.78.0): @@ -47875,7 +48070,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) /htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -48335,6 +48530,7 @@ packages: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 + dev: true /import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} @@ -48437,6 +48633,14 @@ packages: - supports-color dev: false + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false + + /inline-style-parser@0.2.3: + resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} + dev: false + /inquirer@8.2.4: resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} engines: {node: '>=12.0.0'} @@ -48513,6 +48717,7 @@ packages: /interpret@3.1.1: resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} engines: {node: '>=10.13.0'} + dev: true /into-stream@6.0.0: resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} @@ -48621,12 +48826,23 @@ packages: /is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + /is-alphanumerical@1.0.4: resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} dependencies: is-alphabetical: 1.0.4 is-decimal: 1.0.4 + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: false + /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -48737,6 +48953,10 @@ packages: /is-decimal@1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + /is-deflate@1.0.0: resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} dev: true @@ -48870,6 +49090,10 @@ packages: is-docker: 3.0.0 dev: true + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + /is-installed-globally@0.4.0: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} engines: {node: '>=10'} @@ -49004,7 +49228,6 @@ packages: /is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - dev: true /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} @@ -49046,6 +49269,12 @@ packages: dependencies: '@types/estree': 1.0.5 + /is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + dependencies: + '@types/estree': 1.0.5 + dev: false + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -49786,47 +50015,6 @@ packages: - utf-8-validate dev: true - /jest-config@27.5.1(ts-node@10.9.2): - resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - ts-node: '>=9.0.0' - peerDependenciesMeta: - ts-node: - optional: true - dependencies: - '@babel/core': 7.24.4 - '@jest/test-sequencer': 27.5.1 - '@jest/types': 27.5.1 - babel-jest: 27.5.1(@babel/core@7.24.4) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-get-type: 27.5.1 - jest-jasmine2: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runner: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 27.5.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@14.18.42)(typescript@4.9.5) - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - /jest-config@29.5.0(@types/node@14.18.42)(ts-node@10.9.1): resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -50131,6 +50319,15 @@ packages: pretty-format: 27.5.1 dev: true + /jest-diff@29.5.0: + resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + /jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -50467,7 +50664,7 @@ packages: resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.24.2 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -50624,7 +50821,7 @@ packages: jest-pnp-resolver: 1.2.3(jest-resolve@29.5.0) jest-util: 29.7.0 jest-validate: 29.7.0 - resolve: 1.22.8 + resolve: 1.22.2 resolve.exports: 2.0.2 slash: 3.0.0 dev: true @@ -50871,8 +51068,8 @@ packages: '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.24.4) '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.24.4) '@babel/traverse': 7.24.1 - '@babel/types': 7.24.5 - '@jest/expect-utils': 29.5.0 + '@babel/types': 7.24.0 + '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@types/babel__traverse': 7.18.3 @@ -52234,7 +52431,7 @@ packages: less: 4.1.3 loader-utils: 1.4.2 pify: 3.0.0 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /less@4.1.3: @@ -52926,7 +53123,6 @@ packages: /longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: true /longest@2.0.1: resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} @@ -53307,6 +53503,11 @@ packages: object-visit: 1.0.1 dev: true + /markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + dev: false + /markdown-it-anchor@8.6.7(@types/markdown-it@12.2.3)(markdown-it@12.3.2): resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} requiresBuild: true @@ -53493,7 +53694,7 @@ packages: /mdast-util-from-markdown@2.0.0: resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} dependencies: - '@types/mdast': 4.0.4 + '@types/mdast': 4.0.3 '@types/unist': 3.0.2 decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -53507,7 +53708,20 @@ packages: unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color - dev: true + dev: false + + /mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false /mdast-util-gfm-autolink-literal@1.0.3: resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} @@ -53620,19 +53834,63 @@ packages: - supports-color dev: true - /mdast-util-gfm@3.0.0: - resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + /mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 mdast-util-from-markdown: 2.0.0 - 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 - dev: true + dev: false + + /mdast-util-mdx-jsx@3.1.2: + resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + 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 + dev: false + + /mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + dependencies: + mdast-util-from-markdown: 2.0.0 + 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 + dev: false + + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false /mdast-util-phrasing@3.0.1: resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} @@ -53644,22 +53902,23 @@ packages: /mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} dependencies: - '@types/mdast': 4.0.4 + '@types/mdast': 4.0.3 unist-util-is: 6.0.0 - dev: true + dev: false - /mdast-util-to-hast@13.0.2: - resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + /mdast-util-to-hast@13.1.0: + resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} dependencies: '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 + '@types/mdast': 4.0.3 '@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 - dev: true + vfile: 6.0.1 + dev: false /mdast-util-to-markdown@1.5.0: resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} @@ -53677,7 +53936,7 @@ packages: /mdast-util-to-markdown@2.1.0: resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} dependencies: - '@types/mdast': 4.0.4 + '@types/mdast': 4.0.3 '@types/unist': 3.0.2 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 @@ -53685,7 +53944,7 @@ packages: micromark-util-decode-string: 2.0.0 unist-util-visit: 5.0.0 zwitch: 2.0.4 - dev: true + dev: false /mdast-util-to-string@1.1.0: resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} @@ -53703,8 +53962,8 @@ packages: /mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} dependencies: - '@types/mdast': 4.0.4 - dev: true + '@types/mdast': 4.0.3 + dev: false /mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} @@ -53717,11 +53976,31 @@ packages: /mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + /mdx-bundler@10.0.2(esbuild@0.20.1): + resolution: {integrity: sha512-0wF0zoCv+Ms4G+eSlk/jaKYoJHc0oXBaOma3kYlFJiKq9H8h41Dd66ioDBGF4noy80Pf7KTBQlyHfEpTqVml7A==} + engines: {node: '>=18', npm: '>=6'} + peerDependencies: + esbuild: 0.* + dependencies: + '@babel/runtime': 7.23.2 + '@esbuild-plugins/node-resolve': 0.2.2(esbuild@0.20.1) + '@fal-works/esbuild-plugin-global-externals': 2.1.2 + '@mdx-js/esbuild': 3.0.1(esbuild@0.20.1) + esbuild: 0.20.1 + gray-matter: 4.0.3 + remark-frontmatter: 5.0.0 + remark-mdx-frontmatter: 4.0.0 + uuid: 9.0.1 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + /meant@1.0.3: resolution: {integrity: sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw==} /media-typer@0.3.0: - resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} /mediaquery-text@1.2.0: @@ -53913,7 +54192,16 @@ packages: micromark-util-subtokenize: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true + dev: false + + /micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false /micromark-extension-gfm-autolink-literal@1.0.5: resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} @@ -54046,18 +54334,66 @@ packages: micromark-util-types: 1.1.0 dev: true - /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==} + dependencies: + '@types/estree': 1.0.5 + 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 + dev: false + + /micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + 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 + dev: false + + /micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + dependencies: + '@types/estree': 1.0.5 + 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 + dev: false + + /micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} dependencies: - micromark-extension-gfm-autolink-literal: 2.0.0 - micromark-extension-gfm-footnote: 2.0.0 - micromark-extension-gfm-strikethrough: 2.0.0 - micromark-extension-gfm-table: 2.0.0 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.0.1 + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + 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 - dev: true + dev: false /micromark-factory-destination@1.1.0: resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} @@ -54073,7 +54409,7 @@ packages: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true + dev: false /micromark-factory-label@1.1.0: resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} @@ -54091,7 +54427,20 @@ packages: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true + dev: false + + /micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + dependencies: + '@types/estree': 1.0.5 + 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 + dev: false /micromark-factory-space@1.1.0: resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} @@ -54105,7 +54454,7 @@ packages: dependencies: micromark-util-character: 2.1.0 micromark-util-types: 2.0.0 - dev: true + dev: false /micromark-factory-title@1.1.0: resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} @@ -54123,7 +54472,7 @@ packages: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true + dev: false /micromark-factory-whitespace@1.1.0: resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} @@ -54141,7 +54490,7 @@ packages: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true + dev: false /micromark-util-character@1.2.0: resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} @@ -54155,7 +54504,7 @@ packages: dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true + dev: false /micromark-util-chunked@1.1.0: resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} @@ -54167,7 +54516,7 @@ packages: resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} dependencies: micromark-util-symbol: 2.0.0 - dev: true + dev: false /micromark-util-classify-character@1.1.0: resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} @@ -54183,7 +54532,7 @@ packages: micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true + dev: false /micromark-util-combine-extensions@1.1.0: resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} @@ -54197,7 +54546,7 @@ packages: dependencies: micromark-util-chunked: 2.0.0 micromark-util-types: 2.0.0 - dev: true + dev: false /micromark-util-decode-numeric-character-reference@1.1.0: resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} @@ -54209,7 +54558,7 @@ packages: resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} dependencies: micromark-util-symbol: 2.0.0 - dev: true + dev: false /micromark-util-decode-string@1.1.0: resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} @@ -54227,7 +54576,7 @@ packages: micromark-util-character: 2.1.0 micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-symbol: 2.0.0 - dev: true + dev: false /micromark-util-encode@1.1.0: resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} @@ -54235,7 +54584,20 @@ packages: /micromark-util-encode@2.0.0: resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - dev: true + dev: false + + /micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + '@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 + dev: false /micromark-util-html-tag-name@1.2.0: resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} @@ -54243,7 +54605,7 @@ packages: /micromark-util-html-tag-name@2.0.0: resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - dev: true + dev: false /micromark-util-normalize-identifier@1.1.0: resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} @@ -54255,7 +54617,7 @@ packages: resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} dependencies: micromark-util-symbol: 2.0.0 - dev: true + dev: false /micromark-util-resolve-all@1.1.0: resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} @@ -54267,7 +54629,7 @@ packages: resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} dependencies: micromark-util-types: 2.0.0 - dev: true + dev: false /micromark-util-sanitize-uri@1.2.0: resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} @@ -54283,7 +54645,7 @@ packages: micromark-util-character: 2.1.0 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 - dev: true + dev: false /micromark-util-subtokenize@1.1.0: resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} @@ -54301,7 +54663,7 @@ packages: micromark-util-chunked: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: true + dev: false /micromark-util-symbol@1.1.0: resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} @@ -54309,7 +54671,7 @@ packages: /micromark-util-symbol@2.0.0: resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - dev: true + dev: false /micromark-util-types@1.1.0: resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} @@ -54317,21 +54679,12 @@ packages: /micromark-util-types@2.0.0: resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - dev: true - - /micromark@2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} - dependencies: - debug: 4.3.4(supports-color@8.1.1) - parse-entities: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: true + dev: false /micromark@3.2.0: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: - '@types/debug': 4.1.8 + '@types/debug': 4.1.12 debug: 4.3.4(supports-color@8.1.1) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 @@ -54374,7 +54727,7 @@ packages: micromark-util-types: 2.0.0 transitivePeerDependencies: - supports-color - dev: true + dev: false /micromatch@2.3.11: resolution: {integrity: sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==} @@ -54504,7 +54857,7 @@ packages: webpack: ^5.0.0 dependencies: schema-utils: 4.0.0 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /mini-css-extract-plugin@2.7.6(webpack@5.88.2): @@ -55006,6 +55359,7 @@ packages: /mrmime@1.0.1: resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} engines: {node: '>=10'} + dev: true /mrmime@2.0.0: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} @@ -56371,10 +56725,10 @@ packages: enquirer: 2.3.6 figures: 3.2.0 flat: 5.0.2 - fs-extra: 11.2.0 + fs-extra: 11.1.1 glob: 7.1.4 ignore: 5.2.4 - jest-diff: 29.7.0 + jest-diff: 29.5.0 js-yaml: 4.1.0 jsonc-parser: 3.2.0 lines-and-columns: 2.0.3 @@ -56436,10 +56790,10 @@ packages: enquirer: 2.3.6 figures: 3.2.0 flat: 5.0.2 - fs-extra: 11.2.0 + fs-extra: 11.1.1 glob: 7.1.4 ignore: 5.2.4 - jest-diff: 29.7.0 + jest-diff: 29.5.0 js-yaml: 4.1.0 jsonc-parser: 3.2.0 lines-and-columns: 2.0.3 @@ -56820,6 +57174,7 @@ packages: /opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true + dev: true /opentracing@0.14.7: resolution: {integrity: sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==} @@ -57277,6 +57632,19 @@ packages: is-decimal: 1.0.4 is-hexadecimal: 1.0.4 + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.6 + 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 + dev: false + /parse-github-url@1.0.2: resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} engines: {node: '>=0.10.0'} @@ -57660,6 +58028,14 @@ packages: /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.5 + estree-walker: 3.0.3 + is-reference: 3.0.2 + dev: false + /pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} @@ -58372,8 +58748,8 @@ packages: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.4.31 - semver: 7.6.0 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + semver: 7.5.4 + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /postcss-loader@7.3.3(postcss@8.4.31)(webpack@5.88.2): @@ -59306,7 +59682,7 @@ packages: /property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - dev: true + dev: false /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -60816,7 +61192,7 @@ packages: peerDependencies: react-scripts: '>=2.1.3' dependencies: - react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(@swc/core@1.3.107)(esbuild@0.18.20)(eslint-import-resolver-webpack@0.13.7)(eslint@8.57.0)(react@17.0.2)(ts-node@10.9.1)(typescript@4.9.5) + react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(@swc/core@1.3.107)(esbuild@0.20.1)(eslint-import-resolver-webpack@0.13.7)(eslint@8.57.0)(react@17.0.2)(ts-node@10.9.1)(typescript@4.9.5) semver: 5.7.2 dev: true @@ -60948,7 +61324,7 @@ packages: strip-ansi: 6.0.1 text-table: 0.2.0 typescript: 4.9.5 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) transitivePeerDependencies: - eslint - supports-color @@ -61538,7 +61914,7 @@ packages: - supports-color dev: true - /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(@swc/core@1.3.107)(esbuild@0.18.20)(eslint-import-resolver-webpack@0.13.7)(eslint@8.57.0)(react@17.0.2)(ts-node@10.9.1)(typescript@4.9.5): + /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.15)(@swc/core@1.3.107)(esbuild@0.20.1)(eslint-import-resolver-webpack@0.13.7)(eslint@8.57.0)(react@17.0.2)(ts-node@10.9.1)(typescript@4.9.5): resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -61562,7 +61938,7 @@ packages: camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 css-loader: 6.7.3(webpack@5.78.0) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.18.20)(webpack@5.78.0) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.20.1)(webpack@5.78.0) dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.0 @@ -61593,9 +61969,9 @@ packages: source-map-loader: 3.0.2(webpack@5.78.0) style-loader: 3.3.2(webpack@5.78.0) tailwindcss: 3.3.1(postcss@8.4.31)(ts-node@10.9.1) - terser-webpack-plugin: 5.3.7(@swc/core@1.3.107)(esbuild@0.18.20)(webpack@5.78.0) + terser-webpack-plugin: 5.3.7(@swc/core@1.3.107)(esbuild@0.20.1)(webpack@5.78.0) typescript: 4.9.5 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) webpack-dev-server: 4.11.1(webpack@5.78.0) webpack-manifest-plugin: 4.1.1(webpack@5.78.0) workbox-webpack-plugin: 6.5.4(webpack@5.78.0) @@ -62366,7 +62742,8 @@ packages: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} engines: {node: '>= 10.13.0'} dependencies: - resolve: 1.22.8 + resolve: 1.22.2 + dev: true /recursive-diff@1.0.9: resolution: {integrity: sha512-5mqpskzvXDo5Vy29Vj8tH30a0+XBmY11aqWGoN/uB94UHRwndX2EuPvH+WtbqOYkrwAF718/lDo6U4CB1qSSqQ==} @@ -62620,6 +62997,17 @@ packages: space-separated-tokens: 1.1.5 unist-util-visit: 2.0.3 + /remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + /remark-gfm@3.0.1: resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} dependencies: @@ -62631,39 +63019,46 @@ packages: - supports-color dev: true - /remark-gfm@4.0.0: - resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + /remark-mdx-frontmatter@4.0.0: + resolution: {integrity: sha512-PZzAiDGOEfv1Ua7exQ8S5kKxkD8CDaSb4nM+1Mprs6u8dyvQifakh+kCj6NovfGXW+bTvrhjaR3srzjS2qJHKg==} 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 + '@types/mdast': 4.0.3 + estree-util-is-identifier-name: 3.0.0 + estree-util-value-to-estree: 3.1.1 + toml: 3.0.0 unified: 11.0.4 + yaml: 2.4.2 + dev: false + + /remark-mdx@3.0.1: + resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 transitivePeerDependencies: - supports-color - dev: true + dev: false /remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} dependencies: - '@types/mdast': 4.0.4 + '@types/mdast': 4.0.3 mdast-util-from-markdown: 2.0.0 micromark-util-types: 2.0.0 unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: true + dev: false /remark-rehype@11.1.0: resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} dependencies: '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - mdast-util-to-hast: 13.0.2 + '@types/mdast': 4.0.3 + mdast-util-to-hast: 13.1.0 unified: 11.0.4 vfile: 6.0.1 - dev: true + dev: false /remark-slug@6.1.0: resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} @@ -62859,6 +63254,7 @@ packages: engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 + dev: true /resolve-dir@1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} @@ -63177,11 +63573,11 @@ packages: peerDependencies: rollup: ^2.0.0 dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.21.4 jest-worker: 26.6.2 rollup: 2.79.1 serialize-javascript: 4.0.0 - terser: 5.22.0 + terser: 5.16.9 dev: true /rollup-plugin-terser@7.0.2(rollup@3.20.2): @@ -63451,7 +63847,7 @@ packages: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /sass-loader@13.3.2(sass@1.64.1)(webpack@5.88.2): @@ -63602,7 +63998,7 @@ packages: dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - dev: true + dev: false /secure-compare@3.0.1: resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} @@ -64058,6 +64454,7 @@ packages: '@polka/url': 1.0.0-next.21 mrmime: 1.0.1 totalist: 1.1.0 + dev: true /sirv@2.0.4: resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} @@ -64331,7 +64728,7 @@ packages: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.0.2 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /source-map-loader@4.0.1(webpack@5.88.2): @@ -64417,7 +64814,7 @@ packages: /space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: true + dev: false /spamc@0.0.5: resolution: {integrity: sha512-jYXItuZuiWZyG9fIdvgTUbp2MNRuyhuSwvvhhpPJd4JK/9oSZxkD7zAj53GJtowSlXwCJzLg6sCKAoE9wXsKgg==} @@ -64513,7 +64910,7 @@ packages: webpack: ^1 || ^2 || ^3 || ^4 || ^5 dependencies: chalk: 4.1.2 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: false /split-string@3.1.0: @@ -64964,7 +65361,7 @@ packages: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - dev: true + dev: false /stringify-object@3.3.0: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} @@ -65010,7 +65407,7 @@ packages: /strip-bom-string@1.0.0: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} - dev: true + dev: false /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} @@ -65144,9 +65541,21 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true + /style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + + /style-to-object@1.0.6: + resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==} + dependencies: + inline-style-parser: 0.2.3 + dev: false + /style-value-types@5.0.0: resolution: {integrity: sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==} dependencies: @@ -65472,7 +65881,7 @@ packages: webpack: '>=2' dependencies: '@swc/core': 1.3.107 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /symbol-observable@1.2.0: @@ -65740,7 +66149,7 @@ packages: supports-hyperlinks: 2.3.0 dev: true - /terser-webpack-plugin@5.3.7(@swc/core@1.3.107)(esbuild@0.18.20)(webpack@5.78.0): + /terser-webpack-plugin@5.3.7(@swc/core@1.3.107)(esbuild@0.20.1)(webpack@5.78.0): resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -65758,12 +66167,12 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.19 '@swc/core': 1.3.107 - esbuild: 0.18.20 + esbuild: 0.20.1 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.22.0 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /terser-webpack-plugin@5.3.7(webpack@5.78.0): @@ -65814,6 +66223,7 @@ packages: serialize-javascript: 6.0.1 terser: 5.22.0 webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + dev: true /terser-webpack-plugin@5.3.9(@swc/core@1.3.107)(esbuild@0.18.20)(webpack@5.82.1): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} @@ -65839,6 +66249,32 @@ packages: serialize-javascript: 6.0.1 terser: 5.16.9 webpack: 5.82.1(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + dev: true + + /terser-webpack-plugin@5.3.9(@swc/core@1.3.107)(esbuild@0.20.1)(webpack@5.78.0): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + 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 + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@swc/core': 1.3.107 + esbuild: 0.20.1 + jest-worker: 27.5.1 + schema-utils: 3.1.2 + serialize-javascript: 6.0.1 + terser: 5.22.0 + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) /terser-webpack-plugin@5.3.9(esbuild@0.18.17)(webpack@5.88.2): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} @@ -65908,6 +66344,7 @@ packages: acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 + dev: true /terser@5.19.2: resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} @@ -66180,6 +66617,10 @@ packages: ieee754: 1.2.1 dev: true + /toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + dev: false + /toposort@2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} dev: true @@ -66187,6 +66628,7 @@ packages: /totalist@1.1.0: resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} engines: {node: '>=6'} + dev: true /totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} @@ -66260,7 +66702,7 @@ packages: /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: true + dev: false /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} @@ -66284,7 +66726,6 @@ packages: /trough@2.1.0: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: true /tryer@1.0.1: resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} @@ -67562,7 +68003,7 @@ packages: is-plain-obj: 4.1.0 trough: 2.1.0 vfile: 6.0.1 - dev: true + dev: false /union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} @@ -67632,26 +68073,26 @@ packages: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} dependencies: '@types/unist': 3.0.2 - dev: true + dev: false - /unist-util-modify-children@3.1.1: - resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} + /unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} dependencies: - '@types/unist': 2.0.6 - array-iterate: 2.0.1 - dev: true + '@types/unist': 3.0.2 + dev: false /unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} dependencies: '@types/unist': 3.0.2 - dev: true + dev: false - /unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} dependencies: - '@types/unist': 2.0.6 - dev: true + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + dev: false /unist-util-stringify-position@3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} @@ -67663,13 +68104,7 @@ packages: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} dependencies: '@types/unist': 3.0.2 - dev: true - - /unist-util-visit-children@2.0.2: - resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} - dependencies: - '@types/unist': 2.0.6 - dev: true + dev: false /unist-util-visit-parents@3.1.1: resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} @@ -67689,7 +68124,7 @@ packages: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - dev: true + dev: false /unist-util-visit@2.0.3: resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} @@ -67712,7 +68147,7 @@ packages: '@types/unist': 3.0.2 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - dev: true + dev: false /universal-user-agent@6.0.0: resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} @@ -68445,7 +68880,7 @@ packages: dev: true /verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=} engines: {'0': node >=0.6.0} dependencies: assert-plus: 1.0.0 @@ -68480,7 +68915,7 @@ packages: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 - dev: true + dev: false /vfile@5.3.7: resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} @@ -68497,28 +68932,7 @@ packages: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - dev: true - - /vite-node@1.2.1(@types/node@18.16.9): - resolution: {integrity: sha512-fNzHmQUSOY+y30naohBvSW7pPn/xn3Ib/uqm+5wAJQJiqQsU0NBR78XdRJb04l4bOFKjpTWld0XAfkKlrDbySg==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4(supports-color@8.1.1) - pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.1.7(@types/node@18.16.9) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true + dev: false /vite-node@1.2.1(@types/node@18.18.5): resolution: {integrity: sha512-fNzHmQUSOY+y30naohBvSW7pPn/xn3Ib/uqm+5wAJQJiqQsU0NBR78XdRJb04l4bOFKjpTWld0XAfkKlrDbySg==} @@ -69225,6 +69639,7 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true /webpack-cli@5.1.4(webpack-bundle-analyzer@4.9.0)(webpack@5.82.1): resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} @@ -69258,6 +69673,7 @@ packages: webpack: 5.82.1(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) webpack-bundle-analyzer: 4.9.0 webpack-merge: 5.8.0 + dev: true /webpack-dev-middleware@5.3.3(webpack@5.78.0): resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} @@ -69270,7 +69686,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) /webpack-dev-middleware@5.3.3(webpack@5.88.2): resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} @@ -69300,7 +69716,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) dev: true /webpack-dev-middleware@6.1.1(webpack@5.88.2): @@ -69358,7 +69774,7 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) webpack-dev-middleware: 5.3.3(webpack@5.78.0) ws: 8.13.0 transitivePeerDependencies: @@ -69433,7 +69849,7 @@ packages: webpack: ^4.44.2 || ^5.47.0 dependencies: tapable: 2.2.1 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) webpack-sources: 2.3.1 dev: true @@ -69571,6 +69987,46 @@ packages: - '@swc/core' - esbuild - uglify-js + dev: true + + /webpack@5.78.0(@swc/core@1.3.107)(esbuild@0.20.1): + resolution: {integrity: sha512-gT5DP72KInmE/3azEaQrISjTvLYlSM0j1Ezhht/KLVkrqtv10JoP/RXhwmX/frrutOPuSq3o5Vq0ehR/4Vmd1g==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 0.0.51 + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/wasm-edit': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.23.0 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 0.9.3 + 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.9(@swc/core@1.3.107)(esbuild@0.20.1)(webpack@5.78.0) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js /webpack@5.82.1(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4): resolution: {integrity: sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==} @@ -69611,6 +70067,7 @@ packages: - '@swc/core' - esbuild - uglify-js + dev: true /webpack@5.88.2(esbuild@0.18.17): resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} @@ -70064,7 +70521,7 @@ packages: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack: 5.78.0(@swc/core@1.3.107)(esbuild@0.20.1) webpack-sources: 1.4.3 workbox-build: 6.5.4 transitivePeerDependencies: @@ -70362,6 +70819,12 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + /yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + engines: {node: '>= 14'} + hasBin: true + dev: false + /yargs-parser@13.1.2: resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} dependencies: @@ -70597,7 +71060,6 @@ packages: /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: true /zxcvbn@4.4.2: resolution: {integrity: sha512-Bq0B+ixT/DMyG8kgX2xWcI5jUvCwqrMxSFam7m0lAf78nf04hv6lNCsyLYdyYTrCVMqNDY/206K7eExYCeSyUQ==} From 9703b5b9bf192d7de7e08621ab048ca4c0cc8ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= <granskog_@hotmail.com> Date: Tue, 7 May 2024 15:05:23 +0200 Subject: [PATCH 02/34] feat: add workaround for images --- apps/web/src/pages/docs/DocsPage.tsx | 42 ++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/apps/web/src/pages/docs/DocsPage.tsx b/apps/web/src/pages/docs/DocsPage.tsx index 1a439496de3..d623f974bd3 100644 --- a/apps/web/src/pages/docs/DocsPage.tsx +++ b/apps/web/src/pages/docs/DocsPage.tsx @@ -14,7 +14,7 @@ export const DocsPage = () => { const segment = useSegment(); const path = useMemo(() => params['*'], [params]); - const { isLoading, data: { code } = { code: '' } } = useQuery(['docs', path], async () => { + const { isLoading, data: { code, title } = { code: '', title: '' } } = useQuery(['docs', path], async () => { const response = await fetch('http://localhost:5173/' + path); const json = await response.json(); @@ -35,19 +35,40 @@ export const DocsPage = () => { return getMDXComponent(code); }, [code]); + // Workaround for img tags that is not parsed correctly by mdx-bundler + useEffect(() => { + if (Component === null || isLoading) { + return; + } + + const docs = document.getElementById('docs'); + + if (!docs) { + return; + } + + const images = Array.from(docs.getElementsByTagName('img')); + + for (const img of images) { + const url = new URL(img.src); + img.src = `https://mintlify.s3-us-west-1.amazonaws.com/novu${url.pathname}`; + } + }, [Component, isLoading]); + if (isLoading || Component === null) { return null; } return ( <PageContainer title="Docs"> - <Stack p={20} spacing={8}> + <Stack id="docs" p={20} spacing={8}> + <Title size={1}>{title} { return (
- + {props.caption} @@ -148,6 +169,21 @@ export const DocsPage = () => { h3: ({ className, ...props }: any) => { return ; }, + a: ({ className, ...props }: any) => { + const LinkComponet = props.href.includes('api-reference') ? 'a' : Link; + const LinkProps = props.href.includes('api-reference') + ? { href: `https://docs.novu.co${props.href}` } + : { to: `/docs${props.href}` }; + + return ( + <LinkComponet + {...(LinkProps as any)} + rel={props.href.includes('api-reference') ? 'noopener noreferrer' : undefined} + target={props.href.includes('api-reference') ? '_blank' : '_self'} + children={props.children} + /> + ); + }, }} /> </Stack> From 09a460580a4bfee93881ae7dac3b1fcb764fe0cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= <granskog_@hotmail.com> Date: Wed, 8 May 2024 07:30:34 +0200 Subject: [PATCH 03/34] refactor: page to be drawer --- apps/web/src/AppRoutes.tsx | 2 - apps/web/src/components/docs/DocsButton.tsx | 17 ++ .../{pages => components}/docs/Highlight.tsx | 0 apps/web/src/components/docs/index.tsx | 202 ++++++++++++++++++ apps/web/src/components/layout/AppLayout.tsx | 23 +- .../layout/components/HeaderNav.tsx | 2 + .../layout/components/v2/HeaderNav.tsx | 5 +- .../src/components/providers/DocsProvider.tsx | 71 ++++++ apps/web/src/pages/docs/DocsPage.tsx | 192 ----------------- .../pages/subscribers/SubscribersListPage.tsx | 2 + 10 files changed, 310 insertions(+), 206 deletions(-) create mode 100644 apps/web/src/components/docs/DocsButton.tsx rename apps/web/src/{pages => components}/docs/Highlight.tsx (100%) create mode 100644 apps/web/src/components/docs/index.tsx create mode 100644 apps/web/src/components/providers/DocsProvider.tsx delete mode 100644 apps/web/src/pages/docs/DocsPage.tsx diff --git a/apps/web/src/AppRoutes.tsx b/apps/web/src/AppRoutes.tsx index 16bf339d36d..3b7245faca2 100644 --- a/apps/web/src/AppRoutes.tsx +++ b/apps/web/src/AppRoutes.tsx @@ -13,7 +13,6 @@ import SignUpPage from './pages/auth/SignUpPage'; import { BrandPage } from './pages/brand/BrandPage'; import { BrandingForm, LayoutsListPage } from './pages/brand/tabs'; import { PromoteChangesPage } from './pages/changes/PromoteChangesPage'; -import { DocsPage } from './pages/docs/DocsPage'; import { GetStartedPage } from './pages/get-started/GetStartedPage'; import HomePage from './pages/HomePage'; import { SelectProviderPage } from './pages/integrations/components/SelectProviderPage'; @@ -127,7 +126,6 @@ export const AppRoutes = () => { <Route path="" element={<LayoutsListPage />} /> </Route> )} - <Route path="/translations/*" element={<TranslationRoutes />} /> <Route path="/docs/*" element={<DocsPage />} /> <Route path={ROUTES.ANY} element={<HomePage />} /> </Route> diff --git a/apps/web/src/components/docs/DocsButton.tsx b/apps/web/src/components/docs/DocsButton.tsx new file mode 100644 index 00000000000..89d595d0711 --- /dev/null +++ b/apps/web/src/components/docs/DocsButton.tsx @@ -0,0 +1,17 @@ +import { ActionIcon } from '@mantine/core'; +import { IconInfo, Tooltip } from '@novu/design-system'; +import { useDocsContext } from '../providers/DocsProvider'; + +export const DocsButton = () => { + const { toggle, enabled } = useDocsContext(); + + return ( + <Tooltip label={enabled ? 'Documentation' : 'There is no documentation for this page'}> + <div> + <ActionIcon disabled={!enabled} variant="transparent" onClick={() => toggle()}> + <IconInfo /> + </ActionIcon> + </div> + </Tooltip> + ); +}; diff --git a/apps/web/src/pages/docs/Highlight.tsx b/apps/web/src/components/docs/Highlight.tsx similarity index 100% rename from apps/web/src/pages/docs/Highlight.tsx rename to apps/web/src/components/docs/Highlight.tsx diff --git a/apps/web/src/components/docs/index.tsx b/apps/web/src/components/docs/index.tsx new file mode 100644 index 00000000000..794826704f7 --- /dev/null +++ b/apps/web/src/components/docs/index.tsx @@ -0,0 +1,202 @@ +import { colors, Tabs, Text, Title, Tooltip } from '@novu/design-system'; +import { Accordion, Alert, Code, Grid, Loader, Paper, Stack } from '@mantine/core'; +import { useEffect, useMemo } from 'react'; +import { Link } from 'react-router-dom'; +import * as mdxBundler from 'mdx-bundler/client'; +import { Highlight } from './Highlight'; +import { useQuery } from '@tanstack/react-query'; +import { useSegment } from '@novu/shared-web'; +import { Center } from '../../styled-system/jsx'; + +const getMDXComponent = mdxBundler.getMDXComponent; + +export const Docs = ({ path = '' }: { path?: string }) => { + const segment = useSegment(); + + const { isLoading, data: { code, title } = { code: '', title: '' } } = useQuery(['docs', path], async () => { + const response = await fetch('http://localhost:5173/' + path); + const json = await response.json(); + + return json; + }); + + useEffect(() => { + segment.track('Open Inline Documentation', { + documentationPage: path, + pageURL: window.location.href, + }); + }, [path, segment]); + + const Component = useMemo(() => { + if (code.length === 0) { + return null; + } + + return getMDXComponent(code); + }, [code]); + + // Workaround for img tags that is not parsed correctly by mdx-bundler + useEffect(() => { + if (Component === null || isLoading) { + return; + } + + const docs = document.getElementById('docs'); + + if (!docs) { + return; + } + + const images = Array.from(docs.getElementsByTagName('img')); + + for (const img of images) { + const url = new URL(img.src); + img.src = `https://mintlify.s3-us-west-1.amazonaws.com/novu${url.pathname}`; + } + }, [Component, isLoading]); + + if (isLoading) { + return ( + <Center style={{ marginTop: 64 }}> + <Loader color={colors.error} size={32} /> + </Center> + ); + } + + if (Component === null) { + return ( + <Text align="center" mt={64}> + We could not load the documenation for you, please try again. + </Text> + ); + } + + return ( + <Stack mt={32} id="docs" p={20} spacing={8}> + <Title size={1}>{title} + { + return ( +
+ + + {props.caption} + +
+ ); + }, + Info: ({ className, ...props }: any) => { + return ; + }, + Snippet: () => { + return null; + }, + Warning: ({ className, ...props }: any) => { + return ; + }, + Note: ({ className, ...props }: any) => { + return ; + }, + CardGroup: ({ className, ...props }: any) => { + return ( + + {props.children} + + ); + }, + AccordionGroup: ({ className, ...props }: any) => { + return ; + }, + Tab: () => null, + Tabs: ({ className, ...props }: any) => { + const children = Array.isArray(props.children) ? props.children : [props.children]; + + return ( + { + return { + content: tab.props.children, + value: tab.props.title, + }; + })} + defaultValue={children[0].props.title} + /> + ); + }, + Tip: ({ className, ...props }: any) => { + return ; + }, + Tooltip: ({ className, ...props }: any) => { + return ( + + {props.children} + + ); + }, + code: ({ className, ...props }: any) => { + if (className?.includes('language-')) { + return ; + } + + return ; + }, + Card: ({ className, ...props }: any) => { + const LinkComponet = props.href.includes('api-reference') ? 'a' : Link; + const LinkProps = props.href.includes('api-reference') + ? { href: `https://docs.novu.co${props.href}` } + : { to: `/docs${props.href}` }; + + return ( + + + + <LinkComponet + {...(LinkProps as any)} + rel={props.href.includes('api-reference') ? 'noopener noreferrer' : undefined} + target={props.href.includes('api-reference') ? '_blank' : '_self'} + > + {props.title} + </LinkComponet> + + + + ); + }, + Accordion: ({ className, ...props }: any) => { + return ( + + {props.title} + {props.children} + + ); + }, + p: ({ className, ...props }: any) => { + return ; + }, + h2: ({ className, ...props }: any) => { + return ; + }, + h3: ({ className, ...props }: any) => { + return <Title size={2} {...props} />; + }, + a: ({ className, ...props }: any) => { + const LinkComponet = props.href.includes('api-reference') ? 'a' : Link; + const LinkProps = props.href.includes('api-reference') + ? { href: `https://docs.novu.co${props.href}` } + : { to: `/docs${props.href}` }; + + return ( + <LinkComponet + {...(LinkProps as any)} + rel={props.href.includes('api-reference') ? 'noopener noreferrer' : undefined} + target={props.href.includes('api-reference') ? '_blank' : '_self'} + children={props.children} + /> + ); + }, + }} + /> + </Stack> + ); +}; diff --git a/apps/web/src/components/layout/AppLayout.tsx b/apps/web/src/components/layout/AppLayout.tsx index 589a809d678..d34e41e6ded 100644 --- a/apps/web/src/components/layout/AppLayout.tsx +++ b/apps/web/src/components/layout/AppLayout.tsx @@ -16,6 +16,7 @@ import { FeatureFlagsKeysEnum } from '@novu/shared'; import { HeaderNav as HeaderNavNew } from './components/v2/HeaderNav'; import { MainNav } from '../nav/MainNav'; import { FreeTrialBanner } from './components/FreeTrialBanner'; +import { DocsProvider } from '../providers/DocsProvider'; const AppShell = styled.div` display: flex; @@ -63,16 +64,18 @@ export function AppLayout() { > <SpotLight> <AppShell> - {isInformationArchitectureEnabled ? <MainNav /> : <SideNav />} - <ContentShell> - <FreeTrialBanner /> - {isInformationArchitectureEnabled ? ( - <HeaderNavNew /> - ) : ( - <HeaderNav isIntercomOpened={isIntercomOpened} /> - )} - <Outlet /> - </ContentShell> + <DocsProvider> + {isInformationArchitectureEnabled ? <MainNav /> : <SideNav />} + <ContentShell> + <FreeTrialBanner /> + {isInformationArchitectureEnabled ? ( + <HeaderNavNew /> + ) : ( + <HeaderNav isIntercomOpened={isIntercomOpened} /> + )} + <Outlet /> + </ContentShell> + </DocsProvider> </AppShell> </SpotLight> </Sentry.ErrorBoundary> diff --git a/apps/web/src/components/layout/components/HeaderNav.tsx b/apps/web/src/components/layout/components/HeaderNav.tsx index 1a6419b34de..6cea9f2f081 100644 --- a/apps/web/src/components/layout/components/HeaderNav.tsx +++ b/apps/web/src/components/layout/components/HeaderNav.tsx @@ -26,6 +26,7 @@ import { HEADER_NAV_HEIGHT } from '../constants'; import { NotificationCenterWidget } from './NotificationCenterWidget'; import { useSegment } from '../../providers/SegmentProvider'; import { EchoStatus } from './EchoStatus'; +import { DocsButton } from '../../docs/DocsButton'; type Props = { isIntercomOpened: boolean }; const menuItem = [ @@ -177,6 +178,7 @@ export function HeaderNav({ isIntercomOpened }: Props) { </div> </Tooltip> </ActionIcon> + <DocsButton /> {isSelfHosted ? ( <a href={discordInviteUrl} target="_blank" rel="noreferrer"> <ActionIcon variant="transparent"> diff --git a/apps/web/src/components/layout/components/v2/HeaderNav.tsx b/apps/web/src/components/layout/components/v2/HeaderNav.tsx index 4c0c0e721f3..a486a053332 100644 --- a/apps/web/src/components/layout/components/v2/HeaderNav.tsx +++ b/apps/web/src/components/layout/components/v2/HeaderNav.tsx @@ -1,11 +1,11 @@ import { ActionIcon, Group, Header } from '@mantine/core'; - -import { colors, IconHelpOutline, Tooltip } from '@novu/design-system'; +import { IconHelpOutline, Tooltip } from '@novu/design-system'; import { IS_DOCKER_HOSTED } from '../../../../config'; import { useBootIntercom } from '../../../../hooks'; import useThemeChange from '../../../../hooks/useThemeChange'; import { discordInviteUrl } from '../../../../pages/quick-start/consts'; import { css } from '@novu/novui/css'; +import { DocsButton } from '../../../docs/DocsButton'; import { useAuthContext } from '../../../providers/AuthProvider'; import { HEADER_NAV_HEIGHT } from '../../constants'; import { NotificationCenterWidget } from '../NotificationCenterWidget'; @@ -40,6 +40,7 @@ export function HeaderNav() { <div>{themeIcon}</div> </Tooltip> </ActionIcon> + <DocsButton /> {isSelfHosted ? ( <a href={discordInviteUrl} target="_blank" rel="noopener noreferrer"> <ActionIcon variant="transparent"> diff --git a/apps/web/src/components/providers/DocsProvider.tsx b/apps/web/src/components/providers/DocsProvider.tsx new file mode 100644 index 00000000000..f36a9757293 --- /dev/null +++ b/apps/web/src/components/providers/DocsProvider.tsx @@ -0,0 +1,71 @@ +import React, { useContext, useEffect, useState } from 'react'; +import { Drawer } from '@mantine/core'; +import { useLocation } from 'react-router-dom'; +import { Docs } from '../docs'; + +interface IDocsContext { + setPath: (path: string) => void; + toggle: () => void; + enabled: boolean; +} + +const DocsContext = React.createContext<IDocsContext>({ + setPath: () => {}, + toggle: () => {}, + enabled: false, +}); + +export const useDocsContext = (): IDocsContext => useContext(DocsContext); + +export const useSetDocs = (path: string) => { + const { setPath } = useDocsContext(); + useEffect(() => { + setPath(path); + }, [path, setPath]); +}; + +export const DocsProvider = ({ children }) => { + const [path, setPath] = useState<string>(''); + const [open, setOpen] = useState(false); + const { pathname } = useLocation(); + + useEffect(() => { + return () => { + setPath(''); + }; + }, [pathname]); + + const toggle = () => { + setOpen(!open); + }; + + return ( + <DocsContext.Provider + value={{ + setPath, + toggle, + enabled: path.length > 0, + }} + > + {children} + <Drawer + opened={open} + onClose={() => { + setOpen(false); + }} + position="right" + size="50%" + styles={{ + drawer: { + overflow: 'scroll', + }, + header: { + display: 'none', + }, + }} + > + <Docs path={path} /> + </Drawer> + </DocsContext.Provider> + ); +}; diff --git a/apps/web/src/pages/docs/DocsPage.tsx b/apps/web/src/pages/docs/DocsPage.tsx deleted file mode 100644 index d623f974bd3..00000000000 --- a/apps/web/src/pages/docs/DocsPage.tsx +++ /dev/null @@ -1,192 +0,0 @@ -import { PageContainer, Tabs, Text, Title, Tooltip } from '@novu/design-system'; -import { Accordion, Alert, Grid, Paper, Stack } from '@mantine/core'; -import { useEffect, useMemo } from 'react'; -import { Link, useParams } from 'react-router-dom'; -import * as mdxBundler from 'mdx-bundler/client'; -import { Highlight } from './Highlight'; -import { useQuery } from '@tanstack/react-query'; -import { useSegment } from '@novu/shared-web'; - -const getMDXComponent = mdxBundler.getMDXComponent; - -export const DocsPage = () => { - const params = useParams(); - const segment = useSegment(); - const path = useMemo(() => params['*'], [params]); - - const { isLoading, data: { code, title } = { code: '', title: '' } } = useQuery(['docs', path], async () => { - const response = await fetch('http://localhost:5173/' + path); - const json = await response.json(); - - return json; - }); - - useEffect(() => { - segment.track('Open Inline Documentation', { - documentationPage: path, - }); - }, [path, segment]); - - const Component = useMemo(() => { - if (code.length === 0) { - return null; - } - - return getMDXComponent(code); - }, [code]); - - // Workaround for img tags that is not parsed correctly by mdx-bundler - useEffect(() => { - if (Component === null || isLoading) { - return; - } - - const docs = document.getElementById('docs'); - - if (!docs) { - return; - } - - const images = Array.from(docs.getElementsByTagName('img')); - - for (const img of images) { - const url = new URL(img.src); - img.src = `https://mintlify.s3-us-west-1.amazonaws.com/novu${url.pathname}`; - } - }, [Component, isLoading]); - - if (isLoading || Component === null) { - return null; - } - - return ( - <PageContainer title="Docs"> - <Stack id="docs" p={20} spacing={8}> - <Title size={1}>{title} - { - return ( -
- - - {props.caption} - -
- ); - }, - Info: ({ className, ...props }: any) => { - return ; - }, - Snippet: () => { - return null; - }, - Warning: ({ className, ...props }: any) => { - return ; - }, - Note: ({ className, ...props }: any) => { - return ; - }, - CardGroup: ({ className, ...props }: any) => { - return ( - - {props.children} - - ); - }, - AccordionGroup: ({ className, ...props }: any) => { - return ; - }, - Tab: () => null, - Tabs: ({ className, ...props }: any) => { - const children = Array.isArray(props.children) ? props.children : [props.children]; - - return ( - { - return { - content: tab.props.children, - value: tab.props.title, - }; - })} - defaultValue={children[0].props.title} - /> - ); - }, - Tip: ({ className, ...props }: any) => { - return ; - }, - Tooltip: ({ className, ...props }: any) => { - return ( - - {props.children} - - ); - }, - code: ({ className, ...props }: any) => { - if (className?.includes('language-')) { - return ; - } - - return ; - }, - Card: ({ className, ...props }: any) => { - const LinkComponet = props.href.includes('api-reference') ? 'a' : Link; - const LinkProps = props.href.includes('api-reference') - ? { href: `https://docs.novu.co${props.href}` } - : { to: `/docs${props.href}` }; - - return ( - - - - <LinkComponet - {...(LinkProps as any)} - rel={props.href.includes('api-reference') ? 'noopener noreferrer' : undefined} - target={props.href.includes('api-reference') ? '_blank' : '_self'} - > - {props.title} - </LinkComponet> - - - - ); - }, - Accordion: ({ className, ...props }: any) => { - return ( - - {props.title} - {props.children} - - ); - }, - p: ({ className, ...props }: any) => { - return ; - }, - h2: ({ className, ...props }: any) => { - return ; - }, - h3: ({ className, ...props }: any) => { - return <Title size={2} {...props} />; - }, - a: ({ className, ...props }: any) => { - const LinkComponet = props.href.includes('api-reference') ? 'a' : Link; - const LinkProps = props.href.includes('api-reference') - ? { href: `https://docs.novu.co${props.href}` } - : { to: `/docs${props.href}` }; - - return ( - <LinkComponet - {...(LinkProps as any)} - rel={props.href.includes('api-reference') ? 'noopener noreferrer' : undefined} - target={props.href.includes('api-reference') ? '_blank' : '_self'} - children={props.children} - /> - ); - }, - }} - /> - </Stack> - </PageContainer> - ); -}; diff --git a/apps/web/src/pages/subscribers/SubscribersListPage.tsx b/apps/web/src/pages/subscribers/SubscribersListPage.tsx index e60ab61d164..3828446f1f7 100644 --- a/apps/web/src/pages/subscribers/SubscribersListPage.tsx +++ b/apps/web/src/pages/subscribers/SubscribersListPage.tsx @@ -7,6 +7,7 @@ import { useSubscribers } from '../../hooks'; import PageHeader from '../../components/layout/components/PageHeader'; import PageContainer from '../../components/layout/components/PageContainer'; import { Table, withCellLoading, IExtendedColumn, ViewportWide, HoverCard } from '@novu/design-system'; +import { useSetDocs } from '../../components/providers/DocsProvider'; const columns: IExtendedColumn<ISubscriber>[] = [ { @@ -57,6 +58,7 @@ const columns: IExtendedColumn<ISubscriber>[] = [ ]; function SubscribersList() { + useSetDocs('subscribers/subscribers'); const [page, setPage] = useState<number>(0); const { subscribers, loading: isLoading, hasMore, pageSize } = useSubscribers(page); From 3da27d17cc9ed7898d7d99ecd63f39db28f814de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= <granskog_@hotmail.com> Date: Wed, 8 May 2024 13:33:19 +0200 Subject: [PATCH 04/34] feat: add doc page to routes --- apps/web/src/components/docs/index.tsx | 19 +++++++++++-------- .../src/components/providers/DocsProvider.tsx | 16 ++++++++++++---- apps/web/src/pages/TranslationPages.tsx | 3 +++ .../src/pages/activities/ActivitiesPage.tsx | 2 ++ .../src/pages/brand/tabs/LayoutsListPage.tsx | 2 ++ .../src/pages/changes/PromoteChangesPage.tsx | 2 ++ .../integrations/IntegrationsListPage.tsx | 2 ++ .../src/pages/templates/WorkflowListPage.tsx | 2 ++ apps/web/src/pages/tenants/TenantsPage.tsx | 2 ++ 9 files changed, 38 insertions(+), 12 deletions(-) diff --git a/apps/web/src/components/docs/index.tsx b/apps/web/src/components/docs/index.tsx index 794826704f7..dcaa1cda048 100644 --- a/apps/web/src/components/docs/index.tsx +++ b/apps/web/src/components/docs/index.tsx @@ -1,6 +1,6 @@ import { colors, Tabs, Text, Title, Tooltip } from '@novu/design-system'; -import { Accordion, Alert, Code, Grid, Loader, Paper, Stack } from '@mantine/core'; -import { useEffect, useMemo } from 'react'; +import { Accordion, Alert, Code, Grid, Group, Loader, Paper, Stack } from '@mantine/core'; +import { ReactNode, useEffect, useMemo } from 'react'; import { Link } from 'react-router-dom'; import * as mdxBundler from 'mdx-bundler/client'; import { Highlight } from './Highlight'; @@ -10,7 +10,7 @@ import { Center } from '../../styled-system/jsx'; const getMDXComponent = mdxBundler.getMDXComponent; -export const Docs = ({ path = '' }: { path?: string }) => { +export const Docs = ({ path = '', children }: { path?: string; children: ReactNode }) => { const segment = useSegment(); const { isLoading, data: { code, title } = { code: '', title: '' } } = useQuery(['docs', path], async () => { @@ -72,8 +72,11 @@ export const Docs = ({ path = '' }: { path?: string }) => { } return ( - <Stack mt={32} id="docs" p={20} spacing={8}> - <Title size={1}>{title} + + + {title} + {children} + { @@ -110,17 +113,17 @@ export const Docs = ({ path = '' }: { path?: string }) => { }, Tab: () => null, Tabs: ({ className, ...props }: any) => { - const children = Array.isArray(props.children) ? props.children : [props.children]; + const tabs = Array.isArray(props.children) ? props.children : [props.children]; return ( { + menuTabs={tabs.map((tab) => { return { content: tab.props.children, value: tab.props.title, }; })} - defaultValue={children[0].props.title} + defaultValue={tabs[0].props.title} /> ); }, diff --git a/apps/web/src/components/providers/DocsProvider.tsx b/apps/web/src/components/providers/DocsProvider.tsx index f36a9757293..8e0d05eeeac 100644 --- a/apps/web/src/components/providers/DocsProvider.tsx +++ b/apps/web/src/components/providers/DocsProvider.tsx @@ -1,7 +1,8 @@ import React, { useContext, useEffect, useState } from 'react'; -import { Drawer } from '@mantine/core'; +import { ActionIcon, Drawer } from '@mantine/core'; import { useLocation } from 'react-router-dom'; import { Docs } from '../docs'; +import { IconClose } from '@novu/design-system'; interface IDocsContext { setPath: (path: string) => void; @@ -47,15 +48,17 @@ export const DocsProvider = ({ children }) => { enabled: path.length > 0, }} > - {children} { setOpen(false); }} position="right" - size="50%" + size="100%" styles={{ + root: { + zIndex: 10002, + }, drawer: { overflow: 'scroll', }, @@ -64,8 +67,13 @@ export const DocsProvider = ({ children }) => { }, }} > - + + toggle()}> + + + + {children} ); }; diff --git a/apps/web/src/pages/TranslationPages.tsx b/apps/web/src/pages/TranslationPages.tsx index bc59767a4c7..6197ca846e9 100644 --- a/apps/web/src/pages/TranslationPages.tsx +++ b/apps/web/src/pages/TranslationPages.tsx @@ -1,6 +1,9 @@ +import { useSetDocs } from '../components/providers/DocsProvider'; import { IS_DOCKER_HOSTED } from '../config'; export const TranslationRoutes = () => { + useSetDocs('content-creation-design/translations'); + if (IS_DOCKER_HOSTED) { return null; } diff --git a/apps/web/src/pages/activities/ActivitiesPage.tsx b/apps/web/src/pages/activities/ActivitiesPage.tsx index 96ff5fe6124..a40eb1a69f1 100644 --- a/apps/web/src/pages/activities/ActivitiesPage.tsx +++ b/apps/web/src/pages/activities/ActivitiesPage.tsx @@ -16,6 +16,7 @@ import { ExecutionDetailsModal } from '../../components/execution-detail/Executi import { IActivityGraphStats } from './interfaces'; import { Flex } from '@mantine/core'; import { FIRST_100_WORKFLOWS } from '../../constants/workflowConstants'; +import { useSetDocs } from '../../components/providers/DocsProvider'; const FiltersContainer = styled.div` gap: 15px; @@ -39,6 +40,7 @@ const initialFormState: IFiltersForm = { }; export function ActivitiesPage() { + useSetDocs('activity-feed/introduction'); const { templates, loading: loadingTemplates } = useTemplates(FIRST_100_WORKFLOWS); const [page, setPage] = useState(0); const [isModalOpen, setToggleModal] = useState(false); diff --git a/apps/web/src/pages/brand/tabs/LayoutsListPage.tsx b/apps/web/src/pages/brand/tabs/LayoutsListPage.tsx index 71c18d85e9d..2b92effb35d 100644 --- a/apps/web/src/pages/brand/tabs/LayoutsListPage.tsx +++ b/apps/web/src/pages/brand/tabs/LayoutsListPage.tsx @@ -24,6 +24,7 @@ import { useEnvController, useLayouts } from '../../../hooks'; import { errorMessage, successMessage } from '../../../utils/notifications'; import { DeleteConfirmModal } from '../../templates/components/DeleteConfirmModal'; import { LayoutEditor } from './LayoutEditor'; +import { useSetDocs } from '../../../components/providers/DocsProvider'; const enum ActivePageEnum { LAYOUTS_LIST = 'layouts_list', @@ -35,6 +36,7 @@ type LayoutsListPageContext = { }; export function LayoutsListPage() { + useSetDocs('content-creation-design/layouts'); const { handleLayoutAnalytics } = useOutletContext(); const theme = useMantineTheme(); const queryClient = useQueryClient(); diff --git a/apps/web/src/pages/changes/PromoteChangesPage.tsx b/apps/web/src/pages/changes/PromoteChangesPage.tsx index c43040d0d6f..c72a5dc4f52 100644 --- a/apps/web/src/pages/changes/PromoteChangesPage.tsx +++ b/apps/web/src/pages/changes/PromoteChangesPage.tsx @@ -12,11 +12,13 @@ import { bulkPromoteChanges } from '../../api/changes'; import { QueryKeys } from '../../api/query.keys'; import { errorMessage, successMessage } from '../../utils/notifications'; import { ROUTES } from '../../constants/routes.enum'; +import { useSetDocs } from '../../components/providers/DocsProvider'; const PENDING = 'Pending'; const HISTORY = 'History'; export function PromoteChangesPage() { + useSetDocs('platform/environments'); const [page, setPage] = useState(0); const navigate = useNavigate(); const { readonly } = useEnvController(); diff --git a/apps/web/src/pages/integrations/IntegrationsListPage.tsx b/apps/web/src/pages/integrations/IntegrationsListPage.tsx index a7ce20ee1b7..11ee229970e 100644 --- a/apps/web/src/pages/integrations/IntegrationsListPage.tsx +++ b/apps/web/src/pages/integrations/IntegrationsListPage.tsx @@ -2,12 +2,14 @@ import { ChannelTypeEnum } from '@novu/shared'; import { useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { Row } from 'react-table'; +import { useSetDocs } from '../../components/providers/DocsProvider'; import { ROUTES } from '../../constants/routes.enum'; import { IntegrationsList } from './IntegrationsList'; import { ITableIntegration } from './types'; export const IntegrationsListPage = () => { + useSetDocs('channels-and-providers/integration-store'); const navigate = useNavigate(); const onRowClickCallback = useCallback( diff --git a/apps/web/src/pages/templates/WorkflowListPage.tsx b/apps/web/src/pages/templates/WorkflowListPage.tsx index 927deb23c10..8bd34182482 100644 --- a/apps/web/src/pages/templates/WorkflowListPage.tsx +++ b/apps/web/src/pages/templates/WorkflowListPage.tsx @@ -41,6 +41,7 @@ import { TemplateCreationSourceEnum } from './shared'; import { When } from '../../components/utils/When'; import { ListPage } from '../../components/layout/components/ListPage'; import { WorkflowListNoMatches } from './WorkflowListNoMatches'; +import { useSetDocs } from '../../components/providers/DocsProvider'; const columns: IExtendedColumn[] = [ { @@ -162,6 +163,7 @@ const columns: IExtendedColumn[] = [ ]; function WorkflowListPage() { + useSetDocs('workflows/notification-workflows'); const segment = useSegment(); const { readonly } = useEnvController(); const { loading: areNotificationGroupLoading } = useNotificationGroup(); diff --git a/apps/web/src/pages/tenants/TenantsPage.tsx b/apps/web/src/pages/tenants/TenantsPage.tsx index 7df5a8b4c4c..20224e80c2a 100644 --- a/apps/web/src/pages/tenants/TenantsPage.tsx +++ b/apps/web/src/pages/tenants/TenantsPage.tsx @@ -8,8 +8,10 @@ import PageHeader from '../../components/layout/components/PageHeader'; import { TenantsList } from './components/list/TenantsList'; import { ROUTES } from '../../constants/routes.enum'; import { useSegment } from '../../components/providers/SegmentProvider'; +import { useSetDocs } from '../../components/providers/DocsProvider'; export function TenantsPage() { + useSetDocs('tenants/introduction'); const segment = useSegment(); const navigate = useNavigate(); From 91621da23d0c4599cc506149180b621199d2a9b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= Date: Tue, 14 May 2024 09:49:38 +0200 Subject: [PATCH 05/34] refactor: inline docs --- apps/web/src/components/docs/DocsButton.tsx | 96 ++++++- apps/web/src/components/docs/DocsCard.tsx | 43 +++ .../web/src/components/docs/DocsHomeModal.tsx | 244 ++++++++++++++++++ apps/web/src/components/docs/ExploreLink.tsx | 51 ++++ apps/web/src/components/docs/index.tsx | 178 +++++++++---- .../src/components/providers/DocsProvider.tsx | 139 ++++++++-- 6 files changed, 673 insertions(+), 78 deletions(-) create mode 100644 apps/web/src/components/docs/DocsCard.tsx create mode 100644 apps/web/src/components/docs/DocsHomeModal.tsx create mode 100644 apps/web/src/components/docs/ExploreLink.tsx diff --git a/apps/web/src/components/docs/DocsButton.tsx b/apps/web/src/components/docs/DocsButton.tsx index 89d595d0711..7782a89116e 100644 --- a/apps/web/src/components/docs/DocsButton.tsx +++ b/apps/web/src/components/docs/DocsButton.tsx @@ -1,16 +1,100 @@ -import { ActionIcon } from '@mantine/core'; -import { IconInfo, Tooltip } from '@novu/design-system'; +import { ActionIcon, Popover, useMantineColorScheme } from '@mantine/core'; +import { Button, colors, IconOutlineMenuBook, QuickGuide, shadows, Tooltip } from '@novu/design-system'; +import { useEffect, useState } from 'react'; +import { css } from '../../styled-system/css'; +import { Flex, styled } from '../../styled-system/jsx'; +import { text, title } from '../../styled-system/recipes'; import { useDocsContext } from '../providers/DocsProvider'; +const Title = styled('h3', title); +const Text = styled('p', text); + export const DocsButton = () => { + const { colorScheme } = useMantineColorScheme(); + const isDark = colorScheme === 'dark'; const { toggle, enabled } = useDocsContext(); + const [opened, setOpened] = useState(false); + + const onClose = () => { + setOpened(false); + localStorage.setItem('inline-docs-intro', 'false'); + }; + + useEffect(() => { + if (!enabled) { + return; + } + if (localStorage.getItem('inline-docs-intro') === 'false') { + return; + } + setOpened(false); + }, [enabled]); return ( - +
- toggle()}> - - + + + toggle()}> + + + + + + +
+ + Discover inline documentation + + + Need help? Get details and dive deeper with our inline docs. + +
+
+ + + +
+
); diff --git a/apps/web/src/components/docs/DocsCard.tsx b/apps/web/src/components/docs/DocsCard.tsx new file mode 100644 index 00000000000..234e78c8ac7 --- /dev/null +++ b/apps/web/src/components/docs/DocsCard.tsx @@ -0,0 +1,43 @@ +import { useMantineColorScheme } from '@mantine/core'; +import { css } from '../../styled-system/css'; +import { styled } from '../../styled-system/jsx'; +import { text as RText, title as RTitle } from '../../styled-system/recipes'; + +const CardTitle = styled('h3', RTitle); +const CardText = styled('p', RText); + +export const DocsCard = ({ + title, + text, + Icon, + onClick, +}: { + title: string; + text: string; + Icon: any; + onClick: () => void; +}) => { + const { colorScheme } = useMantineColorScheme(); + const isDark = colorScheme === 'dark'; + + return ( +
{ + onClick(); + }} + > + + + {title} + + {text} +
+ ); +}; diff --git a/apps/web/src/components/docs/DocsHomeModal.tsx b/apps/web/src/components/docs/DocsHomeModal.tsx new file mode 100644 index 00000000000..717659ab831 --- /dev/null +++ b/apps/web/src/components/docs/DocsHomeModal.tsx @@ -0,0 +1,244 @@ +import { ActionIcon, Modal, useMantineColorScheme } from '@mantine/core'; +import { + colors, + IconChecklist, + IconCode, + IconEditNote, + IconHandyman, + IconOpenInNew, + IconOutlineClose, + IconOutlineCloudUpload, + IconOutlineMarkEmailRead, + IconOutlineSwapCalls, + IconOutlineZoomIn, + IconPlayArrow, + IconSchool, + IconWidgets, + IconWrapText, + Tooltip, +} from '@novu/design-system'; +import { css } from '../../styled-system/css'; +import { Flex, Grid, GridItem, styled } from '../../styled-system/jsx'; +import { title } from '../../styled-system/recipes'; +import { useDocsContext } from '../providers/DocsProvider'; +import { When } from '../utils/When'; +import { DocsCard } from './DocsCard'; +import { ExploreLink } from './ExploreLink'; + +const ModalTitle = styled('h2', title); + +export const DocsHomeModal = ({ path, open }: { path: string; open: boolean }) => { + const { setPath, toggle } = useDocsContext(); + const { colorScheme } = useMantineColorScheme(); + const isDark = colorScheme === 'dark'; + + const onClose = () => { + toggle(); + }; + + return ( + + + + Explore Novu + + + { + window.open('https://docs.novu.co/getting-started/introduction'); + }} + > + + + + + + + + + + + { + setPath('/getting-started/novu-sign-up'); + }} + /> + + + { + setPath('/getting-started/introduction'); + }} + /> + + + { + setPath('/getting-started/how-novu-works'); + }} + /> + + + { + setPath('/echo/quickstart'); + }} + /> + + + + + { + setPath('/echo/concepts/workflows'); + }} + /> + + + { + setPath('/echo/concepts/inputs'); + }} + /> + + + { + setPath('/echo/integrations/react-email'); + }} + /> + + + { + setPath('/echo/concepts/payload'); + }} + /> + + + + + { + setPath('/echo/sdk/typescript'); + }} + /> + + + { + setPath('/echo/sdk/client'); + }} + /> + + + { + setPath('/echo/integrations/react-email'); + }} + /> + + + { + setPath('/echo/recipes/json-schema'); + }} + /> + + + + + { + setPath('/echo/deployment/production'); + }} + /> + + + { + setPath('/echo/deployment/actions'); + }} + /> + + + { + setPath('/echo/deployment/cli'); + }} + /> + + + + + ); +}; diff --git a/apps/web/src/components/docs/ExploreLink.tsx b/apps/web/src/components/docs/ExploreLink.tsx new file mode 100644 index 00000000000..b37325d12f7 --- /dev/null +++ b/apps/web/src/components/docs/ExploreLink.tsx @@ -0,0 +1,51 @@ +import { Flex, styled } from '../../styled-system/jsx'; +import { text as RText } from '../../styled-system/recipes'; +import { css } from '../../styled-system/css'; + +const Text = styled('p', RText); + +export const ExploreLink = ({ + title, + text, + Icon, + onClick, +}: { + title: string; + text: string; + Icon: any; + onClick: () => void; +}) => { + return ( + { + onClick(); + }} + > + +
+ + {title} + + + {text} + +
+
+ ); +}; diff --git a/apps/web/src/components/docs/index.tsx b/apps/web/src/components/docs/index.tsx index dcaa1cda048..cfb5f40bf18 100644 --- a/apps/web/src/components/docs/index.tsx +++ b/apps/web/src/components/docs/index.tsx @@ -1,24 +1,33 @@ -import { colors, Tabs, Text, Title, Tooltip } from '@novu/design-system'; -import { Accordion, Alert, Code, Grid, Group, Loader, Paper, Stack } from '@mantine/core'; +import { colors, IconInfoOutline, IconOutlineWarning, Tabs, Tooltip } from '@novu/design-system'; +import { Accordion, Alert, Code, Loader, Paper } from '@mantine/core'; import { ReactNode, useEffect, useMemo } from 'react'; -import { Link } from 'react-router-dom'; import * as mdxBundler from 'mdx-bundler/client'; import { Highlight } from './Highlight'; import { useQuery } from '@tanstack/react-query'; import { useSegment } from '@novu/shared-web'; -import { Center } from '../../styled-system/jsx'; +import { Center, Flex, Grid, GridItem, styled, VStack } from '../../styled-system/jsx'; +import { css } from '../../styled-system/css'; +import { text, title as RTitle } from '../../styled-system/recipes'; + +const Text = styled('p', text); +const TitleH2 = styled('h2', RTitle); +const TitleH3 = styled('h3', RTitle); +const TitleH1 = styled('h1', RTitle); const getMDXComponent = mdxBundler.getMDXComponent; export const Docs = ({ path = '', children }: { path?: string; children: ReactNode }) => { const segment = useSegment(); - const { isLoading, data: { code, title } = { code: '', title: '' } } = useQuery(['docs', path], async () => { - const response = await fetch('http://localhost:5173/' + path); - const json = await response.json(); + const { isLoading, data: { code, title, description } = { code: '', title: '', description: '' } } = useQuery( + ['docs', path], + async () => { + const response = await fetch('http://localhost:5173/' + path); + const json = await response.json(); - return json; - }); + return json; + } + ); useEffect(() => { segment.track('Open Inline Documentation', { @@ -50,6 +59,10 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo const images = Array.from(docs.getElementsByTagName('img')); for (const img of images) { + if (img.src.includes('mintlify.s3-us-west-1.amazonaws.com')) { + continue; + } + const url = new URL(img.src); img.src = `https://mintlify.s3-us-west-1.amazonaws.com/novu${url.pathname}`; } @@ -57,7 +70,11 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo if (isLoading) { return ( -
+
); @@ -65,45 +82,101 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo if (Component === null) { return ( - - We could not load the documenation for you, please try again. - + + We could not load the documenation for you, please try again. + {children} + ); } return ( - - - {title} - {children} - + +
+ + {title} + {children} + + {description} +
{ + return ( + + ); + }, + thead: ({ className, ...props }: any) => { + return ( + + ); + }, Frame: ({ className, ...props }: any) => { return (
- - {props.caption} - + {props.caption}
); }, Info: ({ className, ...props }: any) => { - return ; + return ( + } /> + ); }, Snippet: () => { return null; }, + Steps: ({ className, ...props }: any) => { + return
    {props.children}
; + }, + Step: ({ className, ...props }: any) => { + return ( +
  • + {props.title} + {props.children} +
  • + ); + }, Warning: ({ className, ...props }: any) => { - return ; + return ( + } + /> + ); }, Note: ({ className, ...props }: any) => { - return ; + return ( + } /> + ); }, CardGroup: ({ className, ...props }: any) => { return ( - + {props.children} ); @@ -128,7 +201,9 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo ); }, Tip: ({ className, ...props }: any) => { - return ; + return ( + } /> + ); }, Tooltip: ({ className, ...props }: any) => { return ( @@ -145,25 +220,16 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo return ; }, Card: ({ className, ...props }: any) => { - const LinkComponet = props.href.includes('api-reference') ? 'a' : Link; - const LinkProps = props.href.includes('api-reference') - ? { href: `https://docs.novu.co${props.href}` } - : { to: `/docs${props.href}` }; - return ( - + - - <LinkComponet - {...(LinkProps as any)} - rel={props.href.includes('api-reference') ? 'noopener noreferrer' : undefined} - target={props.href.includes('api-reference') ? '_blank' : '_self'} - > + <TitleH2> + <a href={`https://docs.novu.co${props.href}`} rel={'noopener noreferrer'} target={'_blank'}> {props.title} - </LinkComponet> - + + - + ); }, Accordion: ({ className, ...props }: any) => { @@ -175,31 +241,35 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo ); }, p: ({ className, ...props }: any) => { - return ; + return ; + }, + ol: ({ className, ...props }: any) => { + return
      ; + }, + ul: ({ className, ...props }: any) => { + return
        ; + }, + li: ({ className, ...props }: any) => { + return
      • ; }, h2: ({ className, ...props }: any) => { - return ; + return <TitleH2 className={css({ marginTop: '75' })} {...props} />; }, h3: ({ className, ...props }: any) => { - return <Title size={2} {...props} />; + return <TitleH3 {...props} />; }, a: ({ className, ...props }: any) => { - const LinkComponet = props.href.includes('api-reference') ? 'a' : Link; - const LinkProps = props.href.includes('api-reference') - ? { href: `https://docs.novu.co${props.href}` } - : { to: `/docs${props.href}` }; - return ( - <LinkComponet - {...(LinkProps as any)} - rel={props.href.includes('api-reference') ? 'noopener noreferrer' : undefined} - target={props.href.includes('api-reference') ? '_blank' : '_self'} + <a + href={`https://docs.novu.co${props.href}`} + rel={'noopener noreferrer'} + target={'_blank'} children={props.children} /> ); }, }} /> - </Stack> + </VStack> ); }; diff --git a/apps/web/src/components/providers/DocsProvider.tsx b/apps/web/src/components/providers/DocsProvider.tsx index 8e0d05eeeac..95baa5e2848 100644 --- a/apps/web/src/components/providers/DocsProvider.tsx +++ b/apps/web/src/components/providers/DocsProvider.tsx @@ -1,8 +1,21 @@ import React, { useContext, useEffect, useState } from 'react'; -import { ActionIcon, Drawer } from '@mantine/core'; +import { ActionIcon, useMantineColorScheme, Modal } from '@mantine/core'; import { useLocation } from 'react-router-dom'; import { Docs } from '../docs'; -import { IconClose } from '@novu/design-system'; +import { + colors, + IconOpenInNew, + IconOutlineClose, + IconThumbDownAlt, + IconThumbUpAlt, + Tooltip, +} from '@novu/design-system'; +import { Flex, styled } from '../../styled-system/jsx'; +import { text } from '../../styled-system/recipes'; +import { css } from '../../styled-system/css'; +import { useSegment } from '@novu/shared-web'; + +const Text = styled('p', text); interface IDocsContext { setPath: (path: string) => void; @@ -28,7 +41,15 @@ export const useSetDocs = (path: string) => { export const DocsProvider = ({ children }) => { const [path, setPath] = useState<string>(''); const [open, setOpen] = useState(false); + const [voted, setVoted] = useState(''); const { pathname } = useLocation(); + const segment = useSegment(); + const { colorScheme } = useMantineColorScheme(); + const isDark = colorScheme === 'dark'; + + const onClose = () => { + toggle(); + }; useEffect(() => { return () => { @@ -48,31 +69,113 @@ export const DocsProvider = ({ children }) => { enabled: path.length > 0, }} > - <Drawer + <Modal opened={open} - onClose={() => { - setOpen(false); - }} - position="right" - size="100%" + onClose={onClose} styles={{ root: { - zIndex: 10002, - }, - drawer: { - overflow: 'scroll', + zIndex: 10003, }, - header: { - display: 'none', + modal: { + width: 800, + padding: '24px !important', + borderRadius: 12, + position: 'relative', }, }} + overflow="inside" + withCloseButton={false} + overlayColor={isDark ? colors.BGDark : colors.BGLight} > <Docs path={path}> - <ActionIcon variant="transparent" onClick={() => toggle()}> - <IconClose /> - </ActionIcon> + <Flex + className={css({ + position: 'fixed', + top: '150', + right: '150', + background: 'legacy.B15', + zIndex: 1, + padding: '25', + borderBottomLeftRadius: '50', + })} + gap="125" + > + <Tooltip label="Open docs website"> + <ActionIcon + style={{ + width: '20px !important', + minWidth: '20px !important', + border: 'none', + }} + variant="transparent" + onClick={() => { + window.open(`https://docs.novu.co/${path}`); + }} + > + <IconOpenInNew /> + </ActionIcon> + </Tooltip> + <ActionIcon + variant="transparent" + onClick={onClose} + style={{ + width: '20px !important', + minWidth: '20px !important', + border: 'none', + }} + > + <IconOutlineClose /> + </ActionIcon> + </Flex> </Docs> - </Drawer> + <Flex + className={css({ + marginTop: '250', + })} + align="center" + gap="125" + > + <Text>Did you find it useful?</Text> + <Flex gap="100" align="center"> + <ActionIcon + style={{ + width: '20px !important', + minWidth: '20px', + border: 'none', + }} + variant="transparent" + onClick={() => { + segment.track('Inline docs voting used', { + documentationPage: path, + pageURL: window.location.href, + vote: 'up', + }); + setVoted('up'); + }} + > + <IconThumbUpAlt color={voted == 'up' ? 'white' : undefined} size={20} /> + </ActionIcon> + <ActionIcon + style={{ + width: '20px !important', + minWidth: '20px', + border: 'none', + }} + variant="transparent" + onClick={() => { + segment.track('Inline docs voting used', { + documentationPage: path, + pageURL: window.location.href, + vote: 'down', + }); + setVoted('down'); + }} + > + <IconThumbDownAlt color={voted == 'down' ? 'white' : undefined} size={20} /> + </ActionIcon> + </Flex> + </Flex> + </Modal> {children} </DocsContext.Provider> ); From 89934549761a62e99a49ec246b47153d6a48d14f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= <granskog_@hotmail.com> Date: Tue, 14 May 2024 10:23:19 +0200 Subject: [PATCH 06/34] fix: image bug --- apps/web/src/components/docs/index.tsx | 4 +-- .../src/components/providers/DocsProvider.tsx | 27 ++++++++----------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/apps/web/src/components/docs/index.tsx b/apps/web/src/components/docs/index.tsx index cfb5f40bf18..a9af02bbf8d 100644 --- a/apps/web/src/components/docs/index.tsx +++ b/apps/web/src/components/docs/index.tsx @@ -59,7 +59,7 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo const images = Array.from(docs.getElementsByTagName('img')); for (const img of images) { - if (img.src.includes('mintlify.s3-us-west-1.amazonaws.com')) { + if (img.src.includes('https://mintlify.s3-us-west-1.amazonaws.com')) { continue; } @@ -135,7 +135,7 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo Frame: ({ className, ...props }: any) => { return ( <div {...props}> - <img alt="" src={props.children.props.src} /> + <img alt="" src={`https://mintlify.s3-us-west-1.amazonaws.com/novu${props.children.props.src}`} /> <Text className={css({ textAlign: 'center', fontStyle: 'italic' })}>{props.caption}</Text> </div> ); diff --git a/apps/web/src/components/providers/DocsProvider.tsx b/apps/web/src/components/providers/DocsProvider.tsx index 95baa5e2848..392de619643 100644 --- a/apps/web/src/components/providers/DocsProvider.tsx +++ b/apps/web/src/components/providers/DocsProvider.tsx @@ -61,6 +61,15 @@ export const DocsProvider = ({ children }) => { setOpen(!open); }; + const onVoteClick = (vote: string) => () => { + segment.track('Inline docs voting used', { + documentationPage: path, + pageURL: window.location.href, + vote, + }); + setVoted(vote); + }; + return ( <DocsContext.Provider value={{ @@ -144,14 +153,7 @@ export const DocsProvider = ({ children }) => { border: 'none', }} variant="transparent" - onClick={() => { - segment.track('Inline docs voting used', { - documentationPage: path, - pageURL: window.location.href, - vote: 'up', - }); - setVoted('up'); - }} + onClick={onVoteClick('up')} > <IconThumbUpAlt color={voted == 'up' ? 'white' : undefined} size={20} /> </ActionIcon> @@ -162,14 +164,7 @@ export const DocsProvider = ({ children }) => { border: 'none', }} variant="transparent" - onClick={() => { - segment.track('Inline docs voting used', { - documentationPage: path, - pageURL: window.location.href, - vote: 'down', - }); - setVoted('down'); - }} + onClick={onVoteClick('down')} > <IconThumbDownAlt color={voted == 'down' ? 'white' : undefined} size={20} /> </ActionIcon> From d6ed5a06cc8ed4023a821e2b01a54d4c4bfe5a7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= <granskog_@hotmail.com> Date: Tue, 14 May 2024 10:25:28 +0200 Subject: [PATCH 07/34] fix: cspell error --- .cspell.json | 3 ++- apps/web/src/components/docs/index.tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.cspell.json b/.cspell.json index 1e2800efdfe..fe4377846a6 100644 --- a/.cspell.json +++ b/.cspell.json @@ -666,7 +666,8 @@ "automerge", "novui", "tsup", - "pandabox" + "pandabox", + "hljs" ], "flagWords": [], "patterns": [ diff --git a/apps/web/src/components/docs/index.tsx b/apps/web/src/components/docs/index.tsx index a9af02bbf8d..e4928f4d497 100644 --- a/apps/web/src/components/docs/index.tsx +++ b/apps/web/src/components/docs/index.tsx @@ -89,7 +89,7 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo justify="center" align="center" > - <Text>We could not load the documenation for you, please try again.</Text> + <Text>We could not load the documentation for you, please try again.</Text> {children} </Flex> ); From 2219184dcc79b539b56905b265bb8a40b0f3c6a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= <granskog_@hotmail.com> Date: Tue, 14 May 2024 10:41:30 +0200 Subject: [PATCH 08/34] fix: incomplete url substring sanitization --- apps/web/src/components/docs/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/components/docs/index.tsx b/apps/web/src/components/docs/index.tsx index e4928f4d497..7c6b1b8a862 100644 --- a/apps/web/src/components/docs/index.tsx +++ b/apps/web/src/components/docs/index.tsx @@ -59,7 +59,7 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo const images = Array.from(docs.getElementsByTagName('img')); for (const img of images) { - if (img.src.includes('https://mintlify.s3-us-west-1.amazonaws.com')) { + if (img.src.startsWith('https://mintlify.s3-us-west-1.amazonaws.com')) { continue; } From 614a665a00ac6db8d13e5d19610621f1a84e9abc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= <granskog_@hotmail.com> Date: Tue, 14 May 2024 14:38:45 +0200 Subject: [PATCH 09/34] fix: after testing --- apps/web/src/components/docs/DocsButton.tsx | 18 ++++++++++++++---- .../src/components/providers/DocsProvider.tsx | 12 ++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/apps/web/src/components/docs/DocsButton.tsx b/apps/web/src/components/docs/DocsButton.tsx index 7782a89116e..8bb8bc15bd1 100644 --- a/apps/web/src/components/docs/DocsButton.tsx +++ b/apps/web/src/components/docs/DocsButton.tsx @@ -1,5 +1,6 @@ import { ActionIcon, Popover, useMantineColorScheme } from '@mantine/core'; import { Button, colors, IconOutlineMenuBook, QuickGuide, shadows, Tooltip } from '@novu/design-system'; +import { useSegment } from '@novu/shared-web'; import { useEffect, useState } from 'react'; import { css } from '../../styled-system/css'; import { Flex, styled } from '../../styled-system/jsx'; @@ -12,8 +13,9 @@ const Text = styled('p', text); export const DocsButton = () => { const { colorScheme } = useMantineColorScheme(); const isDark = colorScheme === 'dark'; - const { toggle, enabled } = useDocsContext(); + const { toggle, enabled, path } = useDocsContext(); const [opened, setOpened] = useState(false); + const segment = useSegment(); const onClose = () => { setOpened(false); @@ -28,10 +30,18 @@ export const DocsButton = () => { return; } setOpened(false); - }, [enabled]); + segment.track('Inline docs tooltip shown', { + documentationPage: path, + pageURL: window.location.href, + }); + }, [enabled, path, segment]); + + if (!enabled) { + return null; + } return ( - <Tooltip disabled={opened} label={enabled ? 'Inline documentation' : 'There is no documentation for this page'}> + <Tooltip disabled={opened} label="Inline documentation"> <div> <Popover closeOnClickOutside={false} @@ -42,7 +52,7 @@ export const DocsButton = () => { withArrow > <Popover.Target> - <ActionIcon variant="transparent" disabled={!enabled} onClick={() => toggle()}> + <ActionIcon variant="transparent" onClick={() => toggle()}> <IconOutlineMenuBook /> </ActionIcon> </Popover.Target> diff --git a/apps/web/src/components/providers/DocsProvider.tsx b/apps/web/src/components/providers/DocsProvider.tsx index 392de619643..7505d1632d8 100644 --- a/apps/web/src/components/providers/DocsProvider.tsx +++ b/apps/web/src/components/providers/DocsProvider.tsx @@ -21,12 +21,14 @@ interface IDocsContext { setPath: (path: string) => void; toggle: () => void; enabled: boolean; + path: string; } const DocsContext = React.createContext<IDocsContext>({ setPath: () => {}, toggle: () => {}, enabled: false, + path: '', }); export const useDocsContext = (): IDocsContext => useContext(DocsContext); @@ -54,6 +56,7 @@ export const DocsProvider = ({ children }) => { useEffect(() => { return () => { setPath(''); + setVoted(''); }; }, [pathname]); @@ -76,6 +79,7 @@ export const DocsProvider = ({ children }) => { setPath, toggle, enabled: path.length > 0, + path, }} > <Modal @@ -85,11 +89,19 @@ export const DocsProvider = ({ children }) => { root: { zIndex: 10003, }, + inner: { + padding: '24px', + }, + body: { + height: '100%', + maxHeight: '100%', + }, modal: { width: 800, padding: '24px !important', borderRadius: 12, position: 'relative', + height: '100%', }, }} overflow="inside" From b5e65622bf630a8a6cb4967451d4cf2dc6f1580d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= <granskog_@hotmail.com> Date: Tue, 14 May 2024 14:43:52 +0200 Subject: [PATCH 10/34] fix: move segment event track for docs button --- apps/web/src/components/docs/DocsButton.tsx | 10 +++++----- apps/web/src/components/docs/index.tsx | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/web/src/components/docs/DocsButton.tsx b/apps/web/src/components/docs/DocsButton.tsx index 8bb8bc15bd1..71702b7f5f0 100644 --- a/apps/web/src/components/docs/DocsButton.tsx +++ b/apps/web/src/components/docs/DocsButton.tsx @@ -20,6 +20,10 @@ export const DocsButton = () => { const onClose = () => { setOpened(false); localStorage.setItem('inline-docs-intro', 'false'); + segment.track('Inline docs tooltip shown', { + documentationPage: path, + pageURL: window.location.href, + }); }; useEffect(() => { @@ -30,11 +34,7 @@ export const DocsButton = () => { return; } setOpened(false); - segment.track('Inline docs tooltip shown', { - documentationPage: path, - pageURL: window.location.href, - }); - }, [enabled, path, segment]); + }, [enabled]); if (!enabled) { return null; diff --git a/apps/web/src/components/docs/index.tsx b/apps/web/src/components/docs/index.tsx index 7c6b1b8a862..cee19d617fa 100644 --- a/apps/web/src/components/docs/index.tsx +++ b/apps/web/src/components/docs/index.tsx @@ -30,7 +30,7 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo ); useEffect(() => { - segment.track('Open Inline Documentation', { + segment.track('Inline docs opened', { documentationPage: path, pageURL: window.location.href, }); From 56b101fc294ac3b6f7ab7232ecd7add4f9e80955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= <granskog_@hotmail.com> Date: Wed, 15 May 2024 08:25:50 +0200 Subject: [PATCH 11/34] fix: list style type bug --- apps/web/src/components/docs/index.tsx | 58 ++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/apps/web/src/components/docs/index.tsx b/apps/web/src/components/docs/index.tsx index cee19d617fa..97a97c7df8b 100644 --- a/apps/web/src/components/docs/index.tsx +++ b/apps/web/src/components/docs/index.tsx @@ -10,6 +10,7 @@ import { css } from '../../styled-system/css'; import { text, title as RTitle } from '../../styled-system/recipes'; const Text = styled('p', text); +const LiText = styled('span', text); const TitleH2 = styled('h2', RTitle); const TitleH3 = styled('h3', RTitle); const TitleH1 = styled('h1', RTitle); @@ -96,7 +97,14 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo } return ( - <VStack alignItems="unset" id="docs" gap={12}> + <VStack + alignItems="unset" + id="docs" + gap={12} + className={css({ + textAlign: 'justify left', + })} + > <div> <Flex justify="space-between" align="center"> <TitleH1>{title}</TitleH1> @@ -149,13 +157,25 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo return null; }, Steps: ({ className, ...props }: any) => { - return <ol className={css({ lineHeight: '125', listStyleType: 'decimal' })}>{props.children}</ol>; + return ( + <ol + className={css({ + lineHeight: '125', + listStyleType: 'decimal', + listStylePosition: 'inside', + })} + > + {props.children} + </ol> + ); }, Step: ({ className, ...props }: any) => { return ( - <li className={css({ paddingLeft: '100', lineHeight: '125', marginBottom: '50' })}> - <Text className={css({ lineHeight: '150', fontSize: '100', fontWeight: 'bolder' })}>{props.title}</Text> - <Text className={css({ lineHeight: '125' })}>{props.children}</Text> + <li className={css({ lineHeight: '125', marginBottom: '50' })}> + <LiText className={css({ lineHeight: '150', fontSize: '100', fontWeight: 'bolder' })}> + {props.title} + </LiText> + <LiText className={css({ lineHeight: '125' })}>{props.children}</LiText> </li> ); }, @@ -244,10 +264,34 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo return <Text className={css({ lineHeight: '125' })} {...props} />; }, ol: ({ className, ...props }: any) => { - return <ol className={css({ lineHeight: '125', listStyleType: 'decimal' })} {...props} />; + return ( + <ol + className={css({ + lineHeight: '125', + listStyleType: 'decimal', + listStylePosition: 'inside', + '& p': { + display: 'inline !important', + }, + })} + {...props} + /> + ); }, ul: ({ className, ...props }: any) => { - return <ul className={css({ lineHeight: '125', listStyleType: 'disc' })} {...props} />; + return ( + <ul + className={css({ + lineHeight: '125', + listStyleType: 'disc', + listStylePosition: 'inside', + '& p': { + display: 'inline !important', + }, + })} + {...props} + /> + ); }, li: ({ className, ...props }: any) => { return <li className={css({ lineHeight: '125', marginBottom: '50' })} {...props} />; From 1c97ced06368bebd28e43e304f6eaba87e7b691e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= <granskog_@hotmail.com> Date: Wed, 15 May 2024 08:27:53 +0200 Subject: [PATCH 12/34] fix: so multiple vote can not be done on same view time --- apps/web/src/components/providers/DocsProvider.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/web/src/components/providers/DocsProvider.tsx b/apps/web/src/components/providers/DocsProvider.tsx index 7505d1632d8..d4b4a059a34 100644 --- a/apps/web/src/components/providers/DocsProvider.tsx +++ b/apps/web/src/components/providers/DocsProvider.tsx @@ -65,6 +65,9 @@ export const DocsProvider = ({ children }) => { }; const onVoteClick = (vote: string) => () => { + if (voted.length > 0) { + return; + } segment.track('Inline docs voting used', { documentationPage: path, pageURL: window.location.href, From ae299ac5900f1730435b2b4da5075f880a0ec282 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= <granskog_@hotmail.com> Date: Wed, 15 May 2024 09:10:11 +0200 Subject: [PATCH 13/34] fix: dark and light theme --- apps/web/src/components/providers/DocsProvider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/components/providers/DocsProvider.tsx b/apps/web/src/components/providers/DocsProvider.tsx index d4b4a059a34..de711bb0ef2 100644 --- a/apps/web/src/components/providers/DocsProvider.tsx +++ b/apps/web/src/components/providers/DocsProvider.tsx @@ -117,7 +117,7 @@ export const DocsProvider = ({ children }) => { position: 'fixed', top: '150', right: '150', - background: 'legacy.B15', + background: isDark ? 'legacy.B15' : 'white', zIndex: 1, padding: '25', borderBottomLeftRadius: '50', From da11cb3dfbf8ed6584f8ba58d0ffcaab6c61c110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= <granskog_@hotmail.com> Date: Wed, 15 May 2024 14:19:23 +0200 Subject: [PATCH 14/34] fix: domain for docs --- apps/web/src/components/docs/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/components/docs/index.tsx b/apps/web/src/components/docs/index.tsx index 97a97c7df8b..8d1e11d9b10 100644 --- a/apps/web/src/components/docs/index.tsx +++ b/apps/web/src/components/docs/index.tsx @@ -23,7 +23,7 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo const { isLoading, data: { code, title, description } = { code: '', title: '', description: '' } } = useQuery( ['docs', path], async () => { - const response = await fetch('http://localhost:5173/' + path); + const response = await fetch('https://cloud-doc.vercel.app/' + path); const json = await response.json(); return json; From 5ae59022f9da60cd6b59c3145ba7c46fe6615b0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= <granskog_@hotmail.com> Date: Thu, 16 May 2024 04:35:22 +0200 Subject: [PATCH 15/34] fix: after pr comments --- apps/web/src/components/docs/DocsButton.tsx | 30 ++++++++--------- apps/web/src/components/docs/DocsCard.tsx | 10 +++--- .../web/src/components/docs/DocsHomeModal.tsx | 5 +-- apps/web/src/components/docs/ExploreLink.tsx | 2 +- apps/web/src/components/docs/Highlight.tsx | 2 +- apps/web/src/components/docs/index.tsx | 32 +++++++++++-------- .../src/components/providers/DocsProvider.tsx | 11 ++++--- 7 files changed, 51 insertions(+), 41 deletions(-) diff --git a/apps/web/src/components/docs/DocsButton.tsx b/apps/web/src/components/docs/DocsButton.tsx index 71702b7f5f0..2573cdb3118 100644 --- a/apps/web/src/components/docs/DocsButton.tsx +++ b/apps/web/src/components/docs/DocsButton.tsx @@ -1,5 +1,5 @@ -import { ActionIcon, Popover, useMantineColorScheme } from '@mantine/core'; -import { Button, colors, IconOutlineMenuBook, QuickGuide, shadows, Tooltip } from '@novu/design-system'; +import { ActionIcon, Popover } from '@mantine/core'; +import { Button, IconOutlineMenuBook, QuickGuide, Tooltip, useColorScheme } from '@novu/design-system'; import { useSegment } from '@novu/shared-web'; import { useEffect, useState } from 'react'; import { css } from '../../styled-system/css'; @@ -11,10 +11,10 @@ const Title = styled('h3', title); const Text = styled('p', text); export const DocsButton = () => { - const { colorScheme } = useMantineColorScheme(); + const { colorScheme } = useColorScheme(); const isDark = colorScheme === 'dark'; const { toggle, enabled, path } = useDocsContext(); - const [opened, setOpened] = useState(false); + const [opened, setOpened] = useState<boolean>(false); const segment = useSegment(); const onClose = () => { @@ -57,11 +57,11 @@ export const DocsButton = () => { </ActionIcon> </Popover.Target> <Popover.Dropdown - style={{ - borderRadius: '12px', - boxShadow: isDark ? undefined : shadows.dark, - background: isDark ? colors.B30 : undefined, - }} + className={css({ + borderRadius: '75', + boxShadow: isDark ? undefined : 'dark', + background: isDark ? 'legacy.B30' : undefined, + })} > <Flex gap="125" justify="space-between"> <QuickGuide /> @@ -69,7 +69,7 @@ export const DocsButton = () => { <Title className={css({ marginBottom: '50', - fontSize: '18px', + fontSize: '88', lineHeight: '150', })} > @@ -77,7 +77,7 @@ export const DocsButton = () => { { > diff --git a/apps/web/src/components/docs/DocsCard.tsx b/apps/web/src/components/docs/DocsCard.tsx index 234e78c8ac7..c35cbcd867a 100644 --- a/apps/web/src/components/docs/DocsCard.tsx +++ b/apps/web/src/components/docs/DocsCard.tsx @@ -1,4 +1,4 @@ -import { useMantineColorScheme } from '@mantine/core'; +import { useColorScheme } from '@novu/design-system'; import { css } from '../../styled-system/css'; import { styled } from '../../styled-system/jsx'; import { text as RText, title as RTitle } from '../../styled-system/recipes'; @@ -14,10 +14,10 @@ export const DocsCard = ({ }: { title: string; text: string; - Icon: any; + Icon: (props: { size?: number }) => JSX.Element; onClick: () => void; }) => { - const { colorScheme } = useMantineColorScheme(); + const { colorScheme } = useColorScheme(); const isDark = colorScheme === 'dark'; return ( @@ -37,7 +37,9 @@ export const DocsCard = ({ {title} - {text} + + {text} +
    ); }; diff --git a/apps/web/src/components/docs/DocsHomeModal.tsx b/apps/web/src/components/docs/DocsHomeModal.tsx index 717659ab831..b25364c1a9d 100644 --- a/apps/web/src/components/docs/DocsHomeModal.tsx +++ b/apps/web/src/components/docs/DocsHomeModal.tsx @@ -1,4 +1,4 @@ -import { ActionIcon, Modal, useMantineColorScheme } from '@mantine/core'; +import { ActionIcon, Modal } from '@mantine/core'; import { colors, IconChecklist, @@ -16,6 +16,7 @@ import { IconWidgets, IconWrapText, Tooltip, + useColorScheme, } from '@novu/design-system'; import { css } from '../../styled-system/css'; import { Flex, Grid, GridItem, styled } from '../../styled-system/jsx'; @@ -29,7 +30,7 @@ const ModalTitle = styled('h2', title); export const DocsHomeModal = ({ path, open }: { path: string; open: boolean }) => { const { setPath, toggle } = useDocsContext(); - const { colorScheme } = useMantineColorScheme(); + const { colorScheme } = useColorScheme(); const isDark = colorScheme === 'dark'; const onClose = () => { diff --git a/apps/web/src/components/docs/ExploreLink.tsx b/apps/web/src/components/docs/ExploreLink.tsx index b37325d12f7..06d7e011526 100644 --- a/apps/web/src/components/docs/ExploreLink.tsx +++ b/apps/web/src/components/docs/ExploreLink.tsx @@ -40,7 +40,7 @@ export const ExploreLink = ({ className={css({ fontSize: '75', lineHeight: '125', - color: 'legacy.B60', + color: 'typography.text.secondary', })} > {text} diff --git a/apps/web/src/components/docs/Highlight.tsx b/apps/web/src/components/docs/Highlight.tsx index 1d012f2e984..b6f1fd983eb 100644 --- a/apps/web/src/components/docs/Highlight.tsx +++ b/apps/web/src/components/docs/Highlight.tsx @@ -4,7 +4,7 @@ import 'highlight.js/styles/default.css'; import 'highlight.js/styles/atom-one-dark.css'; export const Highlight = (props: any) => { - const ref: any = useRef(); + const ref = useRef(); useEffect(() => { if (!ref.current) { diff --git a/apps/web/src/components/docs/index.tsx b/apps/web/src/components/docs/index.tsx index 8d1e11d9b10..5bfb6a0d8e4 100644 --- a/apps/web/src/components/docs/index.tsx +++ b/apps/web/src/components/docs/index.tsx @@ -20,15 +20,16 @@ const getMDXComponent = mdxBundler.getMDXComponent; export const Docs = ({ path = '', children }: { path?: string; children: ReactNode }) => { const segment = useSegment(); - const { isLoading, data: { code, title, description } = { code: '', title: '', description: '' } } = useQuery( - ['docs', path], - async () => { - const response = await fetch('https://cloud-doc.vercel.app/' + path); - const json = await response.json(); + const { isLoading, data: { code, title, description } = { code: '', title: '', description: '' } } = useQuery<{ + code: string; + title: string; + description: string; + }>(['docs', path], async () => { + const response = await fetch('https://cloud-doc.vercel.app/' + path); + const json = await response.json(); - return json; - } - ); + return json; + }); useEffect(() => { segment.track('Inline docs opened', { @@ -73,7 +74,7 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo return (
    @@ -85,12 +86,12 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo return ( - We could not load the documentation for you, please try again. + We could not load the documentation for you. Please try again. {children} ); @@ -134,7 +135,7 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo className={css({ height: '150', lineHeight: '125', - color: 'legacy.B40', + color: 'typography.text.main', borderBottomColor: 'legacy.B30', })} /> @@ -222,7 +223,12 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo }, Tip: ({ className, ...props }: any) => { return ( - } /> + } + /> ); }, Tooltip: ({ className, ...props }: any) => { diff --git a/apps/web/src/components/providers/DocsProvider.tsx b/apps/web/src/components/providers/DocsProvider.tsx index de711bb0ef2..268d751cd47 100644 --- a/apps/web/src/components/providers/DocsProvider.tsx +++ b/apps/web/src/components/providers/DocsProvider.tsx @@ -1,5 +1,5 @@ import React, { useContext, useEffect, useState } from 'react'; -import { ActionIcon, useMantineColorScheme, Modal } from '@mantine/core'; +import { ActionIcon, Modal } from '@mantine/core'; import { useLocation } from 'react-router-dom'; import { Docs } from '../docs'; import { @@ -9,6 +9,7 @@ import { IconThumbDownAlt, IconThumbUpAlt, Tooltip, + useColorScheme, } from '@novu/design-system'; import { Flex, styled } from '../../styled-system/jsx'; import { text } from '../../styled-system/recipes'; @@ -46,7 +47,7 @@ export const DocsProvider = ({ children }) => { const [voted, setVoted] = useState(''); const { pathname } = useLocation(); const segment = useSegment(); - const { colorScheme } = useMantineColorScheme(); + const { colorScheme } = useColorScheme(); const isDark = colorScheme === 'dark'; const onClose = () => { @@ -64,7 +65,7 @@ export const DocsProvider = ({ children }) => { setOpen(!open); }; - const onVoteClick = (vote: string) => () => { + const onVoteClick = (vote: 'up' | 'down') => () => { if (voted.length > 0) { return; } @@ -170,7 +171,7 @@ export const DocsProvider = ({ children }) => { variant="transparent" onClick={onVoteClick('up')} > - + { variant="transparent" onClick={onVoteClick('down')} > - + From 5b8cd64af1e8db2ce5e0494a516699ead4eb2bbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= Date: Thu, 16 May 2024 04:39:25 +0200 Subject: [PATCH 16/34] fix: after pr comments --- .../src/components/providers/DocsProvider.tsx | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/apps/web/src/components/providers/DocsProvider.tsx b/apps/web/src/components/providers/DocsProvider.tsx index 268d751cd47..913d43c128a 100644 --- a/apps/web/src/components/providers/DocsProvider.tsx +++ b/apps/web/src/components/providers/DocsProvider.tsx @@ -127,11 +127,11 @@ export const DocsProvider = ({ children }) => { > { window.open(`https://docs.novu.co/${path}`); @@ -143,11 +143,11 @@ export const DocsProvider = ({ children }) => { @@ -163,22 +163,22 @@ export const DocsProvider = ({ children }) => { Did you find it useful? From ce9b0a29933e0087a2e70906f55ab2e23bb268b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derberg?= Date: Thu, 16 May 2024 04:57:48 +0200 Subject: [PATCH 17/34] fix: after pr comments --- apps/web/src/components/docs/VotingWidget.tsx | 51 ++ apps/web/src/components/docs/index.tsx | 451 +++++++++--------- .../src/components/providers/DocsProvider.tsx | 120 ++--- 3 files changed, 321 insertions(+), 301 deletions(-) create mode 100644 apps/web/src/components/docs/VotingWidget.tsx diff --git a/apps/web/src/components/docs/VotingWidget.tsx b/apps/web/src/components/docs/VotingWidget.tsx new file mode 100644 index 00000000000..36f557f4b13 --- /dev/null +++ b/apps/web/src/components/docs/VotingWidget.tsx @@ -0,0 +1,51 @@ +import { ActionIcon } from '@mantine/core'; +import { IconThumbDownAlt, IconThumbUpAlt } from '@novu/design-system'; +import { css } from '../../styled-system/css'; +import { Flex, styled } from '../../styled-system/jsx'; +import { text } from '../../styled-system/recipes'; + +const Text = styled('p', text); + +export const VotingWidget = ({ + voted, + onVoteClick, +}: { + voted: 'up' | 'down' | ''; + onVoteClick: (vote: 'up' | 'down') => () => void; +}) => { + return ( + + Did you find it useful? + + + + + + + + + + ); +}; diff --git a/apps/web/src/components/docs/index.tsx b/apps/web/src/components/docs/index.tsx index 5bfb6a0d8e4..9b5d71a31e3 100644 --- a/apps/web/src/components/docs/index.tsx +++ b/apps/web/src/components/docs/index.tsx @@ -17,7 +17,11 @@ const TitleH1 = styled('h1', RTitle); const getMDXComponent = mdxBundler.getMDXComponent; -export const Docs = ({ path = '', children }: { path?: string; children: ReactNode }) => { +/* + *Render the mdx for our mintlify docs inside of the web. + *Fetching the compiled mdx from another service and then try to map the markdown to react components. + */ +export const Docs = ({ path = '', children, actions }: { path?: string; children: ReactNode; actions: ReactNode }) => { const segment = useSegment(); const { isLoading, data: { code, title, description } = { code: '', title: '', description: '' } } = useQuery<{ @@ -98,228 +102,231 @@ export const Docs = ({ path = '', children }: { path?: string; children: ReactNo } return ( - -
    - - {title} - {children} - - {description} -
    - { - return ( - - ); - }, - thead: ({ className, ...props }: any) => { - return ( - - ); - }, - Frame: ({ className, ...props }: any) => { - return ( -
    - - {props.caption} -
    - ); - }, - Info: ({ className, ...props }: any) => { - return ( - } /> - ); - }, - Snippet: () => { - return null; - }, - Steps: ({ className, ...props }: any) => { - return ( -
      - {props.children} -
    - ); - }, - Step: ({ className, ...props }: any) => { - return ( -
  • - - {props.title} - - {props.children} -
  • - ); - }, - Warning: ({ className, ...props }: any) => { - return ( - } - /> - ); - }, - Note: ({ className, ...props }: any) => { - return ( - } /> - ); - }, - CardGroup: ({ className, ...props }: any) => { - return ( - - {props.children} - - ); - }, - AccordionGroup: ({ className, ...props }: any) => { - return ; - }, - Tab: () => null, - Tabs: ({ className, ...props }: any) => { - const tabs = Array.isArray(props.children) ? props.children : [props.children]; + <> + +
    + + {title} + {actions} + + {description} +
    + { + return ( + + ); + }, + thead: ({ className, ...props }: any) => { + return ( + + ); + }, + Frame: ({ className, ...props }: any) => { + return ( +
    + + {props.caption} +
    + ); + }, + Info: ({ className, ...props }: any) => { + return ( + } /> + ); + }, + Snippet: () => { + return null; + }, + Steps: ({ className, ...props }: any) => { + return ( +
      + {props.children} +
    + ); + }, + Step: ({ className, ...props }: any) => { + return ( +
  • + + {props.title} + + {props.children} +
  • + ); + }, + Warning: ({ className, ...props }: any) => { + return ( + } + /> + ); + }, + Note: ({ className, ...props }: any) => { + return ( + } /> + ); + }, + CardGroup: ({ className, ...props }: any) => { + return ( + + {props.children} + + ); + }, + AccordionGroup: ({ className, ...props }: any) => { + return ; + }, + Tab: () => null, + Tabs: ({ className, ...props }: any) => { + const tabs = Array.isArray(props.children) ? props.children : [props.children]; - return ( - { - return { - content: tab.props.children, - value: tab.props.title, - }; - })} - defaultValue={tabs[0].props.title} - /> - ); - }, - Tip: ({ className, ...props }: any) => { - return ( - } - /> - ); - }, - Tooltip: ({ className, ...props }: any) => { - return ( - - {props.children} - - ); - }, - code: ({ className, ...props }: any) => { - if (className?.includes('language-')) { - return ; - } + return ( + { + return { + content: tab.props.children, + value: tab.props.title, + }; + })} + defaultValue={tabs[0].props.title} + /> + ); + }, + Tip: ({ className, ...props }: any) => { + return ( + } + /> + ); + }, + Tooltip: ({ className, ...props }: any) => { + return ( + + {props.children} + + ); + }, + code: ({ className, ...props }: any) => { + if (className?.includes('language-')) { + return ; + } - return ; - }, - Card: ({ className, ...props }: any) => { - return ( - - - - - {props.title} - - - - - ); - }, - Accordion: ({ className, ...props }: any) => { - return ( - - {props.title} - {props.children} - - ); - }, - p: ({ className, ...props }: any) => { - return ; - }, - ol: ({ className, ...props }: any) => { - return ( -
      - ); - }, - ul: ({ className, ...props }: any) => { - return ( -