diff --git a/package.json b/package.json
index b8d411fac..01f96bd4e 100644
--- a/package.json
+++ b/package.json
@@ -360,7 +360,8 @@
"graphql": "16.8.0",
"type-fest": "4.10.1",
"typescript": "5.3.3",
- "prosemirror-model": "1.23.0"
+ "prosemirror-model": "1.23.0",
+ "yjs": "13.6.18"
},
"version": "0.2.1",
"nx": {},
diff --git a/packages/twenty-front/.storybook/main.ts b/packages/twenty-front/.storybook/main.ts
index c320d9750..376b3f4b1 100644
--- a/packages/twenty-front/.storybook/main.ts
+++ b/packages/twenty-front/.storybook/main.ts
@@ -37,7 +37,7 @@ const config: StorybookConfig = {
'@storybook/addon-docs',
'@storybook/addon-essentials/docs',
],
- }
+ },
},
addons: [
'@storybook/addon-links',
diff --git a/packages/twenty-front/package.json b/packages/twenty-front/package.json
index 44e33f61c..c88a46e28 100644
--- a/packages/twenty-front/package.json
+++ b/packages/twenty-front/package.json
@@ -38,6 +38,7 @@
"@nivo/core": "^0.87.0",
"@nivo/line": "^0.87.0",
"@react-pdf/renderer": "^4.1.6",
+ "@scalar/api-reference-react": "^0.4.36",
"@tiptap/core": "^2.10.4",
"@tiptap/extension-document": "^2.10.4",
"@tiptap/extension-hard-break": "^2.10.4",
diff --git a/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx b/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx
index 270655a7b..0e72485df 100644
--- a/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx
+++ b/packages/twenty-front/src/modules/app/components/SettingsRoutes.tsx
@@ -7,6 +7,38 @@ import { SettingsPath } from '@/types/SettingsPath';
import { FeatureFlagKey } from '~/generated-metadata/graphql';
import { SettingsPermissions } from '~/generated/graphql';
+const SettingsApiKeys = lazy(() =>
+ import('~/pages/settings/developers/api-keys/SettingsApiKeys').then(
+ (module) => ({
+ default: module.SettingsApiKeys,
+ }),
+ ),
+);
+
+const SettingsGraphQLPlayground = lazy(() =>
+ import(
+ '~/pages/settings/developers/playground/SettingsGraphQLPlayground'
+ ).then((module) => ({
+ default: module.SettingsGraphQLPlayground,
+ })),
+);
+
+const SettingsRestPlayground = lazy(() =>
+ import('~/pages/settings/developers/playground/SettingsRestPlayground').then(
+ (module) => ({
+ default: module.SettingsRestPlayground,
+ }),
+ ),
+);
+
+const SettingsWebhooks = lazy(() =>
+ import(
+ '~/pages/settings/developers/webhooks/components/SettingsWebhooks'
+ ).then((module) => ({
+ default: module.SettingsWebhooks,
+ })),
+);
+
const SettingsAccountsCalendars = lazy(() =>
import('~/pages/settings/accounts/SettingsAccountsCalendars').then(
(module) => ({
@@ -137,12 +169,6 @@ const SettingsBilling = lazy(() =>
})),
);
-const SettingsDevelopers = lazy(() =>
- import('~/pages/settings/developers/SettingsDevelopers').then((module) => ({
- default: module.SettingsDevelopers,
- })),
-);
-
const SettingsIntegrations = lazy(() =>
import('~/pages/settings/integrations/SettingsIntegrations').then(
(module) => ({
@@ -376,9 +402,15 @@ export const SettingsRoutes = ({
/>
}
>
+ } />
+ } />
}
+ path={`${SettingsPath.GraphQLPlayground}`}
+ element={}
+ />
+ }
/>
{
getSelectedIndexForSubItems(subItems);
return (
-
+
{
/>
{subItems.map((subItem, subIndex) => (
{
}
return (
theme.border.color.light};
@@ -53,7 +55,9 @@ export const SettingsApiKeysTable = () => {
))}
diff --git a/packages/twenty-front/src/modules/settings/developers/components/SettingsReadDocumentationButton.tsx b/packages/twenty-front/src/modules/settings/developers/components/SettingsReadDocumentationButton.tsx
deleted file mode 100644
index 8fa1fe924..000000000
--- a/packages/twenty-front/src/modules/settings/developers/components/SettingsReadDocumentationButton.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { useLingui } from '@lingui/react/macro';
-import { Button, IconBook2 } from 'twenty-ui';
-
-export const SettingsReadDocumentationButton = () => {
- const { t } = useLingui();
-
- return (
-
- );
-};
diff --git a/packages/twenty-front/src/modules/settings/developers/hooks/useWebhookUpdateForm.ts b/packages/twenty-front/src/modules/settings/developers/hooks/useWebhookUpdateForm.ts
index d11e6f7bf..b05fcbd12 100644
--- a/packages/twenty-front/src/modules/settings/developers/hooks/useWebhookUpdateForm.ts
+++ b/packages/twenty-front/src/modules/settings/developers/hooks/useWebhookUpdateForm.ts
@@ -145,7 +145,7 @@ export const useWebhookUpdateForm = ({
const deleteWebhook = async () => {
await deleteOneWebhook(webhookId);
- navigate(SettingsPath.Developers);
+ navigate(SettingsPath.Webhooks);
};
useFindOneRecord({
diff --git a/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx b/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx
index 1b03d7b3e..b03b16634 100644
--- a/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx
+++ b/packages/twenty-front/src/modules/settings/hooks/useSettingsNavigationItems.tsx
@@ -1,8 +1,8 @@
import {
+ IconApi,
IconApps,
IconAt,
IconCalendarEvent,
- IconCode,
IconColorSwatch,
IconComponent,
IconCurrencyDollar,
@@ -18,6 +18,7 @@ import {
IconSettings,
IconUserCircle,
IconUsers,
+ IconWebhook,
} from 'twenty-ui';
import { SettingsPath } from '@/types/SettingsPath';
@@ -159,9 +160,16 @@ const useSettingsNavigationItems = (): SettingsNavigationSection[] => {
isAdvanced: true,
items: [
{
- label: t`API & Webhooks`,
- path: SettingsPath.Developers,
- Icon: IconCode,
+ label: t`APIs`,
+ path: SettingsPath.APIs,
+ Icon: IconApi,
+ isAdvanced: true,
+ isHidden: !permissionMap[SettingsPermissions.API_KEYS_AND_WEBHOOKS],
+ },
+ {
+ label: t`Webhooks`,
+ path: SettingsPath.Webhooks,
+ Icon: IconWebhook,
isAdvanced: true,
isHidden: !permissionMap[SettingsPermissions.API_KEYS_AND_WEBHOOKS],
},
diff --git a/packages/twenty-front/src/modules/settings/playground/assets/cover-dark.png b/packages/twenty-front/src/modules/settings/playground/assets/cover-dark.png
new file mode 100644
index 000000000..069ca9d30
Binary files /dev/null and b/packages/twenty-front/src/modules/settings/playground/assets/cover-dark.png differ
diff --git a/packages/twenty-front/src/modules/settings/playground/assets/cover-light.png b/packages/twenty-front/src/modules/settings/playground/assets/cover-light.png
new file mode 100644
index 000000000..dadd89963
Binary files /dev/null and b/packages/twenty-front/src/modules/settings/playground/assets/cover-light.png differ
diff --git a/packages/twenty-front/src/modules/settings/playground/components/GraphQLPlayground.tsx b/packages/twenty-front/src/modules/settings/playground/components/GraphQLPlayground.tsx
new file mode 100644
index 000000000..bd1a002fe
--- /dev/null
+++ b/packages/twenty-front/src/modules/settings/playground/components/GraphQLPlayground.tsx
@@ -0,0 +1,55 @@
+import { playgroundApiKeyState } from '@/settings/playground/states/playgroundApiKeyState';
+import { PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas';
+import { explorerPlugin } from '@graphiql/plugin-explorer';
+import '@graphiql/plugin-explorer/dist/style.css';
+import { createGraphiQLFetcher } from '@graphiql/toolkit';
+import { GraphiQL } from 'graphiql';
+import 'graphiql/graphiql.css';
+import { useContext } from 'react';
+import { useRecoilValue } from 'recoil';
+import { ThemeContext } from 'twenty-ui';
+import { REACT_APP_SERVER_BASE_URL } from '~/config';
+
+type GraphQLPlaygroundProps = {
+ onError(): void;
+ schema: PlaygroundSchemas;
+};
+
+export const schemaToPath = {
+ [PlaygroundSchemas.CORE]: 'graphql',
+ [PlaygroundSchemas.METADATA]: 'metadata',
+};
+
+export const GraphQLPlayground = ({
+ onError,
+ schema,
+}: GraphQLPlaygroundProps) => {
+ const playgroundApiKey = useRecoilValue(playgroundApiKeyState);
+ const baseUrl = REACT_APP_SERVER_BASE_URL + '/' + schemaToPath[schema];
+
+ const { theme } = useContext(ThemeContext);
+
+ if (!playgroundApiKey) {
+ onError();
+ return null;
+ }
+
+ const explorer = explorerPlugin({
+ showAttribution: true,
+ });
+
+ const fetcher = createGraphiQLFetcher({
+ url: baseUrl,
+ });
+
+ return (
+
+ );
+};
diff --git a/packages/twenty-front/src/modules/settings/playground/components/PlaygroundSetupForm.tsx b/packages/twenty-front/src/modules/settings/playground/components/PlaygroundSetupForm.tsx
new file mode 100644
index 000000000..7dda40470
--- /dev/null
+++ b/packages/twenty-front/src/modules/settings/playground/components/PlaygroundSetupForm.tsx
@@ -0,0 +1,193 @@
+import { playgroundApiKeyState } from '@/settings/playground/states/playgroundApiKeyState';
+import { PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas';
+import { PlaygroundTypes } from '@/settings/playground/types/PlaygroundTypes';
+import { SettingsPath } from '@/types/SettingsPath';
+import { Select } from '@/ui/input/components/Select';
+import { TextInput } from '@/ui/input/components/TextInput';
+import styled from '@emotion/styled';
+import { zodResolver } from '@hookform/resolvers/zod';
+import { useLingui } from '@lingui/react/macro';
+import { Controller, useForm } from 'react-hook-form';
+import { useRecoilState } from 'recoil';
+import {
+ Button,
+ IconApi,
+ IconBracketsAngle,
+ IconBrandGraphql,
+ IconFolderRoot,
+} from 'twenty-ui';
+import { z } from 'zod';
+import { REACT_APP_SERVER_BASE_URL } from '~/config';
+import { useNavigateSettings } from '~/hooks/useNavigateSettings';
+
+const playgroundSetupFormSchema = z.object({
+ apiKeyForPlayground: z.string(),
+ schema: z.nativeEnum(PlaygroundSchemas),
+ playgroundType: z.nativeEnum(PlaygroundTypes),
+});
+
+type PlaygroundSetupFormValues = z.infer;
+
+const StyledForm = styled.form`
+ display: grid;
+ grid-template-columns: 1.5fr 1fr 1fr 0.5fr;
+ align-items: end;
+ gap: ${({ theme }) => theme.spacing(2)};
+ margin-bottom: ${({ theme }) => theme.spacing(2)};
+ width: 100%;
+`;
+
+export const PlaygroundSetupForm = () => {
+ const { t } = useLingui();
+ const navigateSettings = useNavigateSettings();
+ const [playgroundApiKey, setPlaygroundApiKey] = useRecoilState(
+ playgroundApiKeyState,
+ );
+
+ const {
+ control,
+ handleSubmit,
+ formState: { isSubmitting },
+ setError,
+ } = useForm({
+ mode: 'onTouched',
+ resolver: zodResolver(playgroundSetupFormSchema),
+ defaultValues: {
+ schema: PlaygroundSchemas.CORE,
+ playgroundType: PlaygroundTypes.REST,
+ apiKeyForPlayground: playgroundApiKey || '',
+ },
+ });
+
+ const validateApiKey = async (values: PlaygroundSetupFormValues) => {
+ try {
+ // Validate by fetching the schema (but not storing it)
+ const response = await fetch(
+ `${REACT_APP_SERVER_BASE_URL}/open-api/${values.schema}`,
+ {
+ headers: { Authorization: `Bearer ${values.apiKeyForPlayground}` },
+ },
+ );
+
+ if (!response.ok) {
+ throw new Error(`HTTP error! status: ${response.status}`);
+ }
+
+ const openAPIReference = await response.json();
+
+ if (!openAPIReference.tags) {
+ throw new Error('Invalid API Key');
+ }
+
+ return true;
+ } catch (error) {
+ throw new Error(
+ t`Failed to validate API key. Please check your API key and try again.`,
+ );
+ }
+ };
+
+ const onSubmit = async (values: PlaygroundSetupFormValues) => {
+ try {
+ await validateApiKey(values);
+
+ setPlaygroundApiKey(values.apiKeyForPlayground);
+
+ const path =
+ values.playgroundType === PlaygroundTypes.GRAPHQL
+ ? SettingsPath.GraphQLPlayground
+ : SettingsPath.RestPlayground;
+
+ navigateSettings(path, {
+ schema: values.schema.toLowerCase(),
+ });
+ } catch (error) {
+ setError('apiKeyForPlayground', {
+ type: 'manual',
+ message:
+ error instanceof Error
+ ? error.message
+ : t`An unexpected error occurred`,
+ });
+ }
+ };
+
+ return (
+
+ (
+ {
+ onChange(newValue);
+ setPlaygroundApiKey(newValue);
+ }}
+ error={error?.message}
+ required
+ />
+ )}
+ />
+ (
+
+ )}
+ />
+ (
+
+ )}
+ />
+
+
+ );
+};
diff --git a/packages/twenty-front/src/modules/settings/playground/components/RestPlayground.tsx b/packages/twenty-front/src/modules/settings/playground/components/RestPlayground.tsx
new file mode 100644
index 000000000..bc1d0f9f7
--- /dev/null
+++ b/packages/twenty-front/src/modules/settings/playground/components/RestPlayground.tsx
@@ -0,0 +1,77 @@
+import { playgroundApiKeyState } from '@/settings/playground/states/playgroundApiKeyState';
+import { PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas';
+import { SettingsPath } from '@/types/SettingsPath';
+import { useTheme } from '@emotion/react';
+import styled from '@emotion/styled';
+import { lazy, Suspense } from 'react';
+import Skeleton, { SkeletonTheme } from 'react-loading-skeleton';
+import { useRecoilValue } from 'recoil';
+import { REACT_APP_SERVER_BASE_URL } from '~/config';
+import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
+
+const StyledContainer = styled.div`
+ height: 100%;
+ overflow-y: scroll;
+ width: 100%;
+`;
+
+const ApiReferenceReact = lazy(() =>
+ import('@scalar/api-reference-react').then((module) => ({
+ default: module.ApiReferenceReact,
+ })),
+);
+
+type RestPlaygroundProps = {
+ onError(): void;
+ schema: PlaygroundSchemas;
+};
+
+export const RestPlayground = ({ onError, schema }: RestPlaygroundProps) => {
+ const theme = useTheme();
+ const playgroundApiKey = useRecoilValue(playgroundApiKeyState);
+
+ if (!playgroundApiKey) {
+ onError();
+ return null;
+ }
+
+ return (
+
+
+
+
+ }
+ >
+
+
+
+ );
+};
diff --git a/packages/twenty-front/src/modules/settings/playground/components/SettingsPlaygroundCoverImage.tsx b/packages/twenty-front/src/modules/settings/playground/components/SettingsPlaygroundCoverImage.tsx
new file mode 100644
index 000000000..79235994f
--- /dev/null
+++ b/packages/twenty-front/src/modules/settings/playground/components/SettingsPlaygroundCoverImage.tsx
@@ -0,0 +1,22 @@
+import styled from '@emotion/styled';
+import { Card } from 'twenty-ui';
+
+import DarkCoverImage from '../assets/cover-dark.png';
+import LightCoverImage from '../assets/cover-light.png';
+
+export const StyledSettingsApiPlaygroundCoverImage = styled(Card)`
+ align-items: center;
+ background-image: ${({ theme }) =>
+ theme.name === 'light'
+ ? `url('${LightCoverImage.toString()}')`
+ : `url('${DarkCoverImage.toString()}')`};
+ background-size: cover;
+ border-radius: ${({ theme }) => theme.border.radius.md};
+ box-sizing: border-box;
+ display: flex;
+ height: 153px;
+ justify-content: center;
+ position: relative;
+ margin-top: ${({ theme }) => theme.spacing(4)};
+ margin-bottom: ${({ theme }) => theme.spacing(4)};
+`;
diff --git a/packages/twenty-front/src/modules/settings/playground/components/__stories__/GraphQLPlayground.stories.tsx b/packages/twenty-front/src/modules/settings/playground/components/__stories__/GraphQLPlayground.stories.tsx
new file mode 100644
index 000000000..974c35f62
--- /dev/null
+++ b/packages/twenty-front/src/modules/settings/playground/components/__stories__/GraphQLPlayground.stories.tsx
@@ -0,0 +1,57 @@
+import { GraphQLPlayground } from '@/settings/playground/components/GraphQLPlayground';
+import { playgroundApiKeyState } from '@/settings/playground/states/playgroundApiKeyState';
+import { action } from '@storybook/addon-actions';
+import { Meta, StoryObj } from '@storybook/react';
+import { useEffect } from 'react';
+import { useSetRecoilState } from 'recoil';
+import { ComponentDecorator, ComponentWithRouterDecorator } from 'twenty-ui';
+import { ComponentWithRecoilScopeDecorator } from '~/testing/decorators/ComponentWithRecoilScopeDecorator';
+import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
+import { graphqlMocks } from '~/testing/graphqlMocks';
+
+const PlaygroundApiKeySetterEffect = () => {
+ const setPlaygroundApiKey = useSetRecoilState(playgroundApiKeyState);
+
+ useEffect(() => {
+ setPlaygroundApiKey('test-api-key-123');
+ }, [setPlaygroundApiKey]);
+
+ return null;
+};
+
+const meta: Meta = {
+ title: 'Modules/Settings/Playground/GraphQLPlayground',
+ component: GraphQLPlayground,
+ decorators: [
+ ComponentDecorator,
+ I18nFrontDecorator,
+ ComponentWithRouterDecorator,
+ ComponentWithRecoilScopeDecorator,
+ ],
+ parameters: {
+ docs: {
+ description: {
+ component:
+ 'GraphQLPlayground provides an interactive environment to test GraphQL queries with authentication.',
+ },
+ },
+ msw: graphqlMocks,
+ },
+};
+export default meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ onError: action('GraphQL Playground encountered unexpected error'),
+ },
+ decorators: [
+ (Story) => (
+ <>
+
+
+ >
+ ),
+ ],
+};
diff --git a/packages/twenty-front/src/modules/settings/playground/components/__stories__/PlaygroundSetupForm.stories.tsx b/packages/twenty-front/src/modules/settings/playground/components/__stories__/PlaygroundSetupForm.stories.tsx
new file mode 100644
index 000000000..1a472b961
--- /dev/null
+++ b/packages/twenty-front/src/modules/settings/playground/components/__stories__/PlaygroundSetupForm.stories.tsx
@@ -0,0 +1,32 @@
+import { Meta, StoryObj } from '@storybook/react';
+import { ComponentDecorator, RouterDecorator } from 'twenty-ui';
+import { ComponentWithRecoilScopeDecorator } from '~/testing/decorators/ComponentWithRecoilScopeDecorator';
+import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
+import { PlaygroundSetupForm } from '../PlaygroundSetupForm';
+
+const meta: Meta = {
+ title: 'Modules/Settings/Playground/PlaygroundSetupForm',
+ component: PlaygroundSetupForm,
+ decorators: [
+ ComponentDecorator,
+ RouterDecorator,
+ I18nFrontDecorator,
+ ComponentWithRecoilScopeDecorator,
+ ],
+ parameters: {
+ docs: {
+ description: {
+ component:
+ 'A form component for setting up the API playground with API key, schema selection, and playground type.',
+ },
+ },
+ },
+};
+
+export default meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {},
+};
diff --git a/packages/twenty-front/src/modules/settings/playground/components/__stories__/RestPlayground.stories.tsx b/packages/twenty-front/src/modules/settings/playground/components/__stories__/RestPlayground.stories.tsx
new file mode 100644
index 000000000..de7532da1
--- /dev/null
+++ b/packages/twenty-front/src/modules/settings/playground/components/__stories__/RestPlayground.stories.tsx
@@ -0,0 +1,132 @@
+import { playgroundApiKeyState } from '@/settings/playground/states/playgroundApiKeyState';
+import { PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas';
+import { action } from '@storybook/addon-actions';
+import { Meta, StoryObj } from '@storybook/react';
+import { http, HttpResponse } from 'msw';
+import { useEffect } from 'react';
+import { useSetRecoilState } from 'recoil';
+import { ComponentDecorator } from 'twenty-ui';
+import { ComponentWithRecoilScopeDecorator } from '~/testing/decorators/ComponentWithRecoilScopeDecorator';
+import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
+import { RestPlayground } from '../RestPlayground';
+
+const PlaygroundApiKeySetterEffect = () => {
+ const setPlaygroundApiKey = useSetRecoilState(playgroundApiKeyState);
+
+ useEffect(() => {
+ setPlaygroundApiKey('test-api-key-123');
+ }, [setPlaygroundApiKey]);
+
+ return null;
+};
+
+const openApiSpec = {
+ openapi: '3.1.1',
+ info: {
+ title: 'Twenty Api',
+ description:
+ 'This is a **Twenty REST/API** playground based on the **OpenAPI 3.1 specification**.',
+ version: '1.0.0',
+ },
+ servers: [
+ {
+ url: 'http://localhost:3000',
+ description: 'Local server',
+ },
+ ],
+ paths: {
+ '/companies': {
+ get: {
+ tags: ['Companies'],
+ summary: 'List companies',
+ operationId: 'listCompanies',
+ security: [
+ {
+ bearerAuth: [],
+ },
+ ],
+ responses: {
+ '200': {
+ description: 'Successful response',
+ content: {
+ 'application/json': {
+ schema: {
+ type: 'array',
+ items: {
+ type: 'object',
+ properties: {
+ id: { type: 'string' },
+ name: { type: 'string' },
+ },
+ },
+ },
+ examples: {
+ 'List of companies': {
+ value: [
+ { id: '1', name: 'Acme Corp' },
+ { id: '2', name: 'Globex Corporation' },
+ ],
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ components: {
+ securitySchemes: {
+ bearerAuth: {
+ type: 'http',
+ scheme: 'bearer',
+ },
+ },
+ },
+};
+
+const meta: Meta = {
+ title: 'Modules/Settings/Playground/RestPlayground',
+ component: RestPlayground,
+ decorators: [
+ ComponentDecorator,
+ I18nFrontDecorator,
+ ComponentWithRecoilScopeDecorator,
+ ],
+ parameters: {
+ docs: {
+ description: {
+ component:
+ 'RestPlayground provides an interactive environment to test REST API endpoints with authentication.',
+ },
+ },
+ msw: {
+ handlers: [
+ http.get('*/open-api/*', () => {
+ return HttpResponse.json(openApiSpec);
+ }),
+ ],
+ },
+ },
+};
+
+export default meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ onError: (...args) => {
+ action('REST Playground encountered unexpected error')(...args);
+ },
+ schema: PlaygroundSchemas.CORE,
+ },
+ decorators: [
+ (Story) => (
+ <>
+
+
+ >
+ ),
+ ],
+};
diff --git a/packages/twenty-front/src/modules/settings/playground/states/openAPIReference.ts b/packages/twenty-front/src/modules/settings/playground/states/openAPIReference.ts
new file mode 100644
index 000000000..0e0fe86ba
--- /dev/null
+++ b/packages/twenty-front/src/modules/settings/playground/states/openAPIReference.ts
@@ -0,0 +1,6 @@
+import { createState } from 'twenty-ui';
+
+export const openAPIReferenceState = createState({
+ key: 'OpenAPIReference',
+ defaultValue: null,
+});
diff --git a/packages/twenty-front/src/modules/settings/playground/states/playgroundApiKeyState.ts b/packages/twenty-front/src/modules/settings/playground/states/playgroundApiKeyState.ts
new file mode 100644
index 000000000..7debd8fbd
--- /dev/null
+++ b/packages/twenty-front/src/modules/settings/playground/states/playgroundApiKeyState.ts
@@ -0,0 +1,8 @@
+import { atom } from 'recoil';
+import { localStorageEffect } from '~/utils/recoil-effects';
+
+export const playgroundApiKeyState = atom({
+ key: 'playgroundApiKeyState',
+ default: null,
+ effects: [localStorageEffect()],
+});
diff --git a/packages/twenty-front/src/modules/settings/playground/types/PlaygroundSchemas.ts b/packages/twenty-front/src/modules/settings/playground/types/PlaygroundSchemas.ts
new file mode 100644
index 000000000..dafdde1cf
--- /dev/null
+++ b/packages/twenty-front/src/modules/settings/playground/types/PlaygroundSchemas.ts
@@ -0,0 +1,4 @@
+export enum PlaygroundSchemas {
+ METADATA = 'metadata',
+ CORE = 'core',
+}
diff --git a/packages/twenty-front/src/modules/settings/playground/types/PlaygroundTypes.ts b/packages/twenty-front/src/modules/settings/playground/types/PlaygroundTypes.ts
new file mode 100644
index 000000000..d8cce7bfd
--- /dev/null
+++ b/packages/twenty-front/src/modules/settings/playground/types/PlaygroundTypes.ts
@@ -0,0 +1,4 @@
+export enum PlaygroundTypes {
+ GRAPHQL = 'graphql',
+ REST = 'rest',
+}
diff --git a/packages/twenty-front/src/modules/types/SettingsPath.ts b/packages/twenty-front/src/modules/types/SettingsPath.ts
index 613935ce2..dd074d90c 100644
--- a/packages/twenty-front/src/modules/types/SettingsPath.ts
+++ b/packages/twenty-front/src/modules/types/SettingsPath.ts
@@ -19,9 +19,11 @@ export enum SettingsPath {
WorkspaceMembersPage = 'workspace-members',
Workspace = 'workspace',
Domain = 'domain',
- Developers = 'developers',
- DevelopersNewApiKey = 'developers/api-keys/new',
- DevelopersApiKeyDetail = 'developers/api-keys/:apiKeyId',
+ APIs = 'api-keys',
+ RestPlayground = 'playground/rest/:schema',
+ GraphQLPlayground = 'playground/graphql/:schema',
+ DevelopersNewApiKey = 'api-keys/new',
+ DevelopersApiKeyDetail = 'api-keys/:apiKeyId',
Integrations = 'integrations',
IntegrationDatabase = 'integrations/:databaseKey',
IntegrationDatabaseConnection = 'integrations/:databaseKey/:connectionId',
diff --git a/packages/twenty-front/src/modules/ui/layout/fullscreen/components/FullScreenContainer.tsx b/packages/twenty-front/src/modules/ui/layout/fullscreen/components/FullScreenContainer.tsx
new file mode 100644
index 000000000..fa707c93c
--- /dev/null
+++ b/packages/twenty-front/src/modules/ui/layout/fullscreen/components/FullScreenContainer.tsx
@@ -0,0 +1,59 @@
+import { PageHeader } from '@/ui/layout/page/components/PageHeader';
+import {
+ Breadcrumb,
+ BreadcrumbProps,
+} from '@/ui/navigation/bread-crumb/components/Breadcrumb';
+import styled from '@emotion/styled';
+import { useLingui } from '@lingui/react/macro';
+import '@scalar/api-reference-react/style.css';
+import { IconButton, IconX, useIsMobile } from 'twenty-ui';
+
+type FullScreenContainerProps = {
+ children: JSX.Element | JSX.Element[];
+ links: BreadcrumbProps['links'];
+ exitFullScreen(): void;
+};
+
+const StyledFullScreen = styled.div`
+ display: flex;
+ flex-direction: column;
+ width: 100dvw;
+ height: 100dvh;
+ background: ${({ theme }) => theme.background.noisy};
+`;
+
+const StyledMainContainer = styled.div`
+ border-top: 1px solid ${({ theme }) => theme.border.color.medium};
+ height: 100%;
+ width: 100%;
+`;
+
+export const FullScreenContainer = ({
+ children,
+ links,
+ exitFullScreen,
+}: FullScreenContainerProps) => {
+ const isMobile = useIsMobile();
+ const { t } = useLingui();
+
+ const handleExitFullScreen = () => {
+ exitFullScreen();
+ };
+
+ return (
+
+ }>
+
+
+ {children}
+
+ );
+};
diff --git a/packages/twenty-front/src/modules/ui/layout/fullscreen/components/__stories__/FullScreenContainer.stories.tsx b/packages/twenty-front/src/modules/ui/layout/fullscreen/components/__stories__/FullScreenContainer.stories.tsx
new file mode 100644
index 000000000..d1e6d96d2
--- /dev/null
+++ b/packages/twenty-front/src/modules/ui/layout/fullscreen/components/__stories__/FullScreenContainer.stories.tsx
@@ -0,0 +1,45 @@
+import { FullScreenContainer } from '@/ui/layout/fullscreen/components/FullScreenContainer';
+import styled from '@emotion/styled';
+import { Meta, StoryObj } from '@storybook/react';
+import { ComponentDecorator, ComponentWithRouterDecorator } from 'twenty-ui';
+import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
+
+const meta: Meta = {
+ title: 'UI/Layout/FullScreenContainer',
+ component: FullScreenContainer,
+ decorators: [
+ ComponentDecorator,
+ I18nFrontDecorator,
+ ComponentWithRouterDecorator,
+ ],
+};
+export default meta;
+
+type Story = StoryObj;
+
+const StyledContainer = styled.div`
+ width: 100%;
+ height: 100%;
+ background-color: white;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+`;
+
+export const Default: Story = {
+ args: {
+ children: This is full-screen content,
+ links: [
+ {
+ children: 'Layout',
+ href: '/',
+ },
+ {
+ children: 'FullScreen',
+ href: '/',
+ },
+ ],
+ exitFullScreen: () => {},
+ },
+ decorators: [ComponentDecorator],
+};
diff --git a/packages/twenty-front/src/modules/ui/layout/fullscreen/hooks/useShowFullscreen.ts b/packages/twenty-front/src/modules/ui/layout/fullscreen/hooks/useShowFullscreen.ts
new file mode 100644
index 000000000..08e983b21
--- /dev/null
+++ b/packages/twenty-front/src/modules/ui/layout/fullscreen/hooks/useShowFullscreen.ts
@@ -0,0 +1,19 @@
+import { useMemo } from 'react';
+
+import { SettingsPath } from '@/types/SettingsPath';
+import { useIsMatchingLocation } from '~/hooks/useIsMatchingLocation';
+
+export const useShowFullscreen = () => {
+ const { isMatchingLocation } = useIsMatchingLocation();
+
+ return useMemo(() => {
+ if (
+ isMatchingLocation('settings/' + SettingsPath.RestPlayground + '/*') ||
+ isMatchingLocation('settings/' + SettingsPath.GraphQLPlayground)
+ ) {
+ return true;
+ }
+
+ return false;
+ }, [isMatchingLocation]);
+};
diff --git a/packages/twenty-front/src/modules/ui/layout/page/components/DefaultLayout.tsx b/packages/twenty-front/src/modules/ui/layout/page/components/DefaultLayout.tsx
index 0941e4044..edcc736a8 100644
--- a/packages/twenty-front/src/modules/ui/layout/page/components/DefaultLayout.tsx
+++ b/packages/twenty-front/src/modules/ui/layout/page/components/DefaultLayout.tsx
@@ -8,6 +8,7 @@ import { useIsSettingsPage } from '@/navigation/hooks/useIsSettingsPage';
import { OBJECT_SETTINGS_WIDTH } from '@/settings/data-model/constants/ObjectSettings';
import { SignInAppNavigationDrawerMock } from '@/sign-in-background-mock/components/SignInAppNavigationDrawerMock';
import { SignInBackgroundMockPage } from '@/sign-in-background-mock/components/SignInBackgroundMockPage';
+import { useShowFullscreen } from '@/ui/layout/fullscreen/hooks/useShowFullscreen';
import { useShowAuthModal } from '@/ui/layout/hooks/useShowAuthModal';
import { NAV_DRAWER_WIDTHS } from '@/ui/navigation/navigation-drawer/constants/NavDrawerWidths';
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
@@ -69,6 +70,7 @@ export const DefaultLayout = () => {
const theme = useTheme();
const windowsWidth = useScreenSize().width;
const showAuthModal = useShowAuthModal();
+ const useShowFullScreen = useShowFullscreen();
return (
<>
@@ -90,7 +92,7 @@ export const DefaultLayout = () => {
{
>
{showAuthModal ? (
- ) : (
+ ) : useShowFullScreen ? null : (
)}
{showAuthModal ? (
diff --git a/packages/twenty-front/src/modules/ui/layout/show-page/components/ShowPageActivityContainer.tsx b/packages/twenty-front/src/modules/ui/layout/show-page/components/ShowPageActivityContainer.tsx
index 2b17eebac..bedc34414 100644
--- a/packages/twenty-front/src/modules/ui/layout/show-page/components/ShowPageActivityContainer.tsx
+++ b/packages/twenty-front/src/modules/ui/layout/show-page/components/ShowPageActivityContainer.tsx
@@ -1,15 +1,44 @@
-import { ActivityRichTextEditor } from '@/activities/components/ActivityRichTextEditor';
import { ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { isNewViewableRecordLoadingState } from '@/object-record/record-right-drawer/states/isNewViewableRecordLoading';
import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper';
+import { useTheme } from '@emotion/react';
import styled from '@emotion/styled';
+import { lazy, Suspense } from 'react';
+import Skeleton, { SkeletonTheme } from 'react-loading-skeleton';
import { useRecoilValue } from 'recoil';
+const ActivityRichTextEditor = lazy(() =>
+ import('@/activities/components/ActivityRichTextEditor').then((module) => ({
+ default: module.ActivityRichTextEditor,
+ })),
+);
+
const StyledShowPageActivityContainer = styled.div`
margin-top: ${({ theme }) => theme.spacing(6)};
width: 100%;
`;
+
+const StyledSkeletonContainer = styled.div`
+ width: 100%;
+`;
+
+const LoadingSkeleton = () => {
+ const theme = useTheme();
+
+ return (
+
+
+
+
+
+ );
+};
+
export const ShowPageActivityContainer = ({
targetableObject,
}: {
@@ -28,14 +57,16 @@ export const ShowPageActivityContainer = ({
componentInstanceId={`scroll-wrapper-tab-list-${targetableObject.id}`}
>
-
+ }>
+
+
) : (
diff --git a/packages/twenty-front/src/pages/settings/developers/__stories__/SettingsDevelopers.stories.tsx b/packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopers.stories.tsx
similarity index 67%
rename from packages/twenty-front/src/pages/settings/developers/__stories__/SettingsDevelopers.stories.tsx
rename to packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopers.stories.tsx
index 40b3b8ae6..a491e9711 100644
--- a/packages/twenty-front/src/pages/settings/developers/__stories__/SettingsDevelopers.stories.tsx
+++ b/packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopers.stories.tsx
@@ -1,7 +1,7 @@
import { Meta, StoryObj } from '@storybook/react';
import { within } from '@storybook/test';
-import { SettingsDevelopers } from '~/pages/settings/developers/SettingsDevelopers';
+import { SettingsApiKeys } from '~/pages/settings/developers/api-keys/SettingsApiKeys';
import {
PageDecorator,
PageDecoratorArgs,
@@ -9,10 +9,10 @@ import {
import { graphqlMocks } from '~/testing/graphqlMocks';
const meta: Meta = {
- title: 'Pages/Settings/Developers/SettingsDevelopers',
- component: SettingsDevelopers,
+ title: 'Pages/Settings/ApiKeys',
+ component: SettingsApiKeys,
decorators: [PageDecorator],
- args: { routePath: '/settings/developers' },
+ args: { routePath: '/settings/apis' },
parameters: {
msw: graphqlMocks,
},
@@ -20,7 +20,7 @@ const meta: Meta = {
export default meta;
-export type Story = StoryObj;
+export type Story = StoryObj;
export const Default: Story = {
play: async ({ canvasElement }) => {
diff --git a/packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopersApiKeysDetail.stories.tsx b/packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopersApiKeysDetail.stories.tsx
index 37c96a2a5..341638535 100644
--- a/packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopersApiKeysDetail.stories.tsx
+++ b/packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopersApiKeysDetail.stories.tsx
@@ -11,7 +11,7 @@ import { graphqlMocks } from '~/testing/graphqlMocks';
import { sleep } from '~/utils/sleep';
const meta: Meta = {
- title: 'Pages/Settings/Developers/ApiKeys/SettingsDevelopersApiKeyDetail',
+ title: 'Pages/Settings/ApiKeys/SettingsDevelopersApiKeyDetail',
component: SettingsDevelopersApiKeyDetail,
decorators: [PageDecorator],
args: {
diff --git a/packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopersApiKeysNew.stories.tsx b/packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopersApiKeysNew.stories.tsx
index 28bfd6dbb..d1e5ba1e7 100644
--- a/packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopersApiKeysNew.stories.tsx
+++ b/packages/twenty-front/src/pages/settings/developers/__stories__/api-keys/SettingsDevelopersApiKeysNew.stories.tsx
@@ -11,7 +11,7 @@ import { graphqlMocks } from '~/testing/graphqlMocks';
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
const meta: Meta = {
- title: 'Pages/Settings/Developers/ApiKeys/SettingsDevelopersApiKeysNew',
+ title: 'Pages/Settings/ApiKeys/SettingsDevelopersApiKeysNew',
component: SettingsDevelopersApiKeysNew,
decorators: [PageDecorator],
args: { routePath: getSettingsPath(SettingsPath.DevelopersNewApiKey) },
diff --git a/packages/twenty-front/src/pages/settings/developers/__stories__/playground/GraphQLPlayground.stories.tsx b/packages/twenty-front/src/pages/settings/developers/__stories__/playground/GraphQLPlayground.stories.tsx
new file mode 100644
index 000000000..b20ea98d6
--- /dev/null
+++ b/packages/twenty-front/src/pages/settings/developers/__stories__/playground/GraphQLPlayground.stories.tsx
@@ -0,0 +1,34 @@
+import { action } from '@storybook/addon-actions';
+import { Meta, StoryObj } from '@storybook/react';
+import { ComponentDecorator, ComponentWithRouterDecorator } from 'twenty-ui';
+import { SettingsGraphQLPlayground } from '~/pages/settings/developers/playground/SettingsGraphQLPlayground';
+import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
+import { graphqlMocks } from '~/testing/graphqlMocks';
+
+const meta: Meta = {
+ title: 'Pages/Settings/Playground/GraphQLPlayground',
+ component: SettingsGraphQLPlayground,
+ decorators: [
+ ComponentDecorator,
+ I18nFrontDecorator,
+ ComponentWithRouterDecorator,
+ ],
+ parameters: {
+ docs: {
+ description: {
+ component:
+ 'GraphQLPlayground provides an interactive environment to test GraphQL queries with authentication.',
+ },
+ },
+ msw: graphqlMocks,
+ },
+};
+export default meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ onError: action('GraphQL Playground encountered unexpected error'),
+ },
+};
diff --git a/packages/twenty-front/src/pages/settings/developers/__stories__/playground/SettingsPlayground.stories.tsx b/packages/twenty-front/src/pages/settings/developers/__stories__/playground/SettingsPlayground.stories.tsx
new file mode 100644
index 000000000..bf574818e
--- /dev/null
+++ b/packages/twenty-front/src/pages/settings/developers/__stories__/playground/SettingsPlayground.stories.tsx
@@ -0,0 +1,36 @@
+import { action } from '@storybook/addon-actions';
+import { Meta, StoryObj } from '@storybook/react';
+import { ComponentDecorator, ComponentWithRouterDecorator } from 'twenty-ui';
+import { SettingsRestPlayground } from '~/pages/settings/developers/playground/SettingsRestPlayground';
+import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
+import { graphqlMocks } from '~/testing/graphqlMocks';
+
+const meta: Meta = {
+ title: 'Pages/Settings/Playground/RestPlayground',
+ component: SettingsRestPlayground,
+ decorators: [
+ ComponentDecorator,
+ I18nFrontDecorator,
+ ComponentWithRouterDecorator,
+ ],
+ parameters: {
+ docs: {
+ description: {
+ component:
+ 'RestPlayground provides an interactive environment to test Open API queries with authentication.',
+ },
+ },
+ msw: {
+ handlers: graphqlMocks,
+ },
+ },
+};
+export default meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ onError: action('Rest Playground encountered unexpected error'),
+ },
+};
diff --git a/packages/twenty-front/src/pages/settings/developers/__stories__/webhooks/SettingsDevelopersWebhooksDetail.stories.tsx b/packages/twenty-front/src/pages/settings/developers/__stories__/webhooks/SettingsDevelopersWebhooksDetail.stories.tsx
index 4d36fc14d..e59b04a84 100644
--- a/packages/twenty-front/src/pages/settings/developers/__stories__/webhooks/SettingsDevelopersWebhooksDetail.stories.tsx
+++ b/packages/twenty-front/src/pages/settings/developers/__stories__/webhooks/SettingsDevelopersWebhooksDetail.stories.tsx
@@ -10,7 +10,7 @@ import {
import { graphqlMocks } from '~/testing/graphqlMocks';
const meta: Meta = {
- title: 'Pages/Settings/Developers/Webhooks/SettingsDevelopersWebhooksDetail',
+ title: 'Pages/Settings/Webhooks/SettingsDevelopersWebhooksDetail',
component: SettingsDevelopersWebhooksDetail,
decorators: [PageDecorator],
args: {
diff --git a/packages/twenty-front/src/pages/settings/developers/__stories__/webhooks/SettingsWebhooks.stories.tsx b/packages/twenty-front/src/pages/settings/developers/__stories__/webhooks/SettingsWebhooks.stories.tsx
new file mode 100644
index 000000000..db9388d7c
--- /dev/null
+++ b/packages/twenty-front/src/pages/settings/developers/__stories__/webhooks/SettingsWebhooks.stories.tsx
@@ -0,0 +1,33 @@
+import { Meta, StoryObj } from '@storybook/react';
+import { within } from '@storybook/test';
+import { SettingsWebhooks } from '~/pages/settings/developers/webhooks/components/SettingsWebhooks';
+
+import {
+ PageDecorator,
+ PageDecoratorArgs,
+} from '~/testing/decorators/PageDecorator';
+import { graphqlMocks } from '~/testing/graphqlMocks';
+
+const meta: Meta = {
+ title: 'Pages/Settings/Webhooks',
+ component: SettingsWebhooks,
+ decorators: [PageDecorator],
+ args: { routePath: '/settings/webhooks' },
+ parameters: {
+ msw: graphqlMocks,
+ },
+};
+
+export default meta;
+
+export type Story = StoryObj;
+
+export const Default: Story = {
+ play: async ({ canvasElement }) => {
+ const canvas = within(canvasElement);
+
+ await canvas.findAllByText('Webhooks', undefined, {
+ timeout: 3000,
+ });
+ },
+};
diff --git a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsApiKeys.tsx b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsApiKeys.tsx
new file mode 100644
index 000000000..8e171a542
--- /dev/null
+++ b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsApiKeys.tsx
@@ -0,0 +1,74 @@
+import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer';
+import { SettingsApiKeysTable } from '@/settings/developers/components/SettingsApiKeysTable';
+import { PlaygroundSetupForm } from '@/settings/playground/components/PlaygroundSetupForm';
+import { StyledSettingsApiPlaygroundCoverImage } from '@/settings/playground/components/SettingsPlaygroundCoverImage';
+import { SettingsPath } from '@/types/SettingsPath';
+import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBarContainer';
+import styled from '@emotion/styled';
+import { Trans, useLingui } from '@lingui/react/macro';
+import { Button, H2Title, IconPlus, MOBILE_VIEWPORT, Section } from 'twenty-ui';
+import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
+
+const StyledButtonContainer = styled.div`
+ display: flex;
+ justify-content: flex-end;
+ padding-top: ${({ theme }) => theme.spacing(2)};
+ @media (max-width: ${MOBILE_VIEWPORT}px) {
+ padding-top: ${({ theme }) => theme.spacing(5)};
+ }
+`;
+
+const StyledContainer = styled.div`
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ gap: ${({ theme }) => theme.spacing(2)};
+`;
+
+export const SettingsApiKeys = () => {
+ const { t } = useLingui();
+
+ return (
+ Workspace,
+ href: getSettingsPath(SettingsPath.Workspace),
+ },
+ { children: APIs },
+ ]}
+ >
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
index 5f77fb5fb..e5665aab9 100644
--- a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
+++ b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeyDetail.tsx
@@ -90,7 +90,7 @@ export const SettingsDevelopersApiKeyDetail = () => {
updateOneRecordInput: { revokedAt: DateTime.now().toString() },
});
if (redirect) {
- navigate(SettingsPath.Developers);
+ navigate(SettingsPath.APIs);
}
} catch (err) {
enqueueSnackBar(t`Error deleting api key: ${err}`, {
@@ -166,8 +166,8 @@ export const SettingsDevelopersApiKeyDetail = () => {
href: getSettingsPath(SettingsPath.Workspace),
},
{
- children: t`Developers`,
- href: getSettingsPath(SettingsPath.Developers),
+ children: t`APIs`,
+ href: getSettingsPath(SettingsPath.APIs),
},
{ children: t`${apiKeyName} API Key` },
]}
diff --git a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx
index cee2a148b..cea4dcebe 100644
--- a/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx
+++ b/packages/twenty-front/src/pages/settings/developers/api-keys/SettingsDevelopersApiKeysNew.tsx
@@ -86,8 +86,8 @@ export const SettingsDevelopersApiKeysNew = () => {
href: getSettingsPath(SettingsPath.Workspace),
},
{
- children: t`Developers`,
- href: getSettingsPath(SettingsPath.Developers),
+ children: t`APIs`,
+ href: getSettingsPath(SettingsPath.APIs),
},
{ children: t`New Key` },
]}
@@ -95,7 +95,7 @@ export const SettingsDevelopersApiKeysNew = () => {
{
- navigateSettings(SettingsPath.Developers);
+ navigateSettings(SettingsPath.APIs);
}}
onSave={handleSave}
/>
diff --git a/packages/twenty-front/src/pages/settings/developers/playground/SettingsGraphQLPlayground.tsx b/packages/twenty-front/src/pages/settings/developers/playground/SettingsGraphQLPlayground.tsx
new file mode 100644
index 000000000..11c475930
--- /dev/null
+++ b/packages/twenty-front/src/pages/settings/developers/playground/SettingsGraphQLPlayground.tsx
@@ -0,0 +1,47 @@
+import { GraphQLPlayground } from '@/settings/playground/components/GraphQLPlayground';
+import { PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas';
+import { SettingsPath } from '@/types/SettingsPath';
+
+import { FullScreenContainer } from '@/ui/layout/fullscreen/components/FullScreenContainer';
+import { Trans } from '@lingui/react/macro';
+import { useParams } from 'react-router-dom';
+import { useNavigateSettings } from '~/hooks/useNavigateSettings';
+import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
+
+export const SettingsGraphQLPlayground = () => {
+ const navigateSettings = useNavigateSettings();
+ const { schema: urlSchema = 'core' } = useParams<{ schema: string }>();
+
+ // Convert lowercase URL parameter to PlaygroundSchemas enum
+ const schema =
+ urlSchema === 'metadata'
+ ? PlaygroundSchemas.METADATA
+ : PlaygroundSchemas.CORE;
+
+ const handleExitFullScreen = () => {
+ navigateSettings(SettingsPath.APIs);
+ };
+
+ const handleOnError = () => {
+ handleExitFullScreen();
+ };
+
+ return (
+ Workspace,
+ href: getSettingsPath(SettingsPath.Workspace),
+ },
+ {
+ children: APIs,
+ href: getSettingsPath(SettingsPath.APIs),
+ },
+ { children: GraphQL API Playground },
+ ]}
+ >
+
+
+ );
+};
diff --git a/packages/twenty-front/src/pages/settings/developers/playground/SettingsRestPlayground.tsx b/packages/twenty-front/src/pages/settings/developers/playground/SettingsRestPlayground.tsx
new file mode 100644
index 000000000..54654b28b
--- /dev/null
+++ b/packages/twenty-front/src/pages/settings/developers/playground/SettingsRestPlayground.tsx
@@ -0,0 +1,41 @@
+import { RestPlayground } from '@/settings/playground/components/RestPlayground';
+import { PlaygroundSchemas } from '@/settings/playground/types/PlaygroundSchemas';
+import { SettingsPath } from '@/types/SettingsPath';
+import { FullScreenContainer } from '@/ui/layout/fullscreen/components/FullScreenContainer';
+import { Trans } from '@lingui/react/macro';
+import { useParams } from 'react-router-dom';
+import { useNavigateSettings } from '~/hooks/useNavigateSettings';
+import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
+
+export const SettingsRestPlayground = () => {
+ const navigateSettings = useNavigateSettings();
+ const { schema = PlaygroundSchemas.CORE } = useParams<{
+ schema: PlaygroundSchemas;
+ }>();
+
+ const handleExitFullScreen = () => {
+ navigateSettings(SettingsPath.APIs);
+ };
+
+ return (
+ Workspace,
+ href: getSettingsPath(SettingsPath.Workspace),
+ },
+ {
+ children: APIs,
+ href: getSettingsPath(SettingsPath.APIs),
+ },
+ { children: REST },
+ ]}
+ >
+ navigateSettings(SettingsPath.APIs)}
+ />
+
+ );
+};
diff --git a/packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx b/packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
index 52b21e17f..8a7746914 100644
--- a/packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
+++ b/packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsDevelopersWebhookDetail.tsx
@@ -128,10 +128,6 @@ export const SettingsDevelopersWebhooksDetail = () => {
children: t`Workspace`,
href: getSettingsPath(SettingsPath.Workspace),
},
- {
- children: t`Developers`,
- href: getSettingsPath(SettingsPath.Developers),
- },
{ children: t`Webhook` },
]}
>
diff --git a/packages/twenty-front/src/pages/settings/developers/SettingsDevelopers.tsx b/packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsWebhooks.tsx
similarity index 71%
rename from packages/twenty-front/src/pages/settings/developers/SettingsDevelopers.tsx
rename to packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsWebhooks.tsx
index e76b5bf3a..4bebb76f6 100644
--- a/packages/twenty-front/src/pages/settings/developers/SettingsDevelopers.tsx
+++ b/packages/twenty-front/src/pages/settings/developers/webhooks/components/SettingsWebhooks.tsx
@@ -1,7 +1,4 @@
-import { v4 } from 'uuid';
import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer';
-import { SettingsApiKeysTable } from '@/settings/developers/components/SettingsApiKeysTable';
-import { SettingsReadDocumentationButton } from '@/settings/developers/components/SettingsReadDocumentationButton';
import { SettingsWebhooksTable } from '@/settings/developers/components/SettingsWebhooksTable';
import { SettingsPath } from '@/types/SettingsPath';
import { SubMenuTopBarContainer } from '@/ui/layout/page/components/SubMenuTopBarContainer';
@@ -9,6 +6,7 @@ import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
import styled from '@emotion/styled';
import { Trans, useLingui } from '@lingui/react/macro';
import { Button, H2Title, IconPlus, MOBILE_VIEWPORT, Section } from 'twenty-ui';
+import { v4 } from 'uuid';
import { getSettingsPath } from '~/utils/navigation/getSettingsPath';
const StyledButtonContainer = styled.div`
@@ -27,40 +25,23 @@ const StyledContainer = styled.div<{ isMobile: boolean }>`
gap: ${({ theme }) => theme.spacing(2)};
`;
-export const SettingsDevelopers = () => {
+export const SettingsWebhooks = () => {
const isMobile = useIsMobile();
const { t } = useLingui();
return (
}
+ title={t`Webhooks`}
links={[
{
children: Workspace,
href: getSettingsPath(SettingsPath.Workspace),
},
- { children: Developers },
+ { children: Webhooks },
]}
>
-
{
return (
}
links={[
{
children: Workspace,
diff --git a/packages/twenty-front/src/testing/decorators/FullScreenDecorator.tsx b/packages/twenty-front/src/testing/decorators/FullScreenDecorator.tsx
new file mode 100644
index 000000000..4189635c8
--- /dev/null
+++ b/packages/twenty-front/src/testing/decorators/FullScreenDecorator.tsx
@@ -0,0 +1,28 @@
+import { FullScreenContainer } from '@/ui/layout/fullscreen/components/FullScreenContainer';
+import styled from '@emotion/styled';
+import { action } from '@storybook/addon-actions';
+import { Decorator } from '@storybook/react';
+const StyledT = styled.div`
+ height: 100%;
+ width: 100%;
+`;
+
+export const FullScreenDecorator: Decorator = (Story) => (
+
+
+
+
+
+);
diff --git a/packages/twenty-front/src/testing/graphqlMocks.ts b/packages/twenty-front/src/testing/graphqlMocks.ts
index ce24d4c0d..f16b465f7 100644
--- a/packages/twenty-front/src/testing/graphqlMocks.ts
+++ b/packages/twenty-front/src/testing/graphqlMocks.ts
@@ -44,6 +44,39 @@ export const metadataGraphql = graphql.link(
export const graphqlMocks = {
handlers: [
+ graphql.query('IntrospectionQuery', () => {
+ return HttpResponse.json({
+ data: {
+ __schema: {
+ queryType: { name: 'Query' },
+ types: [
+ {
+ kind: 'OBJECT',
+ name: 'Query',
+ fields: [
+ {
+ name: 'name',
+ type: { kind: 'SCALAR', name: 'String' },
+ args: [],
+ },
+ ],
+ interfaces: [],
+ args: [],
+ },
+ {
+ kind: 'SCALAR',
+ name: 'String',
+ fields: [],
+ interfaces: [],
+ args: [],
+ },
+ ],
+ directives: [],
+ },
+ },
+ });
+ }),
+
graphql.query(getOperationName(GET_CURRENT_USER) ?? '', () => {
return HttpResponse.json({
data: {
diff --git a/packages/twenty-front/src/utils/title-utils.ts b/packages/twenty-front/src/utils/title-utils.ts
index 3dd9b430d..6139d1450 100644
--- a/packages/twenty-front/src/utils/title-utils.ts
+++ b/packages/twenty-front/src/utils/title-utils.ts
@@ -9,6 +9,8 @@ export enum SettingsPageTitles {
Objects = 'Data model - Settings',
Members = 'Members - Settings',
Developers = 'Developers - Settings',
+ Apis = 'API Keys - Settings',
+ Webhooks = 'Webhooks - Settings',
Integration = 'Integrations - Settings',
ServerlessFunctions = 'Functions - Settings',
General = 'General - Settings',
@@ -21,7 +23,8 @@ enum SettingsPathPrefixes {
Profile = `${AppBasePath.Settings}/${SettingsPath.ProfilePage}`,
Objects = `${AppBasePath.Settings}/${SettingsPath.Objects}`,
Members = `${AppBasePath.Settings}/${SettingsPath.WorkspaceMembersPage}`,
- Developers = `${AppBasePath.Settings}/${SettingsPath.Developers}`,
+ ApiKeys = `${AppBasePath.Settings}/${SettingsPath.APIs}`,
+ Webhooks = `${AppBasePath.Settings}/${SettingsPath.Webhooks}`,
ServerlessFunctions = `${AppBasePath.Settings}/${SettingsPath.ServerlessFunctions}`,
Integration = `${AppBasePath.Settings}/${SettingsPath.Integrations}`,
General = `${AppBasePath.Settings}/${SettingsPath.Workspace}`,
@@ -59,8 +62,10 @@ export const getPageTitleFromPath = (pathname: string): string => {
return SettingsPageTitles.Members;
case SettingsPathPrefixes.Objects:
return SettingsPageTitles.Objects;
- case SettingsPathPrefixes.Developers:
- return SettingsPageTitles.Developers;
+ case SettingsPathPrefixes.ApiKeys:
+ return SettingsPageTitles.Apis;
+ case SettingsPathPrefixes.Webhooks:
+ return SettingsPageTitles.Webhooks;
case SettingsPathPrefixes.ServerlessFunctions:
return SettingsPageTitles.ServerlessFunctions;
case SettingsPathPrefixes.Integration:
diff --git a/packages/twenty-server/src/engine/core-modules/auth/strategies/jwt.auth.strategy.spec.ts b/packages/twenty-server/src/engine/core-modules/auth/strategies/jwt.auth.strategy.spec.ts
index 345b6d946..a4ff56d5c 100644
--- a/packages/twenty-server/src/engine/core-modules/auth/strategies/jwt.auth.strategy.spec.ts
+++ b/packages/twenty-server/src/engine/core-modules/auth/strategies/jwt.auth.strategy.spec.ts
@@ -16,6 +16,7 @@ describe('JwtAuthStrategy', () => {
let userRepository: any;
let dataSourceService: any;
let typeORMService: any;
+
const jwt = {
sub: 'sub-default',
jti: 'jti-default',
@@ -33,6 +34,10 @@ describe('JwtAuthStrategy', () => {
findOne: jest.fn(async () => new UserWorkspace()),
};
+ const jwtWrapperService: any = {
+ extractJwtFromRequest: jest.fn(() => () => 'token'),
+ };
+
// first we test the API_KEY case
it('should throw AuthException if type is API_KEY and workspace is not found', async () => {
const payload = {
@@ -46,7 +51,7 @@ describe('JwtAuthStrategy', () => {
strategy = new JwtAuthStrategy(
{} as any,
- {} as any,
+ jwtWrapperService,
typeORMService,
dataSourceService,
workspaceRepository,
@@ -82,7 +87,7 @@ describe('JwtAuthStrategy', () => {
strategy = new JwtAuthStrategy(
{} as any,
- {} as any,
+ jwtWrapperService,
typeORMService,
dataSourceService,
workspaceRepository,
@@ -120,7 +125,7 @@ describe('JwtAuthStrategy', () => {
strategy = new JwtAuthStrategy(
{} as any,
- {} as any,
+ jwtWrapperService,
typeORMService,
dataSourceService,
workspaceRepository,
@@ -152,7 +157,7 @@ describe('JwtAuthStrategy', () => {
strategy = new JwtAuthStrategy(
{} as any,
- {} as any,
+ jwtWrapperService,
typeORMService,
dataSourceService,
workspaceRepository,
@@ -190,7 +195,7 @@ describe('JwtAuthStrategy', () => {
strategy = new JwtAuthStrategy(
{} as any,
- {} as any,
+ jwtWrapperService,
typeORMService,
dataSourceService,
workspaceRepository,
@@ -231,7 +236,7 @@ describe('JwtAuthStrategy', () => {
strategy = new JwtAuthStrategy(
{} as any,
- {} as any,
+ jwtWrapperService,
typeORMService,
dataSourceService,
workspaceRepository,
diff --git a/packages/twenty-server/src/engine/core-modules/auth/strategies/jwt.auth.strategy.ts b/packages/twenty-server/src/engine/core-modules/auth/strategies/jwt.auth.strategy.ts
index 780a43775..8eea41009 100644
--- a/packages/twenty-server/src/engine/core-modules/auth/strategies/jwt.auth.strategy.ts
+++ b/packages/twenty-server/src/engine/core-modules/auth/strategies/jwt.auth.strategy.ts
@@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { InjectRepository } from '@nestjs/typeorm';
-import { ExtractJwt, Strategy } from 'passport-jwt';
+import { Strategy } from 'passport-jwt';
import { Repository } from 'typeorm';
import { TypeORMService } from 'src/database/typeorm/typeorm.service';
@@ -36,25 +36,28 @@ export class JwtAuthStrategy extends PassportStrategy(Strategy, 'jwt') {
@InjectRepository(UserWorkspace, 'core')
private readonly userWorkspaceRepository: Repository,
) {
- super({
- jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
- ignoreExpiration: false,
- secretOrKeyProvider: async (request, rawJwtToken, done) => {
- try {
- const decodedToken = this.jwtWrapperService.decode(
- rawJwtToken,
- ) as JwtPayload;
- const workspaceId = decodedToken.workspaceId;
- const secret = this.jwtWrapperService.generateAppSecret(
- 'ACCESS',
- workspaceId,
- );
+ const jwtFromRequestFunction = jwtWrapperService.extractJwtFromRequest();
+ const secretOrKeyProviderFunction = async (request, rawJwtToken, done) => {
+ try {
+ const decodedToken = jwtWrapperService.decode(
+ rawJwtToken,
+ ) as JwtPayload;
+ const workspaceId = decodedToken.workspaceId;
+ const secret = jwtWrapperService.generateAppSecret(
+ 'ACCESS',
+ workspaceId,
+ );
- done(null, secret);
- } catch (error) {
- done(error, null);
- }
- },
+ done(null, secret);
+ } catch (error) {
+ done(error, null);
+ }
+ };
+
+ super({
+ jwtFromRequest: jwtFromRequestFunction,
+ ignoreExpiration: false,
+ secretOrKeyProvider: secretOrKeyProviderFunction,
});
}
diff --git a/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.spec.ts b/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.spec.ts
index 29aa566c2..228159571 100644
--- a/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.spec.ts
+++ b/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.spec.ts
@@ -39,6 +39,7 @@ describe('AccessTokenService', () => {
verifyWorkspaceToken: jest.fn(),
decode: jest.fn(),
generateAppSecret: jest.fn(),
+ extractJwtFromRequest: jest.fn(),
},
},
{
@@ -179,6 +180,9 @@ describe('AccessTokenService', () => {
workspaceMemberId: 'workspace-member-id',
};
+ jest
+ .spyOn(jwtWrapperService, 'extractJwtFromRequest')
+ .mockReturnValue(() => mockToken);
jest
.spyOn(jwtWrapperService, 'verifyWorkspaceToken')
.mockResolvedValue(undefined);
@@ -207,6 +211,10 @@ describe('AccessTokenService', () => {
headers: {},
} as Request;
+ jest
+ .spyOn(jwtWrapperService, 'extractJwtFromRequest')
+ .mockReturnValue(() => null);
+
await expect(service.validateTokenByRequest(mockRequest)).rejects.toThrow(
AuthException,
);
diff --git a/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.ts b/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.ts
index 59f147d43..afc019a6e 100644
--- a/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.ts
+++ b/packages/twenty-server/src/engine/core-modules/auth/token/services/access-token.service.ts
@@ -4,7 +4,6 @@ import { InjectRepository } from '@nestjs/typeorm';
import { addMilliseconds } from 'date-fns';
import { Request } from 'express';
import ms from 'ms';
-import { ExtractJwt } from 'passport-jwt';
import { isWorkspaceActiveOrSuspended } from 'twenty-shared';
import { Repository } from 'typeorm';
@@ -125,7 +124,7 @@ export class AccessTokenService {
}
async validateTokenByRequest(request: Request): Promise {
- const token = ExtractJwt.fromAuthHeaderAsBearerToken()(request);
+ const token = this.jwtWrapperService.extractJwtFromRequest()(request);
if (!token) {
throw new AuthException(
diff --git a/packages/twenty-server/src/engine/core-modules/jwt/services/jwt-wrapper.service.ts b/packages/twenty-server/src/engine/core-modules/jwt/services/jwt-wrapper.service.ts
index 51ec81933..430b493e2 100644
--- a/packages/twenty-server/src/engine/core-modules/jwt/services/jwt-wrapper.service.ts
+++ b/packages/twenty-server/src/engine/core-modules/jwt/services/jwt-wrapper.service.ts
@@ -3,7 +3,9 @@ import { JwtService, JwtSignOptions, JwtVerifyOptions } from '@nestjs/jwt';
import { createHash } from 'crypto';
+import { Request as ExpressRequest } from 'express';
import * as jwt from 'jsonwebtoken';
+import { ExtractJwt, JwtFromRequestFunction } from 'passport-jwt';
import { isDefined } from 'twenty-shared';
import {
@@ -122,4 +124,20 @@ export class JwtWrapperService {
return accessTokenSecret;
}
+
+ extractJwtFromRequest(): JwtFromRequestFunction {
+ return (request: ExpressRequest) => {
+ // First try to extract token from Authorization header
+ const tokenFromHeader = ExtractJwt.fromAuthHeaderAsBearerToken()(request);
+
+ if (tokenFromHeader) {
+ return tokenFromHeader;
+ }
+
+ // If not found in header, try to extract from URL query parameter
+ // This is for edge cases where we don't control the origin request
+ // (e.g. the REST API playground)
+ return ExtractJwt.fromUrlQueryParameter('token')(request);
+ };
+ }
}
diff --git a/packages/twenty-server/src/engine/middlewares/middleware.module.ts b/packages/twenty-server/src/engine/middlewares/middleware.module.ts
index 2fd0b922c..eba2ce511 100644
--- a/packages/twenty-server/src/engine/middlewares/middleware.module.ts
+++ b/packages/twenty-server/src/engine/middlewares/middleware.module.ts
@@ -1,6 +1,7 @@
import { Module } from '@nestjs/common';
import { TokenModule } from 'src/engine/core-modules/auth/token/token.module';
+import { JwtModule } from 'src/engine/core-modules/jwt/jwt.module';
import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module';
import { WorkspaceMetadataCacheModule } from 'src/engine/metadata-modules/workspace-metadata-cache/workspace-metadata-cache.module';
import { MiddlewareService } from 'src/engine/middlewares/middleware.service';
@@ -12,6 +13,7 @@ import { WorkspaceCacheStorageModule } from 'src/engine/workspace-cache-storage/
WorkspaceCacheStorageModule,
WorkspaceMetadataCacheModule,
TokenModule,
+ JwtModule,
],
providers: [MiddlewareService],
exports: [MiddlewareService],
diff --git a/packages/twenty-server/src/engine/middlewares/middleware.service.ts b/packages/twenty-server/src/engine/middlewares/middleware.service.ts
index b7b2c2b0a..71e5392d0 100644
--- a/packages/twenty-server/src/engine/middlewares/middleware.service.ts
+++ b/packages/twenty-server/src/engine/middlewares/middleware.service.ts
@@ -1,7 +1,6 @@
import { Injectable } from '@nestjs/common';
import { Request, Response } from 'express';
-import { ExtractJwt } from 'passport-jwt';
import { isDefined } from 'twenty-shared';
import { AuthExceptionCode } from 'src/engine/core-modules/auth/auth.exception';
@@ -9,6 +8,7 @@ import { AccessTokenService } from 'src/engine/core-modules/auth/token/services/
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service';
import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
+import { JwtWrapperService } from 'src/engine/core-modules/jwt/services/jwt-wrapper.service';
import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service';
import { WorkspaceMetadataCacheService } from 'src/engine/metadata-modules/workspace-metadata-cache/services/workspace-metadata-cache.service';
import { INTERNAL_SERVER_ERROR } from 'src/engine/middlewares/constants/default-error-message.constant';
@@ -29,12 +29,13 @@ export class MiddlewareService {
private readonly workspaceMetadataCacheService: WorkspaceMetadataCacheService,
private readonly dataSourceService: DataSourceService,
private readonly exceptionHandlerService: ExceptionHandlerService,
+ private readonly jwtWrapperService: JwtWrapperService,
) {}
private excludedOperations = EXCLUDED_MIDDLEWARE_OPERATIONS;
public isTokenPresent(request: Request): boolean {
- const token = ExtractJwt.fromAuthHeaderAsBearerToken()(request);
+ const token = this.jwtWrapperService.extractJwtFromRequest()(request);
return !!token;
}
diff --git a/packages/twenty-ui/src/display/icon/components/TablerIcons.ts b/packages/twenty-ui/src/display/icon/components/TablerIcons.ts
index 5ad764929..81c263ea3 100644
--- a/packages/twenty-ui/src/display/icon/components/TablerIcons.ts
+++ b/packages/twenty-ui/src/display/icon/components/TablerIcons.ts
@@ -25,9 +25,11 @@ export {
IconBookmarkPlus,
IconBox,
IconBrackets,
+ IconBracketsAngle,
IconBracketsContain,
IconBrandGithub,
IconBrandGoogle,
+ IconBrandGraphql,
IconBrandLinkedin,
IconBrandX,
IconBriefcase,
@@ -142,6 +144,7 @@ export {
IconFolder,
IconFolderOpen,
IconFolderPlus,
+ IconFolderRoot,
IconForbid,
IconFunction,
IconGauge,
@@ -278,6 +281,7 @@ export {
IconVariablePlus,
IconVideo,
IconWand,
+ IconWebhook,
IconWorld,
IconX,
} from '@tabler/icons-react';
diff --git a/yarn.lock b/yarn.lock
index ea66b1bf2..a13f42a9f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4094,6 +4094,30 @@ __metadata:
languageName: node
linkType: hard
+"@codemirror/autocomplete@npm:^6.18.3":
+ version: 6.18.6
+ resolution: "@codemirror/autocomplete@npm:6.18.6"
+ dependencies:
+ "@codemirror/language": "npm:^6.0.0"
+ "@codemirror/state": "npm:^6.0.0"
+ "@codemirror/view": "npm:^6.17.0"
+ "@lezer/common": "npm:^1.0.0"
+ checksum: 10c0/65069493978b2af7c600af5020a8873270a8bc9a6820da192bf28b03535f1a0127aa5767eb30d9bfa5d36c61186ee2766925625e8a6c731194e7def0d882fb84
+ languageName: node
+ linkType: hard
+
+"@codemirror/commands@npm:^6.0.0, @codemirror/commands@npm:^6.7.1":
+ version: 6.8.0
+ resolution: "@codemirror/commands@npm:6.8.0"
+ dependencies:
+ "@codemirror/language": "npm:^6.0.0"
+ "@codemirror/state": "npm:^6.4.0"
+ "@codemirror/view": "npm:^6.27.0"
+ "@lezer/common": "npm:^1.1.0"
+ checksum: 10c0/689f85a305f96fbe43df888c901411aefc1b937cfc8217f74d8d4d36d8bb343c5a7eae4f153391749d5fd9e49001338e39b898ce39de837d63bc83e2a6d8180d
+ languageName: node
+ linkType: hard
+
"@codemirror/commands@npm:^6.1.3":
version: 6.6.0
resolution: "@codemirror/commands@npm:6.6.0"
@@ -4119,7 +4143,20 @@ __metadata:
languageName: node
linkType: hard
-"@codemirror/lang-html@npm:^6.4.0":
+"@codemirror/lang-css@npm:^6.3.1":
+ version: 6.3.1
+ resolution: "@codemirror/lang-css@npm:6.3.1"
+ dependencies:
+ "@codemirror/autocomplete": "npm:^6.0.0"
+ "@codemirror/language": "npm:^6.0.0"
+ "@codemirror/state": "npm:^6.0.0"
+ "@lezer/common": "npm:^1.0.2"
+ "@lezer/css": "npm:^1.1.7"
+ checksum: 10c0/339387c5a1b90076ae41017e66d7da70dd2aca4e5e4d012c95df33d0f6e740410cf1fb53c4845e3814636d587ce6eff05ebca3173dcfc564a1f646d24f299180
+ languageName: node
+ linkType: hard
+
+"@codemirror/lang-html@npm:^6.4.0, @codemirror/lang-html@npm:^6.4.8":
version: 6.4.9
resolution: "@codemirror/lang-html@npm:6.4.9"
dependencies:
@@ -4151,6 +4188,45 @@ __metadata:
languageName: node
linkType: hard
+"@codemirror/lang-json@npm:^6.0.0":
+ version: 6.0.1
+ resolution: "@codemirror/lang-json@npm:6.0.1"
+ dependencies:
+ "@codemirror/language": "npm:^6.0.0"
+ "@lezer/json": "npm:^1.0.0"
+ checksum: 10c0/c70301ba43d44dbd1ff0ccab6ec6e3fb9825d61d4854b4839441a8144a9c96997acdad16d93199d157308dd80088a5e9f14b66f395c7e79f4dadc6b4e70ce8a8
+ languageName: node
+ linkType: hard
+
+"@codemirror/lang-xml@npm:^6.0.0":
+ version: 6.1.0
+ resolution: "@codemirror/lang-xml@npm:6.1.0"
+ dependencies:
+ "@codemirror/autocomplete": "npm:^6.0.0"
+ "@codemirror/language": "npm:^6.4.0"
+ "@codemirror/state": "npm:^6.0.0"
+ "@codemirror/view": "npm:^6.0.0"
+ "@lezer/common": "npm:^1.0.0"
+ "@lezer/xml": "npm:^1.0.0"
+ checksum: 10c0/14fe84cf5c8a43f1772963a0d24df55a0c8c59d253b0927a8409bc4be0e00e9cc26c378ef14879418c02504d087590bb55ccc1d09f393eef7e19852095df538a
+ languageName: node
+ linkType: hard
+
+"@codemirror/lang-yaml@npm:^6.1.2":
+ version: 6.1.2
+ resolution: "@codemirror/lang-yaml@npm:6.1.2"
+ dependencies:
+ "@codemirror/autocomplete": "npm:^6.0.0"
+ "@codemirror/language": "npm:^6.0.0"
+ "@codemirror/state": "npm:^6.0.0"
+ "@lezer/common": "npm:^1.2.0"
+ "@lezer/highlight": "npm:^1.2.0"
+ "@lezer/lr": "npm:^1.0.0"
+ "@lezer/yaml": "npm:^1.0.0"
+ checksum: 10c0/fc993c5e24baee0212d587c652ee7633792533c1b1e5b708d5e4f6c29e6164a3563958fd6a3bb402a64f565f7bab7edbda6c8b8cd8bfecfd0b7294f0dcf998a8
+ languageName: node
+ linkType: hard
+
"@codemirror/language@npm:^6.0.0, @codemirror/language@npm:^6.3.2, @codemirror/language@npm:^6.4.0, @codemirror/language@npm:^6.6.0":
version: 6.10.2
resolution: "@codemirror/language@npm:6.10.2"
@@ -4165,6 +4241,20 @@ __metadata:
languageName: node
linkType: hard
+"@codemirror/language@npm:^6.10.7":
+ version: 6.10.8
+ resolution: "@codemirror/language@npm:6.10.8"
+ dependencies:
+ "@codemirror/state": "npm:^6.0.0"
+ "@codemirror/view": "npm:^6.23.0"
+ "@lezer/common": "npm:^1.1.0"
+ "@lezer/highlight": "npm:^1.0.0"
+ "@lezer/lr": "npm:^1.0.0"
+ style-mod: "npm:^4.0.0"
+ checksum: 10c0/b7d07bc4726046563d4cfcd5d26ae64300fbfa58d81c034674d25e346ace0b5b2a53446d0b246ff09f6b0111a7ff35d827f2d5cc4ef95de9dfd43e4d068fe3a7
+ languageName: node
+ linkType: hard
+
"@codemirror/lint@npm:^6.0.0":
version: 6.8.1
resolution: "@codemirror/lint@npm:6.8.1"
@@ -4176,10 +4266,34 @@ __metadata:
languageName: node
linkType: hard
-"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.2.0, @codemirror/state@npm:^6.4.0":
- version: 6.4.1
- resolution: "@codemirror/state@npm:6.4.1"
- checksum: 10c0/cdab74d0ca4e262531a257ac419c9c44124f3ace8b0ca1262598a9218fbb6fd8f0afeb4b5ed2f64552a9573a0fc5d55481d4b9b05e9505ef729f9bd0f9469423
+"@codemirror/lint@npm:^6.8.4":
+ version: 6.8.4
+ resolution: "@codemirror/lint@npm:6.8.4"
+ dependencies:
+ "@codemirror/state": "npm:^6.0.0"
+ "@codemirror/view": "npm:^6.35.0"
+ crelt: "npm:^1.0.5"
+ checksum: 10c0/2614f25c50061b8bea4a430d19b25dca03e3d3059ade0bbc5768d2a1ac1dbc2e653ccc810d951860e6bd9e37031c850f439054c6df6522d533d93984df68bc79
+ languageName: node
+ linkType: hard
+
+"@codemirror/search@npm:^6.0.0":
+ version: 6.5.10
+ resolution: "@codemirror/search@npm:6.5.10"
+ dependencies:
+ "@codemirror/state": "npm:^6.0.0"
+ "@codemirror/view": "npm:^6.0.0"
+ crelt: "npm:^1.0.5"
+ checksum: 10c0/01806b0a04e6274077bac5de9fc201194147da25ec888dec0186269da9aff089d321a1a09245b4de39148c76b30ba8595a95d42dea6f5913d19c3a0107401d3a
+ languageName: node
+ linkType: hard
+
+"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.2.0, @codemirror/state@npm:^6.4.0, @codemirror/state@npm:^6.5.0":
+ version: 6.5.2
+ resolution: "@codemirror/state@npm:6.5.2"
+ dependencies:
+ "@marijn/find-cluster-break": "npm:^1.0.0"
+ checksum: 10c0/1ef773394e32c077a8cfc1ec6d881aefb1918876f82161748e505c38d143aa1c6893c314cfec91097d28f704ec07b2a6c6b75abd435086208974256dee997282
languageName: node
linkType: hard
@@ -4194,6 +4308,17 @@ __metadata:
languageName: node
linkType: hard
+"@codemirror/view@npm:^6.35.0, @codemirror/view@npm:^6.35.3":
+ version: 6.36.4
+ resolution: "@codemirror/view@npm:6.36.4"
+ dependencies:
+ "@codemirror/state": "npm:^6.5.0"
+ style-mod: "npm:^4.1.0"
+ w3c-keyname: "npm:^2.2.4"
+ checksum: 10c0/6381ddfefba1564f17d4782980c02bb6b5356848ecf683435928a17d166fbd37dfece9db6bbcacf40be81d5e60c473acb1a192c3199f269a8651fdd73da5c2bc
+ languageName: node
+ linkType: hard
+
"@codesandbox/nodebox@npm:0.1.8":
version: 0.1.8
resolution: "@codesandbox/nodebox@npm:0.1.8"
@@ -5438,6 +5563,16 @@ __metadata:
languageName: node
linkType: hard
+"@floating-ui/dom@npm:^1.6.7":
+ version: 1.6.13
+ resolution: "@floating-ui/dom@npm:1.6.13"
+ dependencies:
+ "@floating-ui/core": "npm:^1.6.0"
+ "@floating-ui/utils": "npm:^0.2.9"
+ checksum: 10c0/272242d2eb6238ffcee0cb1f3c66e0eafae804d5d7b449db5ecf904bc37d31ad96cf575a9e650b93c1190f64f49a684b1559d10e05ed3ec210628b19116991a9
+ languageName: node
+ linkType: hard
+
"@floating-ui/react-dom@npm:^2.0.0, @floating-ui/react-dom@npm:^2.0.1, @floating-ui/react-dom@npm:^2.1.1":
version: 2.1.1
resolution: "@floating-ui/react-dom@npm:2.1.1"
@@ -5478,6 +5613,13 @@ __metadata:
languageName: node
linkType: hard
+"@floating-ui/utils@npm:^0.2.2, @floating-ui/utils@npm:^0.2.9":
+ version: 0.2.9
+ resolution: "@floating-ui/utils@npm:0.2.9"
+ checksum: 10c0/48bbed10f91cb7863a796cc0d0e917c78d11aeb89f98d03fc38d79e7eb792224a79f538ed8a2d5d5584511d4ca6354ef35f1712659fd569868e342df4398ad6f
+ languageName: node
+ linkType: hard
+
"@floating-ui/utils@npm:^0.2.7":
version: 0.2.7
resolution: "@floating-ui/utils@npm:0.2.7"
@@ -5485,6 +5627,17 @@ __metadata:
languageName: node
linkType: hard
+"@floating-ui/vue@npm:^1.0.2, @floating-ui/vue@npm:^1.1.0":
+ version: 1.1.6
+ resolution: "@floating-ui/vue@npm:1.1.6"
+ dependencies:
+ "@floating-ui/dom": "npm:^1.0.0"
+ "@floating-ui/utils": "npm:^0.2.9"
+ vue-demi: "npm:>=0.13.0"
+ checksum: 10c0/47111d8ecfff9154006fa074092c94c450fc4c5e70e1834784f063e828ad956c9d9ef5d95473e4e697288adf32d314c454c594df2d8268962a3810138a694cff
+ languageName: node
+ linkType: hard
+
"@formatjs/ecma402-abstract@npm:2.3.3":
version: 2.3.3
resolution: "@formatjs/ecma402-abstract@npm:2.3.3"
@@ -6718,6 +6871,26 @@ __metadata:
languageName: node
linkType: hard
+"@headlessui/tailwindcss@npm:^0.2.0":
+ version: 0.2.2
+ resolution: "@headlessui/tailwindcss@npm:0.2.2"
+ peerDependencies:
+ tailwindcss: ^3.0 || ^4.0
+ checksum: 10c0/97fdaad196b1343ad0bbe7375ecda873c87e0fa3c4c9eca05e3ec20cbe28e40cb982deaee5035d6f621a9a717e0bc0a42b18cb6271aa1b59af5d0dd8d028fce7
+ languageName: node
+ linkType: hard
+
+"@headlessui/vue@npm:^1.7.20":
+ version: 1.7.23
+ resolution: "@headlessui/vue@npm:1.7.23"
+ dependencies:
+ "@tanstack/vue-virtual": "npm:^3.0.0-beta.60"
+ peerDependencies:
+ vue: ^3.2.0
+ checksum: 10c0/6c570ab66ff7b0c2f115ab062dd8a08ce769263f5236422ecb298bfcb3d19d15fc83272d009f3c4159b8da3777ad048bf0ef49e258368096ae3b71085417fe13
+ languageName: node
+ linkType: hard
+
"@hello-pangea/dnd@npm:^16.2.0":
version: 16.6.0
resolution: "@hello-pangea/dnd@npm:16.6.0"
@@ -6787,6 +6960,46 @@ __metadata:
languageName: node
linkType: hard
+"@hyperjump/json-pointer@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "@hyperjump/json-pointer@npm:1.1.0"
+ checksum: 10c0/2a2ee4f3069d8434406f36856c66c179055b9757f0f36ced6c7a8a61ad3deeecbb576de9c95d6cc2d7bbce8164eb2e6ebeef9b8d346223bf28eb69abd08a8eb7
+ languageName: node
+ linkType: hard
+
+"@hyperjump/json-schema@npm:^1.9.6":
+ version: 1.11.0
+ resolution: "@hyperjump/json-schema@npm:1.11.0"
+ dependencies:
+ "@hyperjump/json-pointer": "npm:^1.1.0"
+ "@hyperjump/pact": "npm:^1.2.0"
+ "@hyperjump/uri": "npm:^1.2.0"
+ content-type: "npm:^1.0.4"
+ json-stringify-deterministic: "npm:^1.0.12"
+ just-curry-it: "npm:^5.3.0"
+ uuid: "npm:^9.0.0"
+ peerDependencies:
+ "@hyperjump/browser": ^1.1.0
+ checksum: 10c0/b92050a9d5ec0ed586f4f968ee9f1527476d5cfe8e9687a6c120d875fdfe75c134e968236069a1f69ae246af61866b3a9acbd4414425f950f5836291b11fa36e
+ languageName: node
+ linkType: hard
+
+"@hyperjump/pact@npm:^1.2.0":
+ version: 1.3.0
+ resolution: "@hyperjump/pact@npm:1.3.0"
+ dependencies:
+ just-curry-it: "npm:^5.3.0"
+ checksum: 10c0/4f8101e31427928bd85d039be6ed53b70e2d2d01bd4b1a937b5119f852270c1d6acb51ae7a9fd5c4d31ef422f29b461f73805d44914bec8b417364ecdbe5a8e5
+ languageName: node
+ linkType: hard
+
+"@hyperjump/uri@npm:^1.2.0":
+ version: 1.3.1
+ resolution: "@hyperjump/uri@npm:1.3.1"
+ checksum: 10c0/cdcff5ab8a0fe66fb4478ae67281d92fae493116ae8dacce7239f1325e523d4c62382411e341f3f1960ef2d904206fba672eb87dab947c6d91b25dd65a927a72
+ languageName: node
+ linkType: hard
+
"@img/sharp-darwin-arm64@npm:0.33.5":
version: 0.33.5
resolution: "@img/sharp-darwin-arm64@npm:0.33.5"
@@ -7009,7 +7222,7 @@ __metadata:
languageName: node
linkType: hard
-"@internationalized/date@npm:^3.7.0":
+"@internationalized/date@npm:^3.5.4, @internationalized/date@npm:^3.7.0":
version: 3.7.0
resolution: "@internationalized/date@npm:3.7.0"
dependencies:
@@ -7028,7 +7241,7 @@ __metadata:
languageName: node
linkType: hard
-"@internationalized/number@npm:^3.6.0":
+"@internationalized/number@npm:^3.5.3, @internationalized/number@npm:^3.6.0":
version: 3.6.0
resolution: "@internationalized/number@npm:3.6.0"
dependencies:
@@ -7759,6 +7972,13 @@ __metadata:
languageName: node
linkType: hard
+"@lezer/common@npm:^1.2.3":
+ version: 1.2.3
+ resolution: "@lezer/common@npm:1.2.3"
+ checksum: 10c0/fe9f8e111080ef94037a34ca2af1221c8d01c1763ba5ecf708a286185c76119509a5d19d924c8842172716716ddce22d7834394670c4a9432f0ba9f3b7c0f50d
+ languageName: node
+ linkType: hard
+
"@lezer/css@npm:^1.0.0, @lezer/css@npm:^1.1.0":
version: 1.1.8
resolution: "@lezer/css@npm:1.1.8"
@@ -7770,6 +7990,17 @@ __metadata:
languageName: node
linkType: hard
+"@lezer/css@npm:^1.1.7":
+ version: 1.1.10
+ resolution: "@lezer/css@npm:1.1.10"
+ dependencies:
+ "@lezer/common": "npm:^1.2.0"
+ "@lezer/highlight": "npm:^1.0.0"
+ "@lezer/lr": "npm:^1.0.0"
+ checksum: 10c0/f4e870f1890b8131bf641ac3455e26ba72081b311f62dc6204d0df64228f137b8e5a157ba162b752c03d623e6064cac1fc4b96a7f06f6c20b4415dc66baf8821
+ languageName: node
+ linkType: hard
+
"@lezer/highlight@npm:^1.0.0, @lezer/highlight@npm:^1.1.3":
version: 1.2.0
resolution: "@lezer/highlight@npm:1.2.0"
@@ -7779,6 +8010,15 @@ __metadata:
languageName: node
linkType: hard
+"@lezer/highlight@npm:^1.2.0, @lezer/highlight@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "@lezer/highlight@npm:1.2.1"
+ dependencies:
+ "@lezer/common": "npm:^1.0.0"
+ checksum: 10c0/51b4c08596a0dfeec6a7b7ed90a7f2743ab42e7e8ff8b89707fd042860e4e133dbd8243639fcaf077305ae6c303aa74e69794015eb16cb34741f5ac6721f283c
+ languageName: node
+ linkType: hard
+
"@lezer/html@npm:^1.3.0":
version: 1.3.10
resolution: "@lezer/html@npm:1.3.10"
@@ -7801,7 +8041,18 @@ __metadata:
languageName: node
linkType: hard
-"@lezer/lr@npm:^1.0.0, @lezer/lr@npm:^1.3.0":
+"@lezer/json@npm:^1.0.0":
+ version: 1.0.3
+ resolution: "@lezer/json@npm:1.0.3"
+ dependencies:
+ "@lezer/common": "npm:^1.2.0"
+ "@lezer/highlight": "npm:^1.0.0"
+ "@lezer/lr": "npm:^1.0.0"
+ checksum: 10c0/e91c957cc0825e927b55fbcd233d7ee0b39f9c2a89d9475489f394b7eba2b59e5f480d157a12d5cd6ae6f14bc99f9ccd8e8113baad498199ef1b13c49105f546
+ languageName: node
+ linkType: hard
+
+"@lezer/lr@npm:^1.0.0, @lezer/lr@npm:^1.3.0, @lezer/lr@npm:^1.4.0, @lezer/lr@npm:^1.4.2":
version: 1.4.2
resolution: "@lezer/lr@npm:1.4.2"
dependencies:
@@ -7810,6 +8061,28 @@ __metadata:
languageName: node
linkType: hard
+"@lezer/xml@npm:^1.0.0":
+ version: 1.0.6
+ resolution: "@lezer/xml@npm:1.0.6"
+ dependencies:
+ "@lezer/common": "npm:^1.2.0"
+ "@lezer/highlight": "npm:^1.0.0"
+ "@lezer/lr": "npm:^1.0.0"
+ checksum: 10c0/10c4fdf72daefe9b531e2aa31f87b23b8252bb116220168b7c394c16f992414e1d6320736b87c3282a5082af4558db0f8f2c3283e92ebaa494e076b8e5e14292
+ languageName: node
+ linkType: hard
+
+"@lezer/yaml@npm:^1.0.0":
+ version: 1.0.3
+ resolution: "@lezer/yaml@npm:1.0.3"
+ dependencies:
+ "@lezer/common": "npm:^1.2.0"
+ "@lezer/highlight": "npm:^1.0.0"
+ "@lezer/lr": "npm:^1.4.0"
+ checksum: 10c0/cef3d0c0a2c48a7e0f36ccc0af948da9394d17b164dcbaf0187d9b472fd4f628b3107d7a4041045181488f1966a94ae65640c932fc8d3bf8c3597813cfb86ae0
+ languageName: node
+ linkType: hard
+
"@linaria/core@npm:^6.2.0":
version: 6.2.0
resolution: "@linaria/core@npm:6.2.0"
@@ -8081,6 +8354,13 @@ __metadata:
languageName: node
linkType: hard
+"@marijn/find-cluster-break@npm:^1.0.0":
+ version: 1.0.2
+ resolution: "@marijn/find-cluster-break@npm:1.0.2"
+ checksum: 10c0/1a17a60b16083cc5f7ce89d7b7d8aa87ce4099723e3e9e34e229ef2cd8a980e69d481ca8ee90ffedfec5119af1aed581642fb60ed0365e7e90634c81ea6b630f
+ languageName: node
+ linkType: hard
+
"@markdoc/markdoc@npm:^0.4.0":
version: 0.4.0
resolution: "@markdoc/markdoc@npm:0.4.0"
@@ -14597,6 +14877,17 @@ __metadata:
languageName: node
linkType: hard
+"@replit/codemirror-css-color-picker@npm:^6.3.0":
+ version: 6.3.0
+ resolution: "@replit/codemirror-css-color-picker@npm:6.3.0"
+ peerDependencies:
+ "@codemirror/language": ^6.0.0
+ "@codemirror/state": ^6.0.0
+ "@codemirror/view": ^6.0.0
+ checksum: 10c0/8018d3378d790aaa3c49895caa0b4a66b92154a864998075e3288353ea1a4fd704b818767a31eae65712859c225e135dd8bd20aa014be8b362996c06f3897090
+ languageName: node
+ linkType: hard
+
"@revertdotdev/revert-react@npm:^0.0.21":
version: 0.0.21
resolution: "@revertdotdev/revert-react@npm:0.0.21"
@@ -14808,6 +15099,309 @@ __metadata:
languageName: node
linkType: hard
+"@scalar/api-client@npm:2.2.56":
+ version: 2.2.56
+ resolution: "@scalar/api-client@npm:2.2.56"
+ dependencies:
+ "@headlessui/tailwindcss": "npm:^0.2.0"
+ "@headlessui/vue": "npm:^1.7.20"
+ "@scalar/components": "npm:0.13.28"
+ "@scalar/draggable": "npm:0.1.11"
+ "@scalar/icons": "npm:0.1.3"
+ "@scalar/import": "npm:0.2.30"
+ "@scalar/oas-utils": "npm:0.2.110"
+ "@scalar/object-utils": "npm:1.1.13"
+ "@scalar/openapi-parser": "npm:0.10.9"
+ "@scalar/openapi-types": "npm:0.1.9"
+ "@scalar/postman-to-openapi": "npm:0.1.33"
+ "@scalar/snippetz": "npm:0.2.15"
+ "@scalar/themes": "npm:0.9.71"
+ "@scalar/types": "npm:0.0.36"
+ "@scalar/use-codemirror": "npm:0.11.73"
+ "@scalar/use-hooks": "npm:0.1.25"
+ "@scalar/use-toasts": "npm:0.7.9"
+ "@scalar/use-tooltip": "npm:1.0.6"
+ "@vueuse/core": "npm:^10.10.0"
+ "@vueuse/integrations": "npm:^11.2.0"
+ focus-trap: "npm:^7"
+ fuse.js: "npm:^7.0.0"
+ microdiff: "npm:^1.4.0"
+ nanoid: "npm:^5.0.9"
+ pretty-bytes: "npm:^6.1.1"
+ pretty-ms: "npm:^8.0.0"
+ shell-quote: "npm:^1.8.1"
+ vue: "npm:^3.5.12"
+ vue-router: "npm:^4.3.0"
+ whatwg-mimetype: "npm:^4.0.0"
+ yaml: "npm:^2.4.5"
+ zod: "npm:^3.23.8"
+ checksum: 10c0/645a2e541df5f9e2b57fba7ed46165d707c91b4195f6ec1b565153b7253e396f290c20ab4a411d09b35b3f60b4c0eee5cbf2ee3b512fd9476026ca07598f61a8
+ languageName: node
+ linkType: hard
+
+"@scalar/api-reference-react@npm:^0.4.36":
+ version: 0.4.36
+ resolution: "@scalar/api-reference-react@npm:0.4.36"
+ dependencies:
+ "@scalar/api-reference": "npm:1.25.127"
+ peerDependencies:
+ react: ^18.0.0 || ^19.0.0
+ checksum: 10c0/14e5dba17f1ad203d4a44fc80ad4f86b6ed1c6a0bb1de7c72db48fee781277ca49eec95b219338ca81cbba732afadc81fe36a8c18332d441c483065a5fb48825
+ languageName: node
+ linkType: hard
+
+"@scalar/api-reference@npm:1.25.127":
+ version: 1.25.127
+ resolution: "@scalar/api-reference@npm:1.25.127"
+ dependencies:
+ "@floating-ui/vue": "npm:^1.0.2"
+ "@headlessui/vue": "npm:^1.7.20"
+ "@scalar/api-client": "npm:2.2.56"
+ "@scalar/code-highlight": "npm:0.0.23"
+ "@scalar/components": "npm:0.13.28"
+ "@scalar/oas-utils": "npm:0.2.110"
+ "@scalar/openapi-parser": "npm:0.10.9"
+ "@scalar/openapi-types": "npm:0.1.9"
+ "@scalar/snippetz": "npm:0.2.15"
+ "@scalar/themes": "npm:0.9.71"
+ "@scalar/types": "npm:0.0.36"
+ "@scalar/use-hooks": "npm:0.1.25"
+ "@scalar/use-toasts": "npm:0.7.9"
+ "@unhead/vue": "npm:^1.11.11"
+ "@vueuse/core": "npm:^10.10.0"
+ fuse.js: "npm:^7.0.0"
+ github-slugger: "npm:^2.0.0"
+ nanoid: "npm:^5.0.9"
+ vue: "npm:^3.5.12"
+ checksum: 10c0/89c279a32a016a7291a015f48076879e54e8c9e6f66b21b9690e496da1cc4ac970b884dfc65d219ef00309795d92be0f85a06b79c2ebac9de689800ed325ccc1
+ languageName: node
+ linkType: hard
+
+"@scalar/code-highlight@npm:0.0.23":
+ version: 0.0.23
+ resolution: "@scalar/code-highlight@npm:0.0.23"
+ dependencies:
+ hast-util-to-text: "npm:^4.0.2"
+ highlight.js: "npm:^11.9.0"
+ highlightjs-curl: "npm:^1.3.0"
+ highlightjs-vue: "npm:^1.0.0"
+ lowlight: "npm:^3.1.0"
+ rehype-external-links: "npm:^3.0.0"
+ rehype-format: "npm:^5.0.0"
+ rehype-parse: "npm:^9.0.0"
+ rehype-raw: "npm:^7.0.0"
+ rehype-sanitize: "npm:^6.0.0"
+ rehype-stringify: "npm:^10.0.0"
+ remark-gfm: "npm:^4.0.0"
+ remark-parse: "npm:^11.0.0"
+ remark-rehype: "npm:^11.1.0"
+ remark-stringify: "npm:^11.0.0"
+ unified: "npm:^11.0.4"
+ unist-util-visit: "npm:^5.0.0"
+ checksum: 10c0/6d1bbdd1de8356180238ab1390c8ea6acf2104f7bd807f8ecbd017ed86628e172f11eb7f9172330399da15cad97564efb0114b71795fbd443d3d3d205966944b
+ languageName: node
+ linkType: hard
+
+"@scalar/components@npm:0.13.28":
+ version: 0.13.28
+ resolution: "@scalar/components@npm:0.13.28"
+ dependencies:
+ "@floating-ui/utils": "npm:^0.2.2"
+ "@floating-ui/vue": "npm:^1.0.2"
+ "@headlessui/vue": "npm:^1.7.20"
+ "@scalar/code-highlight": "npm:0.0.23"
+ "@scalar/themes": "npm:0.9.71"
+ "@scalar/use-hooks": "npm:0.1.25"
+ "@scalar/use-toasts": "npm:0.7.9"
+ "@vueuse/core": "npm:^10.10.0"
+ cva: "npm:1.0.0-beta.2"
+ nanoid: "npm:^5.0.9"
+ pretty-bytes: "npm:^6.1.1"
+ radix-vue: "npm:^1.9.3"
+ tailwind-merge: "npm:^2.5.5"
+ vue: "npm:^3.5.12"
+ checksum: 10c0/514e72e844105b1bb6e45c37e76b519ec8951f36a6e011da3aabc74f27b70e72dc81488aa7b21f9f14d51be5f028ecf9be7621fbe5522cafa92f66ea747b7f7e
+ languageName: node
+ linkType: hard
+
+"@scalar/draggable@npm:0.1.11":
+ version: 0.1.11
+ resolution: "@scalar/draggable@npm:0.1.11"
+ dependencies:
+ vue: "npm:^3.5.12"
+ checksum: 10c0/1c41325e5240c324c3c9edceb425b7a9260236455769d998e484e990f511810c0c4f568ed538e241494d1d4f88b9606ae65cb83d540d7a714b5f90696942caf8
+ languageName: node
+ linkType: hard
+
+"@scalar/icons@npm:0.1.3":
+ version: 0.1.3
+ resolution: "@scalar/icons@npm:0.1.3"
+ dependencies:
+ vue: "npm:^3.5.12"
+ checksum: 10c0/769cbe6199b9e353f11dfc87fe334bdaf5ab3d5a0c599c6f8f3b2cf327c8aea43ca6cbb88b223722184e50fada2e4c465205f36dd6d7ac0ec3cc8891bdb6cc8d
+ languageName: node
+ linkType: hard
+
+"@scalar/import@npm:0.2.30":
+ version: 0.2.30
+ resolution: "@scalar/import@npm:0.2.30"
+ dependencies:
+ "@scalar/oas-utils": "npm:0.2.110"
+ "@scalar/openapi-parser": "npm:0.10.9"
+ yaml: "npm:^2.4.5"
+ checksum: 10c0/848f45d29a6d4abde9afec5715f066a2fdc2f30c7df70207e9f2c06f97ee46d772f90cba3d3cc02d7508935b6a4656c9318995acaca4ac5b7eec53fba44c5526
+ languageName: node
+ linkType: hard
+
+"@scalar/oas-utils@npm:0.2.110":
+ version: 0.2.110
+ resolution: "@scalar/oas-utils@npm:0.2.110"
+ dependencies:
+ "@hyperjump/json-schema": "npm:^1.9.6"
+ "@scalar/object-utils": "npm:1.1.13"
+ "@scalar/openapi-types": "npm:0.1.9"
+ "@scalar/themes": "npm:0.9.71"
+ "@scalar/types": "npm:0.0.36"
+ flatted: "npm:^3.3.1"
+ microdiff: "npm:^1.4.0"
+ nanoid: "npm:^5.0.9"
+ yaml: "npm:^2.4.5"
+ zod: "npm:^3.23.8"
+ checksum: 10c0/8aa190f0a7b5633652e43967ae91df4788efe5f7f04f6276d2ec46e5431d8659a03606f55d632931dd79dee903d07317f764765348d9f36083ffdac774060ecb
+ languageName: node
+ linkType: hard
+
+"@scalar/object-utils@npm:1.1.13":
+ version: 1.1.13
+ resolution: "@scalar/object-utils@npm:1.1.13"
+ dependencies:
+ flatted: "npm:^3.3.1"
+ just-clone: "npm:^6.2.0"
+ ts-deepmerge: "npm:^7.0.1"
+ checksum: 10c0/cb8011f4efb48b5ca47b8435786cf1a0aadf5fb858f05b72d96278bad365623ae64856661e3f0086968cf54febed42df5b42267a840c713decf7f1469fe0dcc6
+ languageName: node
+ linkType: hard
+
+"@scalar/openapi-parser@npm:0.10.9":
+ version: 0.10.9
+ resolution: "@scalar/openapi-parser@npm:0.10.9"
+ dependencies:
+ ajv: "npm:^8.17.1"
+ ajv-draft-04: "npm:^1.0.0"
+ ajv-formats: "npm:^3.0.1"
+ jsonpointer: "npm:^5.0.1"
+ leven: "npm:^4.0.0"
+ yaml: "npm:^2.4.5"
+ checksum: 10c0/1df164dbdbce0c039434603b5e783b4e93da415e298dd25358dc0f821e739734a708e41801d607d16cd159bf22c44222d3c182ebb0a4aec194ac49e1fcf3b558
+ languageName: node
+ linkType: hard
+
+"@scalar/openapi-types@npm:0.1.9":
+ version: 0.1.9
+ resolution: "@scalar/openapi-types@npm:0.1.9"
+ checksum: 10c0/8c815fadd4a52b496b9851484c537417c04c6408fa5c84f72ad1284c49944ffa74f002a3caa8ab07b3a2fb6434d3c20331da00ffd3f1aa6fb8511658d0c9ae7d
+ languageName: node
+ linkType: hard
+
+"@scalar/postman-to-openapi@npm:0.1.33":
+ version: 0.1.33
+ resolution: "@scalar/postman-to-openapi@npm:0.1.33"
+ dependencies:
+ "@scalar/oas-utils": "npm:0.2.110"
+ "@scalar/openapi-types": "npm:0.1.9"
+ checksum: 10c0/b35b2c2ea71001b94c094ca92714a5ce8295560983aa5145c4a4a5e41ddab76dca22094bad0ee62e9230087acb8af36a7c10d528a347d8d3717ba1c5202f0315
+ languageName: node
+ linkType: hard
+
+"@scalar/snippetz@npm:0.2.15":
+ version: 0.2.15
+ resolution: "@scalar/snippetz@npm:0.2.15"
+ dependencies:
+ stringify-object: "npm:^5.0.0"
+ checksum: 10c0/a0c0d967476fba19cfd26972cf387631593a1f7e4e3f8ce5e8b90deb569860ff0e52036f56b512069548e00be9a9c578f08b50635f3432bea62e46864e6cb445
+ languageName: node
+ linkType: hard
+
+"@scalar/themes@npm:0.9.71":
+ version: 0.9.71
+ resolution: "@scalar/themes@npm:0.9.71"
+ dependencies:
+ "@scalar/types": "npm:0.0.36"
+ checksum: 10c0/ff0a59b409b41871fc4ee28d215c6cb2fad565001e5da03c1630aed5478bda912f2ca416d3f5b665a12f29c765df4ccbea0da55919a09af970db031fa4e5b9fd
+ languageName: node
+ linkType: hard
+
+"@scalar/types@npm:0.0.36":
+ version: 0.0.36
+ resolution: "@scalar/types@npm:0.0.36"
+ dependencies:
+ "@scalar/openapi-types": "npm:0.1.9"
+ "@unhead/schema": "npm:^1.11.11"
+ checksum: 10c0/bae8678d7f4fa0ff0de8e8135298218cbcd495e292eead835655ab43a2afde183416db87fca8bd9e22f7b5d030817d4576f47bc90c1c1cb6bc0fe212096646d8
+ languageName: node
+ linkType: hard
+
+"@scalar/use-codemirror@npm:0.11.73":
+ version: 0.11.73
+ resolution: "@scalar/use-codemirror@npm:0.11.73"
+ dependencies:
+ "@codemirror/autocomplete": "npm:^6.18.3"
+ "@codemirror/commands": "npm:^6.7.1"
+ "@codemirror/lang-css": "npm:^6.3.1"
+ "@codemirror/lang-html": "npm:^6.4.8"
+ "@codemirror/lang-json": "npm:^6.0.0"
+ "@codemirror/lang-xml": "npm:^6.0.0"
+ "@codemirror/lang-yaml": "npm:^6.1.2"
+ "@codemirror/language": "npm:^6.10.7"
+ "@codemirror/lint": "npm:^6.8.4"
+ "@codemirror/state": "npm:^6.5.0"
+ "@codemirror/view": "npm:^6.35.3"
+ "@lezer/common": "npm:^1.2.3"
+ "@lezer/highlight": "npm:^1.2.1"
+ "@lezer/lr": "npm:^1.4.2"
+ "@replit/codemirror-css-color-picker": "npm:^6.3.0"
+ "@scalar/components": "npm:0.13.28"
+ codemirror: "npm:^6.0.0"
+ style-mod: "npm:^4.1.2"
+ vue: "npm:^3.5.12"
+ checksum: 10c0/ce4653d9bf5df1cafe31a3009e0f59de74db0e66ac6f13379e71be78ef6813cf036da32b6ed753a407c6cb1732a8978cd37d7da9144b90cda8fadb3a8949ff68
+ languageName: node
+ linkType: hard
+
+"@scalar/use-hooks@npm:0.1.25":
+ version: 0.1.25
+ resolution: "@scalar/use-hooks@npm:0.1.25"
+ dependencies:
+ "@scalar/themes": "npm:0.9.71"
+ "@scalar/use-toasts": "npm:0.7.9"
+ "@vueuse/core": "npm:^10.10.0"
+ vue: "npm:^3.5.12"
+ zod: "npm:^3.23.8"
+ checksum: 10c0/2a81100937347239d2f728c1f705119c8eabaddd65f01bad20570114ed1089a7eb3090dc2cf0beb85ef4acaaf2122e47a46b8503484b24fdf5fdc159e99ac24a
+ languageName: node
+ linkType: hard
+
+"@scalar/use-toasts@npm:0.7.9":
+ version: 0.7.9
+ resolution: "@scalar/use-toasts@npm:0.7.9"
+ dependencies:
+ nanoid: "npm:^5.0.9"
+ vue: "npm:^3.5.12"
+ vue-sonner: "npm:^1.0.3"
+ checksum: 10c0/30dba022650a9dfeb84aa824b5a97df70142386fc3f8068092f627b54e533937f4774444025a06531703018866d8f7a77f61837f3a919d3c67743792f2104446
+ languageName: node
+ linkType: hard
+
+"@scalar/use-tooltip@npm:1.0.6":
+ version: 1.0.6
+ resolution: "@scalar/use-tooltip@npm:1.0.6"
+ dependencies:
+ tippy.js: "npm:^6.3.7"
+ vue: "npm:^3.5.12"
+ checksum: 10c0/2bfbd1aab3d088a56aa2b9ee51aff6dea9d8f94598d240d01c1c0db4d04cb993f85cd230529d1e643a02a0ae0715b84c7af068ea38399afd6f0a09aa61f3e060
+ languageName: node
+ linkType: hard
+
"@selderee/plugin-htmlparser2@npm:^0.11.0":
version: 0.11.0
resolution: "@selderee/plugin-htmlparser2@npm:0.11.0"
@@ -18534,6 +19128,13 @@ __metadata:
languageName: node
linkType: hard
+"@tanstack/virtual-core@npm:3.13.2":
+ version: 3.13.2
+ resolution: "@tanstack/virtual-core@npm:3.13.2"
+ checksum: 10c0/6527f4e2db071e03b6a0768b10405d072c2692551148314e36ea673878c78ea50f10849f173b32ec8b8d265bd624ab03cacb770c60719885e1ca02cdccf04927
+ languageName: node
+ linkType: hard
+
"@tanstack/virtual-core@npm:3.8.4":
version: 3.8.4
resolution: "@tanstack/virtual-core@npm:3.8.4"
@@ -18541,6 +19142,17 @@ __metadata:
languageName: node
linkType: hard
+"@tanstack/vue-virtual@npm:^3.0.0-beta.60, @tanstack/vue-virtual@npm:^3.8.1":
+ version: 3.13.2
+ resolution: "@tanstack/vue-virtual@npm:3.13.2"
+ dependencies:
+ "@tanstack/virtual-core": "npm:3.13.2"
+ peerDependencies:
+ vue: ^2.7.0 || ^3.0.0
+ checksum: 10c0/1aff324c097b9544f6d109629333262b7c2a5d39b7f5c06379dbe9969086d2b48f45d77461144579a8c377f4b54b53be05daa621f22d13adb95bd9be31473aee
+ languageName: node
+ linkType: hard
+
"@testing-library/dom@npm:^9.0.0, @testing-library/dom@npm:^9.3.1":
version: 9.3.4
resolution: "@testing-library/dom@npm:9.3.4"
@@ -20791,6 +21403,13 @@ __metadata:
languageName: node
linkType: hard
+"@types/web-bluetooth@npm:^0.0.20":
+ version: 0.0.20
+ resolution: "@types/web-bluetooth@npm:0.0.20"
+ checksum: 10c0/3a49bd9396506af8f1b047db087aeeea9fe4301b7fad4fe06ae0f6e00d331138caae878fd09e6410658b70b4aaf10e4b191c41c1a5ff72211fe58da290c7d003
+ languageName: node
+ linkType: hard
+
"@types/wrap-ansi@npm:^3.0.0":
version: 3.0.0
resolution: "@types/wrap-ansi@npm:3.0.0"
@@ -21265,6 +21884,50 @@ __metadata:
languageName: node
linkType: hard
+"@unhead/dom@npm:1.11.20":
+ version: 1.11.20
+ resolution: "@unhead/dom@npm:1.11.20"
+ dependencies:
+ "@unhead/schema": "npm:1.11.20"
+ "@unhead/shared": "npm:1.11.20"
+ checksum: 10c0/344a61a00418ddc6f06b33f313b589945df18e43af29ab8e19e1df97a102f55bfbc7e8e163f7e8f0a415c58c48ad9878d552b29fdf83080e05cdcf30724a17c6
+ languageName: node
+ linkType: hard
+
+"@unhead/schema@npm:1.11.20, @unhead/schema@npm:^1.11.11":
+ version: 1.11.20
+ resolution: "@unhead/schema@npm:1.11.20"
+ dependencies:
+ hookable: "npm:^5.5.3"
+ zhead: "npm:^2.2.4"
+ checksum: 10c0/f2f968639bbd18f90ddfb83b77c9256bc4c0379ab75efa24dc759f3f597aae707d4dde97df690823f8902eab31d73a5faa8bdd8daf18c6ac8e4503a78b42be74
+ languageName: node
+ linkType: hard
+
+"@unhead/shared@npm:1.11.20":
+ version: 1.11.20
+ resolution: "@unhead/shared@npm:1.11.20"
+ dependencies:
+ "@unhead/schema": "npm:1.11.20"
+ packrup: "npm:^0.1.2"
+ checksum: 10c0/65ab0230e6338541f7a62e131c6d82b1160c71c86479fdb17d733fb5187422f6e287739cf50a1e7556690fb10951990d06e861e7aa3a90def479cb7a5ec638fa
+ languageName: node
+ linkType: hard
+
+"@unhead/vue@npm:^1.11.11":
+ version: 1.11.20
+ resolution: "@unhead/vue@npm:1.11.20"
+ dependencies:
+ "@unhead/schema": "npm:1.11.20"
+ "@unhead/shared": "npm:1.11.20"
+ hookable: "npm:^5.5.3"
+ unhead: "npm:1.11.20"
+ peerDependencies:
+ vue: ">=2.7 || >=3"
+ checksum: 10c0/75f1cd8d671de363b02bc8ad2aaf6dc7fb0a402bdd306046ad71608d370190b539e74d6b03ab455d9c2453c5dd62956a235f92d74b09b98c336b68b2d3911602
+ languageName: node
+ linkType: hard
+
"@urql/core@npm:^5.0.0, @urql/core@npm:^5.0.4, @urql/core@npm:^5.1.0":
version: 5.1.0
resolution: "@urql/core@npm:5.1.0"
@@ -21496,6 +22159,29 @@ __metadata:
languageName: node
linkType: hard
+"@vue/compiler-core@npm:3.5.13":
+ version: 3.5.13
+ resolution: "@vue/compiler-core@npm:3.5.13"
+ dependencies:
+ "@babel/parser": "npm:^7.25.3"
+ "@vue/shared": "npm:3.5.13"
+ entities: "npm:^4.5.0"
+ estree-walker: "npm:^2.0.2"
+ source-map-js: "npm:^1.2.0"
+ checksum: 10c0/b89f3e3ca92c3177ae449ada1480df13d99b5b3b2cdcf3202fd37dc30f294a1db1f473209f8bae9233e2d338632219d39b2bfa6941d158cea55255e4b0b30f90
+ languageName: node
+ linkType: hard
+
+"@vue/compiler-dom@npm:3.5.13":
+ version: 3.5.13
+ resolution: "@vue/compiler-dom@npm:3.5.13"
+ dependencies:
+ "@vue/compiler-core": "npm:3.5.13"
+ "@vue/shared": "npm:3.5.13"
+ checksum: 10c0/8f424a71883c9ef4abdd125d2be8d12dd8cf94ba56089245c88734b1f87c65e10597816070ba2ea0a297a2f66dc579f39275a9a53ef5664c143a12409612cd72
+ languageName: node
+ linkType: hard
+
"@vue/compiler-dom@npm:^3.3.0":
version: 3.4.36
resolution: "@vue/compiler-dom@npm:3.4.36"
@@ -21506,6 +22192,40 @@ __metadata:
languageName: node
linkType: hard
+"@vue/compiler-sfc@npm:3.5.13":
+ version: 3.5.13
+ resolution: "@vue/compiler-sfc@npm:3.5.13"
+ dependencies:
+ "@babel/parser": "npm:^7.25.3"
+ "@vue/compiler-core": "npm:3.5.13"
+ "@vue/compiler-dom": "npm:3.5.13"
+ "@vue/compiler-ssr": "npm:3.5.13"
+ "@vue/shared": "npm:3.5.13"
+ estree-walker: "npm:^2.0.2"
+ magic-string: "npm:^0.30.11"
+ postcss: "npm:^8.4.48"
+ source-map-js: "npm:^1.2.0"
+ checksum: 10c0/5fd57895ce2801e480c08f31f91f0d1746ed08a9c1973895fd7269615f5bcdf75497978fb358bda738938d9844dea2404064c53b2cdda991014225297acce19e
+ languageName: node
+ linkType: hard
+
+"@vue/compiler-ssr@npm:3.5.13":
+ version: 3.5.13
+ resolution: "@vue/compiler-ssr@npm:3.5.13"
+ dependencies:
+ "@vue/compiler-dom": "npm:3.5.13"
+ "@vue/shared": "npm:3.5.13"
+ checksum: 10c0/67621337b12fc414fcf9f16578961850724713a9fb64501136e432c2dfe95de99932c46fa24be9820f8bcdf8e7281f815f585b519a95ea979753bafd637dde1b
+ languageName: node
+ linkType: hard
+
+"@vue/devtools-api@npm:^6.6.4":
+ version: 6.6.4
+ resolution: "@vue/devtools-api@npm:6.6.4"
+ checksum: 10c0/0a993ae23618166e1bee5a7c14cebd8312752b93c143cbdd48fb2d0f7ade070d0e6baf757cd920d4681fef8f9acf29515162160f38cc7410f9a684d2df21b6de
+ languageName: node
+ linkType: hard
+
"@vue/language-core@npm:1.8.27, @vue/language-core@npm:^1.8.27":
version: 1.8.27
resolution: "@vue/language-core@npm:1.8.27"
@@ -21528,6 +22248,49 @@ __metadata:
languageName: node
linkType: hard
+"@vue/reactivity@npm:3.5.13":
+ version: 3.5.13
+ resolution: "@vue/reactivity@npm:3.5.13"
+ dependencies:
+ "@vue/shared": "npm:3.5.13"
+ checksum: 10c0/4bf2754a4b8cc31afc8da5bdfd12bba6be67b2963a65f7c9e2b59810883c58128dfc58cce6d1e479c4f666190bc0794f17208d9efd3fc909a2e4843d2cc0e69e
+ languageName: node
+ linkType: hard
+
+"@vue/runtime-core@npm:3.5.13":
+ version: 3.5.13
+ resolution: "@vue/runtime-core@npm:3.5.13"
+ dependencies:
+ "@vue/reactivity": "npm:3.5.13"
+ "@vue/shared": "npm:3.5.13"
+ checksum: 10c0/b6be854bf082a224222614a334fbeac0e7b6445f3cf4ea45cbd49ae4bb1551200c461c14c7a452d748f2459f7402ad4dee5522d51be5a28ea4ae1f699a7c016f
+ languageName: node
+ linkType: hard
+
+"@vue/runtime-dom@npm:3.5.13":
+ version: 3.5.13
+ resolution: "@vue/runtime-dom@npm:3.5.13"
+ dependencies:
+ "@vue/reactivity": "npm:3.5.13"
+ "@vue/runtime-core": "npm:3.5.13"
+ "@vue/shared": "npm:3.5.13"
+ csstype: "npm:^3.1.3"
+ checksum: 10c0/8ee7f3980d19f77f8e7ae854e3ff1f7ee9a9b8b4e214c8d0492e1180ae818e33c04803b3d094503524d557431a30728b78cf15c3683d8abbbbd1b263a299d62a
+ languageName: node
+ linkType: hard
+
+"@vue/server-renderer@npm:3.5.13":
+ version: 3.5.13
+ resolution: "@vue/server-renderer@npm:3.5.13"
+ dependencies:
+ "@vue/compiler-ssr": "npm:3.5.13"
+ "@vue/shared": "npm:3.5.13"
+ peerDependencies:
+ vue: 3.5.13
+ checksum: 10c0/f500bdabc199abf41f1d84defd2a365a47afce1f2223a34c32fada84f6193b39ec2ce50636483409eec81b788b8ef0fa1ff59c63ca0c74764d738c24409eef8f
+ languageName: node
+ linkType: hard
+
"@vue/shared@npm:3.4.36, @vue/shared@npm:^3.3.0":
version: 3.4.36
resolution: "@vue/shared@npm:3.4.36"
@@ -21535,6 +22298,118 @@ __metadata:
languageName: node
linkType: hard
+"@vue/shared@npm:3.5.13":
+ version: 3.5.13
+ resolution: "@vue/shared@npm:3.5.13"
+ checksum: 10c0/2c940ef907116f1c2583ca1d7733984e5705983ab07054c4e72f1d95eb0f7bdf4d01efbdaee1776c2008f79595963f44e98fced057f5957d86d57b70028f5025
+ languageName: node
+ linkType: hard
+
+"@vueuse/core@npm:11.3.0":
+ version: 11.3.0
+ resolution: "@vueuse/core@npm:11.3.0"
+ dependencies:
+ "@types/web-bluetooth": "npm:^0.0.20"
+ "@vueuse/metadata": "npm:11.3.0"
+ "@vueuse/shared": "npm:11.3.0"
+ vue-demi: "npm:>=0.14.10"
+ checksum: 10c0/57ebed3ee2fd5b33297bbb36727424dc1707357db52954a1715366dd6583a4d53a05b10d17d16d1e5bf91fe8f12ea69fd6b232551f60167098ebc606b7234d4a
+ languageName: node
+ linkType: hard
+
+"@vueuse/core@npm:^10.10.0, @vueuse/core@npm:^10.11.0":
+ version: 10.11.1
+ resolution: "@vueuse/core@npm:10.11.1"
+ dependencies:
+ "@types/web-bluetooth": "npm:^0.0.20"
+ "@vueuse/metadata": "npm:10.11.1"
+ "@vueuse/shared": "npm:10.11.1"
+ vue-demi: "npm:>=0.14.8"
+ checksum: 10c0/6a974c1510ce84e652e3d180a4f4373e37e59a5ec025a7a8cec7f144a4ccff25dbdd82e3143ffb057323f467a1076b39da30953981e822c4bd41a7841121afee
+ languageName: node
+ linkType: hard
+
+"@vueuse/integrations@npm:^11.2.0":
+ version: 11.3.0
+ resolution: "@vueuse/integrations@npm:11.3.0"
+ dependencies:
+ "@vueuse/core": "npm:11.3.0"
+ "@vueuse/shared": "npm:11.3.0"
+ vue-demi: "npm:>=0.14.10"
+ peerDependencies:
+ async-validator: ^4
+ axios: ^1
+ change-case: ^5
+ drauu: ^0.4
+ focus-trap: ^7
+ fuse.js: ^7
+ idb-keyval: ^6
+ jwt-decode: ^4
+ nprogress: ^0.2
+ qrcode: ^1.5
+ sortablejs: ^1
+ universal-cookie: ^7
+ peerDependenciesMeta:
+ async-validator:
+ optional: true
+ axios:
+ optional: true
+ change-case:
+ optional: true
+ drauu:
+ optional: true
+ focus-trap:
+ optional: true
+ fuse.js:
+ optional: true
+ idb-keyval:
+ optional: true
+ jwt-decode:
+ optional: true
+ nprogress:
+ optional: true
+ qrcode:
+ optional: true
+ sortablejs:
+ optional: true
+ universal-cookie:
+ optional: true
+ checksum: 10c0/4808c9b64286065e597896073113d0bb67b80fa17d2631823b756ae2fe78be25708bbe3bac39de08b24ee3459e080e0ba46c57429e6eb164b9796c567f93e8c8
+ languageName: node
+ linkType: hard
+
+"@vueuse/metadata@npm:10.11.1":
+ version: 10.11.1
+ resolution: "@vueuse/metadata@npm:10.11.1"
+ checksum: 10c0/c252056aa7e7bd5d207791a2e3b415dcb81fef5b24bfe18cefdec026ae9b7e5a5813100d2e55262fc66feafe15ccdc11a69351d724d848fafe4b3b052e559283
+ languageName: node
+ linkType: hard
+
+"@vueuse/metadata@npm:11.3.0":
+ version: 11.3.0
+ resolution: "@vueuse/metadata@npm:11.3.0"
+ checksum: 10c0/4548912f325d4f250595b029357977824431db66a94651bc6801c04e4992374286ff71eb41604470638ef100338c2b80df2039d663a20f66d92799f68ccba7e9
+ languageName: node
+ linkType: hard
+
+"@vueuse/shared@npm:10.11.1, @vueuse/shared@npm:^10.11.0":
+ version: 10.11.1
+ resolution: "@vueuse/shared@npm:10.11.1"
+ dependencies:
+ vue-demi: "npm:>=0.14.8"
+ checksum: 10c0/22c4f04be8fdb5e95535cf20f13956fc1f3707540f3730282905e6f9b24f314ada28292e82f4401d88b2c1fcf7fc7203011260958f517abc2b756779243147e3
+ languageName: node
+ linkType: hard
+
+"@vueuse/shared@npm:11.3.0":
+ version: 11.3.0
+ resolution: "@vueuse/shared@npm:11.3.0"
+ dependencies:
+ vue-demi: "npm:>=0.14.10"
+ checksum: 10c0/820af5359d204e434b27ef570e5dfb5fe765e19d540738665c51c8d1569b81dd000dbe292add15dffb1b9538cbcec890626d0b47a5525e624273a0963b524e1f
+ languageName: node
+ linkType: hard
+
"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.11.5":
version: 1.12.1
resolution: "@webassemblyjs/ast@npm:1.12.1"
@@ -22230,6 +23105,18 @@ __metadata:
languageName: node
linkType: hard
+"ajv-draft-04@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "ajv-draft-04@npm:1.0.0"
+ peerDependencies:
+ ajv: ^8.5.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+ checksum: 10c0/6044310bd38c17d77549fd326bd40ce1506fa10b0794540aa130180808bf94117fac8c9b448c621512bea60e4a947278f6a978e87f10d342950c15b33ddd9271
+ languageName: node
+ linkType: hard
+
"ajv-formats@npm:2.1.1":
version: 2.1.1
resolution: "ajv-formats@npm:2.1.1"
@@ -22244,6 +23131,20 @@ __metadata:
languageName: node
linkType: hard
+"ajv-formats@npm:^3.0.1":
+ version: 3.0.1
+ resolution: "ajv-formats@npm:3.0.1"
+ dependencies:
+ ajv: "npm:^8.0.0"
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+ checksum: 10c0/168d6bca1ea9f163b41c8147bae537e67bd963357a5488a1eaf3abe8baa8eec806d4e45f15b10767e6020679315c7e1e5e6803088dfb84efa2b4e9353b83dd0a
+ languageName: node
+ linkType: hard
+
"ajv-keywords@npm:^3.5.2":
version: 3.5.2
resolution: "ajv-keywords@npm:3.5.2"
@@ -22289,7 +23190,7 @@ __metadata:
languageName: node
linkType: hard
-"ajv@npm:^8.0.0":
+"ajv@npm:^8.0.0, ajv@npm:^8.17.1":
version: 8.17.1
resolution: "ajv@npm:8.17.1"
dependencies:
@@ -22798,7 +23699,7 @@ __metadata:
languageName: node
linkType: hard
-"aria-hidden@npm:^1.1.1, aria-hidden@npm:^1.2.3":
+"aria-hidden@npm:^1.1.1, aria-hidden@npm:^1.2.3, aria-hidden@npm:^1.2.4":
version: 1.2.4
resolution: "aria-hidden@npm:1.2.4"
dependencies:
@@ -26216,6 +27117,21 @@ __metadata:
languageName: node
linkType: hard
+"codemirror@npm:^6.0.0":
+ version: 6.0.1
+ resolution: "codemirror@npm:6.0.1"
+ dependencies:
+ "@codemirror/autocomplete": "npm:^6.0.0"
+ "@codemirror/commands": "npm:^6.0.0"
+ "@codemirror/language": "npm:^6.0.0"
+ "@codemirror/lint": "npm:^6.0.0"
+ "@codemirror/search": "npm:^6.0.0"
+ "@codemirror/state": "npm:^6.0.0"
+ "@codemirror/view": "npm:^6.0.0"
+ checksum: 10c0/219b0f6ee91d373380fba2e0564a2665990a3cdada0b01861768005b09061187c58eeb3db96aef486777b02b77b50a50ee843635e3743c47d3725034913c4b60
+ languageName: node
+ linkType: hard
+
"collect-v8-coverage@npm:^1.0.0":
version: 1.0.2
resolution: "collect-v8-coverage@npm:1.0.2"
@@ -26720,7 +27636,7 @@ __metadata:
languageName: node
linkType: hard
-"content-type@npm:~1.0.4, content-type@npm:~1.0.5":
+"content-type@npm:^1.0.4, content-type@npm:~1.0.4, content-type@npm:~1.0.5":
version: 1.0.5
resolution: "content-type@npm:1.0.5"
checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af
@@ -27357,13 +28273,27 @@ __metadata:
languageName: node
linkType: hard
-"csstype@npm:3.1.3, csstype@npm:^3.0.2, csstype@npm:^3.1.2":
+"csstype@npm:3.1.3, csstype@npm:^3.0.2, csstype@npm:^3.1.2, csstype@npm:^3.1.3":
version: 3.1.3
resolution: "csstype@npm:3.1.3"
checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248
languageName: node
linkType: hard
+"cva@npm:1.0.0-beta.2":
+ version: 1.0.0-beta.2
+ resolution: "cva@npm:1.0.0-beta.2"
+ dependencies:
+ clsx: "npm:^2.1.1"
+ peerDependencies:
+ typescript: ">= 4.5.5 < 6"
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ checksum: 10c0/2ffa4d327c25df2810704a8b76c2e4fb010ff33632c2e4f022b8a85039c08207ced9217b0e50d88e0282a39f4e1d15c9a3d1731dee0095f5b3bb707319a3799c
+ languageName: node
+ linkType: hard
+
"cwd@npm:^0.10.0":
version: 0.10.0
resolution: "cwd@npm:0.10.0"
@@ -31245,6 +32175,13 @@ __metadata:
languageName: node
linkType: hard
+"flatted@npm:^3.3.1":
+ version: 3.3.3
+ resolution: "flatted@npm:3.3.3"
+ checksum: 10c0/e957a1c6b0254aa15b8cce8533e24165abd98fadc98575db082b786b5da1b7d72062b81bfdcd1da2f4d46b6ed93bec2434e62333e9b4261d79ef2e75a10dd538
+ languageName: node
+ linkType: hard
+
"flow-parser@npm:0.*":
version: 0.243.0
resolution: "flow-parser@npm:0.243.0"
@@ -31259,6 +32196,15 @@ __metadata:
languageName: node
linkType: hard
+"focus-trap@npm:^7":
+ version: 7.6.4
+ resolution: "focus-trap@npm:7.6.4"
+ dependencies:
+ tabbable: "npm:^6.2.0"
+ checksum: 10c0/ed810d47fd904a5e0269e822d98e634c6cbdd7222046c712ef299bdd26a422db754e3cec04e6517065b12be4b47f65c21f6244e0c07a308b1060985463d518cb
+ languageName: node
+ linkType: hard
+
"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.6":
version: 1.15.6
resolution: "follow-redirects@npm:1.15.6"
@@ -31697,6 +32643,13 @@ __metadata:
languageName: node
linkType: hard
+"fuse.js@npm:^7.0.0":
+ version: 7.1.0
+ resolution: "fuse.js@npm:7.1.0"
+ checksum: 10c0/c0d1b1d192a4bdf3eade897453ddd28aff96b70bf3e49161a45880f9845ebaee97265595db633776700a5bcf8942223c752754a848d70c508c3c9fd997faad1e
+ languageName: node
+ linkType: hard
+
"gauge@npm:^3.0.0":
version: 3.0.2
resolution: "gauge@npm:3.0.2"
@@ -31830,6 +32783,13 @@ __metadata:
languageName: node
linkType: hard
+"get-own-enumerable-keys@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "get-own-enumerable-keys@npm:1.0.0"
+ checksum: 10c0/3e14fbcf7cbb27a09f4335b3fe28ec4ac73254cd5007c141ff8e248c854fb1f4b44271fcc707c9aec1de7ae889eb28ffbd5b8a82f6abd9adb91df926fb7cec44
+ languageName: node
+ linkType: hard
+
"get-own-enumerable-property-symbols@npm:^3.0.0":
version: 3.0.2
resolution: "get-own-enumerable-property-symbols@npm:3.0.2"
@@ -32885,6 +33845,20 @@ __metadata:
languageName: node
linkType: hard
+"hast-util-from-html@npm:^2.0.0":
+ version: 2.0.3
+ resolution: "hast-util-from-html@npm:2.0.3"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ devlop: "npm:^1.1.0"
+ hast-util-from-parse5: "npm:^8.0.0"
+ parse5: "npm:^7.0.0"
+ vfile: "npm:^6.0.0"
+ vfile-message: "npm:^4.0.0"
+ checksum: 10c0/993ef707c1a12474c8d4094fc9706a72826c660a7e308ea54c50ad893353d32e139b7cbc67510c2e82feac572b320e3b05aeb13d0f9c6302d61261f337b46764
+ languageName: node
+ linkType: hard
+
"hast-util-from-parse5@npm:^7.0.0":
version: 7.1.2
resolution: "hast-util-from-parse5@npm:7.1.2"
@@ -32900,6 +33874,22 @@ __metadata:
languageName: node
linkType: hard
+"hast-util-from-parse5@npm:^8.0.0":
+ version: 8.0.3
+ resolution: "hast-util-from-parse5@npm:8.0.3"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/unist": "npm:^3.0.0"
+ devlop: "npm:^1.0.0"
+ hastscript: "npm:^9.0.0"
+ property-information: "npm:^7.0.0"
+ vfile: "npm:^6.0.0"
+ vfile-location: "npm:^5.0.0"
+ web-namespaces: "npm:^2.0.0"
+ checksum: 10c0/40ace6c0ad43c26f721c7499fe408e639cde917b2350c9299635e6326559855896dae3c3ebf7440df54766b96c4276a7823e8f376a2b6a28b37b591f03412545
+ languageName: node
+ linkType: hard
+
"hast-util-has-property@npm:^2.0.0":
version: 2.0.1
resolution: "hast-util-has-property@npm:2.0.1"
@@ -32973,6 +33963,15 @@ __metadata:
languageName: node
linkType: hard
+"hast-util-parse-selector@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "hast-util-parse-selector@npm:4.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ checksum: 10c0/5e98168cb44470dc274aabf1a28317e4feb09b1eaf7a48bbaa8c1de1b43a89cd195cb1284e535698e658e3ec26ad91bc5e52c9563c36feb75abbc68aaf68fb9f
+ languageName: node
+ linkType: hard
+
"hast-util-phrasing@npm:^2.0.0":
version: 2.0.2
resolution: "hast-util-phrasing@npm:2.0.2"
@@ -33038,6 +34037,27 @@ __metadata:
languageName: node
linkType: hard
+"hast-util-raw@npm:^9.0.0":
+ version: 9.1.0
+ resolution: "hast-util-raw@npm:9.1.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/unist": "npm:^3.0.0"
+ "@ungap/structured-clone": "npm:^1.0.0"
+ hast-util-from-parse5: "npm:^8.0.0"
+ hast-util-to-parse5: "npm:^8.0.0"
+ html-void-elements: "npm:^3.0.0"
+ mdast-util-to-hast: "npm:^13.0.0"
+ parse5: "npm:^7.0.0"
+ unist-util-position: "npm:^5.0.0"
+ unist-util-visit: "npm:^5.0.0"
+ vfile: "npm:^6.0.0"
+ web-namespaces: "npm:^2.0.0"
+ zwitch: "npm:^2.0.0"
+ checksum: 10c0/d0d909d2aedecef6a06f0005cfae410d6475e6e182d768bde30c3af9fcbbe4f9beb0522bdc21d0679cb3c243c0df40385797ed255148d68b3d3f12e82d12aacc
+ languageName: node
+ linkType: hard
+
"hast-util-sanitize@npm:^4.0.0":
version: 4.1.0
resolution: "hast-util-sanitize@npm:4.1.0"
@@ -33047,6 +34067,17 @@ __metadata:
languageName: node
linkType: hard
+"hast-util-sanitize@npm:^5.0.0":
+ version: 5.0.2
+ resolution: "hast-util-sanitize@npm:5.0.2"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@ungap/structured-clone": "npm:^1.0.0"
+ unist-util-position: "npm:^5.0.0"
+ checksum: 10c0/20951652078a8c21341c1c9a84f90015b2ba01cc41fa16772f122c65cda26a7adb0501fdeba5c8e37e40e2632447e8fe455d0dd2dc27d39663baacca76f2ecb6
+ languageName: node
+ linkType: hard
+
"hast-util-to-estree@npm:^2.0.0":
version: 2.3.3
resolution: "hast-util-to-estree@npm:2.3.3"
@@ -33089,6 +34120,25 @@ __metadata:
languageName: node
linkType: hard
+"hast-util-to-html@npm:^9.0.0":
+ version: 9.0.5
+ resolution: "hast-util-to-html@npm:9.0.5"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/unist": "npm:^3.0.0"
+ ccount: "npm:^2.0.0"
+ comma-separated-tokens: "npm:^2.0.0"
+ hast-util-whitespace: "npm:^3.0.0"
+ html-void-elements: "npm:^3.0.0"
+ mdast-util-to-hast: "npm:^13.0.0"
+ property-information: "npm:^7.0.0"
+ space-separated-tokens: "npm:^2.0.0"
+ stringify-entities: "npm:^4.0.0"
+ zwitch: "npm:^2.0.4"
+ checksum: 10c0/b7a08c30bab4371fc9b4a620965c40b270e5ae7a8e94cf885f43b21705179e28c8e43b39c72885d1647965fb3738654e6962eb8b58b0c2a84271655b4d748836
+ languageName: node
+ linkType: hard
+
"hast-util-to-html@npm:^9.0.4":
version: 9.0.4
resolution: "hast-util-to-html@npm:9.0.4"
@@ -33145,6 +34195,21 @@ __metadata:
languageName: node
linkType: hard
+"hast-util-to-parse5@npm:^8.0.0":
+ version: 8.0.0
+ resolution: "hast-util-to-parse5@npm:8.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ comma-separated-tokens: "npm:^2.0.0"
+ devlop: "npm:^1.0.0"
+ property-information: "npm:^6.0.0"
+ space-separated-tokens: "npm:^2.0.0"
+ web-namespaces: "npm:^2.0.0"
+ zwitch: "npm:^2.0.0"
+ checksum: 10c0/3c0c7fba026e0c4be4675daf7277f9ff22ae6da801435f1b7104f7740de5422576f1c025023c7b3df1d0a161e13a04c6ab8f98ada96eb50adb287b537849a2bd
+ languageName: node
+ linkType: hard
+
"hast-util-to-string@npm:^3.0.0":
version: 3.0.0
resolution: "hast-util-to-string@npm:3.0.0"
@@ -33166,6 +34231,18 @@ __metadata:
languageName: node
linkType: hard
+"hast-util-to-text@npm:^4.0.2":
+ version: 4.0.2
+ resolution: "hast-util-to-text@npm:4.0.2"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/unist": "npm:^3.0.0"
+ hast-util-is-element: "npm:^3.0.0"
+ unist-util-find-after: "npm:^5.0.0"
+ checksum: 10c0/93ecc10e68fe5391c6e634140eb330942e71dea2724c8e0c647c73ed74a8ec930a4b77043b5081284808c96f73f2bee64ee416038ece75a63a467e8d14f09946
+ languageName: node
+ linkType: hard
+
"hast-util-whitespace@npm:^2.0.0":
version: 2.0.1
resolution: "hast-util-whitespace@npm:2.0.1"
@@ -33195,6 +34272,19 @@ __metadata:
languageName: node
linkType: hard
+"hastscript@npm:^9.0.0":
+ version: 9.0.1
+ resolution: "hastscript@npm:9.0.1"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ comma-separated-tokens: "npm:^2.0.0"
+ hast-util-parse-selector: "npm:^4.0.0"
+ property-information: "npm:^7.0.0"
+ space-separated-tokens: "npm:^2.0.0"
+ checksum: 10c0/18dc8064e5c3a7a2ae862978e626b97a254e1c8a67ee9d0c9f06d373bba155ed805fc5b5ce21b990fb7bc174624889e5e1ce1cade264f1b1d58b48f994bc85ce
+ languageName: node
+ linkType: hard
+
"he@npm:^1.2.0":
version: 1.2.0
resolution: "he@npm:1.2.0"
@@ -33256,6 +34346,27 @@ __metadata:
languageName: node
linkType: hard
+"highlight.js@npm:^11.9.0, highlight.js@npm:~11.11.0":
+ version: 11.11.1
+ resolution: "highlight.js@npm:11.11.1"
+ checksum: 10c0/40f53ac19dac079891fcefd5bd8a21cf2e8931fd47da5bd1dca73b7e4375c1defed0636fc39120c639b9c44119b7d110f7f0c15aa899557a5a1c8910f3c0144c
+ languageName: node
+ linkType: hard
+
+"highlightjs-curl@npm:^1.3.0":
+ version: 1.3.0
+ resolution: "highlightjs-curl@npm:1.3.0"
+ checksum: 10c0/5085a9ed4bad68b31ab93aa8b738c97f107e95d5f887a4a511b3fd43fe78564d4b1f89a5b338882ec4fb76c79ec679ed3a6e5a992bf10a1a27488dcdae5be1ac
+ languageName: node
+ linkType: hard
+
+"highlightjs-vue@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "highlightjs-vue@npm:1.0.0"
+ checksum: 10c0/9be378c70b864ca5eee87b07859222e31c946a8ad176227e54f7006a498223974ebe19fcce6e38ad5eb3c1ed0e16a580c4edefdf2cb882b6dfab1c3866cc047a
+ languageName: node
+ linkType: hard
+
"history@npm:^4.9.0":
version: 4.10.1
resolution: "history@npm:4.10.1"
@@ -33316,6 +34427,13 @@ __metadata:
languageName: node
linkType: hard
+"hookable@npm:^5.5.3":
+ version: 5.5.3
+ resolution: "hookable@npm:5.5.3"
+ checksum: 10c0/275f4cc84d27f8d48c5a5cd5685b6c0fea9291be9deea5bff0cfa72856ed566abde1dcd8cb1da0f9a70b4da3d7ec0d60dc3554c4edbba647058cc38816eced3d
+ languageName: node
+ linkType: hard
+
"hosted-git-info@npm:^2.1.4":
version: 2.8.9
resolution: "hosted-git-info@npm:2.8.9"
@@ -34253,6 +35371,13 @@ __metadata:
languageName: node
linkType: hard
+"is-absolute-url@npm:^4.0.0":
+ version: 4.0.1
+ resolution: "is-absolute-url@npm:4.0.1"
+ checksum: 10c0/6f8f603945bd9f2c6031758bbc12352fc647bd5d807cad10d96cc6300fd0e15240cc091521a61db767e4ec0bacff257b4f1015fd5249c147bbb4a4497356c72e
+ languageName: node
+ linkType: hard
+
"is-absolute@npm:^1.0.0":
version: 1.0.0
resolution: "is-absolute@npm:1.0.0"
@@ -34698,6 +35823,13 @@ __metadata:
languageName: node
linkType: hard
+"is-obj@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "is-obj@npm:3.0.0"
+ checksum: 10c0/48d678fa15c56fd38353634ae2106a538827af9050211b18df13540dba0b38aa25c5cb498648a01311bf493a99ac3ce416576649b8cace10bcce7344611fa56a
+ languageName: node
+ linkType: hard
+
"is-path-cwd@npm:^2.2.0":
version: 2.2.0
resolution: "is-path-cwd@npm:2.2.0"
@@ -34796,6 +35928,13 @@ __metadata:
languageName: node
linkType: hard
+"is-regexp@npm:^3.1.0":
+ version: 3.1.0
+ resolution: "is-regexp@npm:3.1.0"
+ checksum: 10c0/99dbaea41bddee2205db468c0946f5fee25cc4ae486333cb4d2b8095ab4b0a500e74ba61afd9e6e4f63ececcd55b4df5ae2a555b1c3e26308e516ff53c9533cd
+ languageName: node
+ linkType: hard
+
"is-relative@npm:^1.0.0":
version: 1.0.0
resolution: "is-relative@npm:1.0.0"
@@ -36474,6 +37613,13 @@ __metadata:
languageName: node
linkType: hard
+"json-stringify-deterministic@npm:^1.0.12":
+ version: 1.0.12
+ resolution: "json-stringify-deterministic@npm:1.0.12"
+ checksum: 10c0/ed7a4b887e5f73195a16bf165f2b74b22968824235e55fe8680319f1ceabc82d7ab303f0a4756a5cbdba65a305c32827e5463cc47426ef2ecb819cdaedec7e41
+ languageName: node
+ linkType: hard
+
"json-stringify-nice@npm:^1.1.4":
version: 1.1.4
resolution: "json-stringify-nice@npm:1.1.4"
@@ -36681,6 +37827,20 @@ __metadata:
languageName: node
linkType: hard
+"just-clone@npm:^6.2.0":
+ version: 6.2.0
+ resolution: "just-clone@npm:6.2.0"
+ checksum: 10c0/5e412b2739dae9dd9dc6cbdb77d03adaad9f8180250b3c04efdbbb0aacb9e7d389699d112606f961256db6af1ec31060f272cb9df6e16075b22bad5eef5e1977
+ languageName: node
+ linkType: hard
+
+"just-curry-it@npm:^5.3.0":
+ version: 5.3.0
+ resolution: "just-curry-it@npm:5.3.0"
+ checksum: 10c0/4068add661ce2eb0242f6c89bda792029dd767967751703db874eb21c48dcfd6b592516765941897112979c9e79536f2070a00fbe05c3666a0c4f956cdf7e2e8
+ languageName: node
+ linkType: hard
+
"just-diff-apply@npm:^3.0.0":
version: 3.1.2
resolution: "just-diff-apply@npm:3.1.2"
@@ -37130,6 +38290,13 @@ __metadata:
languageName: node
linkType: hard
+"leven@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "leven@npm:4.0.0"
+ checksum: 10c0/393bd949d93103d9ef487be96321bdb02c2e7695e372193f650642e1ad653c61b03da16bf55e45d442db59c7b6407eb947a7748b5777e48ddf0ada25f8b2a815
+ languageName: node
+ linkType: hard
+
"levn@npm:^0.4.1":
version: 0.4.1
resolution: "levn@npm:0.4.1"
@@ -37160,7 +38327,7 @@ __metadata:
languageName: node
linkType: hard
-"lib0@npm:^0.2.88, lib0@npm:^0.2.99":
+"lib0@npm:^0.2.88":
version: 0.2.99
resolution: "lib0@npm:0.2.99"
dependencies:
@@ -37767,6 +38934,17 @@ __metadata:
languageName: node
linkType: hard
+"lowlight@npm:^3.1.0":
+ version: 3.3.0
+ resolution: "lowlight@npm:3.3.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ devlop: "npm:^1.0.0"
+ highlight.js: "npm:~11.11.0"
+ checksum: 10c0/9b796fa8443b0334ebf18bc57387c9ee31432d8c263cf2089d23e1087c653d708447284e0647bf993cb2cdc810e0b268a28f51ea27b4a624893b97bdd3f025f4
+ languageName: node
+ linkType: hard
+
"lru-cache@npm:7.10.1 - 7.13.1":
version: 7.13.1
resolution: "lru-cache@npm:7.13.1"
@@ -37925,6 +39103,15 @@ __metadata:
languageName: node
linkType: hard
+"magic-string@npm:^0.30.11":
+ version: 0.30.17
+ resolution: "magic-string@npm:0.30.17"
+ dependencies:
+ "@jridgewell/sourcemap-codec": "npm:^1.5.0"
+ checksum: 10c0/16826e415d04b88378f200fe022b53e638e3838b9e496edda6c0e086d7753a44a6ed187adc72d19f3623810589bf139af1a315541cd6a26ae0771a0193eaf7b8
+ languageName: node
+ linkType: hard
+
"make-cancellable-promise@npm:^1.3.1":
version: 1.3.2
resolution: "make-cancellable-promise@npm:1.3.2"
@@ -38375,6 +39562,19 @@ __metadata:
languageName: node
linkType: hard
+"mdast-util-gfm-footnote@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "mdast-util-gfm-footnote@npm:2.1.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ devlop: "npm:^1.1.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ micromark-util-normalize-identifier: "npm:^2.0.0"
+ checksum: 10c0/8ab965ee6be3670d76ec0e95b2ba3101fc7444eec47564943ab483d96ac17d29da2a4e6146a2a288be30c21b48c4f3938a1e54b9a46fbdd321d49a5bc0077ed0
+ languageName: node
+ linkType: hard
+
"mdast-util-gfm-strikethrough@npm:^0.2.0":
version: 0.2.3
resolution: "mdast-util-gfm-strikethrough@npm:0.2.3"
@@ -38459,6 +39659,18 @@ __metadata:
languageName: node
linkType: hard
+"mdast-util-gfm-task-list-item@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "mdast-util-gfm-task-list-item@npm:2.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ devlop: "npm:^1.0.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ checksum: 10c0/258d725288482b636c0a376c296431390c14b4f29588675297cb6580a8598ed311fc73ebc312acfca12cc8546f07a3a285a53a3b082712e2cbf5c190d677d834
+ languageName: node
+ linkType: hard
+
"mdast-util-gfm@npm:^0.1.0":
version: 0.1.2
resolution: "mdast-util-gfm@npm:0.1.2"
@@ -38487,6 +39699,21 @@ __metadata:
languageName: node
linkType: hard
+"mdast-util-gfm@npm:^3.0.0":
+ version: 3.1.0
+ resolution: "mdast-util-gfm@npm:3.1.0"
+ dependencies:
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-gfm-autolink-literal: "npm:^2.0.0"
+ mdast-util-gfm-footnote: "npm:^2.0.0"
+ mdast-util-gfm-strikethrough: "npm:^2.0.0"
+ mdast-util-gfm-table: "npm:^2.0.0"
+ mdast-util-gfm-task-list-item: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ checksum: 10c0/4bedcfb6a20e39901c8772f0d2bb2d7a64ae87a54c13cbd92eec062cf470fbb68c2ad754e149af5b30794e2de61c978ab1de1ace03c0c40f443ca9b9b8044f81
+ languageName: node
+ linkType: hard
+
"mdast-util-mdx-expression@npm:^1.0.0":
version: 1.3.2
resolution: "mdast-util-mdx-expression@npm:1.3.2"
@@ -38965,6 +40192,13 @@ __metadata:
languageName: node
linkType: hard
+"microdiff@npm:^1.4.0":
+ version: 1.5.0
+ resolution: "microdiff@npm:1.5.0"
+ checksum: 10c0/5f55ca049451d63abf79fd1692808e1052180fbedfc91d9fcab9f02df0dd902aa6a4e30199fd345d1f91982842b12d85ffa86785e38d7dbfb6d59280074f9129
+ languageName: node
+ linkType: hard
+
"micromark-core-commonmark@npm:^1.0.0, micromark-core-commonmark@npm:^1.0.1":
version: 1.1.0
resolution: "micromark-core-commonmark@npm:1.1.0"
@@ -38990,8 +40224,8 @@ __metadata:
linkType: hard
"micromark-core-commonmark@npm:^2.0.0":
- version: 2.0.2
- resolution: "micromark-core-commonmark@npm:2.0.2"
+ version: 2.0.3
+ resolution: "micromark-core-commonmark@npm:2.0.3"
dependencies:
decode-named-character-reference: "npm:^1.0.0"
devlop: "npm:^1.0.0"
@@ -39009,7 +40243,7 @@ __metadata:
micromark-util-subtokenize: "npm:^2.0.0"
micromark-util-symbol: "npm:^2.0.0"
micromark-util-types: "npm:^2.0.0"
- checksum: 10c0/87c7a75cd339189eb6f1d6323037f7d108d1331d953b84fe839b37fd385ee2292b27222327c1ceffda46ba5d5d4dee703482475e5ee8744be40c9e308d8acb77
+ checksum: 10c0/bd4a794fdc9e88dbdf59eaf1c507ddf26e5f7ddf4e52566c72239c0f1b66adbcd219ba2cd42350debbe24471434d5f5e50099d2b3f4e5762ca222ba8e5b549ee
languageName: node
linkType: hard
@@ -39071,6 +40305,22 @@ __metadata:
languageName: node
linkType: hard
+"micromark-extension-gfm-footnote@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "micromark-extension-gfm-footnote@npm:2.1.0"
+ dependencies:
+ devlop: "npm:^1.0.0"
+ micromark-core-commonmark: "npm:^2.0.0"
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-normalize-identifier: "npm:^2.0.0"
+ micromark-util-sanitize-uri: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/d172e4218968b7371b9321af5cde8c77423f73b233b2b0fcf3ff6fd6f61d2e0d52c49123a9b7910612478bf1f0d5e88c75a3990dd68f70f3933fe812b9f77edc
+ languageName: node
+ linkType: hard
+
"micromark-extension-gfm-strikethrough@npm:^1.0.0":
version: 1.0.7
resolution: "micromark-extension-gfm-strikethrough@npm:1.0.7"
@@ -39152,6 +40402,15 @@ __metadata:
languageName: node
linkType: hard
+"micromark-extension-gfm-tagfilter@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0"
+ dependencies:
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/995558843fff137ae4e46aecb878d8a4691cdf23527dcf1e2f0157d66786be9f7bea0109c52a8ef70e68e3f930af811828ba912239438e31a9cfb9981f44d34d
+ languageName: node
+ linkType: hard
+
"micromark-extension-gfm-tagfilter@npm:~0.3.0":
version: 0.3.0
resolution: "micromark-extension-gfm-tagfilter@npm:0.3.0"
@@ -39172,6 +40431,19 @@ __metadata:
languageName: node
linkType: hard
+"micromark-extension-gfm-task-list-item@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "micromark-extension-gfm-task-list-item@npm:2.1.0"
+ dependencies:
+ devlop: "npm:^1.0.0"
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/78aa537d929e9309f076ba41e5edc99f78d6decd754b6734519ccbbfca8abd52e1c62df68d41a6ae64d2a3fc1646cea955893c79680b0b4385ced4c52296181f
+ languageName: node
+ linkType: hard
+
"micromark-extension-gfm-task-list-item@npm:~0.3.0":
version: 0.3.3
resolution: "micromark-extension-gfm-task-list-item@npm:0.3.3"
@@ -39211,6 +40483,22 @@ __metadata:
languageName: node
linkType: hard
+"micromark-extension-gfm@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "micromark-extension-gfm@npm:3.0.0"
+ dependencies:
+ micromark-extension-gfm-autolink-literal: "npm:^2.0.0"
+ micromark-extension-gfm-footnote: "npm:^2.0.0"
+ micromark-extension-gfm-strikethrough: "npm:^2.0.0"
+ micromark-extension-gfm-table: "npm:^2.0.0"
+ micromark-extension-gfm-tagfilter: "npm:^2.0.0"
+ micromark-extension-gfm-task-list-item: "npm:^2.0.0"
+ micromark-util-combine-extensions: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/970e28df6ebdd7c7249f52a0dda56e0566fbfa9ae56c8eeeb2445d77b6b89d44096880cd57a1c01e7821b1f4e31009109fbaca4e89731bff7b83b8519690e5d9
+ languageName: node
+ linkType: hard
+
"micromark-extension-mdx-expression@npm:^1.0.0":
version: 1.0.8
resolution: "micromark-extension-mdx-expression@npm:1.0.8"
@@ -39764,14 +41052,14 @@ __metadata:
linkType: hard
"micromark-util-subtokenize@npm:^2.0.0":
- version: 2.0.4
- resolution: "micromark-util-subtokenize@npm:2.0.4"
+ version: 2.1.0
+ resolution: "micromark-util-subtokenize@npm:2.1.0"
dependencies:
devlop: "npm:^1.0.0"
micromark-util-chunked: "npm:^2.0.0"
micromark-util-symbol: "npm:^2.0.0"
micromark-util-types: "npm:^2.0.0"
- checksum: 10c0/d1d19c6ede87e5d3778aa7f6c56ad736a48404556757abf71ea87bd2baac71927d18db3c9a1f76c4b3f42f32d6032aea97d1de739b49872daf168c6f8f373f39
+ checksum: 10c0/bee69eece4393308e657c293ba80d92ebcb637e5f55e21dcf9c3fa732b91a8eda8ac248d76ff375e675175bfadeae4712e5158ef97eef1111789da1ce7ab5067
languageName: node
linkType: hard
@@ -39839,8 +41127,8 @@ __metadata:
linkType: hard
"micromark@npm:^4.0.0":
- version: 4.0.1
- resolution: "micromark@npm:4.0.1"
+ version: 4.0.2
+ resolution: "micromark@npm:4.0.2"
dependencies:
"@types/debug": "npm:^4.0.0"
debug: "npm:^4.0.0"
@@ -39859,7 +41147,7 @@ __metadata:
micromark-util-subtokenize: "npm:^2.0.0"
micromark-util-symbol: "npm:^2.0.0"
micromark-util-types: "npm:^2.0.0"
- checksum: 10c0/b5d950c84664ce209575e5a54946488f0a1e1240d080544e657b65074c9b08208a5315d9db066b93cbc199ec05f68552ba8b09fd5e716c726f4a4712275a7c5c
+ checksum: 10c0/07462287254219d6eda6eac8a3cebaff2994e0575499e7088027b825105e096e4f51e466b14b2a81b71933a3b6c48ee069049d87bc2c2127eee50d9cc69e8af6
languageName: node
linkType: hard
@@ -40642,6 +41930,15 @@ __metadata:
languageName: node
linkType: hard
+"nanoid@npm:^3.3.8":
+ version: 3.3.8
+ resolution: "nanoid@npm:3.3.8"
+ bin:
+ nanoid: bin/nanoid.cjs
+ checksum: 10c0/4b1bb29f6cfebf3be3bc4ad1f1296fb0a10a3043a79f34fbffe75d1621b4318319211cd420549459018ea3592f0d2f159247a6f874911d6d26eaaadda2478120
+ languageName: node
+ linkType: hard
+
"nanoid@npm:^5.0.1":
version: 5.1.0
resolution: "nanoid@npm:5.1.0"
@@ -40660,6 +41957,15 @@ __metadata:
languageName: node
linkType: hard
+"nanoid@npm:^5.0.7, nanoid@npm:^5.0.9":
+ version: 5.1.2
+ resolution: "nanoid@npm:5.1.2"
+ bin:
+ nanoid: bin/nanoid.js
+ checksum: 10c0/60b3d30d1629704f4b156f79e53a454d10440a38f4ab14cda1c9aa08091389212d03afb35fbc09c11f4619f83bcf5076abc4719295e3b79c57abad0e40297177
+ languageName: node
+ linkType: hard
+
"napi-build-utils@npm:^1.0.1":
version: 1.0.2
resolution: "napi-build-utils@npm:1.0.2"
@@ -42266,6 +43572,13 @@ __metadata:
languageName: node
linkType: hard
+"packrup@npm:^0.1.2":
+ version: 0.1.2
+ resolution: "packrup@npm:0.1.2"
+ checksum: 10c0/8236a89e02a86a1539ee7ff920050544f2abcdc74d1a4c16c6182ad23ca36b8b686adb2203f08ae23f422852d856ff7213e18411a7a3f1ac90b1f850b0b6e86d
+ languageName: node
+ linkType: hard
+
"pacote@npm:^11.1.11, pacote@npm:^11.2.6, pacote@npm:^11.3.5":
version: 11.3.5
resolution: "pacote@npm:11.3.5"
@@ -42496,6 +43809,13 @@ __metadata:
languageName: node
linkType: hard
+"parse-ms@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "parse-ms@npm:3.0.0"
+ checksum: 10c0/056b4a32a9d3749f3f4cfffefb45c45540491deaa8e1d8ad43c2ddde7ba04edd076bd1b298f521238bb5fb084a9b2c4a2ebb78aefa651afbc4c2b0af4232fc54
+ languageName: node
+ linkType: hard
+
"parse-passwd@npm:^1.0.0":
version: 1.0.0
resolution: "parse-passwd@npm:1.0.0"
@@ -43466,6 +44786,17 @@ __metadata:
languageName: node
linkType: hard
+"postcss@npm:^8.4.48":
+ version: 8.5.3
+ resolution: "postcss@npm:8.5.3"
+ dependencies:
+ nanoid: "npm:^3.3.8"
+ picocolors: "npm:^1.1.1"
+ source-map-js: "npm:^1.2.1"
+ checksum: 10c0/b75510d7b28c3ab728c8733dd01538314a18c52af426f199a3c9177e63eb08602a3938bfb66b62dc01350b9aed62087eabbf229af97a1659eb8d3513cec823b3
+ languageName: node
+ linkType: hard
+
"postgres-array@npm:~2.0.0":
version: 2.0.0
resolution: "postgres-array@npm:2.0.0"
@@ -43659,6 +44990,13 @@ __metadata:
languageName: node
linkType: hard
+"pretty-bytes@npm:^6.1.1":
+ version: 6.1.1
+ resolution: "pretty-bytes@npm:6.1.1"
+ checksum: 10c0/c7a660b933355f3b4587ad3f001c266a8dd6afd17db9f89ebc50812354bb142df4b9600396ba5999bdb1f9717300387dc311df91895c5f0f2a1780e22495b5f8
+ languageName: node
+ linkType: hard
+
"pretty-data@npm:0.40.x":
version: 0.40.0
resolution: "pretty-data@npm:0.40.0"
@@ -43707,6 +45045,15 @@ __metadata:
languageName: node
linkType: hard
+"pretty-ms@npm:^8.0.0":
+ version: 8.0.0
+ resolution: "pretty-ms@npm:8.0.0"
+ dependencies:
+ parse-ms: "npm:^3.0.0"
+ checksum: 10c0/e960d633ecca45445cf5c6dffc0f5e4bef6744c92449ab0e8c6c704800675ab71e181c5e02ece5265e02137a33e313d3f3e355fbf8ea30b4b5b23de423329f8d
+ languageName: node
+ linkType: hard
+
"prettyjson@npm:^1.2.1":
version: 1.2.5
resolution: "prettyjson@npm:1.2.5"
@@ -43894,6 +45241,13 @@ __metadata:
languageName: node
linkType: hard
+"property-information@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "property-information@npm:7.0.0"
+ checksum: 10c0/bf443e3bbdfc154da8f4ff4c85ed97c3d21f5e5f77cce84d2fd653c6dfb974a75ad61eafbccb2b8d2285942be35d763eaa99d51e29dccc28b40917d3f018107e
+ languageName: node
+ linkType: hard
+
"prosemirror-changeset@npm:^2.2.1":
version: 2.2.1
resolution: "prosemirror-changeset@npm:2.2.1"
@@ -44446,6 +45800,27 @@ __metadata:
languageName: node
linkType: hard
+"radix-vue@npm:^1.9.3":
+ version: 1.9.17
+ resolution: "radix-vue@npm:1.9.17"
+ dependencies:
+ "@floating-ui/dom": "npm:^1.6.7"
+ "@floating-ui/vue": "npm:^1.1.0"
+ "@internationalized/date": "npm:^3.5.4"
+ "@internationalized/number": "npm:^3.5.3"
+ "@tanstack/vue-virtual": "npm:^3.8.1"
+ "@vueuse/core": "npm:^10.11.0"
+ "@vueuse/shared": "npm:^10.11.0"
+ aria-hidden: "npm:^1.2.4"
+ defu: "npm:^6.1.4"
+ fast-deep-equal: "npm:^3.1.3"
+ nanoid: "npm:^5.0.7"
+ peerDependencies:
+ vue: ">= 3.2.0"
+ checksum: 10c0/dfab2f18287687d677f4aaee611e2124b1aee84af8567ee516e3b4c4d2c41d89a97afdd8459316f5661431d4c0ca6e51f74f0db4bade797e58dc56dfb6753d64
+ languageName: node
+ linkType: hard
+
"raf-schd@npm:^4.0.3":
version: 4.0.3
resolution: "raf-schd@npm:4.0.3"
@@ -45734,6 +47109,20 @@ __metadata:
languageName: node
linkType: hard
+"rehype-external-links@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "rehype-external-links@npm:3.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@ungap/structured-clone": "npm:^1.0.0"
+ hast-util-is-element: "npm:^3.0.0"
+ is-absolute-url: "npm:^4.0.0"
+ space-separated-tokens: "npm:^2.0.0"
+ unist-util-visit: "npm:^5.0.0"
+ checksum: 10c0/486b5db73d8fe72611d62b4eb0b56ec71025ea32bba764ad54473f714ca627be75e057ac29243763f85a77c3810f31727ce3e03c975b3803c1c98643d038e9ae
+ languageName: node
+ linkType: hard
+
"rehype-format@npm:^5.0.0":
version: 5.0.0
resolution: "rehype-format@npm:5.0.0"
@@ -45789,6 +47178,28 @@ __metadata:
languageName: node
linkType: hard
+"rehype-parse@npm:^9.0.0":
+ version: 9.0.1
+ resolution: "rehype-parse@npm:9.0.1"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ hast-util-from-html: "npm:^2.0.0"
+ unified: "npm:^11.0.0"
+ checksum: 10c0/efa9ca17673fe70e2d322a1d262796bbed5f6a89382f8f8393352bbd6f6bbf1d4d1d050984b86ff9cb6c0fa2535175ab0829e53c94b1e38fc3c158e6c0ad90bc
+ languageName: node
+ linkType: hard
+
+"rehype-raw@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "rehype-raw@npm:7.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ hast-util-raw: "npm:^9.0.0"
+ vfile: "npm:^6.0.0"
+ checksum: 10c0/1435b4b6640a5bc3abe3b2133885c4dbff5ef2190ef9cfe09d6a63f74dd7d7ffd0cede70603278560ccf1acbfb9da9faae4b68065a28bc5aa88ad18e40f32d52
+ languageName: node
+ linkType: hard
+
"rehype-remark@npm:^9.1.2":
version: 9.1.2
resolution: "rehype-remark@npm:9.1.2"
@@ -45801,6 +47212,16 @@ __metadata:
languageName: node
linkType: hard
+"rehype-sanitize@npm:^6.0.0":
+ version: 6.0.0
+ resolution: "rehype-sanitize@npm:6.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ hast-util-sanitize: "npm:^5.0.0"
+ checksum: 10c0/43d6c056e63c994cf56e5ee0e157052d2030dc5ac160845ee494af9a26e5906bf5ec5af56c7d90c99f9c4dc0091e45a48a168618135fb6c64a76481ad3c449e9
+ languageName: node
+ linkType: hard
+
"rehype-slug@npm:^6.0.0":
version: 6.0.0
resolution: "rehype-slug@npm:6.0.0"
@@ -45814,6 +47235,17 @@ __metadata:
languageName: node
linkType: hard
+"rehype-stringify@npm:^10.0.0":
+ version: 10.0.1
+ resolution: "rehype-stringify@npm:10.0.1"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ hast-util-to-html: "npm:^9.0.0"
+ unified: "npm:^11.0.0"
+ checksum: 10c0/c643ae3a4862465033e0f1e9f664433767279b4ee9296570746970a79940417ec1fb1997a513659aab97063cf971c5d97e0af8129f590719f01628c8aa480765
+ languageName: node
+ linkType: hard
+
"rehype-stringify@npm:^9.0.3":
version: 9.0.4
resolution: "rehype-stringify@npm:9.0.4"
@@ -45903,6 +47335,20 @@ __metadata:
languageName: node
linkType: hard
+"remark-gfm@npm:^4.0.0":
+ version: 4.0.1
+ resolution: "remark-gfm@npm:4.0.1"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ mdast-util-gfm: "npm:^3.0.0"
+ micromark-extension-gfm: "npm:^3.0.0"
+ remark-parse: "npm:^11.0.0"
+ remark-stringify: "npm:^11.0.0"
+ unified: "npm:^11.0.0"
+ checksum: 10c0/427ecc6af3e76222662061a5f670a3e4e33ec5fffe2cabf04034da6a3f9a1bda1fc023e838a636385ba314e66e2bebbf017ca61ebea357eb0f5200fe0625a4b7
+ languageName: node
+ linkType: hard
+
"remark-mdx@npm:^2.0.0":
version: 2.3.0
resolution: "remark-mdx@npm:2.3.0"
@@ -45924,6 +47370,18 @@ __metadata:
languageName: node
linkType: hard
+"remark-parse@npm:^11.0.0":
+ version: 11.0.0
+ resolution: "remark-parse@npm:11.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ unified: "npm:^11.0.0"
+ checksum: 10c0/6eed15ddb8680eca93e04fcb2d1b8db65a743dcc0023f5007265dda558b09db595a087f622062ccad2630953cd5cddc1055ce491d25a81f3317c858348a8dd38
+ languageName: node
+ linkType: hard
+
"remark-parse@npm:^9.0.0":
version: 9.0.0
resolution: "remark-parse@npm:9.0.0"
@@ -45945,6 +47403,19 @@ __metadata:
languageName: node
linkType: hard
+"remark-rehype@npm:^11.1.0":
+ version: 11.1.1
+ resolution: "remark-rehype@npm:11.1.1"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/mdast": "npm:^4.0.0"
+ mdast-util-to-hast: "npm:^13.0.0"
+ unified: "npm:^11.0.0"
+ vfile: "npm:^6.0.0"
+ checksum: 10c0/68f986e8ee758d415e93babda2a0d89477c15b7c200edc23b8b1d914dd6e963c5fc151a11cbbbcfa7dd237367ff3ef86e302be90f31f37a17b0748668bd8c65b
+ languageName: node
+ linkType: hard
+
"remark-slug@npm:^6.0.0":
version: 6.1.0
resolution: "remark-slug@npm:6.1.0"
@@ -45967,6 +47438,17 @@ __metadata:
languageName: node
linkType: hard
+"remark-stringify@npm:^11.0.0":
+ version: 11.0.0
+ resolution: "remark-stringify@npm:11.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ unified: "npm:^11.0.0"
+ checksum: 10c0/0cdb37ce1217578f6f847c7ec9f50cbab35df5b9e3903d543e74b405404e67c07defcb23cd260a567b41b769400f6de03c2c3d9cd6ae7a6707d5c8d89ead489f
+ languageName: node
+ linkType: hard
+
"remark-stringify@npm:^9.0.1":
version: 9.0.1
resolution: "remark-stringify@npm:9.0.1"
@@ -48207,6 +49689,17 @@ __metadata:
languageName: node
linkType: hard
+"stringify-object@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "stringify-object@npm:5.0.0"
+ dependencies:
+ get-own-enumerable-keys: "npm:^1.0.0"
+ is-obj: "npm:^3.0.0"
+ is-regexp: "npm:^3.1.0"
+ checksum: 10c0/f955bb0b41edb0a200bf5ba24d516a2d409c749a01224e14a088ecf07fec3d930ec90da3a681f6798b9d6a1b187cb3bb57f0d17525190006ef3bd609d0300bb9
+ languageName: node
+ linkType: hard
+
"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1":
version: 6.0.1
resolution: "strip-ansi@npm:6.0.1"
@@ -48411,7 +49904,7 @@ __metadata:
languageName: node
linkType: hard
-"style-mod@npm:^4.0.0, style-mod@npm:^4.1.0":
+"style-mod@npm:^4.0.0, style-mod@npm:^4.1.0, style-mod@npm:^4.1.2":
version: 4.1.2
resolution: "style-mod@npm:4.1.2"
checksum: 10c0/ad4d870b3642b0e42ecc7be0e106dd14b7af11985e34fee8de34e5e38c3214bfc96fa7055acea86d75a3a59ddea3f6a8c6641001a66494d7df72d09685e3fadb
@@ -48721,13 +50214,20 @@ __metadata:
languageName: node
linkType: hard
-"tabbable@npm:^6.0.0, tabbable@npm:^6.0.1":
+"tabbable@npm:^6.0.0, tabbable@npm:^6.0.1, tabbable@npm:^6.2.0":
version: 6.2.0
resolution: "tabbable@npm:6.2.0"
checksum: 10c0/ced8b38f05f2de62cd46836d77c2646c42b8c9713f5bd265daf0e78ff5ac73d3ba48a7ca45f348bafeef29b23da7187c72250742d37627883ef89cbd7fa76898
languageName: node
linkType: hard
+"tailwind-merge@npm:^2.5.5":
+ version: 2.6.0
+ resolution: "tailwind-merge@npm:2.6.0"
+ checksum: 10c0/fc8a5535524de9f4dacf1c16ab298581c7bb757d68a95faaf28942b1c555a619bba9d4c6726fe83986e44973b315410c1a5226e5354c30ba82353bd6d2288fa5
+ languageName: node
+ linkType: hard
+
"tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1":
version: 2.2.1
resolution: "tapable@npm:2.2.1"
@@ -49365,6 +50865,13 @@ __metadata:
languageName: node
linkType: hard
+"ts-deepmerge@npm:^7.0.1":
+ version: 7.0.2
+ resolution: "ts-deepmerge@npm:7.0.2"
+ checksum: 10c0/fd46cf217004020979d6fa628b38a2cf8a689180a8ecde319e76806fb4a61e9e1896b4ba8b805dc75662d2a777983b8e7b5c49666952369dc8cc4e3a0a7d13d0
+ languageName: node
+ linkType: hard
+
"ts-easing@npm:^0.2.0":
version: 0.2.0
resolution: "ts-easing@npm:0.2.0"
@@ -49789,6 +51296,7 @@ __metadata:
"@nivo/core": "npm:^0.87.0"
"@nivo/line": "npm:^0.87.0"
"@react-pdf/renderer": "npm:^4.1.6"
+ "@scalar/api-reference-react": "npm:^0.4.36"
"@tiptap/core": "npm:^2.10.4"
"@tiptap/extension-document": "npm:^2.10.4"
"@tiptap/extension-hard-break": "npm:^2.10.4"
@@ -50691,6 +52199,18 @@ __metadata:
languageName: node
linkType: hard
+"unhead@npm:1.11.20":
+ version: 1.11.20
+ resolution: "unhead@npm:1.11.20"
+ dependencies:
+ "@unhead/dom": "npm:1.11.20"
+ "@unhead/schema": "npm:1.11.20"
+ "@unhead/shared": "npm:1.11.20"
+ hookable: "npm:^5.5.3"
+ checksum: 10c0/cce50a79509984679d3b8f7a2299f7ec7e252c8efdac76e9156ffa816c04c53ff25e526ead88df4cb67dc016b98c37adec8c3e93b7322a972561d3f4cd1c21d8
+ languageName: node
+ linkType: hard
+
"unicode-canonical-property-names-ecmascript@npm:^2.0.0":
version: 2.0.0
resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0"
@@ -50757,6 +52277,21 @@ __metadata:
languageName: node
linkType: hard
+"unified@npm:^11.0.0, unified@npm:^11.0.4":
+ version: 11.0.5
+ resolution: "unified@npm:11.0.5"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ bail: "npm:^2.0.0"
+ devlop: "npm:^1.0.0"
+ extend: "npm:^3.0.0"
+ is-plain-obj: "npm:^4.0.0"
+ trough: "npm:^2.0.0"
+ vfile: "npm:^6.0.0"
+ checksum: 10c0/53c8e685f56d11d9d458a43e0e74328a4d6386af51c8ac37a3dcabec74ce5026da21250590d4aff6733ccd7dc203116aae2b0769abc18cdf9639a54ae528dfc9
+ languageName: node
+ linkType: hard
+
"unified@npm:^9.2.1":
version: 9.2.2
resolution: "unified@npm:9.2.2"
@@ -50862,6 +52397,16 @@ __metadata:
languageName: node
linkType: hard
+"unist-util-find-after@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "unist-util-find-after@npm:5.0.0"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ unist-util-is: "npm:^6.0.0"
+ checksum: 10c0/a7cea473c4384df8de867c456b797ff1221b20f822e1af673ff5812ed505358b36f47f3b084ac14c3622cb879ed833b71b288e8aa71025352a2aab4c2925a6eb
+ languageName: node
+ linkType: hard
+
"unist-util-find-all-after@npm:^4.0.0":
version: 4.0.1
resolution: "unist-util-find-all-after@npm:4.0.1"
@@ -51725,6 +53270,16 @@ __metadata:
languageName: node
linkType: hard
+"vfile-location@npm:^5.0.0":
+ version: 5.0.3
+ resolution: "vfile-location@npm:5.0.3"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ vfile: "npm:^6.0.0"
+ checksum: 10c0/1711f67802a5bc175ea69750d59863343ed43d1b1bb25c0a9063e4c70595e673e53e2ed5cdbb6dcdc370059b31605144d95e8c061b9361bcc2b036b8f63a4966
+ languageName: node
+ linkType: hard
+
"vfile-matter@npm:^3.0.1":
version: 3.0.1
resolution: "vfile-matter@npm:3.0.1"
@@ -52132,6 +53687,40 @@ __metadata:
languageName: node
linkType: hard
+"vue-demi@npm:>=0.13.0, vue-demi@npm:>=0.14.10, vue-demi@npm:>=0.14.8":
+ version: 0.14.10
+ resolution: "vue-demi@npm:0.14.10"
+ peerDependencies:
+ "@vue/composition-api": ^1.0.0-rc.1
+ vue: ^3.0.0-0 || ^2.6.0
+ peerDependenciesMeta:
+ "@vue/composition-api":
+ optional: true
+ bin:
+ vue-demi-fix: bin/vue-demi-fix.js
+ vue-demi-switch: bin/vue-demi-switch.js
+ checksum: 10c0/a9ed8712fa36d01bc13c39757f95f30cebf42d557b99e94bff86d8660c81f2911b41220f7affc023d1ffcc19e13999e4a83019991e264787cca2c616e83aea48
+ languageName: node
+ linkType: hard
+
+"vue-router@npm:^4.3.0":
+ version: 4.5.0
+ resolution: "vue-router@npm:4.5.0"
+ dependencies:
+ "@vue/devtools-api": "npm:^6.6.4"
+ peerDependencies:
+ vue: ^3.2.0
+ checksum: 10c0/5521c8d0ab7634ea75118824d4b4cae3748964725b3d3b4064eb3dbd44013381ea3163d4d856af61655936cd897b84f8eeebb312d0668532c3074d53814bd953
+ languageName: node
+ linkType: hard
+
+"vue-sonner@npm:^1.0.3":
+ version: 1.3.0
+ resolution: "vue-sonner@npm:1.3.0"
+ checksum: 10c0/f271bdb5955976cda0f1d56e415f268d0efd8005ed29b4037b79bbdc8f6e0c63a0b57d0227d8c725842675e2cadb1a1ddcd5c494d8dfce87863099475e76f3dc
+ languageName: node
+ linkType: hard
+
"vue-template-compiler@npm:^2.7.14":
version: 2.7.16
resolution: "vue-template-compiler@npm:2.7.16"
@@ -52157,6 +53746,24 @@ __metadata:
languageName: node
linkType: hard
+"vue@npm:^3.5.12":
+ version: 3.5.13
+ resolution: "vue@npm:3.5.13"
+ dependencies:
+ "@vue/compiler-dom": "npm:3.5.13"
+ "@vue/compiler-sfc": "npm:3.5.13"
+ "@vue/runtime-dom": "npm:3.5.13"
+ "@vue/server-renderer": "npm:3.5.13"
+ "@vue/shared": "npm:3.5.13"
+ peerDependencies:
+ typescript: "*"
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ checksum: 10c0/4bbb5caf3f04fed933b01c100804f3693ff902984a3152ea1359a972264fa3240f6551d32f0163a79c64df3715b4d6691818c9f652cdd41b2473c69e2b0a373d
+ languageName: node
+ linkType: hard
+
"w3c-keyname@npm:^2.2.0, w3c-keyname@npm:^2.2.4":
version: 2.2.8
resolution: "w3c-keyname@npm:2.2.8"
@@ -52428,6 +54035,13 @@ __metadata:
languageName: node
linkType: hard
+"whatwg-mimetype@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "whatwg-mimetype@npm:4.0.0"
+ checksum: 10c0/a773cdc8126b514d790bdae7052e8bf242970cebd84af62fb2f35a33411e78e981f6c0ab9ed1fe6ec5071b09d5340ac9178e05b52d35a9c4bcf558ba1b1551df
+ languageName: node
+ linkType: hard
+
"whatwg-url@npm:^11.0.0":
version: 11.0.0
resolution: "whatwg-url@npm:11.0.0"
@@ -53077,6 +54691,15 @@ __metadata:
languageName: node
linkType: hard
+"yaml@npm:^2.4.5":
+ version: 2.7.0
+ resolution: "yaml@npm:2.7.0"
+ bin:
+ yaml: bin.mjs
+ checksum: 10c0/886a7d2abbd70704b79f1d2d05fe9fb0aa63aefb86e1cb9991837dced65193d300f5554747a872b4b10ae9a12bc5d5327e4d04205f70336e863e35e89d8f4ea9
+ languageName: node
+ linkType: hard
+
"yargs-parser@npm:21.1.1, yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1":
version: 21.1.1
resolution: "yargs-parser@npm:21.1.1"
@@ -53235,16 +54858,7 @@ __metadata:
languageName: node
linkType: hard
-"yjs@npm:^13.6.11":
- version: 13.6.23
- resolution: "yjs@npm:13.6.23"
- dependencies:
- lib0: "npm:^0.2.99"
- checksum: 10c0/85a6b29d647b11451644f99649175c028c48f7c3b7bab986bbf344662d8b6e31a06aad898ed7c16979824b0ef130806a3a44e93542266d5e25c0e2a1d2af279b
- languageName: node
- linkType: hard
-
-"yjs@npm:^13.6.15":
+"yjs@npm:13.6.18":
version: 13.6.18
resolution: "yjs@npm:13.6.18"
dependencies:
@@ -53430,6 +55044,13 @@ __metadata:
languageName: node
linkType: hard
+"zhead@npm:^2.2.4":
+ version: 2.2.4
+ resolution: "zhead@npm:2.2.4"
+ checksum: 10c0/3d166fb661f1b7fdf8a0ef2222d9e574ab241e72141f2f1fda62a9250ca73aabf2eaf0d66046a3984cd24d1dd9bac231338c6271684d6b8caa6b66af7c45f275
+ languageName: node
+ linkType: hard
+
"zip-stream@npm:^4.1.0":
version: 4.1.1
resolution: "zip-stream@npm:4.1.1"
@@ -53468,6 +55089,13 @@ __metadata:
languageName: node
linkType: hard
+"zod@npm:^3.23.8":
+ version: 3.24.2
+ resolution: "zod@npm:3.24.2"
+ checksum: 10c0/c638c7220150847f13ad90635b3e7d0321b36cce36f3fc6050ed960689594c949c326dfe2c6fa87c14b126ee5d370ccdebd6efb304f41ef5557a4aaca2824565
+ languageName: node
+ linkType: hard
+
"zustand@npm:^3.5.2":
version: 3.7.2
resolution: "zustand@npm:3.7.2"