From d099d7eaa6b24face2266807daba883e13f8db04 Mon Sep 17 00:00:00 2001 From: carlosallexandre Date: Mon, 10 Feb 2025 09:35:30 -0300 Subject: [PATCH 01/17] refactor(core): extract SideNav from VerticalSideBarLayout It reduces the VerticalSideBarLayout's size/responsabilities. --- .../src/components/SideNav/SideNav.astro | 83 +++++++++++++++++++ .../src/layouts/VerticalSideBarLayout.astro | 66 +-------------- 2 files changed, 87 insertions(+), 62 deletions(-) create mode 100644 eventcatalog/src/components/SideNav/SideNav.astro diff --git a/eventcatalog/src/components/SideNav/SideNav.astro b/eventcatalog/src/components/SideNav/SideNav.astro new file mode 100644 index 00000000..5eccfef3 --- /dev/null +++ b/eventcatalog/src/components/SideNav/SideNav.astro @@ -0,0 +1,83 @@ +--- +import type { HTMLAttributes } from 'astro/types'; +import CatalogResourcesSideBar from '@components/SideBars/CatalogResourcesSideBar'; +import { isCollectionVisibleInCatalog } from '@eventcatalog'; +import { buildUrl } from '@utils/url-builder'; +import { getChannels } from '@utils/channels'; +import { getDomains } from '@utils/collections/domains'; +import { getFlows } from '@utils/collections/flows'; +import { getServices } from '@utils/collections/services'; +import { getCommands } from '@utils/commands'; +import { getEvents } from '@utils/events'; +import { getQueries } from '@utils/queries'; +import { getTeams } from '@utils/teams'; +import { getUsers } from '@utils/users'; + +interface Props extends Omit, 'children'> {} + +const currentPath = Astro.url.pathname; + +const events = await getEvents({ getAllVersions: false }); +const commands = await getCommands({ getAllVersions: false }); +const queries = await getQueries({ getAllVersions: false }); +const services = await getServices({ getAllVersions: false }); +const domains = await getDomains({ getAllVersions: false }); +const channels = await getChannels({ getAllVersions: false }); +const flows = await getFlows({ getAllVersions: false }); +const teams = await getTeams(); +const users = await getUsers(); + +const messages = [...events, ...commands, ...queries]; + +// @ts-ignore for large catalogs https://github.com/event-catalog/eventcatalog/issues/552 +const allData = [...domains, ...services, ...messages, ...channels, ...flows, ...teams, ...users]; + +const allDataAsSideNav = allData.reduce((acc, item) => { + const title = item.collection; + const group = acc[title] || []; + const currentPath = Astro.url.pathname; + const route = currentPath.includes('visualiser') ? 'visualiser' : 'docs'; + + if ( + currentPath.includes('visualiser') && + (item.collection === 'teams' || item.collection === 'users' || item.collection === 'channels') + ) { + return acc; + } + + const navigationItem = { + label: item.data.name, + version: item.collection === 'teams' || item.collection === 'users' ? null : item.data.version, + // items: item.collection === 'users' ? [] : item.headings, + visible: isCollectionVisibleInCatalog(item.collection), + // @ts-ignore + href: item.data.version + ? // @ts-ignore + buildUrl(`/${route}/${item.collection}/${item.data.id}/${item.data.version}`) + : buildUrl(`/${route}/${item.collection}/${item.data.id}`), + collection: item.collection, + }; + + group.push(navigationItem); + + return { + ...acc, + [title]: group, + }; +}, {} as any); + +const sideNav = { + ...(currentPath.includes('visualiser') + ? { + 'bounded context map': [ + { label: 'Domain map', href: buildUrl('/visualiser/context-map'), collection: 'bounded-context-map' }, + ], + } + : {}), + ...allDataAsSideNav, +}; +--- + +
+ +
diff --git a/eventcatalog/src/layouts/VerticalSideBarLayout.astro b/eventcatalog/src/layouts/VerticalSideBarLayout.astro index c6e4c88d..8db2d6af 100644 --- a/eventcatalog/src/layouts/VerticalSideBarLayout.astro +++ b/eventcatalog/src/layouts/VerticalSideBarLayout.astro @@ -8,19 +8,16 @@ interface Props { import { BookOpenText, Workflow, TableProperties, House } from 'lucide-react'; import Header from '../components/Header.astro'; import SEO from '../components/Seo.astro'; +import SideNav from '../components/SideNav/SideNav.astro'; import { getCommands } from '@utils/commands'; import { getDomains } from '@utils/collections/domains'; import { getEvents } from '@utils/events'; import { getServices } from '@utils/collections/services'; import { getFlows } from '@utils/collections/flows'; -import { getTeams } from '@utils/teams'; -import { getUsers } from '@utils/users'; import { isCollectionVisibleInCatalog } from '@eventcatalog'; import { buildUrl } from '@utils/url-builder'; import { getQueries } from '@utils/queries'; -import { getChannels } from '@utils/channels'; -import CatalogResourcesSideBar from '@components/SideBars/CatalogResourcesSideBar'; import { hasLandingPageForDocs } from '@utils/pages'; const events = await getEvents({ getAllVersions: false }); @@ -28,15 +25,7 @@ const commands = await getCommands({ getAllVersions: false }); const queries = await getQueries({ getAllVersions: false }); const services = await getServices({ getAllVersions: false }); const domains = await getDomains({ getAllVersions: false }); -const channels = await getChannels({ getAllVersions: false }); const flows = await getFlows({ getAllVersions: false }); -const teams = await getTeams(); -const users = await getUsers(); - -const messages = [...events, ...commands, ...queries]; - -// @ts-ignore for large catalogs https://github.com/event-catalog/eventcatalog/issues/552 -const allData = [...domains, ...services, ...messages, ...channels, ...flows, ...teams, ...users]; const currentPath = Astro.url.pathname; @@ -97,53 +86,8 @@ const navigationItems = [ }, ]; -const allDataAsSideNav = allData.reduce((acc, item) => { - const title = item.collection; - const group = acc[title] || []; - const currentPath = Astro.url.pathname; - const route = currentPath.includes('visualiser') ? 'visualiser' : 'docs'; - - if ( - currentPath.includes('visualiser') && - (item.collection === 'teams' || item.collection === 'users' || item.collection === 'channels') - ) { - return acc; - } - - const navigationItem = { - label: item.data.name, - version: item.collection === 'teams' || item.collection === 'users' ? null : item.data.version, - // items: item.collection === 'users' ? [] : item.headings, - visible: isCollectionVisibleInCatalog(item.collection), - // @ts-ignore - href: item.data.version - ? // @ts-ignore - buildUrl(`/${route}/${item.collection}/${item.data.id}/${item.data.version}`) - : buildUrl(`/${route}/${item.collection}/${item.data.id}`), - collection: item.collection, - }; - - group.push(navigationItem); - - return { - ...acc, - [title]: group, - }; -}, {} as any); - -const sideNav = { - ...(currentPath.includes('visualiser') - ? { - 'bounded context map': [ - { label: 'Domain map', href: buildUrl('/visualiser/context-map'), collection: 'bounded-context-map' }, - ], - } - : {}), - ...allDataAsSideNav, -}; - const currentNavigationItem = navigationItems.find((item) => item.current); -const { title, description, sidebar: showSideBarOverride } = Astro.props; +const { title, description } = Astro.props; const showSideBarOnLoad = currentNavigationItem?.sidebar; --- @@ -200,12 +144,10 @@ const showSideBarOnLoad = currentNavigationItem?.sidebar; - + />
Date: Mon, 10 Feb 2025 09:44:25 -0300 Subject: [PATCH 02/17] refactor(core): move `CatalogResourcesSideBar` to `SideNav` The `CatalogResourcesSideBar` is only used within `SideNav`, so colocating it improves organization and maintainability. --- .../getCatalogResources.ts | 74 +++++++++++++++++++ .../CatalogResourcesSideBar/index.tsx | 0 .../CatalogResourcesSideBar/styles.css | 0 .../src/components/SideNav/SideNav.astro | 74 +------------------ 4 files changed, 77 insertions(+), 71 deletions(-) create mode 100644 eventcatalog/src/components/SideNav/CatalogResourcesSideBar/getCatalogResources.ts rename eventcatalog/src/components/{SideBars => SideNav}/CatalogResourcesSideBar/index.tsx (100%) rename eventcatalog/src/components/{SideBars => SideNav}/CatalogResourcesSideBar/styles.css (100%) diff --git a/eventcatalog/src/components/SideNav/CatalogResourcesSideBar/getCatalogResources.ts b/eventcatalog/src/components/SideNav/CatalogResourcesSideBar/getCatalogResources.ts new file mode 100644 index 00000000..dd33d38c --- /dev/null +++ b/eventcatalog/src/components/SideNav/CatalogResourcesSideBar/getCatalogResources.ts @@ -0,0 +1,74 @@ +import { isCollectionVisibleInCatalog } from '@eventcatalog'; +import { buildUrl } from '@utils/url-builder'; +import { getChannels } from '@utils/channels'; +import { getDomains } from '@utils/collections/domains'; +import { getFlows } from '@utils/collections/flows'; +import { getServices } from '@utils/collections/services'; +import { getCommands } from '@utils/commands'; +import { getEvents } from '@utils/events'; +import { getQueries } from '@utils/queries'; +import { getTeams } from '@utils/teams'; +import { getUsers } from '@utils/users'; + +export async function getCatalogResources({ currentPath }: { currentPath: string }) { + const events = await getEvents({ getAllVersions: false }); + const commands = await getCommands({ getAllVersions: false }); + const queries = await getQueries({ getAllVersions: false }); + const services = await getServices({ getAllVersions: false }); + const domains = await getDomains({ getAllVersions: false }); + const channels = await getChannels({ getAllVersions: false }); + const flows = await getFlows({ getAllVersions: false }); + const teams = await getTeams(); + const users = await getUsers(); + + const messages = [...events, ...commands, ...queries]; + + // @ts-ignore for large catalogs https://github.com/event-catalog/eventcatalog/issues/552 + const allData = [...domains, ...services, ...messages, ...channels, ...flows, ...teams, ...users]; + + const allDataAsSideNav = allData.reduce((acc, item) => { + const title = item.collection; + const group = acc[title] || []; + const route = currentPath.includes('visualiser') ? 'visualiser' : 'docs'; + + if ( + currentPath.includes('visualiser') && + (item.collection === 'teams' || item.collection === 'users' || item.collection === 'channels') + ) { + return acc; + } + + const navigationItem = { + label: item.data.name, + version: item.collection === 'teams' || item.collection === 'users' ? null : item.data.version, + // items: item.collection === 'users' ? [] : item.headings, + visible: isCollectionVisibleInCatalog(item.collection), + // @ts-ignore + href: item.data.version + ? // @ts-ignore + buildUrl(`/${route}/${item.collection}/${item.data.id}/${item.data.version}`) + : buildUrl(`/${route}/${item.collection}/${item.data.id}`), + collection: item.collection, + }; + + group.push(navigationItem); + + return { + ...acc, + [title]: group, + }; + }, {} as any); + + const sideNav = { + ...(currentPath.includes('visualiser') + ? { + 'bounded context map': [ + { label: 'Domain map', href: buildUrl('/visualiser/context-map'), collection: 'bounded-context-map' }, + ], + } + : {}), + ...allDataAsSideNav, + }; + + return sideNav; +} diff --git a/eventcatalog/src/components/SideBars/CatalogResourcesSideBar/index.tsx b/eventcatalog/src/components/SideNav/CatalogResourcesSideBar/index.tsx similarity index 100% rename from eventcatalog/src/components/SideBars/CatalogResourcesSideBar/index.tsx rename to eventcatalog/src/components/SideNav/CatalogResourcesSideBar/index.tsx diff --git a/eventcatalog/src/components/SideBars/CatalogResourcesSideBar/styles.css b/eventcatalog/src/components/SideNav/CatalogResourcesSideBar/styles.css similarity index 100% rename from eventcatalog/src/components/SideBars/CatalogResourcesSideBar/styles.css rename to eventcatalog/src/components/SideNav/CatalogResourcesSideBar/styles.css diff --git a/eventcatalog/src/components/SideNav/SideNav.astro b/eventcatalog/src/components/SideNav/SideNav.astro index 5eccfef3..a76fe91c 100644 --- a/eventcatalog/src/components/SideNav/SideNav.astro +++ b/eventcatalog/src/components/SideNav/SideNav.astro @@ -1,81 +1,13 @@ --- import type { HTMLAttributes } from 'astro/types'; -import CatalogResourcesSideBar from '@components/SideBars/CatalogResourcesSideBar'; -import { isCollectionVisibleInCatalog } from '@eventcatalog'; -import { buildUrl } from '@utils/url-builder'; -import { getChannels } from '@utils/channels'; -import { getDomains } from '@utils/collections/domains'; -import { getFlows } from '@utils/collections/flows'; -import { getServices } from '@utils/collections/services'; -import { getCommands } from '@utils/commands'; -import { getEvents } from '@utils/events'; -import { getQueries } from '@utils/queries'; -import { getTeams } from '@utils/teams'; -import { getUsers } from '@utils/users'; +import CatalogResourcesSideBar from './CatalogResourcesSideBar'; +import { getCatalogResources } from './CatalogResourcesSideBar/getCatalogResources'; interface Props extends Omit, 'children'> {} const currentPath = Astro.url.pathname; -const events = await getEvents({ getAllVersions: false }); -const commands = await getCommands({ getAllVersions: false }); -const queries = await getQueries({ getAllVersions: false }); -const services = await getServices({ getAllVersions: false }); -const domains = await getDomains({ getAllVersions: false }); -const channels = await getChannels({ getAllVersions: false }); -const flows = await getFlows({ getAllVersions: false }); -const teams = await getTeams(); -const users = await getUsers(); - -const messages = [...events, ...commands, ...queries]; - -// @ts-ignore for large catalogs https://github.com/event-catalog/eventcatalog/issues/552 -const allData = [...domains, ...services, ...messages, ...channels, ...flows, ...teams, ...users]; - -const allDataAsSideNav = allData.reduce((acc, item) => { - const title = item.collection; - const group = acc[title] || []; - const currentPath = Astro.url.pathname; - const route = currentPath.includes('visualiser') ? 'visualiser' : 'docs'; - - if ( - currentPath.includes('visualiser') && - (item.collection === 'teams' || item.collection === 'users' || item.collection === 'channels') - ) { - return acc; - } - - const navigationItem = { - label: item.data.name, - version: item.collection === 'teams' || item.collection === 'users' ? null : item.data.version, - // items: item.collection === 'users' ? [] : item.headings, - visible: isCollectionVisibleInCatalog(item.collection), - // @ts-ignore - href: item.data.version - ? // @ts-ignore - buildUrl(`/${route}/${item.collection}/${item.data.id}/${item.data.version}`) - : buildUrl(`/${route}/${item.collection}/${item.data.id}`), - collection: item.collection, - }; - - group.push(navigationItem); - - return { - ...acc, - [title]: group, - }; -}, {} as any); - -const sideNav = { - ...(currentPath.includes('visualiser') - ? { - 'bounded context map': [ - { label: 'Domain map', href: buildUrl('/visualiser/context-map'), collection: 'bounded-context-map' }, - ], - } - : {}), - ...allDataAsSideNav, -}; +const sideNav = await getCatalogResources({ currentPath }); ---
From 874afbfad7b3de0c34a460d4937338dc83202a88 Mon Sep 17 00:00:00 2001 From: carlosallexandre Date: Mon, 10 Feb 2025 11:09:44 -0300 Subject: [PATCH 03/17] feat(core): add SideNavTreeView --- .../src/components/SideNav/SideNav.astro | 10 +- .../SideNav/TreeView/getTreeView.ts | 139 +++++ .../src/components/SideNav/TreeView/index.tsx | 98 ++++ package.json | 1 + pnpm-lock.yaml | 480 +++++++++++++++++- 5 files changed, 701 insertions(+), 27 deletions(-) create mode 100644 eventcatalog/src/components/SideNav/TreeView/getTreeView.ts create mode 100644 eventcatalog/src/components/SideNav/TreeView/index.tsx diff --git a/eventcatalog/src/components/SideNav/SideNav.astro b/eventcatalog/src/components/SideNav/SideNav.astro index a76fe91c..ce08e148 100644 --- a/eventcatalog/src/components/SideNav/SideNav.astro +++ b/eventcatalog/src/components/SideNav/SideNav.astro @@ -1,15 +1,21 @@ --- import type { HTMLAttributes } from 'astro/types'; +// FlatView import CatalogResourcesSideBar from './CatalogResourcesSideBar'; import { getCatalogResources } from './CatalogResourcesSideBar/getCatalogResources'; +// TreeView +import { SideNavTreeView } from './TreeView'; +import { getTreeView } from './TreeView/getTreeView'; interface Props extends Omit, 'children'> {} const currentPath = Astro.url.pathname; -const sideNav = await getCatalogResources({ currentPath }); +// const sideNav = await getCatalogResources({ currentPath }); +const tree = getTreeView({ projectDir: process.env.PROJECT_DIR!, currentPath }); ---
- + +
diff --git a/eventcatalog/src/components/SideNav/TreeView/getTreeView.ts b/eventcatalog/src/components/SideNav/TreeView/getTreeView.ts new file mode 100644 index 00000000..eb7a6dfe --- /dev/null +++ b/eventcatalog/src/components/SideNav/TreeView/getTreeView.ts @@ -0,0 +1,139 @@ +import fs from 'fs'; +import path from 'path'; +import gm from 'gray-matter'; +import { globSync } from 'glob'; +import type { CollectionKey } from 'astro:content'; +import { buildUrl } from '@utils/url-builder'; + +export type TreeNode = { + id: string; + name: string; + version: string; + href?: string; + type: CollectionKey | null; + children: TreeNode[]; +}; + +/** + * Resource types that should be in the sidenav + */ +const RESOURCE_TYPES = ['domains', 'services', 'events', 'commands', 'queries', 'flows', 'channels', 'teams', 'users']; + +/** + * Check if the path has a RESOURCE_TYPE on path + */ +function canBeResource(dirPath: string) { + const parts = dirPath.split(path.sep); + for (let i = parts.length - 1; i >= 0; i--) { + if (RESOURCE_TYPES.includes(parts[i])) return true; + } + return false; +} + +function isNotVersioned(dirPath: string) { + const parts = dirPath.split(path.sep); + return parts.every((p) => p !== 'versioned'); +} + +function getResourceType(filePath: string): CollectionKey | null { + const parts = filePath.split(path.sep); + for (let i = parts.length - 1; i >= 0; i--) { + if (RESOURCE_TYPES.includes(parts[i])) return parts[i] as CollectionKey; + } + return null; +} + +function traverse( + directory: string, + parentNode: TreeNode, + options: { ignore?: CollectionKey[]; basePathname: 'docs' | 'visualiser' } +) { + let node: TreeNode | null = null; + + const resourceType = getResourceType(directory); + const markdownFiles = globSync(path.join(directory, '/*.md')); + const isResourceIgnored = options?.ignore && resourceType && options.ignore.includes(resourceType); + if (markdownFiles.length > 0 && !isResourceIgnored) { + const resourceFilePath = markdownFiles.find((md) => md.endsWith('index.md')); + + if (resourceType === 'teams' || resourceType === 'users') { + // Teams and Users aren't nested. Just append to the parentNode. + markdownFiles.forEach((md) => { + const resourceDef = gm.read(md); + parentNode.children.push({ + id: resourceDef.data.id, + name: resourceDef.data.name, + type: resourceType, + version: resourceDef.data.version, + children: [], + href: encodeURI(buildUrl(`/${options.basePathname}/${resourceType}/${resourceDef.data.id}`)), + }); + }); + } else if (resourceFilePath) { + const resourceDef = gm.read(resourceFilePath); + node = { + id: resourceDef.data.id, + name: resourceDef.data.name, + type: resourceType, + version: resourceDef.data.version, + href: encodeURI(buildUrl(`/${options.basePathname}/${resourceType}/${resourceDef.data.id}/${resourceDef.data.version}`)), + children: [], + }; + parentNode.children.push(node); + } + } + + const directories = fs.readdirSync(directory).filter((name) => { + const dirPath = path.join(directory, name); + return fs.statSync(dirPath).isDirectory() && isNotVersioned(dirPath) && canBeResource(dirPath); + }); + for (const dir of directories) { + traverse(path.join(directory, dir), node || parentNode, options); + } +} + +function groupByType(parentNode: TreeNode) { + const next = parentNode.children; + const siblingTypes = new Set(parentNode.children.map((n) => n.type)); + const shouldGroup = parentNode.type === 'services' || siblingTypes.size > 1; + + if (shouldGroup) { + const acc: Record = {}; + parentNode.children.forEach((n) => { + if (!n.type) return; // TODO: Just ignore or remove the type null??? + if (!(n.type in acc)) acc[n.type] = []; + acc[n.type].push(n); + }); + parentNode.children = Object.entries(acc).map(([type, nodes]) => ({ + id: `${parentNode.id}/${type}`, + name: type, + type: type as CollectionKey, + version: '0', + children: nodes, + isLabel: true, + })); + } + + // Go to next level + next.forEach((n) => { + if (n?.children.length === 0) return; // Leaf node + groupByType(n); + }); +} + +export function getTreeView({ projectDir, currentPath }: { projectDir: string; currentPath: string }): TreeNode[] { + const basePathname = currentPath.split('/')[1] as 'docs' | 'visualiser'; + const rootNode: TreeNode = { + id: '/', + name: 'root', + type: null, + version: '0', + children: [], + }; + traverse(projectDir, rootNode, { + basePathname, + ignore: basePathname === 'visualiser' ? ['teams', 'users', 'channels'] : undefined, + }); + groupByType(rootNode); + return rootNode.children; +} diff --git a/eventcatalog/src/components/SideNav/TreeView/index.tsx b/eventcatalog/src/components/SideNav/TreeView/index.tsx new file mode 100644 index 00000000..fb2cda33 --- /dev/null +++ b/eventcatalog/src/components/SideNav/TreeView/index.tsx @@ -0,0 +1,98 @@ +import { purple, gray } from 'tailwindcss/colors'; +import { TreeView } from '@primer/react'; +import { FeatureFlags } from '@primer/react/experimental'; +import { navigate } from 'astro:transitions/client'; +import type { TreeNode as RawTreeNode } from './getTreeView'; +import { buildUrl } from '@utils/url-builder'; +import { getIconForCollection } from '@utils/collections/icons'; +import { useEffect, useState } from 'react'; +import type { CollectionKey } from 'astro:content'; + +type TreeNode = RawTreeNode & { isLabel?: true; isDefaultExpanded?: boolean }; + +function isCurrentNode(node: TreeNode, currentPathname: string) { + return currentPathname === node.href; +} + +function TreeNode({ node }: { node: TreeNode }) { + const Icon = getIconForCollection(node.type ?? ''); + const [isCurrent, setIsCurrent] = useState(document.location.pathname === node.href); + + useEffect(() => { + const abortCtrl = new AbortController(); + // prettier-ignore + document.addEventListener( + 'astro:page-load', + () => setIsCurrent(document.location.pathname === node.href), + { signal: abortCtrl.signal }, + ); + return () => abortCtrl.abort(); + }, [document, node]); + + return ( + navigate(node.href!)} + > + {!node?.isLabel && ( + + + + )} + {node.name} + {(node.children || []).length > 0 && ( + + {node.children!.map((childNode) => ( + + ))} + + )} + + ); +} + +export function SideNavTreeView({ tree }: { tree: TreeNode }) { + function bubbleUpExpanded(parentNode: TreeNode) { + if (isCurrentNode(parentNode, document.location.pathname)) return true; + return (parentNode.isDefaultExpanded = parentNode.children.some(bubbleUpExpanded)); + } + bubbleUpExpanded(tree); + + return ( + // NOTE: Enable the `primer_react_css_modules_ga` was needed to keep the + // styles between astro page transitions. Otherwise `TreeView` lose the styles. + + + + ); +} diff --git a/package.json b/package.json index 0379d4e5..71bc7dbc 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "@heroicons/react": "^2.1.3", "@iconify-json/logos": "^1.2.4", "@parcel/watcher": "^2.4.1", + "@primer/react": "37.11.2", "@stoplight/json-schema-viewer": "^4.16.4", "@tailwindcss/typography": "^0.5.13", "@tanstack/react-table": "^8.17.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c5ce442..37043acd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,9 @@ importers: '@parcel/watcher': specifier: ^2.4.1 version: 2.5.0 + '@primer/react': + specifier: 37.11.2 + version: 37.11.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)) '@stoplight/json-schema-viewer': specifier: ^4.16.4 version: 4.16.4(@babel/core@7.26.0)(@babel/template@7.25.9)(@stoplight/markdown-viewer@5.7.1(@stoplight/mosaic-code-viewer@1.53.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@stoplight/mosaic@1.53.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@stoplight/mosaic-code-viewer@1.53.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@stoplight/mosaic@1.53.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -333,6 +336,10 @@ packages: resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.26.5': resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} engines: {node: '>=6.9.0'} @@ -372,6 +379,12 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.25.9': resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} engines: {node: '>=6.9.0'} @@ -533,6 +546,18 @@ packages: '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emotion/is-prop-valid@1.3.1': + resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/stylis@0.8.5': + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + + '@emotion/unitless@0.7.5': + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -868,6 +893,12 @@ packages: '@fortawesome/fontawesome-svg-core': ~1 || ~6 react: '>=16.3' + '@github/relative-time-element@4.4.5': + resolution: {integrity: sha512-9ejPtayBDIJfEU8x1fg/w2o5mahHkkp1SC6uObDtoKs4Gn+2a1vNK8XIiNDD8rMeEfpvDjydgSZZ+uk+7N0VsQ==} + + '@github/tab-container-element@4.8.2': + resolution: {integrity: sha512-WkaM4mfs8x7dXRWEaDb5deC0OhH6sGQ5cw8i/sVw25gikl4f8C7mHj0kihL5k3eKIIqmGT1Fdswdoi+9ZLDpRA==} + '@headlessui/react@2.2.0': resolution: {integrity: sha512-RzCEg+LXsuI7mHiSomsu/gBJSjpupm6A1qIZ5sWjd7JhARNlMiSA4kKfJpCKwU9tE+zMRterhhrP74PvfJrpXQ==} engines: {node: '>=10'} @@ -1037,6 +1068,9 @@ packages: '@juggle/resize-observer@3.4.0': resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + '@lit-labs/react@1.2.1': + resolution: {integrity: sha512-DiZdJYFU0tBbdQkfwwRSwYyI/mcWkg3sWesKRsHUd4G+NekTmmeq9fzsurvcKTNVa0comNljwtg4Hvi1ds3V+A==} + '@lit-labs/ssr-dom-shim@1.3.0': resolution: {integrity: sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==} @@ -1067,6 +1101,9 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@oddbird/popover-polyfill@0.4.4': + resolution: {integrity: sha512-n9q0ZXYRct6aYmOjjF5E+i5i0RSjVCkoKDJWILzJAkDBk4jmWOAZFjQfExtcAiJa0buX/Lx/CzBdGgiSSAlbrw==} + '@openapi-contrib/openapi-schema-to-json-schema@3.2.0': resolution: {integrity: sha512-Gj6C0JwCr8arj0sYuslWXUBSP/KnUlEGnPW4qxlXvAl543oaNQgMgIgkQUA6vs5BCCvwTEiL8m/wdWzfl4UvSw==} @@ -1195,6 +1232,39 @@ packages: '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + '@primer/behaviors@1.8.0': + resolution: {integrity: sha512-ZUfhWVY4ZBKc2Fh3fIa2Qwwa3SnOi914lY5wcmN+UNtsBxeXsjWNwpohJbwRwWZm+nJ3C1n9qJFWpHuBlDVU1A==} + + '@primer/live-region-element@0.7.2': + resolution: {integrity: sha512-wdxCHfcJzE1IPPjZNFR4RTwRcSWb7TN0fRdMH5HcxphLEnuZBWy0TAxk3xPA+/6lwiN3uEJ+ZWV4UF/glXh43A==} + + '@primer/octicons-react@19.15.0': + resolution: {integrity: sha512-EwRnvR5bK44CoLo/Fq8cQrHzuWJf3FQb5jAoA0pacbCNOMsFiX5hXUVKSd/men1s9qEWNP2Hhthlt+bi8x4uzA==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.3' + + '@primer/primitives@10.3.4': + resolution: {integrity: sha512-f4tudg+MFpU4sH73Ha9wFOBwyN2b2WI7BkqMThqRIWQ/LFUturYkgt78YByJ6PJw8ZY0poPiefvBCdduyd20vA==} + + '@primer/react@37.11.2': + resolution: {integrity: sha512-HrVwMSqwjxzU42iIP2wDqTa+wNTbthJm8bZ0kgTDstNjG709Axd5yoKcZ3gs8G0m3ftKplKsxKDfQSmv1ePNqA==} + engines: {node: '>=12', npm: '>=7'} + peerDependencies: + '@types/react': ^18.0.0 + '@types/react-dom': ^18.0.0 + '@types/styled-components': ^5.1.11 + react: ^18.0.0 + react-dom: ^18.0.0 + styled-components: 5.x + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@types/styled-components': + optional: true + '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -1617,6 +1687,51 @@ packages: resolution: {integrity: sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w==} engines: {node: '>=10.8'} + '@styled-system/background@5.1.2': + resolution: {integrity: sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A==} + + '@styled-system/border@5.1.5': + resolution: {integrity: sha512-JvddhNrnhGigtzWRCVuAHepniyVi6hBlimxWDVAdcTuk7aRn9BYJUwfHslURtwYFsF5FoEs8Zmr1oZq2M1AP0A==} + + '@styled-system/color@5.1.2': + resolution: {integrity: sha512-1kCkeKDZkt4GYkuFNKc7vJQMcOmTl3bJY3YBUs7fCNM6mMYJeT1pViQ2LwBSBJytj3AB0o4IdLBoepgSgGl5MA==} + + '@styled-system/core@5.1.2': + resolution: {integrity: sha512-XclBDdNIy7OPOsN4HBsawG2eiWfCcuFt6gxKn1x4QfMIgeO6TOlA2pZZ5GWZtIhCUqEPTgIBta6JXsGyCkLBYw==} + + '@styled-system/css@5.1.5': + resolution: {integrity: sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==} + + '@styled-system/flexbox@5.1.2': + resolution: {integrity: sha512-6hHV52+eUk654Y1J2v77B8iLeBNtc+SA3R4necsu2VVinSD7+XY5PCCEzBFaWs42dtOEDIa2lMrgL0YBC01mDQ==} + + '@styled-system/grid@5.1.2': + resolution: {integrity: sha512-K3YiV1KyHHzgdNuNlaw8oW2ktMuGga99o1e/NAfTEi5Zsa7JXxzwEnVSDSBdJC+z6R8WYTCYRQC6bkVFcvdTeg==} + + '@styled-system/layout@5.1.2': + resolution: {integrity: sha512-wUhkMBqSeacPFhoE9S6UF3fsMEKFv91gF4AdDWp0Aym1yeMPpqz9l9qS/6vjSsDPF7zOb5cOKC3tcKKOMuDCPw==} + + '@styled-system/position@5.1.2': + resolution: {integrity: sha512-60IZfMXEOOZe3l1mCu6sj/2NAyUmES2kR9Kzp7s2D3P4qKsZWxD1Se1+wJvevb+1TP+ZMkGPEYYXRyU8M1aF5A==} + + '@styled-system/props@5.1.5': + resolution: {integrity: sha512-FXhbzq2KueZpGaHxaDm8dowIEWqIMcgsKs6tBl6Y6S0njG9vC8dBMI6WSLDnzMoSqIX3nSKHmOmpzpoihdDewg==} + + '@styled-system/shadow@5.1.2': + resolution: {integrity: sha512-wqniqYb7XuZM7K7C0d1Euxc4eGtqEe/lvM0WjuAFsQVImiq6KGT7s7is+0bNI8O4Dwg27jyu4Lfqo/oIQXNzAg==} + + '@styled-system/space@5.1.2': + resolution: {integrity: sha512-+zzYpR8uvfhcAbaPXhH8QgDAV//flxqxSjHiS9cDFQQUSznXMQmxJegbhcdEF7/eNnJgHeIXv1jmny78kipgBA==} + + '@styled-system/theme-get@5.1.2': + resolution: {integrity: sha512-afAYdRqrKfNIbVgmn/2Qet1HabxmpRnzhFwttbGr6F/mJ4RDS/Cmn+KHwHvNXangQsWw/5TfjpWV+rgcqqIcJQ==} + + '@styled-system/typography@5.1.2': + resolution: {integrity: sha512-BxbVUnN8N7hJ4aaPOd7wEsudeT7CxarR+2hns8XCX1zp0DFfbWw4xYa/olA0oQaqx7F1hzDg+eRaGzAJbF+jOg==} + + '@styled-system/variant@5.1.5': + resolution: {integrity: sha512-Yn8hXAFoWIro8+Q5J8YJd/mP85Teiut3fsGVR9CAxwgNfIAiqlYxsk5iHU7VHJks/0KjL4ATSjmbtCDC/4l1qw==} + '@swagger-api/apidom-ast@1.0.0-beta.6': resolution: {integrity: sha512-AAxEN/xTcH/ORpn/zEEuPPgtqX6/Q9EZC8RX2R7AlRdUeGZieE9OZ91mXYrg48FcHWi/xwWYqkPPHjyXTQkfww==} @@ -1943,6 +2058,9 @@ packages: peerDependencies: '@types/react': ^18.0.0 + '@types/react-is@18.3.1': + resolution: {integrity: sha512-zts4lhQn5ia0cF/y2+3V6Riu0MAfez9/LJYavdM8TvcVl+S91A/7VWxyBT8hbRuWspmuCaiGI0F41OJYGrKhRA==} + '@types/react@17.0.83': resolution: {integrity: sha512-l0m4ArKJvmFtR4e8UmKrj1pB4tUgOhJITf+mADyF/p69Ts1YAR/E+G9XEM0mHXKVRa1dQNHseyyDNzeuAXfXQw==} @@ -1955,6 +2073,15 @@ packages: '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/styled-system@5.1.23': + resolution: {integrity: sha512-mIwCCdhDa2ifdQCEm8ZeD8m4UEbFsokqEoT9YNOUv4alUJ8jbMKxvpr+oOwfuZgwqLh5HjWuEzwnX7DzWvjFBg==} + + '@types/styled-system__css@5.0.21': + resolution: {integrity: sha512-8S1lPbUbrE8U/2btqjh9X6pK9//kQdbQDe9z3vQl4SWtxtqoAVnrFZE6Xs+IHM7NMZ1uC68XrF9nLdzRHm3VyA==} + + '@types/styled-system__theme-get@5.0.4': + resolution: {integrity: sha512-dbzwxQ+8x6Bo3EKZMo9M3Knzo77ukwoC/isKW+GAuF5TenXlPkvgzx4t4+Lp0+fKs2M4owSef0KO3gtGW3Hpkw==} + '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -2203,6 +2330,11 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + babel-plugin-styled-components@2.1.4: + resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} + peerDependencies: + styled-components: '>= 2' + bail@1.0.5: resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} @@ -2288,6 +2420,9 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + caniuse-lite@1.0.30001692: resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==} @@ -2396,6 +2531,9 @@ packages: color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color2k@2.0.3: + resolution: {integrity: sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog==} + color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} @@ -2481,6 +2619,10 @@ packages: crossws@0.3.1: resolution: {integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw==} + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + css-in-js-utils@3.1.0: resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} @@ -2490,6 +2632,9 @@ packages: css-selector-parser@3.0.5: resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + css-tree@1.1.3: resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} engines: {node: '>=8.0.0'} @@ -3017,6 +3162,9 @@ packages: fnv-plus@1.3.1: resolution: {integrity: sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw==} + focus-visible@5.2.1: + resolution: {integrity: sha512-8Bx950VD1bWTQJEH/AM6SpEk+SU55aVnp4Ujhuuxy3eMEBCRwBnTBnVXr9YAPvZL3/CNjCa8u4IWfNmEO53whA==} + follow-redirects@1.15.9: resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} @@ -3160,6 +3308,10 @@ packages: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3262,6 +3414,9 @@ packages: resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} engines: {node: '>=12.0.0'} + history@5.3.0: + resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} + hogan.js@3.0.2: resolution: {integrity: sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==} hasBin: true @@ -3269,6 +3424,9 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hsluv@1.0.1: + resolution: {integrity: sha512-zCaFTiDqBLQjCCFBu0qg7z9ASYPd+Bxx2GDCVZJsnehjK80S+jByqhuFz0pCd2Aw3FSKr18AWbRlwnKR0YdizQ==} + html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -3725,6 +3883,13 @@ packages: lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + + lodash.isempty@4.4.0: + resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==} + + lodash.isobject@3.0.2: + resolution: {integrity: sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==} lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} @@ -4660,9 +4825,21 @@ packages: react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + react-intersection-observer@9.15.1: + resolution: {integrity: sha512-vGrqYEVWXfH+AGu241uzfUpNK4HAdhCkSAyFdkMb9VWWXs6mxzBLpWCxEy9YcnDNY2g9eO6z7qUtTBdA9hc8pA==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react-dom: + optional: true + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-overflow-list@0.5.0: resolution: {integrity: sha512-+UegukgQ10E4ll3txz4DJyrnCgZ3eDVuv5dvR8ziyG5FfgCDZcUKeKhIgbU90oyqQa21aH4oLOoGKt0TiYJRmg==} engines: {node: '>=10'} @@ -4945,6 +5122,9 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + sharp@0.33.5: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -5111,6 +5291,17 @@ packages: style-to-object@1.0.8: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + styled-components@5.3.11: + resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' + + styled-system@5.1.5: + resolution: {integrity: sha512-7VoD0o2R3RKzOzPK0jYrVnS8iJdfkKsQJNiLRDjikOpQVqQHns/DXWaPZOH4tIKkhAT7I6wIsy9FWTWh2X3q+A==} + stylis@4.3.4: resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==} @@ -5122,6 +5313,10 @@ packages: suf-log@2.5.3: resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -6137,7 +6332,7 @@ snapshots: '@astrojs/telemetry@3.2.0': dependencies: ci-info: 4.1.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) dlv: 1.1.3 dset: 3.1.4 is-docker: 3.0.0 @@ -6243,10 +6438,10 @@ snapshots: '@babel/helpers': 7.26.0 '@babel/parser': 7.26.5 '@babel/template': 7.25.9 - '@babel/traverse': 7.26.5 + '@babel/traverse': 7.26.5(supports-color@5.5.0) '@babel/types': 7.26.5 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -6261,6 +6456,10 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.26.5 + '@babel/helper-compilation-targets@7.26.5': dependencies: '@babel/compat-data': 7.26.5 @@ -6269,9 +6468,9 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-module-imports@7.25.9': + '@babel/helper-module-imports@7.25.9(supports-color@5.5.0)': dependencies: - '@babel/traverse': 7.26.5 + '@babel/traverse': 7.26.5(supports-color@5.5.0) '@babel/types': 7.26.5 transitivePeerDependencies: - supports-color @@ -6279,9 +6478,9 @@ snapshots: '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9 + '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.5 + '@babel/traverse': 7.26.5(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -6302,6 +6501,11 @@ snapshots: dependencies: '@babel/types': 7.26.5 + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -6327,14 +6531,14 @@ snapshots: '@babel/parser': 7.26.5 '@babel/types': 7.26.5 - '@babel/traverse@7.26.5': + '@babel/traverse@7.26.5(supports-color@5.5.0)': dependencies: '@babel/code-frame': 7.26.2 '@babel/generator': 7.26.5 '@babel/parser': 7.26.5 '@babel/template': 7.25.9 '@babel/types': 7.26.5 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -6555,6 +6759,16 @@ snapshots: tslib: 2.8.1 optional: true + '@emotion/is-prop-valid@1.3.1': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/stylis@0.8.5': {} + + '@emotion/unitless@0.7.5': {} + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -6761,6 +6975,10 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 + '@github/relative-time-element@4.4.5': {} + + '@github/tab-container-element@4.8.2': {} + '@headlessui/react@2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react': 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -6785,7 +7003,7 @@ snapshots: '@antfu/install-pkg': 0.4.1 '@antfu/utils': 0.7.10 '@iconify/types': 2.0.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) globals: 15.14.0 kolorist: 1.8.0 local-pkg: 0.5.1 @@ -6908,6 +7126,8 @@ snapshots: '@juggle/resize-observer@3.4.0': {} + '@lit-labs/react@1.2.1': {} + '@lit-labs/ssr-dom-shim@1.3.0': {} '@lit/reactive-element@2.0.4': @@ -6976,6 +7196,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.18.0 + '@oddbird/popover-polyfill@0.4.4': {} + '@openapi-contrib/openapi-schema-to-json-schema@3.2.0': dependencies: fast-deep-equal: 3.1.3 @@ -7068,6 +7290,53 @@ snapshots: '@polka/url@1.0.0-next.28': {} + '@primer/behaviors@1.8.0': {} + + '@primer/live-region-element@0.7.2': + dependencies: + '@lit-labs/ssr-dom-shim': 1.3.0 + + '@primer/octicons-react@19.15.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@primer/primitives@10.3.4': {} + + '@primer/react@37.11.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))': + dependencies: + '@github/relative-time-element': 4.4.5 + '@github/tab-container-element': 4.8.2 + '@lit-labs/react': 1.2.1 + '@oddbird/popover-polyfill': 0.4.4 + '@primer/behaviors': 1.8.0 + '@primer/live-region-element': 0.7.2 + '@primer/octicons-react': 19.15.0(react@18.3.1) + '@primer/primitives': 10.3.4 + '@styled-system/css': 5.1.5 + '@styled-system/props': 5.1.5 + '@styled-system/theme-get': 5.1.2 + '@types/react-is': 18.3.1 + '@types/styled-system': 5.1.23 + '@types/styled-system__css': 5.0.21 + '@types/styled-system__theme-get': 5.0.4 + clsx: 1.2.1 + color2k: 2.0.3 + deepmerge: 4.3.1 + focus-visible: 5.2.1 + history: 5.3.0 + hsluv: 1.0.1 + lodash.isempty: 4.4.0 + lodash.isobject: 3.0.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-intersection-observer: 9.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-is: 18.3.1 + styled-components: 5.3.11(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) + styled-system: 5.1.5 + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@protobufjs/aspromise@1.1.2': {} '@protobufjs/base64@1.1.2': {} @@ -7171,7 +7440,7 @@ snapshots: '@react-types/button@3.4.1(react@18.3.1)': dependencies: - '@react-types/shared': 3.9.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@react-types/checkbox@3.9.0(react@18.3.1)': @@ -7181,7 +7450,7 @@ snapshots: '@react-types/radio@3.1.2(react@18.3.1)': dependencies: - '@react-types/shared': 3.9.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@react-types/shared@3.26.0(react@18.3.1)': @@ -7195,12 +7464,12 @@ snapshots: '@react-types/switch@3.1.2(react@18.3.1)': dependencies: '@react-types/checkbox': 3.9.0(react@18.3.1) - '@react-types/shared': 3.9.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@react-types/textfield@3.3.0(react@18.3.1)': dependencies: - '@react-types/shared': 3.9.0(react@18.3.1) + '@react-types/shared': 3.26.0(react@18.3.1) react: 18.3.1 '@rehooks/component-size@1.0.3(react@18.3.1)': @@ -7664,6 +7933,65 @@ snapshots: '@stoplight/yaml-ast-parser': 0.0.50 tslib: 2.8.1 + '@styled-system/background@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/border@5.1.5': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/color@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/core@5.1.2': + dependencies: + object-assign: 4.1.1 + + '@styled-system/css@5.1.5': {} + + '@styled-system/flexbox@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/grid@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/layout@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/position@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/props@5.1.5': + dependencies: + styled-system: 5.1.5 + + '@styled-system/shadow@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/space@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/theme-get@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/typography@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/variant@5.1.5': + dependencies: + '@styled-system/core': 5.1.2 + '@styled-system/css': 5.1.5 + '@swagger-api/apidom-ast@1.0.0-beta.6': dependencies: '@babel/runtime-corejs3': 7.26.0 @@ -8268,6 +8596,10 @@ snapshots: dependencies: '@types/react': 18.3.18 + '@types/react-is@18.3.1': + dependencies: + '@types/react': 18.3.18 + '@types/react@17.0.83': dependencies: '@types/prop-types': 15.7.14 @@ -8283,6 +8615,16 @@ snapshots: '@types/semver@7.5.8': {} + '@types/styled-system@5.1.23': + dependencies: + csstype: 3.1.3 + + '@types/styled-system__css@5.0.21': + dependencies: + csstype: 3.1.3 + + '@types/styled-system__theme-get@5.0.4': {} + '@types/trusted-types@2.0.7': {} '@types/unist@2.0.11': {} @@ -8550,7 +8892,7 @@ snapshots: common-ancestor-path: 1.0.1 cookie: 0.7.2 cssesc: 3.0.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) deterministic-object-hash: 2.0.2 devalue: 5.1.1 diff: 5.2.0 @@ -8657,6 +8999,18 @@ snapshots: axobject-query@4.1.0: {} + babel-plugin-styled-components@2.1.4(@babel/core@7.26.0)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0): + dependencies: + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.11(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) + transitivePeerDependencies: + - '@babel/core' + - supports-color + bail@1.0.5: {} bail@2.0.2: {} @@ -8743,6 +9097,8 @@ snapshots: camelcase@8.0.0: {} + camelize@1.0.1: {} + caniuse-lite@1.0.30001692: {} ccount@1.1.0: {} @@ -8846,6 +9202,8 @@ snapshots: simple-swizzle: 0.2.2 optional: true + color2k@2.0.3: {} + color@4.2.3: dependencies: color-convert: 2.0.1 @@ -8933,6 +9291,8 @@ snapshots: dependencies: uncrypto: 0.1.3 + css-color-keywords@1.0.0: {} + css-in-js-utils@3.1.0: dependencies: hyphenate-style-name: 1.1.0 @@ -8941,6 +9301,12 @@ snapshots: css-selector-parser@3.0.5: {} + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + css-tree@1.1.3: dependencies: mdn-data: 2.0.14 @@ -9173,9 +9539,11 @@ snapshots: dayjs@1.11.13: {} - debug@4.4.0: + debug@4.4.0(supports-color@5.5.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 decimal.js@10.4.3: {} @@ -9579,6 +9947,8 @@ snapshots: fnv-plus@1.3.1: {} + focus-visible@5.2.1: {} + follow-redirects@1.15.9: {} for-each@0.3.3: @@ -9736,6 +10106,8 @@ snapshots: has-bigints@1.1.0: {} + has-flag@3.0.0: {} + has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -9980,6 +10352,10 @@ snapshots: highlight.js@11.9.0: optional: true + history@5.3.0: + dependencies: + '@babel/runtime': 7.26.0 + hogan.js@3.0.2: dependencies: mkdirp: 0.3.0 @@ -9989,6 +10365,8 @@ snapshots: dependencies: react-is: 16.13.1 + hsluv@1.0.1: {} + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -10006,14 +10384,14 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -10398,6 +10776,10 @@ snapshots: lodash.get@4.4.2: {} + lodash.isempty@4.4.0: {} + + lodash.isobject@3.0.2: {} + lodash.isplainobject@4.0.6: {} lodash.merge@4.6.2: {} @@ -11309,7 +11691,7 @@ snapshots: micromark@2.11.4: dependencies: - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) parse-entities: 2.0.0 transitivePeerDependencies: - supports-color @@ -11317,7 +11699,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -11339,7 +11721,7 @@ snapshots: micromark@4.0.1: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.2 @@ -11828,8 +12210,16 @@ snapshots: react-fast-compare@3.2.2: {} + react-intersection-observer@9.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + react-is@16.13.1: {} + react-is@18.3.1: {} + react-overflow-list@0.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 @@ -12265,6 +12655,8 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.0.0 + shallowequal@1.1.0: {} + sharp@0.33.5: dependencies: color: 4.2.3 @@ -12476,6 +12868,40 @@ snapshots: dependencies: inline-style-parser: 0.2.4 + styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1): + dependencies: + '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.26.5(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.3.1 + '@emotion/stylis': 0.8.5 + '@emotion/unitless': 0.7.5 + babel-plugin-styled-components: 2.1.4(@babel/core@7.26.0)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0) + css-to-react-native: 3.2.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + shallowequal: 1.1.0 + supports-color: 5.5.0 + transitivePeerDependencies: + - '@babel/core' + + styled-system@5.1.5: + dependencies: + '@styled-system/background': 5.1.2 + '@styled-system/border': 5.1.5 + '@styled-system/color': 5.1.2 + '@styled-system/core': 5.1.2 + '@styled-system/flexbox': 5.1.2 + '@styled-system/grid': 5.1.2 + '@styled-system/layout': 5.1.2 + '@styled-system/position': 5.1.2 + '@styled-system/shadow': 5.1.2 + '@styled-system/space': 5.1.2 + '@styled-system/typography': 5.1.2 + '@styled-system/variant': 5.1.5 + object-assign: 4.1.1 + stylis@4.3.4: {} sucrase@3.35.0: @@ -12492,6 +12918,10 @@ snapshots: dependencies: s.color: 0.0.15 + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -12663,7 +13093,7 @@ snapshots: cac: 6.7.14 chokidar: 4.0.3 consola: 3.3.3 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) esbuild: 0.24.2 joycon: 3.1.1 picocolors: 1.1.1 @@ -12998,7 +13428,7 @@ snapshots: vite-node@2.1.6(@types/node@20.17.12)(jiti@1.21.7)(yaml@2.7.0): dependencies: cac: 6.7.14 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) es-module-lexer: 1.6.0 pathe: 1.1.2 vite: 6.0.7(@types/node@20.17.12)(jiti@1.21.7)(yaml@2.7.0) @@ -13018,7 +13448,7 @@ snapshots: vite-tsconfig-paths@4.3.2(typescript@5.7.3)(vite@6.0.7(@types/node@20.17.12)(jiti@1.21.7)(yaml@2.7.0)): dependencies: - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.7.3) optionalDependencies: @@ -13052,7 +13482,7 @@ snapshots: '@vitest/spy': 2.1.6 '@vitest/utils': 2.1.6 chai: 5.1.2 - debug: 4.4.0 + debug: 4.4.0(supports-color@5.5.0) expect-type: 1.1.0 magic-string: 0.30.17 pathe: 1.1.2 From d534b6d7d72d35c36b8af0a5ee9064e5cc0c138b Mon Sep 17 00:00:00 2001 From: carlosallexandre Date: Mon, 10 Feb 2025 11:17:36 -0300 Subject: [PATCH 04/17] feat(core): add sidebar type config It lets the user choose between the sidebar type they want. The options are 'FLAT_VIEW' or 'TREE_VIEW'. The 'FLAT_VIEW' is the default type. --- eventcatalog/src/components/SideNav/SideNav.astro | 11 +++++++---- .../src/components/SideNav/TreeView/getTreeView.ts | 4 ++-- examples/default/eventcatalog.config.js | 1 + src/eventcatalog.config.ts | 4 ++++ 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/eventcatalog/src/components/SideNav/SideNav.astro b/eventcatalog/src/components/SideNav/SideNav.astro index ce08e148..de442a8d 100644 --- a/eventcatalog/src/components/SideNav/SideNav.astro +++ b/eventcatalog/src/components/SideNav/SideNav.astro @@ -1,5 +1,6 @@ --- import type { HTMLAttributes } from 'astro/types'; +import EcConfig from '@config'; // FlatView import CatalogResourcesSideBar from './CatalogResourcesSideBar'; import { getCatalogResources } from './CatalogResourcesSideBar/getCatalogResources'; @@ -11,11 +12,13 @@ interface Props extends Omit, 'children'> {} const currentPath = Astro.url.pathname; -// const sideNav = await getCatalogResources({ currentPath }); -const tree = getTreeView({ projectDir: process.env.PROJECT_DIR!, currentPath }); +let props; +const SIDENAV_TYPE = EcConfig?.docs?.sidebar?.type ?? 'FLAT_VIEW'; +if (SIDENAV_TYPE === 'FLAT_VIEW') props = await getCatalogResources({ currentPath }); +else if (SIDENAV_TYPE === 'TREE_VIEW') props = getTreeView({ projectDir: process.env.PROJECT_DIR!, currentPath }); ---
- - + {SIDENAV_TYPE === 'FLAT_VIEW' && } + {SIDENAV_TYPE === 'TREE_VIEW' && }
diff --git a/eventcatalog/src/components/SideNav/TreeView/getTreeView.ts b/eventcatalog/src/components/SideNav/TreeView/getTreeView.ts index eb7a6dfe..2a5931b0 100644 --- a/eventcatalog/src/components/SideNav/TreeView/getTreeView.ts +++ b/eventcatalog/src/components/SideNav/TreeView/getTreeView.ts @@ -121,7 +121,7 @@ function groupByType(parentNode: TreeNode) { }); } -export function getTreeView({ projectDir, currentPath }: { projectDir: string; currentPath: string }): TreeNode[] { +export function getTreeView({ projectDir, currentPath }: { projectDir: string; currentPath: string }): TreeNode { const basePathname = currentPath.split('/')[1] as 'docs' | 'visualiser'; const rootNode: TreeNode = { id: '/', @@ -135,5 +135,5 @@ export function getTreeView({ projectDir, currentPath }: { projectDir: string; c ignore: basePathname === 'visualiser' ? ['teams', 'users', 'channels'] : undefined, }); groupByType(rootNode); - return rootNode.children; + return rootNode; } diff --git a/examples/default/eventcatalog.config.js b/examples/default/eventcatalog.config.js index a0f65847..bb42d5e2 100644 --- a/examples/default/eventcatalog.config.js +++ b/examples/default/eventcatalog.config.js @@ -16,6 +16,7 @@ export default { trailingSlash: false, docs: { sidebar: { + type: 'TREE_VIEW', services: { visible: true, }, diff --git a/src/eventcatalog.config.ts b/src/eventcatalog.config.ts index 91e5cbb2..cf24d1b7 100644 --- a/src/eventcatalog.config.ts +++ b/src/eventcatalog.config.ts @@ -28,6 +28,10 @@ export interface Config { mdxOptimize?: boolean; docs: { sidebar: { + /** + * @default 'FLAT_VIEW' + */ + type?: 'FLAT_VIEW' | 'TREE_VIEW'; showPageHeadings: true; services?: SideBarConfig; messages?: SideBarConfig; From de4a4802dd484feb38d4fbb2191e4ea6f39d2ce0 Mon Sep 17 00:00:00 2001 From: David Boyne Date: Mon, 10 Feb 2025 15:52:16 +0000 Subject: [PATCH 05/17] update to styles --- .../SideNav/CatalogResourcesSideBar/index.tsx | 2 +- .../SideNav/TreeView/getTreeView.ts | 11 +++++++++- .../src/components/SideNav/TreeView/index.tsx | 21 ++++++++++++------- .../src/layouts/VerticalSideBarLayout.astro | 2 +- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/eventcatalog/src/components/SideNav/CatalogResourcesSideBar/index.tsx b/eventcatalog/src/components/SideNav/CatalogResourcesSideBar/index.tsx index 0392275b..f3f3d19f 100644 --- a/eventcatalog/src/components/SideNav/CatalogResourcesSideBar/index.tsx +++ b/eventcatalog/src/components/SideNav/CatalogResourcesSideBar/index.tsx @@ -75,7 +75,7 @@ const CatalogResourcesSideBar: React.FC = ({ resou if (!isInitialized) return null; return ( -