diff --git a/app/components/AsciidocBlocks/Document.tsx b/app/components/AsciidocBlocks/Document.tsx index 8838960..7a73802 100644 --- a/app/components/AsciidocBlocks/Document.tsx +++ b/app/components/AsciidocBlocks/Document.tsx @@ -5,173 +5,23 @@ * * Copyright Oxide Computer Company */ +import { useDelegatedReactRouterLinks } from '@oxide/design-system/components/dist' +import { Content, type DocumentBlock } from '@oxide/react-asciidoc' +import { useRef } from 'react' -import { Content, type AdocTypes } from '@oxide/react-asciidoc' -import { Link, useLocation } from '@remix-run/react' -import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import tunnel from 'tunnel-rat' - -import { isTruthy } from '~/utils/isTruthy' - -import Container from '../Container' -import { GotoIcon } from '../CustomIcons' -import { - DesktopOutline, - generateTableOfContents, - SmallScreenOutline, - useActiveSectionTracking, - useIntersectionObserver, -} from '../TableOfContents' - -export const ui = tunnel() - -const CustomDocument = ({ document }: { document: AdocTypes.Document }) => { - const [titleEl, setTitleEl] = useState(null) - const bodyRef = useRef(null) - const [activeItem, setActiveItem] = useState('') - - const toc = useMemo(() => generateTableOfContents(document.getSections()), [document]) - - const { pathname, hash } = useLocation() - - const onActiveElementUpdate = useCallback( - (el: Element | null) => { - setActiveItem(el?.id || '') - // history.replaceState({}, '', el ? `#${el.id}` : window.location.pathname) - }, - [setActiveItem], - ) - - // Connect handlers for managing the active (visible section) of the page - const { setSections } = useActiveSectionTracking([], onActiveElementUpdate) - - // Add handler for resetting back to the empty state when the top of the page is reached. - useIntersectionObserver( - useMemo(() => [titleEl].filter(isTruthy), [titleEl]), - useCallback( - (entries) => entries[0].isIntersecting && onActiveElementUpdate(null), - [onActiveElementUpdate], - ), - useMemo(() => ({ rootMargin: '0px 0px -80% 0px' }), []), - ) - - useEffect(() => { - let headings = toc - .filter((item) => item.level <= 2) - .map((item) => { - // wrap in try catch because sometimes heading IDs don't make valid - // selectors, so rather than blowing up, we just ignore them - try { - return bodyRef.current?.querySelector(`#${item.id}`) - } catch (e) { - return null - } - }) - .filter(isTruthy) - - setSections(headings) - }, [toc, setSections]) - - const blocks = document.getBlocks() - const title = (document.getDocumentTitle() || '').toString() - - const [footnotes, setFootnotes] = useState() - - useMemo(() => { - if (blocks || blocks[0]) { - setFootnotes(document.getFootnotes()) - } - }, [document, blocks]) - - const Footnotes = () => { - if (!footnotes) return null - - if ( - footnotes.length > 0 && - blocks && - !blocks[0].getDocument().hasAttribute('nofootnotes') - ) { - return ( -
- -
- Footnotes -
- -
    - {footnotes.map((footnote) => ( -
  • -
    - {footnote.getIndex()} -
    -
    -

    {' '} - - - - View - - -

    -
  • - ))} -
-
-
- ) - } else { - return null - } - } +const CustomDocument = ({ document }: { document: DocumentBlock }) => { + let ref = useRef(null) + useDelegatedReactRouterLinks(ref, document.title) return ( - <> - - {/* - Blank element at the top of the page to use to reset - the selected section in the table of contents - */} -
-
-
- -
-
- - -
-
- - - - +
+ +
) } -export default CustomDocument +export { CustomDocument } diff --git a/app/components/AsciidocBlocks/Footnotes.tsx b/app/components/AsciidocBlocks/Footnotes.tsx new file mode 100644 index 0000000..09a01c7 --- /dev/null +++ b/app/components/AsciidocBlocks/Footnotes.tsx @@ -0,0 +1,64 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright Oxide Computer Company + */ +import { type DocumentBlock } from '@oxide/react-asciidoc' +import { Link } from '@remix-run/react' + +import Container from '../Container' +import { GotoIcon } from '../CustomIcons' + +const Footnotes = ({ doc }: { doc: DocumentBlock }) => { + if (!doc.footnotes) return null + + if (doc.footnotes.length > 0 && doc.blocks && !doc.attributes['nofootnotes']) { + return ( +
+ +
+ Footnotes +
+ +
    + {doc.footnotes.map((footnote) => ( +
  • +
    + {footnote.index} +
    +
    +

    {' '} + + + + View + + +

    +
  • + ))} +
+
+
+ ) + } else { + return null + } +} + +export default Footnotes diff --git a/app/components/AsciidocBlocks/Image.tsx b/app/components/AsciidocBlocks/Image.tsx index c0c2a59..6538704 100644 --- a/app/components/AsciidocBlocks/Image.tsx +++ b/app/components/AsciidocBlocks/Image.tsx @@ -7,20 +7,15 @@ */ import * as Ariakit from '@ariakit/react' -import { CaptionedTitle, type AdocTypes } from '@oxide/react-asciidoc' +import { type Block, type Inline } from '@asciidoctor/core' +import { Title, useConverterContext, type ImageBlock } from '@oxide/react-asciidoc' import { useState } from 'react' -function nodeIsInline(node: AdocTypes.Block | AdocTypes.Inline): node is AdocTypes.Inline { +function nodeIsInline(node: Block | Inline): node is Inline { return node.isInline() } -const Image = ({ - node, - hasLightbox = true, -}: { - node: AdocTypes.Block | AdocTypes.Inline - hasLightbox?: boolean -}) => { +const InlineImage = ({ node }: { node: Block | Inline }) => { const documentAttrs = node.getDocument().getAttributes() let target = '' @@ -33,8 +28,6 @@ const Image = ({ let uri = node.getImageUri(target) let url = '' - const [lightboxOpen, setLightboxOpen] = useState(false) - url = `/rfd/image/${documentAttrs.rfdnumber}/${uri}` let img = ( @@ -43,7 +36,6 @@ const Image = ({ alt={node.getAttribute('alt')} width={node.getAttribute('width')} height={node.getAttribute('height')} - className={node.isBlock() && hasLightbox ? '1000:cursor-zoom-in' : ''} /> ) @@ -55,51 +47,76 @@ const Image = ({ ) } - if (nodeIsInline(node)) { - return ( - + return ( +
+ {img} +
+ ) +} + +const Image = ({ node }: { node: ImageBlock }) => { + const { document } = useConverterContext() + const docAttrs = document.attributes || {} + + let url = '' + + const [lightboxOpen, setLightboxOpen] = useState(false) + + url = `/rfd/image/${docAttrs.rfdnumber}/${node.imageUri}` + + let img = ( + {node.attributes['alt'].toString()} + ) + + if (node.attributes['link']) { + img = ( + {img} -
- ) - } else { - return ( - <> -
setLightboxOpen(true)} - > -
{img}
- -
- {hasLightbox && ( - setLightboxOpen(false)} - className="fixed [&_img]:mx-auto" - backdrop={
} - > - - {node.getAttribute('alt')} - - - )} - + ) } + + return ( + <> +
setLightboxOpen(true)} + > +
{img}
+ + </div> + <Ariakit.Dialog + open={lightboxOpen} + onClose={() => setLightboxOpen(false)} + className="fixed [&_img]:mx-auto" + backdrop={<div className="backdrop" />} + > + <Ariakit.DialogDismiss className="fixed left-1/2 top-1/2 flex h-full w-full -translate-x-1/2 -translate-y-1/2 cursor-zoom-out p-20"> + <img + src={url} + className={`max-h-full max-w-full rounded object-contain`} + alt={node.attributes['alt'].toString()} + /> + </Ariakit.DialogDismiss> + </Ariakit.Dialog> + </> + ) } -export default Image +export { Image, InlineImage } diff --git a/app/components/AsciidocBlocks/Listing.tsx b/app/components/AsciidocBlocks/Listing.tsx index b92f9ae..7b96274 100644 --- a/app/components/AsciidocBlocks/Listing.tsx +++ b/app/components/AsciidocBlocks/Listing.tsx @@ -5,129 +5,36 @@ * * Copyright Oxide Computer Company */ - -import { - CaptionedTitle, - getContent, - getLineNumber, - type AdocTypes, -} from '@oxide/react-asciidoc' +import { Title, useConverterContext, type LiteralBlock } from '@oxide/react-asciidoc' import cn from 'classnames' -import hljs from 'highlight.js' -import { decode } from 'html-entities' import Mermaid from './Mermaid' -// Custom highlight.js language definition to support TLA+ -// Reference: https://github.com/highlightjs/highlight.js/pull/1658 -hljs.registerLanguage('tla', function (hljs) { - return { - keywords: { - keyword: - 'ASSUME ASSUMPTION AXIOM BOOLEAN CASE CONSTANT CONSTANTS ELSE EXCEPT EXTENDS FALSE ' + - 'IF IN INSTANCE LET LOCAL MODULE OTHER STRING THEN THEOREM LEMMA PROPOSITION COROLLARY ' + - 'TRUE VARIABLE VARIABLES WITH CHOOSE ENABLED UNCHANGED SUBSET UNION DOMAIN BY OBVIOUS ' + - 'HAVE QED TAKE DEF HIDE RECURSIVE USE DEFINE PROOF WITNESS PICK DEFS PROVE SUFFICES ' + - 'NEW LAMBDA STATE ACTION TEMPORAL ONLY OMITTED ', - }, - contains: [ - hljs.QUOTE_STRING_MODE, - hljs.COMMENT('\\(\\*', '\\*\\)'), - hljs.COMMENT('\\\\\\*', '$'), - hljs.C_NUMBER_MODE, - { begin: /\/\\/ }, // relevance booster - ], - } -}) - -hljs.registerLanguage('oxql', function (hljs) { - return { - keywords: { - keyword: 'get join align filter group_by', - }, - contains: [ - hljs.QUOTE_STRING_MODE, - { - // 30s, 20m, etc - className: 'number', - match: /\d+[smhdw]/, - relevance: 0, - }, - { - // 2024-05-27T00:00:00 - className: 'number', - match: /@\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/, - relevance: 0, - }, - { - // @now() - className: 'number', - match: /@now\(\)/, - relevance: 0, - }, - hljs.C_NUMBER_MODE, - ], - } -}) - -// Inspired by the HTML5 listing convert function -// https://github.com/asciidoctor/asciidoctor/blob/82c5044d1ae5a45a83a8c82d26d5b5b86fcbc179/lib/asciidoctor/converter/html5.rb#L653-L678 -const Listing = ({ node }: { node: AdocTypes.Block }) => { - const document = node.getDocument() - const attrs = node.getAttributes() - const nowrap = node.isOption('nowrap') || !document.hasAttribute('prewrap') - const content = getContent(node) - - // Replace callouts with placeholders - const replaceCallouts = (content: string) => { - const calloutRegex = /<i class="conum" data-value="\d+"><\/i>/g - const callouts: string[] = [] - let placeholderContent = content.replace(calloutRegex, (match) => { - callouts.push(match) - return `__CALLOUT_PLACEHOLDER_${callouts.length - 1}__` - }) - return { placeholderContent, callouts } - } - - // Restore callouts from placeholders - const restoreCallouts = (highlightedContent: string, callouts: string[]) => { - return highlightedContent.replace( - /__CALLOUT_PLACEHOLDER_(\d+)__/g, - (_, index) => callouts[parseInt(index)], - ) - } +const Listing = ({ node }: { node: LiteralBlock }) => { + const { document } = useConverterContext() - // If we are highlighting we want the content to be decoded, since - // highlight.js will want the original content with tags included - // which it will then encode after highlighting. - // Otherwise let's just use the original content which comes from - // asciidoctor.js encoded. - const lang = attrs.language + const docAttrs = document.attributes || {} + const nowrap = node.attributes.nowrap || docAttrs['prewrap'] === undefined - const { placeholderContent, callouts } = replaceCallouts(content) + if (node.style === 'source') { + const lang = node.language - // Listing blocks of style `source` are source code, should have their syntax - // highlighted (where we have language support) and be inside both a `pre` and `code` tag - if (node.getStyle() === 'source') { return ( - <div className="listingblock" {...getLineNumber(node)}> - <CaptionedTitle node={node} /> + <div + className="listingblock" + {...(node.lineNumber ? { 'data-lineno': node.lineNumber } : {})} + > + <Title text={node.title} /> <div className="content"> <pre className={cn('highlight', nowrap ? ' nowrap' : '')}> {lang && lang === 'mermaid' ? ( - <Mermaid content={decode(content)} /> + <Mermaid content={node.source || ''} /> ) : ( <code - className={`language-${lang || ''}`} - data-lang={lang} + className={lang && `language-${lang}`} + data-lang={lang || undefined} dangerouslySetInnerHTML={{ - __html: - (hljs.getLanguage(lang) && - restoreCallouts( - hljs.highlight(placeholderContent, { language: lang }).value, - callouts, - )) || - restoreCallouts(placeholderContent, callouts), + __html: node.content || '', }} /> )} @@ -138,13 +45,16 @@ const Listing = ({ node }: { node: AdocTypes.Block }) => { } else { // Regular listing blocks are wrapped only in a `pre` tag return ( - <div className="listingblock" {...getLineNumber(node)}> - <CaptionedTitle node={node} /> + <div + className="listingblock" + {...(node.lineNumber ? { 'data-lineno': node.lineNumber } : {})} + > + <Title text={node.title} /> <div className="content"> <pre className={cn('highlight !block', nowrap ? 'nowrap' : '')} dangerouslySetInnerHTML={{ - __html: restoreCallouts(placeholderContent, callouts), + __html: node.content || '', }} /> </div> diff --git a/app/components/AsciidocBlocks/Mermaid.tsx b/app/components/AsciidocBlocks/Mermaid.tsx index 0d6d8a5..b5f23d5 100644 --- a/app/components/AsciidocBlocks/Mermaid.tsx +++ b/app/components/AsciidocBlocks/Mermaid.tsx @@ -31,7 +31,7 @@ const Mermaid = memo(function Mermaid({ content }: { content: string }) { className="absolute right-2 top-2 text-mono-xs text-tertiary" onClick={() => setShowSource(!showSource)} > - {showSource ? 'Hide' : 'Show'} Source <span className="text-quinary">|</span>{' '} + {showSource ? 'Hide' : 'Show'} Source <span className="text-quaternary">|</span>{' '} Mermaid </button> {!showSource ? <code ref={mermaidRef} className="w-full" /> : <code>{content}</code>} diff --git a/app/components/AsciidocBlocks/Section.tsx b/app/components/AsciidocBlocks/Section.tsx deleted file mode 100644 index 47f0339..0000000 --- a/app/components/AsciidocBlocks/Section.tsx +++ /dev/null @@ -1,87 +0,0 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, you can obtain one at https://mozilla.org/MPL/2.0/. - * - * Copyright Oxide Computer Company - */ - -import type { Section as SectionType } from '@asciidoctor/core' -import { Content, getRole, parse } from '@oxide/react-asciidoc' -import cn from 'classnames' -import { createElement } from 'react' - -import Icon from '../Icon' - -// We need to remove anchors from the section title (and table of contents) because having -// an anchor within an anchor causes a client/server render mismatch -export const stripAnchors = (str: string) => str.replace(/<a[^>]*>(.*?)<\/a>/gi, '$1') - -const Section = ({ node }: { node: SectionType }) => { - const docAttrs = node.getDocument().getAttributes() - const level = node.getLevel() - let title: JSX.Element | string = '' - - let sectNum = node.getSectionNumeral() - sectNum = sectNum === '.' ? '' : sectNum - - const sectNumLevels = docAttrs['sectnumlevels'] ? parseInt(docAttrs['sectnumlevels']) : 3 - - if (node.getCaption()) { - title = node.getCaptionedTitle() - } else if (node.isNumbered() && level <= sectNumLevels) { - if (level < 2 && node.getDocument().getDoctype() === 'book') { - const sectionName = node.getSectionName() - if (sectionName === 'chapter') { - const signifier = docAttrs['chapter-signifier'] - title = `${signifier || ''} ${sectNum} ${node.getTitle()}` - } else if (sectionName === 'part') { - const signifier = docAttrs['part-signifier'] - title = `${signifier || ''} ${sectNum} ${node.getTitle()}` - } else { - title = node.getTitle() || '' - } - } else { - title = node.getTitle() || '' - } - } else { - title = node.getTitle() || '' - } - - title = ( - <> - {/* eslint-disable-next-line jsx-a11y/anchor-is-valid, jsx-a11y/anchor-has-content */} - <a className="anchor" id={node.getId() || ''} aria-hidden="true" /> - <a className="link group" href={`#${node.getId()}`}> - {parse(stripAnchors(title))} - <Icon - name="link" - size={16} - className="ml-2 hidden text-accent-secondary group-hover:inline-block" - /> - </a> - </> - ) - - if (level === 0) { - return ( - <> - <h1 className={cn('sect0', getRole(node))} data-sectnum={sectNum}> - {title} - </h1> - <Content blocks={node.getBlocks()} /> - </> - ) - } else { - return ( - <div className={cn(`sect${level}`, getRole(node))}> - {createElement(`h${level + 1}`, { 'data-sectnum': sectNum }, title)} - <div className="sectionbody"> - <Content blocks={node.getBlocks()} /> - </div> - </div> - ) - } -} - -export default Section diff --git a/app/components/AsciidocBlocks/index.ts b/app/components/AsciidocBlocks/index.ts index 17a1dfa..8591e5b 100644 --- a/app/components/AsciidocBlocks/index.ts +++ b/app/components/AsciidocBlocks/index.ts @@ -7,97 +7,19 @@ */ import { AsciiDocBlocks } from '@oxide/design-system/components/dist' -import { getText, type AdocTypes, type Options } from '@oxide/react-asciidoc' +import { type Options } from '@oxide/react-asciidoc' -import CustomDocument, { ui } from './Document' -import Image from './Image' +import { CustomDocument } from './Document' +import { Image } from './Image' import Listing from './Listing' -import Section from './Section' export const opts: Options = { overrides: { admonition: AsciiDocBlocks.Admonition, table: AsciiDocBlocks.Table, image: Image, + section: AsciiDocBlocks.Section, listing: Listing, - section: Section, }, customDocument: CustomDocument, } - -/** - * Adds word break opportunities (<wbr/>) after slashes in text, except within HTML tags. - * This function is used to improve line breaks for long paths or URLs in rendered content. - * * - * renderWithBreaks('/path/to/long/file.txt') - * '/<wbr/>path/<wbr/>to/<wbr/>long/<wbr/>file.txt' - */ -export const renderWithBreaks = (text: string): string => { - return text - .split(/(<[^>]*>)/g) - .map((segment) => { - // if the segment is an HTML tag, leave it unchanged - if (segment.startsWith('<') && segment.endsWith('>')) { - return segment - } - // replace slashes that are not surrounded by spaces - return segment.replace(/(?:^|(?<=\S))\/(?=\S)/g, '/<wbr/>') - }) - .join('') -} - -// prettier-ignore -const QUOTE_TAGS: {[key: string]: [string, string, boolean?]} = { - "monospaced": ['<code>', '</code>', true], - "emphasis": ['<em>', '</em>', true], - "strong": ['<strong>', '</strong>', true], - "double": ['“', '”'], - "single": ['‘', '’'], - "mark": ['<mark>', '</mark>', true], - "superscript": ['<sup>', '</sup>', true], - "subscript": ['<sub>', '</sub>', true], - "unquoted": ['<span>', '</span>', true], - "asciimath": ['\\$', '\\$'], - "latexmath": ['\\(', '\\)'], -} - -const chop = (str: string) => str.substring(0, str.length - 1) - -const convertInlineQuoted = (node: AdocTypes.Inline) => { - const type = node.getType() - const quoteTag = QUOTE_TAGS[type] - const [open, close, tag] = quoteTag || ['', ''] - - let text = getText(node) - - // Add <wbr> for line breaks with long paths - // Ignores a / if there's a space before it - if (type === 'monospaced') { - text = renderWithBreaks(text) - } - - const id = node.getId() - const role = node.getRole() - - const idAttr = id ? `id="${id}"` : '' - const classAttr = role ? `class="${role}"` : '' - const attrs = `${idAttr} ${classAttr}` - - if (id || role) { - if (tag) { - return `${chop(open)} ${attrs}>${text}${close}` - } else { - return `<span ${attrs}>${open}${text}${close}</span>` - } - } else { - return `${open}${text}${close}` - } -} - -function convertInlineCallout(node: AdocTypes.Inline): string { - let text = getText(node) - - return `<i class="conum" data-value="${text}"></i>` -} - -export { ui, convertInlineQuoted, convertInlineCallout } diff --git a/app/components/AsciidocBlocks/renderWithBreaks.test.ts b/app/components/AsciidocBlocks/renderWithBreaks.test.ts deleted file mode 100644 index d1dddaa..0000000 --- a/app/components/AsciidocBlocks/renderWithBreaks.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, you can obtain one at https://mozilla.org/MPL/2.0/. - * - * Copyright Oxide Computer Company - */ - -import { describe, expect, it } from 'vitest' - -import { renderWithBreaks } from '~/components/AsciidocBlocks' - -describe('renderWithBreaks', () => { - it('adds <wbr/> after each slash in URLs and file paths', () => { - expect(renderWithBreaks('/v1/disks/{disk}')).toBe('/<wbr/>v1/<wbr/>disks/<wbr/>{disk}') - expect(renderWithBreaks('https://example.com/path/to/resource')).toBe( - 'https:/<wbr/>/<wbr/>example.com/<wbr/>path/<wbr/>to/<wbr/>resource', - ) - }) - - it('does not add <wbr/> to slashes within HTML-like tags', () => { - expect(renderWithBreaks('<span class="test">Some/text</span>')).toBe( - '<span class="test">Some/<wbr/>text</span>', - ) - }) - - it('handles mixed content correctly', () => { - expect(renderWithBreaks('Text with <tag attr="value"/> and /path/to/file')).toBe( - 'Text with <tag attr="value"/> and /path/<wbr/>to/<wbr/>file', - ) - }) - - it('handles edge cases correctly', () => { - expect(renderWithBreaks('/')).toBe('/') - expect(renderWithBreaks('text / with spaces')).toBe('text / with spaces') - expect(renderWithBreaks('/path/to/file')).toBe('/<wbr/>path/<wbr/>to/<wbr/>file') - expect(renderWithBreaks('a/b/c')).toBe('a/<wbr/>b/<wbr/>c') - }) -}) diff --git a/app/components/Dropdown.tsx b/app/components/Dropdown.tsx index 75108d6..5ac6dac 100644 --- a/app/components/Dropdown.tsx +++ b/app/components/Dropdown.tsx @@ -13,7 +13,7 @@ import type { ReactNode } from 'react' import Icon from '~/components/Icon' export const dropdownOuterStyles = - 'menu-item relative text-sans-md text-secondary border-b border-secondary cursor-pointer' + 'menu-item relative text-sans-md text-default border-b border-secondary cursor-pointer' export const dropdownInnerStyles = `focus:outline-0 focus:bg-hover px-3 py-2 pr-6` @@ -52,7 +52,7 @@ export const DropdownSubTrigger = ({ <Icon name="carat-down" size={12} - className="absolute right-3 top-1/2 -translate-y-1/2 -rotate-90 text-quaternary" + className="absolute right-3 top-1/2 -translate-y-1/2 -rotate-90 text-tertiary" /> </Dropdown.SubTrigger> ) diff --git a/app/components/Header.tsx b/app/components/Header.tsx index d6e2ae8..6dd3989 100644 --- a/app/components/Header.tsx +++ b/app/components/Header.tsx @@ -63,7 +63,7 @@ export default function Header({ currentRfd }: { currentRfd?: RfdItem }) { <Link to="/" prefetch="intent" - className="flex h-8 w-8 items-center justify-center rounded border text-quaternary bg-secondary border-secondary elevation-1 hover:bg-hover" + className="flex h-8 w-8 items-center justify-center rounded border text-tertiary bg-secondary border-secondary elevation-1 hover:bg-hover" aria-label="Back to index" > <Icon name="logs" size={16} /> @@ -73,7 +73,7 @@ export default function Header({ currentRfd }: { currentRfd?: RfdItem }) { <div className="flex space-x-2"> <button - className="flex h-8 w-8 items-center justify-center rounded border text-quaternary bg-secondary border-secondary elevation-1 hover:bg-hover" + className="flex h-8 w-8 items-center justify-center rounded border text-tertiary bg-secondary border-secondary elevation-1 hover:bg-hover" onClick={toggleSearchMenu} > <Icon name="search" size={16} /> @@ -83,12 +83,11 @@ export default function Header({ currentRfd }: { currentRfd?: RfdItem }) { {user ? ( <Dropdown.Root modal={false}> - <Dropdown.Trigger className="flex h-8 w-8 items-center justify-center rounded border text-quaternary bg-secondary border-secondary elevation-1 hover:bg-hover 600:w-auto 600:px-3"> + <Dropdown.Trigger className="flex h-8 w-8 items-center justify-center rounded border text-tertiary bg-secondary border-secondary elevation-1 hover:bg-hover 600:w-auto 600:px-3"> <Icon name="profile" size={16} className="flex-shrink-0" /> - <span className="ml-2 hidden text-sans-sm text-secondary 600:block"> + <span className="ml-2 hidden text-sans-sm text-default 600:block"> {user.displayName || user.email} </span> - <Icon name="carat-down" size={12} className="ml-4 hidden 600:block" /> </Dropdown.Trigger> <DropdownMenu> diff --git a/app/components/Modal.tsx b/app/components/Modal.tsx index d5ecdbb..0e4c49a 100644 --- a/app/components/Modal.tsx +++ b/app/components/Modal.tsx @@ -27,13 +27,13 @@ const Modal = ({ backdrop={<div className="backdrop" />} > <div className="flex w-full items-center border-b p-4 bg-secondary border-secondary"> - <div className="text-semi-lg text-default">{title}</div> + <div className="text-semi-lg text-raise">{title}</div> <DialogDismiss className="absolute right-2 top-2.5 flex rounded p-2 hover:bg-hover"> - <Icon name="close" size={12} className="text-secondary" /> + <Icon name="close" size={12} className="text-default" /> </DialogDismiss> </div> - <main className="px-4 py-6 text-sans-md text-secondary">{children}</main> + <main className="px-4 py-6 text-sans-md text-default">{children}</main> </Dialog> </> ) diff --git a/app/components/NewRfdButton.tsx b/app/components/NewRfdButton.tsx index 9cf908f..640219f 100644 --- a/app/components/NewRfdButton.tsx +++ b/app/components/NewRfdButton.tsx @@ -21,7 +21,7 @@ const NewRfdButton = () => { <> <button onClick={dialog.toggle} - className="flex h-8 w-8 items-center justify-center rounded border text-quaternary bg-secondary border-secondary elevation-1 hover:bg-tertiary" + className="flex h-8 w-8 items-center justify-center rounded border text-tertiary bg-secondary border-secondary elevation-1 hover:bg-tertiary" > <Icon name="add-roundel" size={16} /> </button> @@ -50,7 +50,7 @@ const NewRfdButton = () => { </p> <pre className="mt-4 overflow-x-auto rounded border px-[1.25rem] py-[1rem] text-mono-code border-secondary 800:px-[1.75rem] 800:py-[1.5rem]"> <code className="!text-[0.825rem] text-mono-code"> - <span className="mr-2 inline-block select-none text-quinary">$</span> + <span className="mr-2 inline-block select-none text-quaternary">$</span> scripts/new.sh{' '} {newRfdNumber ? newRfdNumber.toString().padStart(4, '0') : '0042'} "My title here" diff --git a/app/components/Search.tsx b/app/components/Search.tsx index f656518..d6429b0 100644 --- a/app/components/Search.tsx +++ b/app/components/Search.tsx @@ -198,11 +198,11 @@ const SearchWrapper = ({ dismissSearch }: { dismissSearch: () => void }) => { <SearchBox /> <button - className="hover:bg-raise-hover block h-full border-l px-4 text-mono-sm text-tertiary border-l-secondary" + className="hover:bg-raise-hover block h-full border-l px-4 text-mono-sm text-secondary border-l-secondary" onClick={dismissSearch} > <span className="hidden 600:block">Dismiss</span> - <Icon name="close" size={12} className="block text-quaternary 600:hidden" /> + <Icon name="close" size={12} className="block text-tertiary 600:hidden" /> </button> </div> @@ -214,7 +214,7 @@ const SearchWrapper = ({ dismissSearch }: { dismissSearch: () => void }) => { <div className="mb-4 rounded p-1 bg-accent-secondary"> <Icon name="search" size={16} className="text-accent" /> </div> - <div className="text-tertiary"> + <div className="text-secondary"> No results for “ <span className="text-sans-lg text-default">{results.query}</span>” </div> @@ -228,7 +228,7 @@ const SearchWrapper = ({ dismissSearch }: { dismissSearch: () => void }) => { )} </div> - <div className="hidden justify-between rounded-b-lg px-4 py-2 text-secondary bg-tertiary 600:flex"> + <div className="hidden justify-between rounded-b-lg px-4 py-2 text-default bg-tertiary 600:flex"> <ActionMenuHotkey keys={['Enter']} action="submit" /> <ActionMenuHotkey keys={['Arrow Up', 'Arrow Down']} action="select" /> <ActionMenuHotkey keys={['Esc']} action="close" /> @@ -257,7 +257,7 @@ const SearchBox = () => { value={inputValue} onChange={(event) => setInputValue(event.currentTarget.value)} autoFocus - className="w-full bg-transparent px-4 text-sans-lg focus:!outline-none 600:text-sans-2xl" + className="w-full bg-transparent px-4 text-sans-lg text-raise focus:!outline-none 600:text-sans-2xl" placeholder="Search RFD contents" /> {inputValue !== '' && ( @@ -265,7 +265,7 @@ const SearchBox = () => { className="absolute right-0 top-1/2 hidden -translate-y-1/2 p-4 600:block" onClick={() => setInputValue('')} > - <Icon name="close" size={12} className="text-quaternary" /> + <Icon name="close" size={12} className="text-tertiary" /> </button> )} </div> @@ -345,7 +345,7 @@ const Hits = ({ data, selectedIdx }: { data: RFDHit[]; selectedIdx: number }) => {isNewSection && ( <h3 className={cn( - 'line-clamp-1 h-6 rounded-t-sm px-3 !leading-6 text-mono-xs text-tertiary bg-tertiary', + 'line-clamp-1 h-6 rounded-t-sm px-3 !leading-6 text-mono-xs text-secondary bg-tertiary', sectionIsSelected && '600:!text-inverse 600:!bg-accent', )} > @@ -389,7 +389,7 @@ const HitItem = ({ hit, isSelected }: { hit: RFDHit; isSelected: boolean }) => { highlightedTagName="span" classNames={{ root: `break-words ${ - isSelected ? '600:text-accent-tertiary' : '600:text-tertiary' + isSelected ? '600:text-accent-tertiary' : '600:text-secondary' }`, highlighted: isSelected ? 'text-accent 600:underline' : 'text-accent', nonHighlighted: isSelected ? '600:text-accent' : 'text-default', @@ -403,12 +403,12 @@ const HitItem = ({ hit, isSelected }: { hit: RFDHit; isSelected: boolean }) => { highlightedTagName="span" classNames={{ root: `break-words line-clamp-2 ${ - isSelected ? '600:text-accent-tertiary' : '600:text-tertiary' + isSelected ? '600:text-accent-tertiary' : '600:text-secondary' }`, highlighted: isSelected ? 'text-accent 600:underline' : 'text-accent', nonHighlighted: isSelected - ? 'text-tertiary 600:text-accent-tertiary' - : 'text-tertiary', + ? 'text-secondary 600:text-accent-tertiary' + : 'text-secondary', }} /> </DialogDismiss> @@ -442,15 +442,15 @@ const RFDPreview = ({ number }: { number: number }) => { {rfd ? ( <> <div className="flex h-6 items-center border-b px-3 text-mono-xs border-b-secondary"> - <div className="text-quinary">Updated:</div> - <div className="ml-1 text-secondary"> + <div className="text-quaternary">Updated:</div> + <div className="ml-1 text-default"> {dayjs(rfd.commit_date).format('YYYY/MM/DD h:mm A')} </div> </div> <div className="flex w-full flex-col items-start p-6"> <StatusBadge label={rfd.state} /> - <div className="mt-2 !text-[32px] !leading-[1.15] text-sans-3xl"> + <div className="mt-2 !text-[32px] !leading-[1.15] text-sans-3xl text-raise"> {rfd.title} </div> <ul className="mt-6 w-full"> @@ -465,7 +465,7 @@ const RFDPreview = ({ number }: { number: number }) => { > <DialogDismiss className="text-left"> <li - className="text-sans-sm text-secondary hover:text-default children:!text-sans-sm" + className="text-sans-sm text-default hover:text-default children:!text-sans-sm" dangerouslySetInnerHTML={{ __html: item.title }} /> </DialogDismiss> @@ -510,13 +510,13 @@ export const ActionMenuHotkey = ({ keys, action }: ActionMenuHotkeyProps) => ( {keys.map((hotkey) => ( <kbd key={hotkey} - className="mr-1 inline-block rounded px-2 py-1 text-mono-xs text-secondary bg-secondary" + className="mr-1 inline-block rounded px-2 py-1 text-mono-xs text-default bg-secondary" > {hotkey} </kbd> ))} </div> - <span className="text-sans-sm text-tertiary">to {action}</span> + <span className="text-sans-sm text-secondary">to {action}</span> </div> ) diff --git a/app/components/SelectRfdCombobox.tsx b/app/components/SelectRfdCombobox.tsx index 6f2ef6c..36de404 100644 --- a/app/components/SelectRfdCombobox.tsx +++ b/app/components/SelectRfdCombobox.tsx @@ -40,12 +40,12 @@ const SelectRfdCombobox = ({ return ( <div className="flex items-center"> <div> - <div className="text-mono-xs text-quaternary"> + <div className="text-mono-xs text-tertiary"> RFD {currentRfd ? currentRfd.number : ''} </div> <div className={cn( - 'truncate !leading-[14px] text-sans-sm text-secondary 600:max-w-[240px]', + 'truncate !leading-[14px] text-sans-sm text-default 600:max-w-[240px]', isLoggedIn ? 'max-w-[160px]' : 'max-w-[100px]', )} > @@ -54,7 +54,7 @@ const SelectRfdCombobox = ({ </div> <button onClick={toggleCombobox} - className="ml-2 flex h-[32px] w-[18px] items-center justify-center rounded border text-quaternary border-secondary hover:bg-hover 600:ml-6" + className="ml-2 flex h-[32px] w-[18px] items-center justify-center rounded border text-tertiary border-secondary hover:bg-hover 600:ml-6" aria-label="Select a RFD" > <Icon name="select-arrows" size={6} className="flex-shrink-0" height={14} /> @@ -166,13 +166,13 @@ const ComboboxWrapper = ({ }} placeholder="Search" spellCheck="false" - className="mousetrap h-12 w-full appearance-none rounded border-none px-3 text-sans-lg text-default bg-raise focus:outline-none focus:outline-offset-0 600:h-auto 600:py-3 600:text-sans-md" + className="mousetrap h-12 w-full appearance-none rounded border-none px-3 text-sans-lg text-raise bg-raise focus:outline-none focus:outline-offset-0 600:h-auto 600:py-3 600:text-sans-md" /> <button - className="hover:bg-raise-hover block border-l px-4 text-mono-sm text-tertiary border-l-secondary 600:hidden" + className="hover:bg-raise-hover block border-l px-4 text-mono-sm text-secondary border-l-secondary 600:hidden" onClick={handleDismiss} > - <Icon name="close" size={12} className="text-quaternary" /> + <Icon name="close" size={12} className="text-tertiary" /> </button> </div> <div @@ -196,7 +196,7 @@ const ComboboxWrapper = ({ ) }) ) : ( - <div className="px-3 py-2 text-center text-sans-sm text-secondary"> + <div className="px-3 py-2 text-center text-sans-sm text-default"> No matches found </div> )} @@ -252,12 +252,12 @@ const ComboboxItem = ({ 'menu-item relative cursor-pointer border-b px-3 py-2 pr-6 text-sans-sm border-secondary', selected ? 'text-accent bg-accent-secondary hover:bg-accent-secondary-hover' - : 'hover:bg-raise-hover text-secondary', + : 'hover:bg-raise-hover text-default', )} > {selected && <Outline />} <div>RFD {rfd.number}</div> - <div className={cn(selected ? 'text-accent-secondary' : 'text-tertiary')}> + <div className={cn(selected ? 'text-accent-secondary' : 'text-secondary')}> {rfd.title} </div> </li> diff --git a/app/components/Spinner.tsx b/app/components/Spinner.tsx deleted file mode 100644 index 5142486..0000000 --- a/app/components/Spinner.tsx +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, you can obtain one at https://mozilla.org/MPL/2.0/. - * - * Copyright Oxide Computer Company - */ - -import cn from 'classnames' - -const Spinner = ({ className }: { className?: string }) => { - const frameSize = 12 - const center = 6 - const radius = 5 - const strokeWidth = 2 - return ( - <svg - width={frameSize} - height={frameSize} - viewBox={`0 0 ${frameSize + ' ' + frameSize}`} - fill="none" - xmlns="http://www.w3.org/2000/svg" - aria-labelledby="Spinner" - className={cn('spinner', className)} - > - <circle - fill="none" - className="bg" - strokeWidth={strokeWidth} - strokeLinecap="round" - cx={center} - cy={center} - r={radius} - strokeOpacity={0.2} - /> - <circle - className="path" - fill="none" - stroke="currentColor" - strokeWidth={strokeWidth} - strokeLinecap="round" - cx={center} - cy={center} - r={radius} - /> - </svg> - ) -} - -export default Spinner diff --git a/app/components/TableOfContents.tsx b/app/components/TableOfContents.tsx deleted file mode 100644 index 223ebaa..0000000 --- a/app/components/TableOfContents.tsx +++ /dev/null @@ -1,282 +0,0 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, you can obtain one at https://mozilla.org/MPL/2.0/. - * - * Copyright Oxide Computer Company - */ - -import type { AdocTypes } from '@oxide/react-asciidoc' -import * as Accordion from '@radix-ui/react-accordion' -import { Link } from '@remix-run/react' -import cn from 'classnames' -import { useCallback, useEffect, useMemo, useState } from 'react' - -import { isTruthy } from '~/utils/isTruthy' - -import { stripAnchors } from './AsciidocBlocks/Section' -import Icon from './Icon' - -// Create threshold steps that trigger intersection events every 0.5%. This is needed to provide -// decent measurements on very tall elements. In the future we could instead compute the needed -// thresholds on a per element basis so that we are measuring per pixel instead of per percent. -const THRESHOLD = [...Array(200).keys()].map((n) => n / 200) - -// Uses the asciidoc generated classes to find the closest section wrapping parent element -function findParentSection(element: Element): Element | null { - let sect2Wrapper = element.closest('.sect2') - return sect2Wrapper ? sect2Wrapper : element.closest('.sect1') -} - -export function useIntersectionObserver( - elements: Element[], - callback: IntersectionObserverCallback, - options: IntersectionObserverInit, -) { - let [observer, setObserver] = useState<IntersectionObserver | null>(null) - - // Create the observer in an effect so we can tear it down when this unmounts - useEffect(() => { - let observer = new IntersectionObserver(callback, options) - setObserver(observer) - - return () => { - observer.disconnect() - } - }, [callback, options]) - - // Bind the elements that should be listened for - useEffect(() => { - if (observer) { - for (let element of elements) { - observer.observe(element) - } - } - - return () => { - if (observer) { - for (let element of elements) { - observer.unobserve(element) - } - } - } - }, [elements, observer]) - - return observer -} - -// This hook will call the provided callback whenever a section that is identified by a heading is -// determined to be "active". There are three triggering rules for determining when a section -// activates: -// 1. A section header reaches an imaginary line that is 10% down the page -// 2. 90% of the top 50% of the page is covered a single section -// 3. A section is contained entirely in the top 50% of the page -// -// Two IntersectionObservers are used for tracking these conditions. One for tracking the first case, -// and a second for tracking the other two. -export function useActiveSectionTracking( - initialSections: Element[], - onSectionChange: (element: Element) => void, -) { - let [sections, setSections] = useState<Element[]>([]) - let [sectionWrappers, setSectionWrappers] = useState<(Element | null)[]>( - initialSections.map(findParentSection), - ) - - // The caller only provides the hook with section headers and so we need to map those to their - // relevant containing sections - useEffect(() => { - setSectionWrappers(sections.map(findParentSection)) - }, [sections]) - - // Create the heading tracker - let headingActivator = useCallback( - (entries: IntersectionObserverEntry[]) => { - for (let entry of entries) { - if (entry.isIntersecting) { - onSectionChange(entry.target) - } - } - }, - [onSectionChange], - ) - - // Imaginary 0px line at 10% from top the of the screen - let headingSettings = useMemo(() => ({ rootMargin: `-10% 0px -90% 0px` }), []) - useIntersectionObserver(sections, headingActivator, headingSettings) - - // Create the section tracker - let wrapperActivator = useCallback( - (entries: IntersectionObserverEntry[]) => { - for (let entry of entries) { - // Compute the screen space covered by this entry - let covered = entry.intersectionRect.height / (entry.rootBounds?.height || 1) - - // If either this element is entirely encapsulated by the top 50% of the screen or it is - // covering at least 90% of the top 50% of the screen then we consider the element active. - // We specifically do not test for 100% coverage as we are not guaranteed to be given a - // chance to measure at every percentage point. 90% seems to be a safe threshold, but could - // likely use some tuning - if (entry.intersectionRatio === 1 || covered >= 0.9) { - // Map this section back to its relevant header to activate it - let index = sectionWrappers.findIndex((wrapper) => wrapper === entry.target) - onSectionChange(sections[index]) - } - } - }, - [sections, sectionWrappers, onSectionChange], - ) - - // Watch the top 50% of the screen, and measure the intersection every 0.5% (defined by THRESHOLD) - let wrapperSettings = useMemo( - () => ({ threshold: THRESHOLD, rootMargin: `0px 0px -50% 0px` }), - [], - ) - - // We need to ensure that we are only sending valid sections to be observed - let bindableWrappers = useMemo(() => sectionWrappers.filter(isTruthy), [sectionWrappers]) - - useIntersectionObserver(bindableWrappers, wrapperActivator, wrapperSettings) - - return { - setSections, - } -} - -export const generateTableOfContents = (sections: AdocTypes.Section[]) => { - let toc: TocItem[] = [] - - if (sections.length < 1) return toc - - for (let section of sections) { - generateSection(toc, section) - } - - return toc -} - -export type TocItem = { - id: string - level: number - title: string -} - -const generateSection = (toc: TocItem[], section: AdocTypes.Section) => { - toc.push({ - id: section.getId(), - level: section.getLevel(), - title: section.getTitle() || '', - }) - - if (section.hasSections()) { - const sections = section.getSections() - - for (let section of sections) { - generateSection(toc, section) - } - } -} - -export const DesktopOutline = ({ - toc, - activeItem, -}: { - toc: TocItem[] - activeItem: string -}) => { - if (toc && toc.length > 0) { - return ( - <ul className="hidden 1100:block"> - {toc.map((item) => ( - <li - key={item.id} - data-level={item.level} - className={cn('mb-0 list-none text-sans-sm', item.level > 2 && 'hidden')} - > - <Link - to={`#${item.id}`} - className={cn( - 'block border-l py-[4px]', - activeItem === item.id - ? 'text-accent-secondary border-accent-secondary hover:text-accent' - : 'text-quaternary border-secondary hover:text-tertiary', - )} - style={{ - paddingLeft: `${0.5 + item.level * 0.5}rem`, - }} - > - <span dangerouslySetInnerHTML={{ __html: stripAnchors(item.title) }} /> - </Link> - </li> - ))} - </ul> - ) - } - - return null -} - -export const SmallScreenOutline = ({ - toc, - activeItem, - title, -}: { - toc: TocItem[] - activeItem: string - title: string -}) => { - if (toc && toc.length > 0) { - return ( - <Accordion.Root - type="single" - className="fixed bottom-0 left-0 right-0 z-10 mt-4 block max-h-[calc(100vh-var(--header-height)-2rem)] w-full overflow-y-auto border-b border-t bg-default border-secondary 1100:hidden print:hidden" - collapsible - > - <Accordion.Item value={`small-toc-${title}`}> - <Accordion.Header> - <Accordion.Trigger className="flex w-full items-center justify-between px-4 py-4 text-sans-md text-secondary 400:px-6 600:px-8 600:hover:bg-hover [&>svg]:data-[state=open]:rotate-90"> - Table of Contents{' '} - <Icon - name="carat-right" - size={12} - className="transition-all text-quaternary" - /> - </Accordion.Trigger> - </Accordion.Header> - - <Accordion.Content className="AccordionContent hydrated w-full border-t px-4 border-secondary 400:px-6 600:px-8"> - <div className="py-4"> - {toc.map((item) => ( - <li - key={item.id} - data-level={item.level} - className={cn( - 'AccordionContent hydrated list-none text-sans-sm', - item.level > 2 && 'hidden', - )} - > - <Link - to={`#${item.id}`} - className={cn( - 'block border-l py-[4px]', - activeItem === item.id - ? 'text-accent-secondary border-accent-secondary hover:text-accent' - : 'text-quaternary border-secondary hover:text-tertiary', - )} - style={{ - paddingLeft: `${0.5 + item.level * 0.5}rem`, - }} - > - <span dangerouslySetInnerHTML={{ __html: item.title }} /> - </Link> - </li> - ))} - </div> - </Accordion.Content> - </Accordion.Item> - </Accordion.Root> - ) - } - - return null -} diff --git a/app/components/home/FilterDropdown.tsx b/app/components/home/FilterDropdown.tsx index 804eb09..bbbcc54 100644 --- a/app/components/home/FilterDropdown.tsx +++ b/app/components/home/FilterDropdown.tsx @@ -68,7 +68,7 @@ const FilterDropdown = () => { } return ( - <div className="flex h-4 items-center text-mono-sm text-secondary"> + <div className="flex h-4 items-center text-mono-sm text-default"> <Dropdown.Root modal={false}> <Dropdown.Trigger className="-m-2 ml-0 p-2"> <Icon name="filter" size={12} className="flex-shrink-0" /> @@ -119,7 +119,7 @@ const FilterDropdown = () => { {(authorNameParam || authorEmailParam) && ( <> - <div className="ml-3 mr-1 block text-quaternary">Author:</div> + <div className="ml-3 mr-1 block text-tertiary">Author:</div> <FilterBadge onClick={clearAuthor} color="purple"> {authorNameParam || authorEmailParam} </FilterBadge> @@ -128,7 +128,7 @@ const FilterDropdown = () => { {labelParam && ( <> - <div className="ml-3 mr-1 block text-quaternary">Label:</div> + <div className="ml-3 mr-1 block text-tertiary">Label:</div> <FilterBadge onClick={clearLabel} color="blue"> {labelParam} </FilterBadge> diff --git a/app/components/rfd/AccessWarning.tsx b/app/components/rfd/AccessWarning.tsx index c7ab874..9d8dea0 100644 --- a/app/components/rfd/AccessWarning.tsx +++ b/app/components/rfd/AccessWarning.tsx @@ -27,8 +27,8 @@ const AccessWarning = ({ groups }: { groups: string[] }) => { } return ( - <div className="col-span-12 mt-4 flex 800:col-span-10 800:col-start-2 800:pr-10 1000:col-span-10 1000:col-start-2 1100:col-start-2 1200:col-start-3 1200:pr-16"> - <div className="items-top flex w-full rounded px-3 py-2 pr-6 text-sans-md text-notice bg-notice-secondary 1100:w-[calc(100%-var(--toc-width))] print:hidden"> + <div className="col-span-12 mt-4 flex 800:col-span-10 800:col-start-2 800:pr-10 1000:col-span-10 1000:col-start-2 1200:col-start-3 1200:pr-16"> + <div className="items-top flex w-full rounded px-3 py-2 pr-6 text-sans-md text-notice bg-notice-secondary 1200:w-[calc(100%-var(--toc-width))] print:hidden"> <Icon name="access" size={16} className="mr-2 flex-shrink-0 text-notice-tertiary" /> <div> This RFD can be accessed by the following groups: diff --git a/app/components/rfd/MoreDropdown.tsx b/app/components/rfd/MoreDropdown.tsx index 12f7395..16d2bf0 100644 --- a/app/components/rfd/MoreDropdown.tsx +++ b/app/components/rfd/MoreDropdown.tsx @@ -20,7 +20,7 @@ const MoreDropdown = () => { return ( <Dropdown.Root modal={false}> <Dropdown.Trigger className="rounded border p-2 align-[3px] border-default hover:bg-hover"> - <Icon name="more" size={12} className="text-secondary" /> + <Icon name="more" size={12} className="text-default" /> </Dropdown.Trigger> <DropdownMenu> diff --git a/app/components/rfd/RfdDiscussionDialog.tsx b/app/components/rfd/RfdDiscussionDialog.tsx index cf0b9f1..b5b0cd3 100644 --- a/app/components/rfd/RfdDiscussionDialog.tsx +++ b/app/components/rfd/RfdDiscussionDialog.tsx @@ -13,6 +13,7 @@ import { useDialogStore, type DialogStore, } from '@ariakit/react' +import { Spinner } from '@oxide/design-system/components/dist' import cn from 'classnames' import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' @@ -30,7 +31,6 @@ import type { } from '~/services/rfd.server' import { GotoIcon } from '../CustomIcons' -import Spinner from '../Spinner' import { CommentThreadBlock, matchCommentToBlock } from './RfdInlineComments' import { calcOffset } from './RfdPreview' @@ -188,7 +188,7 @@ export const CommentCount = ({ 'flex items-center space-x-2 rounded border p-2 print:hidden', error ? 'text-error bg-error-secondary border-error-secondary' - : 'text-quaternary border-default hover:bg-hover', + : 'text-tertiary border-default hover:bg-hover', )} disabled={isLoading || error} > @@ -230,7 +230,7 @@ const DialogContent = ({ RFD {rfdNumber} {title} </div> <DialogDismiss className="-m-2 p-2"> - <Icon name="close" size={12} className="mt-2 text-tertiary" /> + <Icon name="close" size={12} className="mt-2 text-secondary" /> </DialogDismiss> </div> <a @@ -238,7 +238,7 @@ const DialogContent = ({ target="_blank" rel="noreferrer" > - <div className="text-sans-2xl text-tertiary">#{pullNumber}</div> + <div className="text-sans-2xl text-secondary">#{pullNumber}</div> </a> </DialogHeading> <DiscussionReviewGroup discussions={discussions} pullNumber={pullNumber} /> @@ -297,12 +297,12 @@ const DiscussionReviewGroup = ({ <Icon name="chat" size={16} /> </div> <h2 className="text-semi-lg mt-4">Nothing to see here</h2> - <p className="text-md mt-2 text-secondary"> + <p className="text-md mt-2 text-default"> This discussion has no reviews or comments </p> <a href={`https://github.com/oxidecomputer/rfd/pull/${pullNumber}`} - className="mt-6 inline-block rounded border px-2 py-1 text-mono-xs text-tertiary border-default hover:bg-secondary" + className="mt-6 inline-block rounded border px-2 py-1 text-mono-xs text-secondary border-default hover:bg-secondary" target="_blank" rel="noreferrer" > @@ -353,14 +353,14 @@ const DiscussionReview = ({ <div className="text-sans-semi-md"> <a href={data.review.user.html_url} - className="hover:text-secondary" + className="text-sans-semi-md text-default hover:text-raise" target="_blank" rel="noreferrer" > {data.review.user.login} </a> </div> - <div className="ml-1 text-sans-md text-quaternary"> + <div className="ml-1 text-sans-md text-secondary"> reviewed on <time dateTime={data.review.submitted_at}> {' '} @@ -376,17 +376,17 @@ const DiscussionReview = ({ <div className="flex items-center border-b p-3 text-sans-md bg-secondary border-b-secondary"> <a href={data.review.user.html_url} - className="hover:text-secondary" + className="text-sans-semi-md text-default hover:text-raise" target="_blank" rel="noreferrer" > {data.review.user.login} </a> - <span className="ml-1 text-tertiary">left a comment</span> + <span className="ml-1 text-secondary">left a comment</span> </div> <div - className="github-markdown asciidoc-body w-full p-3 pr-4 text-left text-sans-md text-secondary" + className="github-markdown asciidoc-body w-full p-3 pr-4 text-left text-sans-md text-default" dangerouslySetInnerHTML={{ __html: marked.parse(data.review.body) }} /> </div> @@ -404,7 +404,7 @@ const DiscussionReview = ({ className="group sticky top-0" > <div className="flex h-6 w-6 items-center justify-center rounded-full border bg-raise border-secondary group-hover:bg-secondary"> - <GotoIcon className="text-tertiary" /> + <GotoIcon className="text-secondary" /> </div> </DialogDismiss> </div> @@ -459,13 +459,13 @@ const DiscussionIssueComment = ({ <div className="flex items-center border-b p-3 text-sans-md bg-secondary border-b-secondary"> <a href={data.user.html_url} - className="hover:text-secondary" + className="text-sans-semi-md text-default hover:text-raise" target="_blank" rel="noreferrer" > {data.user.login} </a> - <span className="ml-1 text-tertiary"> + <span className="ml-1 text-secondary"> commented on <time dateTime={data.created_at}> {' '} @@ -475,7 +475,7 @@ const DiscussionIssueComment = ({ </div> <div - className="github-markdown asciidoc-body w-full p-3 pr-4 text-left text-sans-md text-secondary" + className="github-markdown asciidoc-body w-full p-3 pr-4 text-left text-sans-md text-default" dangerouslySetInnerHTML={{ __html: marked.parse(data.body || '') }} /> </div> diff --git a/app/components/rfd/RfdInlineComments.tsx b/app/components/rfd/RfdInlineComments.tsx index 1e954bd..ef6a21a 100644 --- a/app/components/rfd/RfdInlineComments.tsx +++ b/app/components/rfd/RfdInlineComments.tsx @@ -17,6 +17,7 @@ import { useInteractions, useRole, } from '@floating-ui/react' +import { Badge } from '@oxide/design-system/components/dist' import cn from 'classnames' import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' @@ -247,7 +248,7 @@ const CommentThread = ({ commentThread, isLoaded, index }: CommentThreadProps) = })} </div> {users.length > 2 && ( - <div className="text-mono-sm text-quaternary">+{users.length - 2}</div> + <div className="text-mono-sm text-tertiary">+{users.length - 2}</div> )} </button> @@ -296,11 +297,11 @@ const CodeSuggestion = ({ return ( <div className={cn( - 'overflow-hidden rounded-lg border text-default border-secondary', + 'overflow-hidden rounded-lg border text-raise border-secondary', isOverlay ? 'bg-default' : 'bg-raise', )} > - <div className="w-full border-b px-2 py-2 text-mono-xs text-quaternary border-b-secondary"> + <div className="w-full border-b px-2 py-2 text-mono-xs text-tertiary border-b-secondary"> Suggestion </div> <CodeLine change="remove" code={textDiff.before} /> @@ -361,26 +362,25 @@ export const CommentThreadBlock = ({ )} > {/* Meta */} - {/* {isOverlay && ( */} <div className="flex items-center justify-between p-3 bg-secondary"> <a href={htmlUrl} target="_blank" rel="noreferrer" className="hover:opacity-80"> - <div className="flex items-center !normal-case text-mono-xs"> + <div className="flex items-center !normal-case text-mono-sm"> {isOverlay && ( - <span className="mr-1 text-sans-sm text-tertiary">Comment on </span> + <span className="mr-1 text-sans-sm text-secondary">Comment on </span> )} {path} {isOutdated && ( - <div className="ml-2 rounded px-1 py-[1px] text-mono-xs text-notice bg-notice-secondary"> + <Badge className="ml-1" color="notice"> Outdated - </div> + </Badge> )} </div> </a> {isOverlay && ( <button onClick={handleDismiss}> - <Icon name="close" size={12} className="text-secondary" /> + <Icon name="close" size={12} className="text-default" /> </button> )} </div> @@ -460,14 +460,14 @@ export const CommentThreadBlock = ({ <div className="text-sans-semi-md"> <a href={comment.user.html_url} - className="hover:text-secondary" + className="text-default hover:text-raise" target="_blank" rel="noreferrer" > {comment.user.login} </a> </div> - <div className="ml-1 text-sans-md text-quaternary"> + <div className="ml-1 text-sans-md text-secondary"> <time dateTime={comment.created_at}> {dayjs(comment.created_at).fromNow()} </time> @@ -475,7 +475,7 @@ export const CommentThreadBlock = ({ </div> </div> <div - className="github-markdown asciidoc-body mt-2 w-full pr-4 text-left text-sans-md text-secondary" + className="github-markdown asciidoc-body mt-2 w-full pr-4 text-left text-sans-md text-default" dangerouslySetInnerHTML={{ __html: marked.parse(comment.body) }} /> @@ -524,10 +524,10 @@ const CommentReactions = ({ reactions }: { reactions: Reactions }) => { return ( <div key={key} - className="flex items-center rounded-lg border p-1 text-mono-sm text-secondary border-secondary" + className="flex items-center rounded-lg border p-1 text-mono-sm text-default border-secondary" > {emoji} - <span className="ml-1 inline-block text-mono-sm text-secondary">{count}</span> + <span className="ml-1 inline-block text-mono-sm text-default">{count}</span> </div> ) })} diff --git a/app/components/rfd/RfdPreview.tsx b/app/components/rfd/RfdPreview.tsx index feea170..d5654f8 100644 --- a/app/components/rfd/RfdPreview.tsx +++ b/app/components/rfd/RfdPreview.tsx @@ -221,7 +221,7 @@ const RfdPreview = ({ currentRfd }: { currentRfd: number }) => { <Link prefetch="intent" to={`/rfd/${number_string}`} - className="mb-1 block text-sans-lg hover:text-secondary" + className="mb-1 block text-sans-lg hover:text-default" > {title} </Link> @@ -247,7 +247,7 @@ const RfdPreview = ({ currentRfd }: { currentRfd: number }) => { </div> <div className="flex space-x-1 text-sans-sm text-tertiary"> <div>{state.charAt(0).toUpperCase() + state.slice(1)}</div> - <span className="text-quinary">•</span> + <span className="text-quaternary">•</span> <div>{dayjs(commit_date).fromNow()}</div> </div> </div> diff --git a/app/routes/_index.tsx b/app/routes/_index.tsx index d23c9f5..5d84379 100644 --- a/app/routes/_index.tsx +++ b/app/routes/_index.tsx @@ -240,7 +240,7 @@ export default function Index() { /> <div className="1000:translate-0 relative flex w-full flex-col items-center justify-start 600:absolute 600:top-1/2 600:-translate-y-1/2 1200:top-[150px]"> - <h1 className="text-center text-sans-2xl 800:text-sans-3xl"> + <h1 className="text-center text-sans-2xl text-raise 800:text-sans-3xl"> Requests for Discussion </h1> @@ -267,7 +267,7 @@ export default function Index() { className="mousetrap overlay-shadow h-full w-full rounded border p-3 text-sans-md bg-raise border-secondary focus:outline-none focus:outline-offset-0 focus:ring-2 focus:ring-accent-secondary" placeholder="Filter by title, number or author" /> - <div className="pointer-events-none absolute right-3 top-1/2 flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded border text-mono-xs text-secondary border-default"> + <div className="pointer-events-none absolute right-3 top-1/2 flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded border text-mono-xs text-default border-default"> / </div> </div> @@ -282,22 +282,22 @@ export default function Index() { </Container> <Container className="mb-4 mt-4 flex justify-between"> <FilterDropdown /> - <div className="flex text-mono-sm text-secondary"> - <div className="mr-1 block text-quaternary">Results:</div> + <div className="flex text-mono-sm text-default"> + <div className="mr-1 block text-tertiary">Results:</div> {matchedItems.length} </div> </Container> <ul className="space-y-3"> <Container isGrid - className="hidden h-10 items-center rounded-lg border px-3 text-mono-xs text-tertiary bg-raise border-secondary 800:grid" + className="hidden h-10 items-center rounded-lg border px-3 text-mono-xs text-secondary bg-raise border-secondary 800:grid" > <div className="group col-span-12 flex cursor-pointer select-none content-start pl-2 800:col-span-5" onClick={() => submitSortOrder('number')} > <div className="-ml-1 flex items-center rounded p-1 group-hover:bg-tertiary"> - Number <span className="mx-1 inline-block text-quinary">/</span> Title + Number <span className="mx-1 inline-block text-quaternary">/</span> Title <SortIcon isActive={sortAttr === 'number'} direction={sortDir} /> </div> </div> @@ -335,7 +335,7 @@ const SortIcon = ({ }) => ( <div className={cn( - 'ml-2 h-[14px] flex-col justify-between text-tertiary', + 'ml-2 h-[14px] flex-col justify-between text-secondary', isActive ? 'flex' : 'hidden group-hover:!flex group-hover:children:!opacity-40', )} > @@ -356,7 +356,7 @@ const RfdRow = ({ rfd }: { rfd: RfdListItem }) => { > <div className="-m-2 inline-flex flex-col rounded-lg p-2 800:group-hover:bg-hover"> <div>RFD {rfd.number}</div> - <div className="line-clamp-2 text-secondary">{rfd.title}</div> + <div className="line-clamp-2 text-default">{rfd.title}</div> </div> </Link> @@ -364,7 +364,7 @@ const RfdRow = ({ rfd }: { rfd: RfdListItem }) => { <StatusBadge label={rfd.state} /> </div> - <div className="order-3 col-span-12 flex space-x-2 text-sans-md text-secondary 800:col-span-3 800:block 800:space-x-0 1000:col-span-2"> + <div className="order-3 col-span-12 flex space-x-2 text-sans-md text-default 800:col-span-3 800:block 800:space-x-0 1000:col-span-2"> <ClientOnly fallback={ <> @@ -375,11 +375,11 @@ const RfdRow = ({ rfd }: { rfd: RfdListItem }) => { > {() => ( <> - <div className="text-tertiary 800:text-secondary"> + <div className="text-secondary 800:text-default"> {dayjs(rfd.commit_date).format('MMM D, YYYY')} </div> - <div className="text-quinary 800:hidden">/</div> - <div className="text-tertiary 800:text-quaternary"> + <div className="text-quaternary 800:hidden">/</div> + <div className="text-secondary 800:text-tertiary"> {dayjs(rfd.commit_date).format('h:mm A')} </div> </> @@ -414,7 +414,7 @@ const LabelsInner = ({ labels }: { labels: string }) => { return ( <div ref={containerEl} - className="relative flex flex-shrink flex-wrap gap-1 overflow-hidden pr-8 text-quaternary" + className="relative flex flex-shrink flex-wrap gap-1 overflow-hidden pr-8 text-tertiary" > {labels ? ( labels.split(',').map((label) => ( @@ -423,11 +423,11 @@ const LabelsInner = ({ labels }: { labels: string }) => { </Link> )) ) : ( - <div className="text-sans-md text-quinary">-</div> + <div className="text-sans-md text-quaternary">-</div> )} {isOverflow && ( - <div className="absolute right-6 top-1/2 -translate-y-1/2 text-mono-sm text-tertiary"> + <div className="absolute right-6 top-1/2 -translate-y-1/2 text-mono-sm text-secondary"> + </div> )} diff --git a/app/routes/rfd.$slug.tsx b/app/routes/rfd.$slug.tsx index af2c567..23f9068 100644 --- a/app/routes/rfd.$slug.tsx +++ b/app/routes/rfd.$slug.tsx @@ -5,8 +5,13 @@ * * Copyright Oxide Computer Company */ - -import Asciidoc, { asciidoctor, type AdocTypes } from '@oxide/react-asciidoc' +import { + DesktopOutline, + SmallScreenOutline, + useActiveSectionTracking, + useIntersectionObserver, +} from '@oxide/design-system/components/dist' +import { Asciidoc, type DocumentBlock, type DocumentSection } from '@oxide/react-asciidoc' import { defer, redirect, @@ -16,16 +21,19 @@ import { import { Await, useLoaderData, useLocation } from '@remix-run/react' import cn from 'classnames' import dayjs from 'dayjs' -import { Fragment, Suspense, useMemo } from 'react' -import { renderToString } from 'react-dom/server' - import { - convertInlineCallout, - convertInlineQuoted, - opts, - ui, -} from '~/components/AsciidocBlocks' -import Image from '~/components/AsciidocBlocks/Image' + Fragment, + Suspense, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react' +import { flat } from 'remeda' + +import { opts } from '~/components/AsciidocBlocks' +import Footnotes from '~/components/AsciidocBlocks/Footnotes' import { ClientOnly } from '~/components/ClientOnly' import Container from '~/components/Container' import Header from '~/components/Header' @@ -37,38 +45,19 @@ import RfdPreview from '~/components/rfd/RfdPreview' import StatusBadge from '~/components/StatusBadge' import { useRootLoaderData } from '~/root' import { isAuthenticated } from '~/services/authn.server' -import { fetchDiscussion, fetchGroups, fetchRfd } from '~/services/rfd.server' +import { fetchDiscussion, fetchGroups, fetchRfd, type RfdItem } from '~/services/rfd.server' import { parseRfdNum } from '~/utils/parseRfdNum' import { can } from '~/utils/permission' -const ad = asciidoctor() - -class InlineConverter { - baseConverter: AdocTypes.Html5Converter - - constructor() { - this.baseConverter = new ad.Html5Converter() - } - - convert(node: AdocTypes.Block, transform: string) { - switch (node.getNodeName()) { - case 'inline_image': - return renderToString(<Image node={node} hasLightbox={false} />) - case 'image': - return renderToString(<Image node={node} hasLightbox={false} />) - case 'inline_quoted': - return convertInlineQuoted(node as unknown as AdocTypes.Inline) // We know this is always inline - case 'inline_callout': - return convertInlineCallout(node as unknown as AdocTypes.Inline) // We know this is always inline - default: - break - } - - return this.baseConverter.convert(node, transform) - } +function isValue<T>(item: T | null | undefined): item is T { + return !!item } -ad.ConverterFactory.register(new InlineConverter(), ['html5']) +const flattenSections = (sections: DocumentSection[]): DocumentSection[] => { + return flat( + sections.map((section) => [section, ...flattenSections(section.sections || [])]), + ) +} export const resp404 = () => new Response('Not Found', { status: 404 }) @@ -135,23 +124,7 @@ export default function Rfd() { const { pathname, hash } = useLocation() const { rfd, groups, discussionPromise } = useLoaderData<typeof loader>() - const { - rfd: { number, title, state, authors, labels, commit_date, content }, - } = useLoaderData<typeof loader>() - - const doc = useMemo(() => { - return ad.load(content, { - standalone: true, - sourcemap: true, - attributes: { - sectlinks: 'true', - icons: 'font', - rfdnumber: number, - stem: 'latexmath', - xrefstyle: 'basic', - }, - }) - }, [number, content]) + const { number, title, state, authors, labels, commit_date, content } = rfd const { user, inlineComments } = useRootLoaderData() @@ -159,46 +132,49 @@ export default function Rfd() { // which will fail if they try to use const userIsInternal = user?.groups.some((group) => group === 'oxide-employee') + const bodyRef = useRef<HTMLDivElement>(null) + const [activeItem, setActiveItem] = useState('') + + const onActiveElementUpdate = useCallback( + (el: Element | null) => { + setActiveItem(el?.id || '') + }, + [setActiveItem], + ) + + // Connect handlers for managing the active (visible section) of the page + const { setSections } = useActiveSectionTracking([], onActiveElementUpdate) + + // Add handler for resetting back to the empty state when the top of the page is reached. + useIntersectionObserver( + useMemo( + () => + typeof document !== 'undefined' + ? [document.querySelector('h1')].filter(isValue) + : [], + [], + ), + useCallback( + (entries) => entries[0].isIntersecting && onActiveElementUpdate(null), + [onActiveElementUpdate], + ), + useMemo(() => ({ rootMargin: '0px 0px -80% 0px' }), []), + ) + + useEffect(() => { + let headings = flattenSections(content.sections) + .filter((item) => item.level <= 2) + .map((item) => bodyRef.current?.querySelector(`#${item.id}`)) + .filter(isValue) + + setSections(headings) + }, [content.sections, setSections]) + return ( <> {/* key makes the search dialog close on selection */} - <Header currentRfd={rfd} key={pathname + hash} /> + <Header currentRfd={rfd as RfdItem} key={pathname + hash} /> <main className="relative mt-12 800:mt-16 print:mt-0"> - <ui.In> - <Suspense - fallback={<CommentCount isLoading={true} count={0} onClick={() => {}} />} - > - <Await - resolve={discussionPromise} - errorElement={ - <CommentCount error={true} isLoading={false} count={0} onClick={() => {}} /> - } - > - {(discussion) => { - if (!discussion) { - return <></> - } - - const { reviews, comments, pullNumber, prComments } = discussion - - return ( - <> - {comments && reviews && pullNumber ? ( - <RfdDiscussionDialog - rfdNumber={number} - title={title} - pullNumber={pullNumber} - comments={comments} - prComments={prComments} - reviews={reviews} - /> - ) : null} - </> - ) - }} - </Await> - </Suspense> - </ui.In> {inlineComments && ( <Suspense fallback={null}> <Await resolve={discussionPromise} errorElement={<></>}> @@ -218,8 +194,8 @@ export default function Rfd() { <div className="hidden text-sans-lg text-accent-tertiary 800:col-span-1 800:block 1200:col-span-2 print:hidden"> <span className="hidden 1200:inline">RFD</span> {number} </div> - <div className="col-span-12 flex items-baseline 800:col-span-11 1100:col-span-10"> - <h1 className="w-full pr-4 text-sans-2xl 600:pr-10 800:text-sans-3xl 1100:w-[calc(100%-var(--toc-width))] 1200:pr-16 print:pr-0 print:text-center"> + <div className="col-span-12 flex items-baseline 800:col-span-11 1200:col-span-10"> + <h1 className="w-full pr-4 text-sans-2xl text-raise 600:pr-10 800:text-sans-3xl 1200:w-[calc(100%-var(--toc-width))] 1200:pr-16 print:pr-0 print:text-center"> <span className="hidden print:block">RFD {number}</span> {title} </h1> {userIsInternal && ( @@ -231,7 +207,6 @@ export default function Rfd() { <AccessWarning groups={groups} /> </div> </Container> - <div className="border-b border-secondary print:m-auto print:max-w-1200 print:rounded-lg print:border"> <PropertyRow label="State" @@ -290,8 +265,69 @@ export default function Rfd() { </PropertyRow> </div> - <Asciidoc content={doc} options={opts} /> + <Container className="mt-12 800:mt-16" isGrid> + <div + className="col-span-12 flex 800:col-span-10 800:col-start-2 1200:col-span-10 1200:col-start-3" + ref={bodyRef} + > + <Asciidoc document={content as DocumentBlock} options={opts} /> + <div className="top-[calc(2rem+(var(--header-height)))] hidden max-h-[calc(100vh-(var(--header-height)+3rem))] w-[var(--toc-width)] flex-shrink-0 flex-grow overflow-auto 1200:sticky 1200:block print:hidden"> + <Suspense + fallback={<CommentCount isLoading={true} count={0} onClick={() => {}} />} + > + <Await + resolve={discussionPromise} + errorElement={ + <CommentCount + error={true} + isLoading={false} + count={0} + onClick={() => {}} + /> + } + > + {(discussion) => { + if (!discussion) { + return <></> + } + + const { reviews, comments, pullNumber, prComments } = discussion + + return ( + <> + {comments && reviews && pullNumber ? ( + <RfdDiscussionDialog + rfdNumber={number} + title={title} + pullNumber={pullNumber} + comments={comments} + prComments={prComments} + reviews={reviews} + /> + ) : null} + </> + ) + }} + </Await> + </Suspense> + <DesktopOutline + toc={content.sections} + activeItem={activeItem} + className="hidden 1200:block" + /> + </div> + </div> + </Container> + <Footnotes doc={content as DocumentBlock} /> </main> + <div className="fixed inset-x-0 bottom-0 children:mb-0"> + <SmallScreenOutline + toc={content.sections} + activeItem={activeItem} + className="block 1200:hidden" + key={pathname} + /> + </div> </> ) } @@ -312,11 +348,11 @@ const PropertyRow = ({ )} > <Container isGrid> - <div className="relative col-span-4 text-mono-sm text-quaternary 800:col-span-1 1200:col-span-2 print:col-span-2 print:text-default"> + <div className="relative col-span-4 text-mono-sm text-tertiary 800:col-span-1 1200:col-span-2 print:col-span-2 print:text-raise"> <div className="absolute -bottom-2 -top-2 right-0 w-px bg-[black]" /> {label} </div> - <div className="col-span-8 text-sans-md text-secondary 800:col-span-9 1200:col-span-8 print:col-span-10"> + <div className="col-span-8 text-sans-md text-default 800:col-span-9 1200:col-span-8 print:col-span-10"> {children} </div> </Container> diff --git a/app/services/rfd.server.ts b/app/services/rfd.server.ts index 4145813..e6b989a 100644 --- a/app/services/rfd.server.ts +++ b/app/services/rfd.server.ts @@ -9,10 +9,12 @@ import fs from 'fs' import { createAppAuth } from '@octokit/auth-app' import type { GetResponseTypeFromEndpointMethod } from '@octokit/types' -import { asciidoctor, type AdocTypes } from '@oxide/react-asciidoc' +import { handleDocument } from '@oxide/design-system/components/dist' +import { type DocumentBlock, type DocumentSection } from '@oxide/react-asciidoc' import { Octokit } from 'octokit' import { generateAuthors, type Author } from '~/components/rfd/RfdPreview' +import { ad, attrs } from '~/utils/asciidoctor' import { isTruthy } from '~/utils/isTruthy' import { parseRfdNum } from '~/utils/parseRfdNum' import { can, type Permission } from '~/utils/permission' @@ -30,8 +32,8 @@ export type RfdItem = { discussion_link: string | null authors: Author[] labels: string[] - content: string - toc: TocItem[] + content: DocumentBlock + toc: DocumentSection[] commit_date: string pdf_link_google_drive: string visibility: 'private' | 'public' @@ -251,13 +253,13 @@ export async function fetchRfd(num: number, user: User | null): Promise<RfdItem ? fetchRfdLocally(num) : await apiRequest<RfdResponse>(`rfd/${num}`, user?.token) - const ad = asciidoctor() const doc = ad.load(resp.content, { - standalone: true, + ...attrs, attributes: { rfdnumber: num, }, }) + const highlightedDocument = await handleDocument(doc) return { number: resp.rfd_number, @@ -268,8 +270,8 @@ export async function fetchRfd(num: number, user: User | null): Promise<RfdItem discussion_link: resp.discussion, authors: resp.authors ? generateAuthors(resp.authors) : [], labels: resp.labels ? resp.labels.split(',') : [], - content: resp.content, - toc: generateTableOfContents(doc.getSections()), + content: highlightedDocument, + toc: highlightedDocument.sections, commit_date: resp.committed_at, pdf_link_google_drive: resp.pdfs.filter((pdf) => pdf.source === 'google')[0]?.link || '', @@ -374,40 +376,3 @@ export const provideNewRfdNumber = (rfds: RfdListItem[]): number | null => { return latestRfd.number + 1 } - -const generateTableOfContents = (sections: AdocTypes.Section[]) => { - let toc: TocItem[] = [] - - if (sections.length < 1) return toc - - for (let section of sections) { - generateSection(toc, section) - } - - return toc -} - -export type TocItem = { - id: string - level: number - title: string - sectNum: string -} - -const generateSection = (toc: TocItem[], section: AdocTypes.Section) => { - toc.push({ - id: section.getId(), - level: section.getLevel(), - title: section.getTitle() || '', - // @ts-ignore - sectNum: section.$sectnum().slice(0, -1), - }) - - if (section.hasSections()) { - const sections = section.getSections() - - for (let section of sections) { - generateSection(toc, section) - } - } -} diff --git a/app/styles/index.css b/app/styles/index.css index 2748f3c..0397859 100644 --- a/app/styles/index.css +++ b/app/styles/index.css @@ -14,6 +14,7 @@ @import '@oxide/design-system/styles/dist/blue.css'; @import '@oxide/design-system/components/dist/asciidoc.css'; @import '@oxide/design-system/components/dist/button.css'; +@import '@oxide/design-system/components/dist/spinner.css'; @import './lib/asciidoc.css'; @import './lib/highlight.css'; @@ -64,7 +65,7 @@ body { @layer base { body { - @apply text-sans-sm text-default; + @apply text-sans-sm text-raise; } } @@ -118,7 +119,7 @@ input[type='checkbox']:focus:not(:focus-visible) { } .link-with-underline { - @apply text-secondary hover:text-default; + @apply text-default hover:text-raise; text-decoration: underline; text-decoration-color: var(--content-quinary); @@ -126,31 +127,3 @@ input[type='checkbox']:focus:not(:focus-visible) { text-decoration-color: var(--content-tertiary); } } - -/* todo: upgrade design-system and grab from there */ -@layer components { - .accent-link { - @apply text-accent-secondary hover:text-accent; - text-decoration: underline; - text-decoration-color: var(--content-accent-tertiary); - } - - .inline-code { - @apply text-secondary; - @apply ml-[1px] mr-[1px] rounded border px-[4px] py-[1px] align-[1px] text-[0.825rem] bg-raise border-secondary; - } -} - -#footnotes p a { - @apply accent-link; -} - -#footnotes p code { - @apply inline-code; -} - -/* todo: include in design-system after upgrade */ -.asciidoc-body a:not(:is(h1, h2, h3, h4, h5, h6) a) { - text-decoration-color: rgba(var(--content-accent-tertiary-rgb), 0.8); - @apply underline text-accent-secondary; -} diff --git a/app/styles/lib/asciidoc.css b/app/styles/lib/asciidoc.css index 287b7cb..c20ff15 100644 --- a/app/styles/lib/asciidoc.css +++ b/app/styles/lib/asciidoc.css @@ -29,7 +29,7 @@ .asciidoc-body h3[data-sectnum]:before, .asciidoc-body h4[data-sectnum]:before, .asciidoc-body h5[data-sectnum]:before { - @apply pointer-events-none top-[6px] mr-2 inline-block text-quaternary 800:absolute 800:-left-[72px] 800:mr-0 800:w-[60px] 800:text-right 800:text-sans-lg; + @apply pointer-events-none top-[6px] mr-2 inline-block text-tertiary 800:absolute 800:-left-[72px] 800:mr-0 800:w-[60px] 800:text-right 800:text-sans-lg; content: attr(data-sectnum); } @@ -55,7 +55,7 @@ } .asciidoc-body img { - @apply bg-inverse; + @apply bg-inverse-primary; } .asciidoc-body .transparent-dark img { diff --git a/app/styles/lib/github-markdown.css b/app/styles/lib/github-markdown.css index 29efb51..477199b 100644 --- a/app/styles/lib/github-markdown.css +++ b/app/styles/lib/github-markdown.css @@ -17,7 +17,7 @@ & ul, & ol { - @apply normal-case text-sans-md text-secondary; + @apply normal-case text-sans-md text-default; } & blockquote { diff --git a/app/utils/asciidoctor.tsx b/app/utils/asciidoctor.tsx new file mode 100644 index 0000000..797630c --- /dev/null +++ b/app/utils/asciidoctor.tsx @@ -0,0 +1,45 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright Oxide Computer Company + */ +import { type Block, type Html5Converter } from '@asciidoctor/core' +import { InlineConverter, loadAsciidoctor } from '@oxide/design-system/components/dist' +import { renderToString } from 'react-dom/server' + +import { InlineImage } from '~/components/AsciidocBlocks/Image' + +const attrs = { + sectlinks: 'true', + stem: 'latexmath', + stylesheet: false, +} + +const ad = loadAsciidoctor({}) + +class CustomInlineConverter { + baseConverter: Html5Converter + + constructor() { + this.baseConverter = new InlineConverter() + } + + convert(node: Block, transform: string) { + switch (node.getNodeName()) { + case 'inline_image': + return renderToString(<InlineImage node={node} />) + case 'image': + return renderToString(<InlineImage node={node} />) + default: + break + } + + return this.baseConverter.convert(node, transform) + } +} + +ad.ConverterFactory.register(new CustomInlineConverter(), ['html5']) + +export { ad, attrs } diff --git a/package-lock.json b/package-lock.json index 734fd2d..c049dd9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,10 +6,11 @@ "": { "dependencies": { "@ariakit/react": "^0.3.5", + "@asciidoctor/core": "^3.0.4", "@floating-ui/react": "^0.17.0", "@meilisearch/instant-meilisearch": "^0.8.2", - "@oxide/design-system": "^1.4.0", - "@oxide/react-asciidoc": "^0.2.3", + "@oxide/design-system": "^1.8.2", + "@oxide/react-asciidoc": "^1.0.2", "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-dropdown-menu": "^2.0.4", "@remix-run/node": "2.13.1", @@ -25,15 +26,17 @@ "isbot": "^4", "lodash": "^4.17.21", "marked": "^4.2.5", - "mermaid": "^11.4.0", + "mermaid": "^11.4.1", "mime-types": "^2.1.35", "mousetrap": "^1.6.5", "octokit": "^3.1.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-instantsearch": "^7.13.4", + "remeda": "^2.17.4", "remix-auth": "^3.6.0", "remix-auth-oauth2": "^1.11.1", + "shiki": "^1.23.1", "simple-text-diff": "^1.7.0", "tunnel-rat": "^0.1.2", "zod": "^3.22.3" @@ -72,7 +75,7 @@ "vitest": "^2.0.3" }, "engines": { - "node": "^20.0.0" + "node": "^22.x" } }, "node_modules/@algolia/cache-browser-local-storage": { @@ -241,6 +244,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.4.1.tgz", "integrity": "sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==", + "license": "MIT", "dependencies": { "package-manager-detector": "^0.2.0", "tinyexec": "^0.3.0" @@ -253,6 +257,7 @@ "version": "0.7.10", "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } @@ -877,12 +882,14 @@ "node_modules/@braintree/sanitize-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.0.tgz", - "integrity": "sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==" + "integrity": "sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==", + "license": "MIT" }, "node_modules/@chevrotain/cst-dts-gen": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "license": "Apache-2.0", "dependencies": { "@chevrotain/gast": "11.0.3", "@chevrotain/types": "11.0.3", @@ -893,6 +900,7 @@ "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "license": "Apache-2.0", "dependencies": { "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" @@ -901,17 +909,20 @@ "node_modules/@chevrotain/regexp-to-ast": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", - "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==" + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "license": "Apache-2.0" }, "node_modules/@chevrotain/types": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", - "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==" + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "license": "Apache-2.0" }, "node_modules/@chevrotain/utils": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", - "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==" + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "license": "Apache-2.0" }, "node_modules/@csstools/postcss-global-data": { "version": "1.0.3", @@ -945,11 +956,6 @@ "postcss-selector-parser": "^6.0.10" } }, - "node_modules/@cush/relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@cush/relative/-/relative-1.0.0.tgz", - "integrity": "sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==" - }, "node_modules/@emotion/hash": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", @@ -1417,38 +1423,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@figma-export/output-components-as-svgr": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@figma-export/output-components-as-svgr/-/output-components-as-svgr-4.8.0.tgz", - "integrity": "sha512-mTCdseL77/nx2EoUV0/mCTkR90w1mA604dBMP1gaV3urtvjPZNyt5h4Fp22eqYcffVbw3/MDnS38pBQkH+7yvw==", - "dependencies": { - "@figma-export/types": "^4.8.0", - "@figma-export/utils": "^4.8.0", - "@svgr/core": "~6.3.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@figma-export/types": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@figma-export/types/-/types-4.8.0.tgz", - "integrity": "sha512-IRwE1DRvlfsR8aSxyCFfMPH8C73Hg/ApsvEUM+ncNzDGSWF09uKPoXfBEjfbVz02VDKa5/G6FJhtPk+pzXmC1A==", - "dependencies": { - "figma-js": "~1.16.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@figma-export/utils": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@figma-export/utils/-/utils-4.8.0.tgz", - "integrity": "sha512-1nFPCkZzN95iLf6nWrJKiz48ygxfKttOWqWXlqhuhkK/HEJJ2UkPXUjDZ/VmIg/Pj/fpg92zu0pMNqwTMTrTyQ==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/@floating-ui/core": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", @@ -1596,20 +1570,35 @@ "node_modules/@iconify/types": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==" + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" }, "node_modules/@iconify/utils": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.33.tgz", - "integrity": "sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.2.0.tgz", + "integrity": "sha512-9A5eZQV9eKlNCXlI/SgYsGRS7YmGmB1oAsRpNVIYBmIzGJRgH+hfG+lo4069s+GFWFNnBAtDg10c53vQZBLfnA==", + "license": "MIT", "dependencies": { - "@antfu/install-pkg": "^0.4.0", + "@antfu/install-pkg": "^0.4.1", "@antfu/utils": "^0.7.10", "@iconify/types": "^2.0.0", - "debug": "^4.3.6", + "debug": "^4.4.0", + "globals": "^15.13.0", "kolorist": "^1.8.0", - "local-pkg": "^0.5.0", - "mlly": "^1.7.1" + "local-pkg": "^0.5.1", + "mlly": "^1.7.3" + } + }, + "node_modules/@iconify/utils/node_modules/globals": { + "version": "15.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", + "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@isaacs/cliui": { @@ -1784,6 +1773,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.3.0.tgz", "integrity": "sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA==", + "license": "MIT", "dependencies": { "langium": "3.0.0" } @@ -2317,19 +2307,24 @@ "integrity": "sha512-S8u2cJzklBC0FgTwWVLaM8tMrDuDMVE4xiTK4EYXM9GntyvrdbSoxqDQa+Fh57CCNApyIpyeqPhhFEmHPfrXgw==" }, "node_modules/@oxide/design-system": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@oxide/design-system/-/design-system-1.4.6.tgz", - "integrity": "sha512-arhKAI6sS/QUs1z5H30RQ+/bWPgKifE7KrwkVnDqjBRI4jirmAfa/td1X3hh8fN3ef3yUrkcECPjxygyQjikZg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@oxide/design-system/-/design-system-1.8.2.tgz", + "integrity": "sha512-ocHVCQUGPZwrDFtKyOeDqVXznzrzGWRS6Id5iRyMnxJLcLpNcJyJZ5dylHoyhuJkDERHHrSdbO9ATrtNHQZzkQ==", + "license": "MPL 2.0", "dependencies": { - "@figma-export/output-components-as-svgr": "^4.7.0", "@floating-ui/react": "^0.25.1", "@headlessui/react": "^1.7.17", + "@radix-ui/react-accordion": "^1.2.2", "@radix-ui/react-tabs": "^1.0.4", - "html-entities": "^2.4.0", - "react-router-dom": "^6.15.0" + "classnames": "^2.5.1", + "remeda": "^2.17.4", + "shiki": "^1.24.0", + "vitest": "^2.1.8" }, "peerDependencies": { - "@oxide/react-asciidoc": "^0.2.8", + "@asciidoctor/core": "^3.0.0", + "@oxide/react-asciidoc": "^1.0.0", + "@remix-run/react": "2.13.1", "react": "^18.2.0", "react-dom": "^18.2.0" } @@ -2366,303 +2361,16 @@ "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, "node_modules/@oxide/react-asciidoc": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@oxide/react-asciidoc/-/react-asciidoc-0.2.8.tgz", - "integrity": "sha512-9q36DCdWQzMzfh9neT1AlMdIQ5X0s9dVpwZqH4btU0vOH+JTqrd3i9n5CG+a1JXI7OKfpfsFaJ2wLwl3wL1hSg==", - "dependencies": { - "@asciidoctor/core": "^3.0.2", - "classnames": "^2.3.2", - "highlight.js": "^11.6.0", - "html-react-parser": "^4.2.2", - "vite-tsconfig-paths": "^3.5.1", - "vitest": "^0.24.3" - }, - "peerDependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "engines": { - "node": "*" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "engines": { - "node": "*" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", - "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/tinypool": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.1.tgz", - "integrity": "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/tinyspy": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", - "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/vite": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.11.tgz", - "integrity": "sha512-K/jGKL/PgbIgKCiJo5QbASQhFiV02X9Jh+Qq0AKCRCRKZtOTVi4t6wh75FDpGf2N9rYOnzH87OEFQNaFy6pdxQ==", - "dependencies": { - "esbuild": "^0.15.9", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/vite-tsconfig-paths": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-3.6.0.tgz", - "integrity": "sha512-UfsPYonxLqPD633X8cWcPFVuYzx/CMNHAjZTasYwX69sXpa4gNmQkR0XCjj82h7zhLGdTWagMjC1qfb9S+zv0A==", - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "recrawl-sync": "^2.0.3", - "tsconfig-paths": "^4.0.0" - }, - "peerDependencies": { - "vite": ">2.0.0-0" - } - }, - "node_modules/@oxide/react-asciidoc/node_modules/vitest": { - "version": "0.24.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.24.5.tgz", - "integrity": "sha512-zw6JhPUHtLILQDe5Q39b/SzoITkG+R7hcFjuthp4xsi6zpmfQPOZcHodZ+3bqoWl4EdGK/p1fuMiEwdxgbGLOA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@oxide/react-asciidoc/-/react-asciidoc-1.0.2.tgz", + "integrity": "sha512-CRA7LGX8aYhdpYZ3is6MSS1Lb0g+mIdi8rLuLA1mb/LXuXh9SOOPItucPaz+8PNIB+Owub6PpVUnqYCUJzNWew==", "dependencies": { - "@types/chai": "^4.3.3", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "chai": "^4.3.6", - "debug": "^4.3.4", - "local-pkg": "^0.4.2", - "strip-literal": "^0.4.2", - "tinybench": "^2.3.1", - "tinypool": "^0.3.0", - "tinyspy": "^1.0.2", - "vite": "^3.0.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": ">=v14.16.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "html-react-parser": "^5.1.15" }, "peerDependencies": { - "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } + "@asciidoctor/core": "^3.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, "node_modules/@pkgjs/parseargs": { @@ -2695,18 +2403,19 @@ "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" }, "node_modules/@radix-ui/react-accordion": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.1.tgz", - "integrity": "sha512-bg/l7l5QzUjgsh8kjwDFommzAshnUsuVMV5NM56QVCm+7ZckYdd9P/ExR8xG/Oup0OajVxNLaHJ1tb8mXk+nzQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.2.tgz", + "integrity": "sha512-b1oh54x4DMCdGsB4/7ahiSrViXxaBwRPotiZNnYXjLha9vfuURSAZErki6qjDoSIV0eXx5v57XnTGVtGwnfp2g==", + "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collapsible": "1.1.1", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collapsible": "1.1.2", + "@radix-ui/react-collection": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", "@radix-ui/react-context": "1.1.1", "@radix-ui/react-direction": "1.1.0", "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-primitive": "2.0.1", "@radix-ui/react-use-controllable-state": "1.1.0" }, "peerDependencies": { @@ -2724,12 +2433,22 @@ } } }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", - "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-collection": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.1.tgz", + "integrity": "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==", + "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.0.0" + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-slot": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -2746,19 +2465,28 @@ } } }, - "node_modules/@radix-ui/react-collapsible": { + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-compose-refs": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.1.tgz", - "integrity": "sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-presence": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" + "@radix-ui/react-slot": "1.1.1" }, "peerDependencies": { "@types/react": "*", @@ -2775,7 +2503,163 @@ } } }, - "node_modules/@radix-ui/react-collection": { + "node_modules/@radix-ui/react-accordion/node_modules/@radix-ui/react-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.2.tgz", + "integrity": "sha512-PliMB63vxz7vggcyq0IxNYk8vGDrLXVWw4+W4B8YnwI1s18x7YZYqlG9PLX7XxAJUi0g2DxP4XKJMFHh/iVh9A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.1", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-presence": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-primitive": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz", + "integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible/node_modules/@radix-ui/react-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz", + "integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", @@ -3908,205 +3792,75 @@ "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", "dev": true }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", - "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", - "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", - "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", - "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", - "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@shikijs/core": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.24.2.tgz", + "integrity": "sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ==", + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "1.24.2", + "@shikijs/engine-oniguruma": "1.24.2", + "@shikijs/types": "1.24.2", + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.3" } }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", - "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@shikijs/core/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" } }, - "node_modules/@svgr/babel-preset": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", - "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "node_modules/@shikijs/engine-javascript": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.24.2.tgz", + "integrity": "sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q==", + "license": "MIT", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@shikijs/types": "1.24.2", + "@shikijs/vscode-textmate": "^9.3.0", + "oniguruma-to-es": "0.7.0" } }, - "node_modules/@svgr/core": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.3.1.tgz", - "integrity": "sha512-Sm3/7OdXbQreemf9aO25keerZSbnKMpGEfmH90EyYpj1e8wMD4TuwJIb3THDSgRMWk1kYJfSRulELBy4gVgZUA==", + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.2.tgz", + "integrity": "sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==", + "license": "MIT", "dependencies": { - "@svgr/plugin-jsx": "^6.3.1", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "@shikijs/types": "1.24.2", + "@shikijs/vscode-textmate": "^9.3.0" } }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", - "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "node_modules/@shikijs/types": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.2.tgz", + "integrity": "sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.20.0", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4" } }, - "node_modules/@svgr/plugin-jsx": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", - "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "node_modules/@shikijs/types/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "^6.0.0" + "@types/unist": "*" } }, + "node_modules/@shikijs/vscode-textmate": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz", + "integrity": "sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==", + "license": "MIT" + }, "node_modules/@tailwindcss/line-clamp": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.4.4.tgz", @@ -4360,19 +4114,6 @@ "resolved": "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.2.tgz", "integrity": "sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==" }, - "node_modules/@types/chai": { - "version": "4.3.20", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", - "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==" - }, - "node_modules/@types/chai-subset": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.5.tgz", - "integrity": "sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==", - "dependencies": { - "@types/chai": "*" - } - }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -4622,15 +4363,6 @@ "resolved": "https://registry.npmjs.org/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.1.tgz", "integrity": "sha512-udCxb8DvjcDKfk1WTBzDsxFbLgYxmQGKrE/ricoMqHRNjSlSUCcamVTA5lIQqzY10mY5qCY0QDwBfFEwhfoDPw==" }, - "node_modules/@types/dompurify": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.2.0.tgz", - "integrity": "sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg==", - "deprecated": "This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed.", - "dependencies": { - "dompurify": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -4789,11 +4521,6 @@ "undici-types": "~6.19.2" } }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, "node_modules/@types/prop-types": { "version": "15.7.13", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", @@ -4884,6 +4611,13 @@ "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, "node_modules/@types/unist": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", @@ -5092,8 +4826,7 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@vanilla-extract/babel-plugin-debug-ids": { "version": "1.1.0", @@ -5212,14 +4945,14 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/@vitest/expect": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.3.tgz", - "integrity": "sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==", - "dev": true, + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", + "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", + "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.3", - "@vitest/utils": "2.1.3", - "chai": "^5.1.1", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", "tinyrainbow": "^1.2.0" }, "funding": { @@ -5227,21 +4960,20 @@ } }, "node_modules/@vitest/mocker": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.3.tgz", - "integrity": "sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==", - "dev": true, + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", + "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", + "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.3", + "@vitest/spy": "2.1.8", "estree-walker": "^3.0.3", - "magic-string": "^0.30.11" + "magic-string": "^0.30.12" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/spy": "2.1.3", - "msw": "^2.3.5", + "msw": "^2.4.9", "vite": "^5.0.0" }, "peerDependenciesMeta": { @@ -5254,10 +4986,10 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.3.tgz", - "integrity": "sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==", - "dev": true, + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", + "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", + "license": "MIT", "dependencies": { "tinyrainbow": "^1.2.0" }, @@ -5266,12 +4998,12 @@ } }, "node_modules/@vitest/runner": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.3.tgz", - "integrity": "sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==", - "dev": true, + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", + "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", + "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.3", + "@vitest/utils": "2.1.8", "pathe": "^1.1.2" }, "funding": { @@ -5279,13 +5011,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.3.tgz", - "integrity": "sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==", - "dev": true, + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", + "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", + "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.3", - "magic-string": "^0.30.11", + "@vitest/pretty-format": "2.1.8", + "magic-string": "^0.30.12", "pathe": "^1.1.2" }, "funding": { @@ -5293,25 +5025,25 @@ } }, "node_modules/@vitest/spy": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.3.tgz", - "integrity": "sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==", - "dev": true, + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", + "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", + "license": "MIT", "dependencies": { - "tinyspy": "^3.0.0" + "tinyspy": "^3.0.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.3.tgz", - "integrity": "sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==", - "dev": true, + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", + "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", + "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.3", - "loupe": "^3.1.1", + "@vitest/pretty-format": "2.1.8", + "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" }, "funding": { @@ -5376,9 +5108,10 @@ } }, "node_modules/acorn": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", - "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -5490,7 +5223,8 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true }, "node_modules/anymatch": { "version": "3.1.3", @@ -5703,7 +5437,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, + "license": "MIT", "engines": { "node": ">=12" } @@ -5789,14 +5523,6 @@ "node": ">=4" } }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -6111,21 +5837,11 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "engines": { "node": ">=6" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -6176,10 +5892,10 @@ } }, "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", - "dev": true, + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "license": "MIT", "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", @@ -6244,7 +5960,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, + "license": "MIT", "engines": { "node": ">= 16" } @@ -6253,6 +5969,7 @@ "version": "11.0.3", "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "license": "Apache-2.0", "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", @@ -6266,6 +5983,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", "dependencies": { "lodash-es": "^4.17.21" }, @@ -6552,25 +6270,11 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", "dependencies": { "layout-base": "^1.0.0" } }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/cross-fetch": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", @@ -6837,9 +6541,10 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/cytoscape": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.2.tgz", - "integrity": "sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw==", + "version": "3.30.4", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.4.tgz", + "integrity": "sha512-OxtlZwQl1WbwMmLiyPSEBuzeTIQnwZhJYYWFzZ2PhEHVFwpeaqNIkUzSiso00D98qk60l8Gwon2RP304d3BJ1A==", + "license": "MIT", "engines": { "node": ">=0.10" } @@ -6848,6 +6553,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", "dependencies": { "cose-base": "^1.0.0" }, @@ -6859,6 +6565,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", "dependencies": { "cose-base": "^2.2.0" }, @@ -6870,6 +6577,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", "dependencies": { "layout-base": "^2.0.0" } @@ -6877,12 +6585,14 @@ "node_modules/cytoscape-fcose/node_modules/layout-base": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==" + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" }, "node_modules/d3": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -6923,6 +6633,7 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", "dependencies": { "internmap": "1 - 2" }, @@ -6934,6 +6645,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", "engines": { "node": ">=12" } @@ -6942,6 +6654,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -6957,6 +6670,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", "dependencies": { "d3-path": "1 - 3" }, @@ -6968,6 +6682,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -6976,6 +6691,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", "dependencies": { "d3-array": "^3.2.0" }, @@ -6987,6 +6703,7 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", "dependencies": { "delaunator": "5" }, @@ -6998,6 +6715,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7006,6 +6724,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -7018,6 +6737,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", "dependencies": { "commander": "7", "iconv-lite": "0.6", @@ -7042,6 +6762,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -7053,6 +6774,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", "engines": { "node": ">=12" } @@ -7061,6 +6783,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", "dependencies": { "d3-dsv": "1 - 3" }, @@ -7072,6 +6795,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -7085,6 +6809,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7093,6 +6818,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -7104,6 +6830,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7112,6 +6839,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -7123,6 +6851,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7131,6 +6860,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7139,6 +6869,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7147,6 +6878,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7155,6 +6887,7 @@ "version": "0.12.3", "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "1 - 2", "d3-shape": "^1.2.0" @@ -7164,6 +6897,7 @@ "version": "2.12.1", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", "dependencies": { "internmap": "^1.0.0" } @@ -7171,12 +6905,14 @@ "node_modules/d3-sankey/node_modules/d3-path": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" }, "node_modules/d3-sankey/node_modules/d3-shape": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", "dependencies": { "d3-path": "1" } @@ -7184,12 +6920,14 @@ "node_modules/d3-sankey/node_modules/internmap": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" }, "node_modules/d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -7205,6 +6943,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -7217,6 +6956,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7225,6 +6965,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", "dependencies": { "d3-path": "^3.1.0" }, @@ -7236,6 +6977,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", "dependencies": { "d3-array": "2 - 3" }, @@ -7247,6 +6989,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", "dependencies": { "d3-time": "1 - 3" }, @@ -7258,6 +7001,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -7266,6 +7010,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -7284,6 +7029,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -7299,6 +7045,7 @@ "version": "7.0.11", "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", + "license": "MIT", "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" @@ -7390,9 +7137,10 @@ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -7441,7 +7189,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -7545,6 +7293,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", "dependencies": { "robust-predicates": "^3.0.2" } @@ -7596,6 +7345,19 @@ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -7699,9 +7461,13 @@ } }, "node_modules/dompurify": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz", - "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.3.tgz", + "integrity": "sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } }, "node_modules/domutils": { "version": "3.1.0", @@ -7794,6 +7560,12 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "license": "MIT" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -7840,14 +7612,6 @@ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/es-abstract": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", @@ -8065,418 +7829,118 @@ "@esbuild/win32-x64": "0.17.6" } }, - "node_modules/esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], + "node_modules/esbuild-plugins-node-modules-polyfill": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.6.7.tgz", + "integrity": "sha512-1lzsVFT/6OO1ZATHKZqSP+qYzyFo2d+QF9QzMKsyJR7GMRScYizYb1uEEE4NxTsBSxWviY3xnmN9dEOTaKFbJA==", + "dependencies": { + "@jspm/core": "^2.0.1", + "local-pkg": "^0.5.0", + "resolve.exports": "^2.0.2" + }, "engines": { - "node": ">=12" + "node": ">=14.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.14.0 <=0.23.x" } }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { - "node": ">=12" + "node": ">=0.8.0" } }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" } }, - "node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-plugins-node-modules-polyfill": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.6.7.tgz", - "integrity": "sha512-1lzsVFT/6OO1ZATHKZqSP+qYzyFo2d+QF9QzMKsyJR7GMRScYizYb1uEEE4NxTsBSxWviY3xnmN9dEOTaKFbJA==", - "dependencies": { - "@jspm/core": "^2.0.1", - "local-pkg": "^0.5.0", - "resolve.exports": "^2.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.14.0 <=0.23.x" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-typescript": { @@ -9385,6 +8849,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/express": { "version": "4.21.1", "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", @@ -9539,17 +9012,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/figma-js": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/figma-js/-/figma-js-1.16.0.tgz", - "integrity": "sha512-cImQT9DAJp1J0xr6FMUAswXKEnjwrDz4QKAgIBpUyydKAgDS/lm862stjweHp99uco5qLoNv+GbwQWBHyDvDQw==", - "dependencies": { - "axios": "^0.21.1" - }, - "engines": { - "node": ">=8.9" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -9641,25 +9103,6 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -9851,14 +9294,6 @@ "node": ">=6.9.0" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "engines": { - "node": "*" - } - }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -9967,11 +9402,6 @@ "node": ">= 6" } }, - "node_modules/glob-regex": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/glob-regex/-/glob-regex-0.3.2.tgz", - "integrity": "sha512-m5blUd3/OqDTWwzBBtWBPrGlAzatRywHameHeekAZyZrskYouOGdNB8T/q6JucucvJXtOuyHIn0/Yia7iDasDw==" - }, "node_modules/glob/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -10030,7 +9460,8 @@ "node_modules/globrex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true }, "node_modules/gopd": { "version": "1.0.1", @@ -10059,117 +9490,384 @@ "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", "dependencies": { - "browserify-zlib": "^0.1.4", - "is-deflate": "^1.0.0", - "is-gzip": "^1.0.0", - "peek-stream": "^1.1.0", - "pumpify": "^1.3.3", - "through2": "^2.0.3" + "browserify-zlib": "^0.1.4", + "is-deflate": "^1.0.0", + "is-gzip": "^1.0.0", + "peek-stream": "^1.1.0", + "pumpify": "^1.3.3", + "through2": "^2.0.3" + }, + "bin": { + "gunzip-maybe": "bin.js" + } + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-estree": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz", + "integrity": "sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "estree-util-attach-comments": "^2.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdxjs-esm": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.1", + "unist-util-position": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", + "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-to-html/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-to-html/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/hast-util-to-html/node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/hast-util-to-html/node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/hast-util-to-html/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/hast-util-to-html/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/hast-util-to-html/node_modules/micromark-util-types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", + "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/hast-util-to-html/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" }, - "bin": { - "gunzip-maybe": "bin.js" - } - }, - "node_modules/hachure-fill": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", - "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==" - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/hast-util-to-html/node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" + "node_modules/hast-util-to-html/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" + "node_modules/hast-util-to-html/node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/hast-util-to-html/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/hast-util-to-html/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-estree": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz", - "integrity": "sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==", + "node_modules/hast-util-to-html/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "estree-util-attach-comments": "^2.0.0", - "estree-util-is-identifier-name": "^2.0.0", - "hast-util-whitespace": "^2.0.0", - "mdast-util-mdx-expression": "^1.0.0", - "mdast-util-mdxjs-esm": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.1", - "unist-util-position": "^4.0.0", - "zwitch": "^2.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", @@ -10230,12 +9928,12 @@ "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==" }, "node_modules/html-dom-parser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-5.0.3.tgz", - "integrity": "sha512-slsc6ipw88OUZjAayRs5NTmfOQCwcUa3hNyk6AdsbQxY09H5Lr1Y3CZ4ZlconMKql3Ga6sWg3HMoUzo7KSItaQ==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-5.0.10.tgz", + "integrity": "sha512-GwArYL3V3V8yU/mLKoFF7HlLBv80BZ2Ey1BzfVNRpAci0cEKhFHI/Qh8o8oyt3qlAMLlK250wsxLdYX4viedvg==", "dependencies": { "domhandler": "5.0.3", - "htmlparser2": "9.0.0" + "htmlparser2": "9.1.0" } }, "node_modules/html-encoding-sniffer": { @@ -10267,23 +9965,39 @@ ] }, "node_modules/html-react-parser": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-4.2.10.tgz", - "integrity": "sha512-JyKZVQ+kQ8PdycISwkuLbEEvV/k4hWhU6cb6TT7yGaYwdqA7cPt4VRYXkCZcix2vlQtgDBSMJUmPI2jpNjPGvg==", + "version": "5.1.18", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-5.1.18.tgz", + "integrity": "sha512-65BwC0zzrdeW96jB2FRr5f1ovBhRMpLPJNvwkY5kA8Ay5xdL9t/RH2/uUTM7p+cl5iM88i6dDk4LXtfMnRmaJQ==", "dependencies": { "domhandler": "5.0.3", - "html-dom-parser": "5.0.3", + "html-dom-parser": "5.0.10", "react-property": "2.0.2", - "style-to-js": "1.1.8" + "style-to-js": "1.1.16" }, "peerDependencies": { + "@types/react": "0.14 || 15 || 16 || 17 || 18", "react": "0.14 || 15 || 16 || 17 || 18" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/htmlparser2": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.0.0.tgz", - "integrity": "sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -10406,6 +10120,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -10512,6 +10227,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", "engines": { "node": ">=12" } @@ -10586,11 +10302,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, "node_modules/is-async-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", @@ -11322,13 +11033,14 @@ } }, "node_modules/katex": { - "version": "0.16.11", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.11.tgz", - "integrity": "sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==", + "version": "0.16.15", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.15.tgz", + "integrity": "sha512-yE9YJIEAk2aZ+FL/G8r+UGw0CTUzEA8ZFy6E+8tc3spHUKq3qBnzCkI1CQwGoI9atJhVyFPEypQsTY7mJ1Pi9w==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" ], + "license": "MIT", "dependencies": { "commander": "^8.3.0" }, @@ -11340,6 +11052,7 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", "engines": { "node": ">= 12" } @@ -11369,12 +11082,14 @@ "node_modules/kolorist": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==" + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT" }, "node_modules/langium": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/langium/-/langium-3.0.0.tgz", "integrity": "sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==", + "license": "MIT", "dependencies": { "chevrotain": "~11.0.3", "chevrotain-allstar": "~0.3.0", @@ -11407,7 +11122,8 @@ "node_modules/layout-base": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" }, "node_modules/levn": { "version": "0.4.1", @@ -11434,7 +11150,8 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/loader-utils": { "version": "3.3.1", @@ -11445,12 +11162,13 @@ } }, "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "license": "MIT", "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" }, "engines": { "node": ">=14" @@ -11481,7 +11199,8 @@ "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -11649,7 +11368,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", - "dev": true + "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", @@ -11669,10 +11388,10 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", - "dev": true, + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -11935,15 +11654,15 @@ } }, "node_modules/mermaid": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.4.0.tgz", - "integrity": "sha512-mxCfEYvADJqOiHfGpJXLs4/fAjHz448rH0pfY5fAoxiz70rQiDSzUUy4dNET2T08i46IVpjohPd6WWbzmRHiPA==", + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.4.1.tgz", + "integrity": "sha512-Mb01JT/x6CKDWaxigwfZYuYmDZ6xtrNwNlidKZwkSrDaY9n90tdrJTV5Umk+wP1fZscGptmKFXHsXMDEVZ+Q6A==", + "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^7.0.1", "@iconify/utils": "^2.1.32", "@mermaid-js/parser": "^0.3.0", "@types/d3": "^7.4.3", - "@types/dompurify": "^3.0.5", "cytoscape": "^3.29.2", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", @@ -11951,7 +11670,7 @@ "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.11", "dayjs": "^1.11.10", - "dompurify": "^3.0.11 <3.1.7", + "dompurify": "^3.2.1", "katex": "^0.16.9", "khroma": "^2.1.0", "lodash-es": "^4.17.21", @@ -11966,6 +11685,7 @@ "version": "13.0.3", "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", + "license": "MIT", "bin": { "marked": "bin/marked.js" }, @@ -12779,13 +12499,14 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/mlly": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.2.tgz", - "integrity": "sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.3.tgz", + "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==", + "license": "MIT", "dependencies": { - "acorn": "^8.12.1", + "acorn": "^8.14.0", "pathe": "^1.1.2", - "pkg-types": "^1.2.0", + "pkg-types": "^1.2.1", "ufo": "^1.5.4" } }, @@ -12867,6 +12588,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -13092,6 +12814,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -13285,6 +13008,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/oniguruma-to-es": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.7.0.tgz", + "integrity": "sha512-HRaRh09cE0gRS3+wi2zxekB+I5L8C/gN60S+vb11eADHUaB/q4u8wGGOX3GvwvitG8ixaeycZfeoyruKQzUgNg==", + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^5.0.2", + "regex-recursion": "^4.3.0" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -13441,9 +13175,10 @@ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" }, "node_modules/package-manager-detector": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.5.tgz", - "integrity": "sha512-3dS7y28uua+UDbRCLBqltMBrbI+A5U2mI9YuxHRxIWYmLj3DwntEBmERYzIAQ4DMeuCUOBSak7dBHHoXKpOTYQ==" + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.7.tgz", + "integrity": "sha512-g4+387DXDKlZzHkP+9FLt8yKj8+/3tOkPv7DVTJGGRm00RkEWgqbFstX1mXJ4M0VDYhUqsTOiISqNOJnhAu3PQ==", + "license": "MIT" }, "node_modules/pako": { "version": "0.2.9", @@ -13454,6 +13189,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -13480,28 +13216,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, "node_modules/parse-ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", @@ -13539,7 +13253,8 @@ "node_modules/path-data-parser": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", - "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==" + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", @@ -13569,7 +13284,8 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "node_modules/path-scurry": { "version": "1.11.1", @@ -13601,6 +13317,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, "engines": { "node": ">=8" } @@ -13614,7 +13331,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, + "license": "MIT", "engines": { "node": ">= 14.16" } @@ -13679,6 +13396,7 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, "engines": { "node": ">= 6" } @@ -13740,12 +13458,14 @@ "node_modules/points-on-curve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", - "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==" + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" }, "node_modules/points-on-path": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" @@ -14936,23 +14656,6 @@ "node": ">=8.10.0" } }, - "node_modules/recrawl-sync": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recrawl-sync/-/recrawl-sync-2.2.3.tgz", - "integrity": "sha512-vSaTR9t+cpxlskkdUFrsEpnf67kSmPk66yAGT1fZPrDudxQjoMzPgQhSMImQ0pAw5k0NPirefQfhopSjhdUtpQ==", - "dependencies": { - "@cush/relative": "^1.0.0", - "glob-regex": "^0.3.0", - "slash": "^3.0.0", - "sucrase": "^3.20.3", - "tslib": "^1.9.3" - } - }, - "node_modules/recrawl-sync/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/reflect.getprototypeof": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", @@ -14979,6 +14682,30 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, + "node_modules/regex": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.0.2.tgz", + "integrity": "sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-4.3.0.tgz", + "integrity": "sha512-5LcLnizwjcQ2ALfOj95MjcatxyqF5RPySx9yT+PaXu3Gox2vyAtLDjHB8NTJLtMGkvyau6nI3CfpwFCjPUIs/A==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, "node_modules/regexp.prototype.flags": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", @@ -15089,6 +14816,14 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remeda": { + "version": "2.17.4", + "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.17.4.tgz", + "integrity": "sha512-pviU2Ag7Qx9mOCAKO4voxDx/scfLzdhp3v85qDO4xxntQsU76uE9sgrAAdK1ATn4zzaOJqCXYMMNRP+O9F4Wiw==", + "dependencies": { + "type-fest": "^4.27.0" + } + }, "node_modules/remix-auth": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/remix-auth/-/remix-auth-3.7.0.tgz", @@ -15158,6 +14893,7 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -15174,6 +14910,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "engines": { "node": ">=4" } @@ -15286,7 +15023,8 @@ "node_modules/robust-predicates": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" }, "node_modules/rollup": { "version": "4.24.0", @@ -15326,6 +15064,7 @@ "version": "4.6.6", "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", @@ -15365,7 +15104,8 @@ "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" }, "node_modules/sade": { "version": "1.8.1", @@ -15584,6 +15324,28 @@ "node": ">=8" } }, + "node_modules/shiki": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.24.2.tgz", + "integrity": "sha512-TR1fi6mkRrzW+SKT5G6uKuc32Dj2EEa7Kj0k8kGqiBINb+C1TiflVOiT9ta6GqOJtC4fraxO5SLUaKBcSY38Fg==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "1.24.2", + "@shikijs/engine-javascript": "1.24.2", + "@shikijs/engine-oniguruma": "1.24.2", + "@shikijs/types": "1.24.2", + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4" + } + }, + "node_modules/shiki/node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -15604,8 +15366,7 @@ "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" }, "node_modules/signal-exit": { "version": "3.0.7", @@ -15624,6 +15385,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "engines": { "node": ">=8" } @@ -15719,8 +15481,7 @@ "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" }, "node_modules/statuses": { "version": "2.0.1", @@ -15732,10 +15493,10 @@ } }, "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "license": "MIT" }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", @@ -15991,36 +15752,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-0.4.2.tgz", - "integrity": "sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw==", - "dependencies": { - "acorn": "^8.8.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/style-to-js": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.8.tgz", - "integrity": "sha512-bPSspCXkkhETLXnEgDbaoWRWyv3lF2bj32YIc8IElok2IIMHUlZtQUrxYmAkKUNxpluhH0qnKWrmuoXUyTY12g==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", + "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", "dependencies": { - "style-to-object": "1.0.3" + "style-to-object": "1.0.8" } }, "node_modules/style-to-js/node_modules/inline-style-parser": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz", - "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" }, "node_modules/style-to-js/node_modules/style-to-object": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.3.tgz", - "integrity": "sha512-xOpx7S53E0V3DpVsvt7ySvoiumRpfXiC99PUXLqGB3wiAnN9ybEIpuzlZ8LAZg+h1sl9JkEUwtSQXxcCgFqbbg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", "dependencies": { - "inline-style-parser": "0.2.2" + "inline-style-parser": "0.2.4" } }, "node_modules/style-to-object": { @@ -16050,12 +15800,14 @@ "node_modules/stylis": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", - "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==" + "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==", + "license": "MIT" }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -16077,6 +15829,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, "engines": { "node": ">= 6" } @@ -16085,6 +15838,7 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -16115,6 +15869,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -16122,11 +15877,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, "node_modules/svgo": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", @@ -16347,6 +16097,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, "dependencies": { "any-promise": "^1.0.0" } @@ -16355,6 +16106,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -16412,7 +16164,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", - "dev": true, "engines": { "node": "^18.0.0 || >=20.0.0" } @@ -16421,7 +16172,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -16430,7 +16181,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", - "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -16529,6 +16280,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", "engines": { "node": ">=6.10" } @@ -16536,7 +16288,8 @@ "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true }, "node_modules/ts-morph": { "version": "12.0.0", @@ -16636,12 +16389,15 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "node_modules/type-fest": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.29.0.tgz", + "integrity": "sha512-RPYt6dKyemXJe7I6oNstcH24myUGSReicxcHTvCLgzm4e0n8y05dGvcGB15/SoPRBmhlMthWQ9pvKyL81ko8nQ==", "engines": { - "node": ">=4" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/type-is": { @@ -17636,29 +17392,30 @@ } }, "node_modules/vitest": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.3.tgz", - "integrity": "sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==", - "dev": true, - "dependencies": { - "@vitest/expect": "2.1.3", - "@vitest/mocker": "2.1.3", - "@vitest/pretty-format": "^2.1.3", - "@vitest/runner": "2.1.3", - "@vitest/snapshot": "2.1.3", - "@vitest/spy": "2.1.3", - "@vitest/utils": "2.1.3", - "chai": "^5.1.1", - "debug": "^4.3.6", - "magic-string": "^0.30.11", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz", + "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.8", + "@vitest/mocker": "2.1.8", + "@vitest/pretty-format": "^2.1.8", + "@vitest/runner": "2.1.8", + "@vitest/snapshot": "2.1.8", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", "pathe": "^1.1.2", - "std-env": "^3.7.0", + "std-env": "^3.8.0", "tinybench": "^2.9.0", - "tinyexec": "^0.3.0", - "tinypool": "^1.0.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.1.3", + "vite-node": "2.1.8", "why-is-node-running": "^2.3.0" }, "bin": { @@ -17673,8 +17430,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.3", - "@vitest/ui": "2.1.3", + "@vitest/browser": "2.1.8", + "@vitest/ui": "2.1.8", "happy-dom": "*", "jsdom": "*" }, @@ -17700,13 +17457,14 @@ } }, "node_modules/vitest/node_modules/vite-node": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.3.tgz", - "integrity": "sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==", - "dev": true, + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz", + "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", + "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.6", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", "pathe": "^1.1.2", "vite": "^5.0.0" }, @@ -17724,6 +17482,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -17732,6 +17491,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, @@ -17743,6 +17503,7 @@ "version": "3.17.5", "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" @@ -17751,17 +17512,20 @@ "node_modules/vscode-languageserver-textdocument": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==" + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" }, "node_modules/vscode-languageserver-types": { "version": "3.17.5", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" }, "node_modules/vscode-uri": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==" + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "license": "MIT" }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", @@ -17959,7 +17723,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" @@ -18086,6 +17849,7 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, "engines": { "node": ">= 6" } diff --git a/package.json b/package.json index 2264692..0f3eac1 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,11 @@ }, "dependencies": { "@ariakit/react": "^0.3.5", + "@asciidoctor/core": "^3.0.4", "@floating-ui/react": "^0.17.0", "@meilisearch/instant-meilisearch": "^0.8.2", - "@oxide/design-system": "^1.4.0", - "@oxide/react-asciidoc": "^0.2.3", + "@oxide/design-system": "^1.8.2", + "@oxide/react-asciidoc": "^1.0.2", "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-dropdown-menu": "^2.0.4", "@remix-run/node": "2.13.1", @@ -33,15 +34,17 @@ "isbot": "^4", "lodash": "^4.17.21", "marked": "^4.2.5", - "mermaid": "^11.4.0", + "mermaid": "^11.4.1", "mime-types": "^2.1.35", "mousetrap": "^1.6.5", "octokit": "^3.1.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-instantsearch": "^7.13.4", + "remeda": "^2.17.4", "remix-auth": "^3.6.0", "remix-auth-oauth2": "^1.11.1", + "shiki": "^1.23.1", "simple-text-diff": "^1.7.0", "tunnel-rat": "^0.1.2", "zod": "^3.22.3" @@ -80,6 +83,6 @@ "vitest": "^2.0.3" }, "engines": { - "node": "^20.0.0" + "node": "^22.x" } } diff --git a/tailwind.config.js b/tailwind.config.ts similarity index 86% rename from tailwind.config.js rename to tailwind.config.ts index 6a8913c..66169d0 100644 --- a/tailwind.config.js +++ b/tailwind.config.ts @@ -5,20 +5,15 @@ * * Copyright Oxide Computer Company */ - -// @ts-check - -/** @type {import('tailwindcss/lib/util/createPlugin').default} */ -// @ts-ignore -const plugin = require('tailwindcss/plugin') -const { - textUtilities, - colorUtilities, +import { borderRadiusTokens, + colorUtilities, elevationUtilities, -} = require('@oxide/design-system/styles/dist/tailwind-tokens') + textUtilities, +} from '@oxide/design-system/styles/dist/tailwind-tokens.ts' +import { type Config } from 'tailwindcss' +import plugin from 'tailwindcss/plugin' -/** @type {import('tailwindcss/tailwind-config').TailwindConfig} */ module.exports = { corePlugins: { fontFamily: false, @@ -85,4 +80,4 @@ module.exports = { translate: ['group-hover'], }, }, -} +} satisfies Config diff --git a/test/e2e/everything.spec.ts b/test/e2e/everything.spec.ts index e97039b..5ddffae 100644 --- a/test/e2e/everything.spec.ts +++ b/test/e2e/everything.spec.ts @@ -62,10 +62,10 @@ test('Header filter box', async ({ page }) => { page.getByRole('heading', { name: 'Mission, Principles and Values' }), ).toBeVisible() - await expect(page.getByPlaceholder('Search')).toBeHidden() + await expect(page.getByRole('banner').getByPlaceholder('Search')).toBeHidden() await page.getByRole('button', { name: 'Select a RFD' }).click() - await page.getByPlaceholder('Search').fill('User Networking API') - await page.getByPlaceholder('Search').press('Enter') + await page.getByRole('banner').getByPlaceholder('Search').fill('User Networking API') + await page.getByRole('banner').getByPlaceholder('Search').press('Enter') await expect(page.getByRole('heading', { name: 'User Networking API' })).toBeVisible() })