diff --git a/CHANGELOG.md b/CHANGELOG.md index 55defc6a0..728825436 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## UNRELEASED + +- [#1048](https://github.com/atomicdata-dev/atomic-server/issues/1048) Fix search index not removing old versions of resources. + List of changes for this repo, including `atomic-cli`, `atomic-server` and `atomic-lib`. By far most changes relate to `atomic-server`, so if not specified, assume the changes are relevant only for the server. **Changes to JS assets (including the front-end and JS libraries) are not shown here**, but in [`/browser/CHANGELOG`](/browser/CHANGELOG.md). diff --git a/browser/CHANGELOG.md b/browser/CHANGELOG.md index 97cd05a6f..cd5f47255 100644 --- a/browser/CHANGELOG.md +++ b/browser/CHANGELOG.md @@ -17,6 +17,7 @@ This changelog covers all five packages, as they are (for now) updated as a whol - [#1008](https://github.com/atomicdata-dev/atomic-server/issues/1008) Add 'open' option to classes and properties in the ontology edit view. - [#1008](https://github.com/atomicdata-dev/atomic-server/issues/1008) Updated the look of the resource selector and made it more responsive. - [#1008](https://github.com/atomicdata-dev/atomic-server/issues/1008) Add info dropdowns to different sections of the ontology editor for more information about the section. +- [#459](https://github.com/atomicdata-dev/atomic-server/issues/459) New feature: Add tags to your resources to better organize your data. Search for resources with specific tags in the search bar with `tag:[name]`. ### @tomic/lib @@ -25,6 +26,7 @@ This changelog covers all five packages, as they are (for now) updated as a whol - Fix generated ontologies not working in a Next.js server context. - SEMI BREAKING CHANGE: When using generated types by cli, @tomic/lib now requires them to be generated by @tomic/cli v0.41.0 or above. - Fix types masquerading as esm module in cjs build. +- `store.search()` now handles multiple values for the same property correctly. ### @tomic/react diff --git a/browser/data-browser/package.json b/browser/data-browser/package.json index 152422103..8eee76e56 100644 --- a/browser/data-browser/package.json +++ b/browser/data-browser/package.json @@ -60,7 +60,7 @@ "@types/react-pdf": "^7.0.0", "@types/react-window": "^1.8.8", "@vitejs/plugin-react": "^4.3.4", - "babel-plugin-react-compiler": "19.0.0-beta-37ed2a7-20241206", + "babel-plugin-react-compiler": "19.0.0-beta-21e868a-20250216", "babel-plugin-styled-components": "^2.1.4", "csstype": "^3.1.3", "gh-pages": "^5.0.0", diff --git a/browser/data-browser/src/components/EditableTitle.tsx b/browser/data-browser/src/components/EditableTitle.tsx index 4f337876a..d047bf7c5 100644 --- a/browser/data-browser/src/components/EditableTitle.tsx +++ b/browser/data-browser/src/components/EditableTitle.tsx @@ -9,6 +9,7 @@ import { } from '../helpers/transitionName'; import { ViewTransitionProps } from '../helpers/ViewTransitionProps'; import { UnsavedIndicator } from './UnsavedIndicator'; +import { Flex } from './Row'; export interface EditableTitleProps { resource: Resource; @@ -142,6 +143,11 @@ const TitleInput = styled.input` &:focus { outline: none; } + + ${Flex} & { + // When rendered inside a flex container the margin is already provided by the gap. + margin-bottom: 0; + } `; const Icon = styled(FaPencil)` diff --git a/browser/data-browser/src/components/Main.tsx b/browser/data-browser/src/components/Main.tsx index 8af90b1c6..bce635d09 100644 --- a/browser/data-browser/src/components/Main.tsx +++ b/browser/data-browser/src/components/Main.tsx @@ -9,6 +9,7 @@ import { ViewTransitionProps } from '../helpers/ViewTransitionProps'; import { MAIN_CONTAINER } from '../helpers/containers'; import Parent from './Parent'; import { useResource } from '@tomic/react'; +import { CalculatedPageHeight } from '../globalCssVars'; /** Main landmark. Every page should have one of these. * If the pages shows a resource a subject can be passed that enables view transitions to work. */ @@ -36,7 +37,9 @@ export function Main({ const StyledMain = memo(styled.main` container: ${MAIN_CONTAINER} / inline-size; ${p => transitionName(RESOURCE_PAGE_TRANSITION_TAG, p.subject)}; - height: calc(100vh - ${p => p.theme.heights.breadCrumbBar}); + height: calc( + ${CalculatedPageHeight.var()} - ${p => p.theme.heights.breadCrumbBar} + ); overflow-y: auto; scroll-padding: calc( ${p => p.theme.heights.breadCrumbBar} + ${p => p.theme.size(2)} diff --git a/browser/data-browser/src/components/Navigation.tsx b/browser/data-browser/src/components/Navigation.tsx index 9be4d92bd..909379378 100644 --- a/browser/data-browser/src/components/Navigation.tsx +++ b/browser/data-browser/src/components/Navigation.tsx @@ -4,37 +4,53 @@ import { FaArrowLeft, FaArrowRight, FaBars } from 'react-icons/fa'; import { styled } from 'styled-components'; import { ButtonBar } from './Button'; -import { useCurrentSubject } from '../helpers/useCurrentSubject'; import { useSettings } from '../helpers/AppSettings'; import { SideBar } from './SideBar'; import { isRunningInTauri } from '../helpers/tauri'; import { shortcuts } from './HotKeyWrapper'; -import { NavBarSpacer } from './NavBarSpacer'; -import { Searchbar } from './Searchbar'; +import { Searchbar } from './Searchbar/Searchbar'; import { useMediaQuery } from '../hooks/useMediaQuery'; import { useBackForward } from '../hooks/useNavigateWithTransition'; import { NAVBAR_TRANSITION_TAG } from '../helpers/transitionName'; +import { SearchbarFakeInput } from './Searchbar/SearchbarInput'; +import { CalculatedPageHeight } from '../globalCssVars'; interface NavWrapperProps { children: React.ReactNode; } +enum NavBarPosition { + Top, + Floating, + Bottom, +} + +const getPosition = ( + navbarTop: boolean, + navbarFloating: boolean, +): NavBarPosition => { + if (navbarTop) return NavBarPosition.Top; + if (navbarFloating) return NavBarPosition.Floating; + + return NavBarPosition.Bottom; +}; /** Wraps the entire app and adds a navbar at the bottom or the top */ export function NavWrapper({ children }: NavWrapperProps): JSX.Element { const { navbarTop, navbarFloating } = useSettings(); const contentRef = React.useRef(null); + const navbarPosition = getPosition(navbarTop, navbarFloating); + return ( <> {navbarTop && } - + - {children} @@ -58,10 +74,8 @@ const Content = styled.div` function NavBar(): JSX.Element { const { back, forward } = useBackForward(); - const [subject] = useCurrentSubject(); const { navbarTop, navbarFloating, sideBarLocked, setSideBarLocked } = useSettings(); - const [showButtons, setShowButtons] = React.useState(true); const machesStandalone = useMediaQuery( '(display-mode: standalone) or (display-mode: fullscreen)', @@ -77,13 +91,6 @@ function NavBar(): JSX.Element { [machesStandalone], ); - /** Hide buttons if the input element is quite small */ - function maybeHideButtons(event: React.FocusEvent) { - if (event.target.getBoundingClientRect().width < 280) { - setShowButtons(false); - } - } - const ConditionalNavbar = navbarFloating ? NavBarFloating : NavBarFixed; return ( @@ -92,35 +99,29 @@ function NavBar(): JSX.Element { aria-label='search' floating={navbarFloating} > - {showButtons && ( - <> - setSideBarLocked(!sideBarLocked)} - title={`Show / hide sidebar (${shortcuts.sidebarToggle})`} - data-test='sidebar-toggle' - > - - - {isInStandaloneMode && ( - <> - - - {' '} - - - - - )} - - )} + <> + setSideBarLocked(!sideBarLocked)} + title={`Show / hide sidebar (${shortcuts.sidebarToggle})`} + data-test='sidebar-toggle' + > + + + {isInStandaloneMode && ( + <> + + + {' '} + + + + + )} + - setShowButtons(true)} - /> + ); } @@ -140,11 +141,20 @@ const NavBarBase = styled.div` border: solid 1px ${props => props.theme.colors.bg2}; background-color: ${props => props.theme.colors.bg}; view-transition-name: ${NAVBAR_TRANSITION_TAG}; + container-name: search-bar; + container-type: inline-size; + + /* Hide buttons when the searchbar is small and has focus. */ + &:has(${SearchbarFakeInput}:focus) ${ButtonBar} { + @container search-bar (max-inline-size: 280px) { + display: none; + } + } `; /** Width of the floating navbar in rem */ const NavBarFloating = styled(NavBarBase)` - box-shadow: ${props => props.theme.boxShadow}; + box-shadow: ${props => props.theme.boxShadowSoft}; border-radius: 999px; overflow: hidden; max-width: calc(100% - 2rem); @@ -157,7 +167,7 @@ const NavBarFloating = styled(NavBarBase)` top: ${props => (props.top ? '2rem' : 'auto')}; bottom: ${props => (props.top ? 'auto' : '1rem')}; - &:has(input:focus) { + &:has(${SearchbarFakeInput}:focus) { box-shadow: 0px 0px 0px 1px ${props => props.theme.colors.main}; border-color: ${props => props.theme.colors.main}; } @@ -193,12 +203,19 @@ const VerticalDivider = styled.div` height: 100%; margin-left: ${p => p.theme.size(2)}; `; -const SideBarWrapper = styled('div')` + +const SideBarWrapper = styled.div<{ navbarPosition: NavBarPosition }>` + ${CalculatedPageHeight.define(p => + p.navbarPosition === NavBarPosition.Floating + ? '100dvh' + : `calc(100dvh - 2.5rem)`, + )} display: flex; - height: 100vh; + height: ${CalculatedPageHeight.var()}; position: fixed; - top: 0; - bottom: 0; + top: ${p => (p.navbarPosition === NavBarPosition.Top ? '2.5rem' : 'auto')}; + bottom: ${p => + p.navbarPosition === NavBarPosition.Bottom ? '2.5rem' : 'auto'}; left: 0; right: 0; diff --git a/browser/data-browser/src/components/Row.tsx b/browser/data-browser/src/components/Row.tsx index 97c83e63a..c8550e6c1 100644 --- a/browser/data-browser/src/components/Row.tsx +++ b/browser/data-browser/src/components/Row.tsx @@ -52,7 +52,13 @@ export const Column = forwardRef< Column.displayName = 'Column'; -const Flex = styled.div` +/** + * Underlying layout of the Row and Column components. + * Do not use this component directly and don't extend it. + * + * This component is only exported so it can be used in css selectors. + */ +export const Flex = styled.div` align-items: ${p => (p.center ? 'center' : 'initial')}; display: flex; gap: ${p => p.gap ?? `${p.theme.margin}rem`}; diff --git a/browser/data-browser/src/components/ScrollArea.tsx b/browser/data-browser/src/components/ScrollArea.tsx index c50f10376..898dc5485 100644 --- a/browser/data-browser/src/components/ScrollArea.tsx +++ b/browser/data-browser/src/components/ScrollArea.tsx @@ -62,6 +62,7 @@ const Thumb = styled(RadixScrollArea.Thumb)` export const ScrollViewPort = styled(RadixScrollArea.Viewport)` width: 100%; height: 100%; + & > div[style] { /* Radix gives this div a display of table to fix an obscure bug (that we don't have). This messes with the accessibility tree and stops the TableEditor from working correctly for screen readers. */ diff --git a/browser/data-browser/src/components/Searchbar.tsx b/browser/data-browser/src/components/Searchbar.tsx deleted file mode 100644 index a26b3abc7..000000000 --- a/browser/data-browser/src/components/Searchbar.tsx +++ /dev/null @@ -1,261 +0,0 @@ -import { Client, useResource, useTitle } from '@tomic/react'; -import { transparentize } from 'polished'; -import React, { useEffect, useRef, useState, type JSX } from 'react'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { FaTimes } from 'react-icons/fa'; -import { styled } from 'styled-components'; -import { constructOpenURL } from '../helpers/navigation'; -import { useQueryScopeHandler } from '../hooks/useQueryScope'; -import { shortcuts } from './HotKeyWrapper'; -import { IconButton, IconButtonVariant } from './IconButton/IconButton'; -import { FaMagnifyingGlass } from 'react-icons/fa6'; -import { isURL } from '../helpers/isURL'; -import { useNavigate, useSearch } from '@tanstack/react-router'; -import { paths } from '../routes/paths'; -import { useCurrentSubject } from '../helpers/useCurrentSubject'; - -export interface SearchbarProps { - onFocus?: React.FocusEventHandler; - onBlur?: React.FocusEventHandler; - subject?: string; -} - -export function Searchbar({ - onFocus, - onBlur, - subject, -}: SearchbarProps): JSX.Element { - const [currentSubject] = useCurrentSubject(); - const { query } = useSearch({ strict: false }); - const [input, setInput] = useState(currentSubject ?? query ?? ''); - const { scope, clearScope } = useQueryScopeHandler(); - const searchBarRef = useRef(null); - const inputRef = useRef(null); - - const navigate = useNavigate(); - - const setQuery = useDebouncedCallback((q: string) => { - try { - Client.tryValidSubject(q); - // Replace instead of push to make the back-button behavior better. - navigate({ to: constructOpenURL(q), replace: true }); - } catch (_err) { - navigate({ - to: paths.search, - search: { - query: q, - ...(scope ? { queryscope: scope } : {}), - }, - replace: true, - }); - } - }, 20); - - const handleInput = (q: string) => { - setInput(q); - setQuery(q); - }; - - const handleSelect: React.MouseEventHandler = e => { - if (isURL(input ?? '')) { - // @ts-ignore - e.target.select(); - } - }; - - const handleSubmit: React.FormEventHandler = event => { - if (!subject) { - return; - } - - event.preventDefault(); - - inputRef.current?.blur(); - //@ts-expect-error This should work - document.activeElement?.blur(); - navigate({ to: constructOpenURL(subject), replace: true }); - }; - - const onSearchButtonClick = () => { - navigate({ to: paths.search }); - inputRef.current?.focus(); - }; - - useHotkeys(shortcuts.search, e => { - e.preventDefault(); - - inputRef.current?.select(); - inputRef.current?.focus(); - }); - - useHotkeys( - 'esc', - e => { - e.preventDefault(); - inputRef.current?.blur(); - }, - { enableOnTags: ['INPUT'] }, - ); - - useHotkeys( - 'backspace', - _ => { - if (input === undefined || input.length === 0) { - if (scope) { - clearScope(); - } - } - }, - { enableOnTags: ['INPUT'] }, - ); - - useEffect(() => { - if (query !== undefined) { - return; - } - - if (scope !== undefined) { - setInput(''); - - return; - } - - if (currentSubject) { - setInput(currentSubject); - - return; - } - - setInput(''); - }, [query, scope, currentSubject]); - - return ( -
- - - - {scope && } - handleInput(e.target.value)} - placeholder='Enter an Atomic URL or search (press "/" )' - /> - - ); -} - -function useDebouncedCallback( - callback: (query: string) => void, - timeout: number, -): (query: string) => void { - const timeoutId = useRef>(undefined); - - const cb = (query: string) => { - if (timeoutId.current) { - clearTimeout(timeoutId.current); - } - - timeoutId.current = setTimeout(async () => { - callback(query); - }, timeout); - }; - - return cb; -} - -interface ParentTagProps { - subject: string; - onClick: () => void; -} - -function ParentTag({ subject, onClick }: ParentTagProps): JSX.Element { - const resource = useResource(subject); - const [title] = useTitle(resource); - - return ( - - in:{title} - - - - - ); -} - -const Input = styled.input` - border: none; - font-size: 0.9rem; - padding-block: 0.4rem; - padding-inline-start: 0rem; - color: ${props => props.theme.colors.text}; - width: 100%; - flex: 1; - min-width: 1rem; - height: 100%; - background-color: ${props => props.theme.colors.bg}; - // Outline is handled by the Navbar. - outline: none; - color: ${p => p.theme.colors.textLight}; -`; - -const Form = styled.form` - flex: 1; - height: 100%; - gap: 0.5rem; - display: flex; - align-items: center; - padding-inline: ${p => p.theme.size(3)}; - border-radius: 999px; - - :hover { - ${props => transparentize(0.6, props.theme.colors.main)}; - ${Input} { - color: ${p => p.theme.colors.text}; - } - } - :focus-within { - ${Input} { - color: ${p => p.theme.colors.text}; - } - - // Outline is handled by the Navbar. - outline: none; - } -`; - -const Tag = styled.span` - background-color: ${props => props.theme.colors.bg1}; - border-radius: ${props => props.theme.radius}; - padding: 0.2rem 0.5rem; - display: flex; - flex-direction: row; - align-items: center; - gap: 0.3rem; - span { - max-width: 15ch; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } -`; diff --git a/browser/data-browser/src/components/Searchbar/Searchbar.tsx b/browser/data-browser/src/components/Searchbar/Searchbar.tsx new file mode 100644 index 000000000..3df6f2e2c --- /dev/null +++ b/browser/data-browser/src/components/Searchbar/Searchbar.tsx @@ -0,0 +1,213 @@ +import { Client, dataBrowser, useResource, useTitle } from '@tomic/react'; +import { transparentize } from 'polished'; +import { useEffect, useRef, type JSX } from 'react'; +import { useHotkeys } from 'react-hotkeys-hook'; +import { FaTimes } from 'react-icons/fa'; +import { styled } from 'styled-components'; +import { constructOpenURL } from '../../helpers/navigation'; +import { useQueryScopeHandler } from '../../hooks/useQueryScope'; +import { shortcuts } from '../HotKeyWrapper'; +import { IconButton, IconButtonVariant } from '../IconButton/IconButton'; +import { FaMagnifyingGlass } from 'react-icons/fa6'; +import { useNavigate } from '@tanstack/react-router'; +import { paths } from '../../routes/paths'; +import { useCurrentSubject } from '../../helpers/useCurrentSubject'; +import { SearchbarFakeInput, SearchbarInput } from './SearchbarInput'; +import { + base64StringToFilter, + filterToBase64String, +} from '../../routes/Search/searchUtils'; + +function addTagsToFilter( + base64Filter: string | undefined, + tags: string[], +): string { + const filter = base64Filter ? base64StringToFilter(base64Filter) : {}; + + filter[dataBrowser.properties.tags] = tags; + + return filterToBase64String(filter); +} + +const getText = (inputRef: React.RefObject) => { + if (!inputRef.current) return ''; + + return inputRef.current.textContent ?? ''; +}; + +export function Searchbar(): JSX.Element { + const [currentSubject] = useCurrentSubject(); + const { scope, clearScope } = useQueryScopeHandler(); + const inputRef = useRef(null); + + const navigate = useNavigate(); + + const setQuery = useDebouncedCallback((q: string, tags: string[]) => { + try { + Client.tryValidSubject(q); + // Replace instead of push to make the back-button behavior better. + navigate({ to: constructOpenURL(q), replace: true }); + } catch (_err) { + navigate({ + to: paths.search, + search: prev => ({ + query: q, + ...(scope ? { queryscope: scope } : {}), + ...(tags.length > 0 + ? { filters: addTagsToFilter(prev.filters, tags) } + : {}), + }), + replace: true, + }); + } + }, 20); + + const mutateText = (str: string) => { + if (inputRef.current) { + inputRef.current.innerText = str; + } + }; + + const handleQueryChange = (q: string, tags: string[]) => { + setQuery(q, tags); + }; + + const handleUrlChange = (url: string) => { + Client.tryValidSubject(url); + // Replace instead of push to make the back-button behavior better. + navigate({ to: constructOpenURL(url), replace: true }); + }; + + const onSearchButtonClick = () => { + navigate({ to: paths.search }); + inputRef.current?.focus(); + }; + + useHotkeys(shortcuts.search, e => { + e.preventDefault(); + + inputRef.current?.focus(); + }); + + useHotkeys( + 'backspace', + _ => { + if (getText(inputRef) === '') { + if (scope) { + clearScope(); + } + } + }, + { enableOnTags: ['INPUT'], enableOnContentEditable: true }, + ); + + useEffect(() => { + if (scope !== undefined) { + mutateText(''); + inputRef.current?.focus(); + + return; + } + }, [scope]); + + return ( + + + + + {scope && } + + + ); +} + +function useDebouncedCallback( + callback: (query: string, tags: string[]) => void, + timeout: number, +): (query: string, tags: string[]) => void { + const timeoutId = useRef>(undefined); + + const cb = (query: string, tags: string[]) => { + if (timeoutId.current) { + clearTimeout(timeoutId.current); + } + + timeoutId.current = setTimeout(async () => { + callback(query, tags); + }, timeout); + }; + + return cb; +} + +interface ParentTagProps { + subject: string; + onClick: () => void; +} + +function ParentTag({ subject, onClick }: ParentTagProps): JSX.Element { + const resource = useResource(subject); + const [title] = useTitle(resource); + + return ( + + in:{title} + + + + + ); +} + +const Wrapper = styled.div` + flex: 1; + height: 100%; + gap: 1ch; + display: flex; + align-items: center; + padding-inline: ${p => p.theme.size(2)}; + overflow: hidden; + border-radius: 999px; + display: flex; + + :hover { + ${props => transparentize(0.6, props.theme.colors.main)}; + ${SearchbarFakeInput} { + color: ${p => p.theme.colors.text}; + } + } +`; + +const Tag = styled.span` + background-color: ${props => props.theme.colors.bg1}; + border-radius: ${props => props.theme.radius}; + padding: 0.2rem 0.5rem; + display: flex; + flex-direction: row; + align-items: center; + gap: 0.3rem; + span { + max-width: 15ch; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } +`; diff --git a/browser/data-browser/src/components/Searchbar/SearchbarInput.tsx b/browser/data-browser/src/components/Searchbar/SearchbarInput.tsx new file mode 100644 index 000000000..0ac592cc2 --- /dev/null +++ b/browser/data-browser/src/components/Searchbar/SearchbarInput.tsx @@ -0,0 +1,400 @@ +import { useState, useRef, useEffect } from 'react'; +import styled from 'styled-components'; +import { useSettings } from '../../helpers/AppSettings'; +import { + dataBrowser, + type Server, + useArray, + useResource, + useResources, +} from '@tomic/react'; +import { TagSuggestionOverlay } from './TagSuggestionOverlay'; +import { useSelectedIndex } from '../../hooks/useSelectedIndex'; +import { isURL } from '../../helpers/isURL'; +import { polyfillPlaintextOnly } from './searchbarUtils'; + +interface SearchbarInputProps { + inputRef: React.RefObject; + customValue?: string; + onQueryChange: (query: string, tags: string[]) => void; + onURLChange: (url: string) => void; + /** Only needed because of a bug in react compiler seeing the ref in props as immutable. */ + mutateText: (str: string) => void; +} + +export type TagWithTitle = { + subject: string; + title: string; +}; + +function useTagList(): TagWithTitle[] { + const { drive } = useSettings(); + const driveResource = useResource(drive); + const [tags] = useArray(driveResource, dataBrowser.properties.tagList); + const tagResourceMap = useResources(tags); + + return Array.from(tagResourceMap.entries()).map(([subject, resource]) => { + return { subject, title: resource.title }; + }); +} + +// Gracefully fall back to a no-op implementation if the browser doesn't support the Highlight API. +const newHighlight = () => { + if ('Highlight' in window) { + return new window.Highlight(); + } + + // Cast to unknown first to avoid type checking, then to Highlight + return { + add: () => {}, + clear: () => {}, + priority: 0, + type: 'highlight', + forEach: () => {}, + } as unknown as Highlight; +}; + +function useTagHighlighting( + inputRef: React.RefObject, + validTags: TagWithTitle[], +) { + const tagHighlight = useRef(newHighlight()); + + useEffect(() => { + if ('highlights' in CSS) { + // @ts-expect-error Typescript doesn't know that set() exists + CSS.highlights.set('tag-highlight', tagHighlight.current); + + return () => { + // @ts-expect-error Typescript doesn't know that delete() exists + CSS.highlights.delete('tag-highlight'); + }; + } + }, []); + + return (str: string): TagWithTitle[] => { + if (!inputRef.current) return []; + + // @ts-expect-error Typescript doesn't know that clear() exists + tagHighlight.current.clear(); + + const regex = /(?<=\btag:)[\w-]+/g; + let m; + + const foundTags: TagWithTitle[] = []; + + while ((m = regex.exec(str)) !== null) { + // This is necessary to avoid infinite loops with zero-width matches + const text = m[0]; + const foundTag = validTags.find(t => t.title === text); + if (!foundTag) continue; + + if (m.index === regex.lastIndex) { + regex.lastIndex++; + } + + const range = new Range(); + range.setStart(inputRef.current.firstChild!, m.index); + range.setEnd(inputRef.current.firstChild!, regex.lastIndex); + + // @ts-expect-error Typescript doesn't know that add() exists + tagHighlight.current.add(range); + + foundTags.push(foundTag); + } + + return foundTags; + }; +} + +function getFullTagFromPosition(text: string, start: number): string { + // Remove everything before the start index, now the string starts with 'tag:', + // Split the string by spaces so we have the full tag title as the first element. + // Remove the 'tag:' prefix. + return text.slice(start).split(' ')[0].slice(4); +} + +function getTagAtCaretPosition(input: HTMLDivElement): + | { + rect: DOMRect; + tag: string; + } + | undefined { + const text = input.textContent; + + const selection = input.ownerDocument.defaultView?.getSelection(); + + if (!text || !selection) return; + + if (selection.type !== 'Caret') return; + + const slicedText = text.slice(0, selection.anchorOffset); + const match = slicedText.match(/tag:[\w-]*$/); + + if (!match) return; + + const range = new Range(); + range.setStart(input.firstChild!, match.index!); + range.setEnd(input.firstChild!, match.index! + 'tag:'.length); + const rect = range.getBoundingClientRect(); + + return { rect, tag: getFullTagFromPosition(text, match.index!) }; +} + +function extractQueryFromText(text: string): string { + const tagTokenRegex = /\btag:[\w-]*/g; + + return text.replace(tagTokenRegex, '').trim(); +} + +function replacePartialTagWithFullTag( + input: HTMLDivElement, + selectedTag: string, +) { + const selection = window.getSelection(); + + if (!selection || selection.rangeCount === 0) return; + + const textContent = input.textContent || ''; + const caretOffset = selection.anchorOffset; + const match = textContent.slice(0, caretOffset).match(/tag:[\w-]*$/); + + if (!match) return; + + const startIndex = match.index!; + + const endIndex = + startIndex + + 'tag:'.length + + getFullTagFromPosition(textContent, startIndex).length; + + const textNode = input.firstChild; + + if (!textNode) return; + + // Create a range covering the entire partial tag text. + const range = document.createRange(); + range.setStart(textNode, startIndex); + range.setEnd(textNode, endIndex); + + // Replace the partial tag with the full tag suggestion plus a trailing space if needed. + range.deleteContents(); + const followingChar = textContent.charAt(endIndex); + const trailing = followingChar === ' ' ? '' : ' '; + const newTagText = `tag:${selectedTag}${trailing}`; + const newTagNode = document.createTextNode(newTagText); + range.insertNode(newTagNode); + + // Move the caret right after the inserted text. + const newRange = document.createRange(); + newRange.setStartAfter(newTagNode); + selection.removeAllRanges(); + selection.addRange(newRange); + + // Merge all text nodes that might have been created by inserting the new tag. + input.normalize(); +} + +export const SearchbarInput: React.FC = ({ + onQueryChange, + onURLChange, + customValue, + inputRef, + mutateText, +}) => { + const [tagRect, setTagRect] = useState(); + const [tagQueryValue, setTagQueryValue] = useState(''); + const tagList = useTagList(); + + const filteredTagList = tagList.filter(t => + t.title.toLowerCase().includes(tagQueryValue.toLowerCase()), + ); + + const highlightAndFindTags = useTagHighlighting(inputRef, tagList); + + const onSelect = (index: number | undefined) => { + if (index === undefined) return; + + const selectedTag = filteredTagList[index]; + + if (!selectedTag || !inputRef.current) return; + + replacePartialTagWithFullTag(inputRef.current, selectedTag.title); + + const text = inputRef.current.textContent || ''; + + // Recreate any ranges that where present before insertion. + const foundTags = highlightAndFindTags(text.toLowerCase()); + + onQueryChange( + extractQueryFromText(text), + foundTags.map(t => t.subject), + ); + }; + + const { + selectedIndex, + onKeyDown: onTagKeyDown, + onMouseOver: onTagHover, + onClick: onTagClick, + resetIndex, + usingKeyboard, + } = useSelectedIndex(filteredTagList, onSelect); + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (tagRect) { + if (e.key === 'ArrowUp' || e.key === 'ArrowDown' || e.key === 'Enter') { + e.preventDefault(); + e.stopPropagation(); + } + + onTagKeyDown(e); + } + }; + + const handleChange = (e: React.ChangeEvent) => { + if (!inputRef.current) return; + + let str = e.target.textContent ?? ''; + + // For some reason a single
tag is present when the user empties the input, we need to remove that so the placeholder is visible again. + if (str === '') { + e.target.childNodes.forEach(child => { + child.remove(); + }); + } + + // Check if the user is entering an URL, if so, update the URL state. + // 'tag:' is also technically a valid URL but we don't want to treat it as one. + if (!str.startsWith('tag:') && isURL(str)) { + onURLChange(str); + + return; + } + + // Content-editable fields allow newlines in their text, we remove them manually. + if (str.includes('\n')) { + str = str.replaceAll('\n', ''); + mutateText(str); + } + + const foundTags = highlightAndFindTags(str.toLowerCase()); + const finalQuery = extractQueryFromText(str); + + onQueryChange( + finalQuery, + foundTags.map(t => t.subject), + ); + }; + + const handleFocus = () => { + if (!inputRef.current) return; + + const text = inputRef.current.textContent || ''; + + // If the text is a url, select the whole text. + if (isURL(text)) { + const range = document.createRange(); + range.selectNodeContents(inputRef.current); + const selection = window.getSelection(); + + if (selection) { + selection.removeAllRanges(); + selection.addRange(range); + } + } + }; + + // Check the position of the caret and update the tag rect and query value if the caret is in a tag. + useEffect(() => { + const onSelectionChange = () => { + if (!inputRef.current) return; + + const tagAtCaret = getTagAtCaretPosition(inputRef.current); + + if (tagAtCaret) { + setTagRect(tagAtCaret.rect); + setTagQueryValue(tagAtCaret.tag); + } else { + setTagRect(undefined); + setTagQueryValue(''); + } + + resetIndex(); + }; + + document.addEventListener('selectionchange', onSelectionChange); + + return () => { + document.removeEventListener('selectionchange', onSelectionChange); + }; + }, []); + + useEffect(() => { + if ( + inputRef.current && + customValue !== undefined && + // We don't want to update the node if the value is already in there as that would cause the users cursor to jump to the start. + inputRef.current.textContent !== customValue + ) { + mutateText(customValue); + } + }, [customValue]); + + useEffect(() => { + if (!inputRef.current) return; + + return polyfillPlaintextOnly(inputRef.current); + }, []); + + return ( + <> + + + + ); +}; + +export const SearchbarFakeInput = styled.div<{ $placeholder: string }>` + white-space: nowrap; + overflow: hidden; + padding-block: 0.4rem; + padding-inline-start: 0rem; + color: ${p => p.theme.colors.textLight}; + flex: 1; + + &:focus { + color: ${p => p.theme.colors.text}; + outline: none; + } + + &:empty::before { + content: '${p => p.$placeholder}'; + pointer-events: none; + } + + &::highlight(tag-highlight) { + color: ${p => p.theme.colors.mainSelectedFg}; + background-color: ${p => p.theme.colors.mainSelectedBg}; + padding: 0.2rem; + display: inline-block; + } +`; diff --git a/browser/data-browser/src/components/Searchbar/TagSuggestionOverlay.tsx b/browser/data-browser/src/components/Searchbar/TagSuggestionOverlay.tsx new file mode 100644 index 000000000..3298c21cd --- /dev/null +++ b/browser/data-browser/src/components/Searchbar/TagSuggestionOverlay.tsx @@ -0,0 +1,163 @@ +import { useResource, type DataBrowser } from '@tomic/react'; +import { Column } from '../Row'; +import { styled } from 'styled-components'; +import type { TagWithTitle } from './SearchbarInput'; +import { useEffect, useRef } from 'react'; +import { ScrollArea } from '../ScrollArea'; + +interface TagSuggestionOverlayProps { + tags: TagWithTitle[]; + onTagHover: (index: number) => void; + onTagClick: (index: number) => void; + selectedIndex: number | undefined; + startingRect: DOMRect | undefined; + usingKeyboard: boolean; +} + +function moveToAvailableSpace(menu: HTMLDivElement, triggerRect: DOMRect) { + const menuRect = menu.getBoundingClientRect(); + const topPos = triggerRect.y - menuRect.height; + + // If the top is outside of the screen, render it below + if (topPos < 0) { + menu.style.top = `calc(${triggerRect.y + triggerRect.height / 2}px + 1rem)`; + } else { + menu.style.top = `calc(${topPos + triggerRect.height / 2}px - 1rem)`; + } + + const rightPos = triggerRect.x + triggerRect.width + menuRect.width; + + if (rightPos > window.innerWidth) { + menu.style.left = `${window.innerWidth - menuRect.width - 10}px`; + } else { + menu.style.left = `${triggerRect.x}px`; + } +} + +export const TagSuggestionOverlay: React.FC = ({ + tags, + onTagHover, + onTagClick, + selectedIndex, + startingRect, + usingKeyboard, +}) => { + const ref = useRef(null); + + useEffect(() => { + if (startingRect) { + requestAnimationFrame(() => { + if (ref.current) { + moveToAvailableSpace(ref.current, startingRect); + } + }); + } + }, [startingRect]); + + return ( + + + + {tags.length === 0 && No tags found} + {tags.map((tag, index) => ( + onTagHover(index)} + onClick={() => onTagClick(index)} + blockAutoscroll={!usingKeyboard} + /> + ))} + + + + ); +}; + +interface TagSuggestionRowProps { + subject: string; + selected: boolean; + blockAutoscroll: boolean; + onMouseOver: () => void; + onClick: () => void; +} + +const TagSuggestionRow: React.FC = ({ + subject, + selected, + blockAutoscroll, + onMouseOver, + onClick, +}) => { + const ref = useRef(null); + const resource = useResource(subject); + + useEffect(() => { + if (selected && !blockAutoscroll) { + ref.current?.scrollIntoView({ block: 'nearest' }); + } + }, [selected, blockAutoscroll]); + + if (!resource.isReady()) return
Loading...
; + + return ( + + {resource.props.emoji} +
{resource.title}
+
+ ); +}; + +const SuggestionPopover = styled.div<{ tagRect: DOMRect | undefined }>` + display: ${p => (p.tagRect ? 'block' : 'none')}; + opacity: ${p => (p.tagRect ? 1 : 0)}; + position: fixed; + transition: + opacity 0.1s ease, + display 0.1s ease allow-discrete; + border-radius: ${p => p.theme.radius}; + box-shadow: ${p => p.theme.boxShadowSoft}; + background-color: ${p => p.theme.colors.bg}; + padding: ${p => p.theme.size(2)}; + min-width: 10rem; + @starting-style { + opacity: 0; + } +`; + +const Emote = styled.div` + text-shadow: 0 2px 2px rgba(0, 0, 0, 0.2); +`; + +const TagRow = styled.button<{ selected: boolean }>` + appearance: none; + border: none; + display: flex; + align-items: center; + gap: 1ch; + cursor: pointer; + background-color: ${p => + p.selected ? p.theme.colors.mainSelectedBg : 'transparent'}; + padding: ${p => p.theme.size(2)}; + border-radius: ${p => p.theme.radius}; + color: ${p => + p.selected ? p.theme.colors.mainSelectedFg : p.theme.colors.text}; + + white-space: nowrap; +`; + +const StyledScrollArea = styled(ScrollArea)` + height: min(20rem, 30dvh); +`; + +const EmptyMessage = styled.div` + padding: ${p => p.theme.size(2)}; +`; diff --git a/browser/data-browser/src/components/Searchbar/searchbarUtils.ts b/browser/data-browser/src/components/Searchbar/searchbarUtils.ts new file mode 100644 index 000000000..7111ef8e6 --- /dev/null +++ b/browser/data-browser/src/components/Searchbar/searchbarUtils.ts @@ -0,0 +1,48 @@ +function supportsPlaintextOnly() { + const el = document.createElement('div'); + el.setAttribute('contenteditable', 'plaintext-only'); + document.body.appendChild(el); + const isSupported = getComputedStyle(el).whiteSpace === 'pre-wrap'; + document.body.removeChild(el); + + return isSupported; +} + +export function polyfillPlaintextOnly(input: HTMLDivElement) { + if (supportsPlaintextOnly()) { + // Browser is normal and doesn't take 9 years to implement a basic feature. + return; + } + + // Browser is firefox. + input.setAttribute('contenteditable', 'true'); + + const handlePaste = (e: ClipboardEvent) => { + e.preventDefault(); + const text = e.clipboardData?.getData('text/plain'); + + // remove all newlines + const textWithoutNewlines = text?.replace(/\n/g, ''); + + document.execCommand('insertText', false, textWithoutNewlines); + }; + + const handleKeyDown = (e: KeyboardEvent) => { + if (e.ctrlKey || e.metaKey) { + const blockedKeys = ['b', 'i', 'u']; + + if (blockedKeys.includes(e.key.toLowerCase())) { + e.preventDefault(); + } + } + }; + + input.addEventListener('paste', handlePaste); + + input.addEventListener('keydown', handleKeyDown); + + return () => { + input.removeEventListener('paste', handlePaste); + input.removeEventListener('keydown', handleKeyDown); + }; +} diff --git a/browser/data-browser/src/components/SideBar/OverlapSpacer.tsx b/browser/data-browser/src/components/SideBar/OverlapSpacer.tsx index 61cd78c99..6f4061082 100644 --- a/browser/data-browser/src/components/SideBar/OverlapSpacer.tsx +++ b/browser/data-browser/src/components/SideBar/OverlapSpacer.tsx @@ -8,12 +8,12 @@ import type { JSX } from 'react'; export function OverlapSpacer(): JSX.Element { const narrow = useMediaQuery('(max-width: 950px)'); const { navbarFloating } = useSettings(); - const elivate = narrow && navbarFloating; + const elevate = narrow && navbarFloating; - return ; + return ; } -const Elivator = styled.div<{ $elivate: boolean }>` - height: ${p => (p.$elivate ? '3.5rem' : '0rem')}; +const Elevator = styled.div<{ elevate: boolean }>` + height: ${p => (p.elevate ? '3.8rem' : '0rem')}; ${transition('height')} `; diff --git a/browser/data-browser/src/components/SideBar/SideBarDrive.tsx b/browser/data-browser/src/components/SideBar/SideBarDrive.tsx index 56f5ec30f..cd1d7a947 100644 --- a/browser/data-browser/src/components/SideBar/SideBarDrive.tsx +++ b/browser/data-browser/src/components/SideBar/SideBarDrive.tsx @@ -25,8 +25,8 @@ import { DndContext, DragOverlay } from '@dnd-kit/core'; import { SidebarItemTitle } from './ResourceSideBar/SidebarItemTitle'; import { DropEdge } from './ResourceSideBar/DropEdge'; import { createPortal } from 'react-dom'; -import { transition } from '../../helpers/transition'; import { useNavigateWithTransition } from '../../hooks/useNavigateWithTransition'; +import { SkeletonButton } from '../SkeletonButton'; interface SideBarDriveProps { onItemClick: () => unknown; @@ -184,36 +184,10 @@ const StyledScrollArea = styled(ScrollArea)` overflow: hidden; `; -const AddButton = styled.button` - display: flex; - justify-content: center; - color: ${p => p.theme.colors.textLight}; - background: none; - appearance: none; - border: 1px dashed ${p => p.theme.colors.bg2}; - border-radius: ${p => p.theme.radius}; +const AddButton = styled(SkeletonButton)` width: calc(100% - 5rem); padding-block: 0.3rem; margin-inline-start: 2rem; margin-block-start: 0.5rem; margin-block-end: 1rem; - cursor: pointer; - ${transition('color', 'border')} - - & svg { - ${transition('transform')} - } - &:hover, - &:focus-visible { - color: ${p => p.theme.colors.main}; - border: 1px solid ${p => p.theme.colors.main}; - - & svg { - transform: scale(1.3); - } - } - - &:active { - background-color: ${p => p.theme.colors.bg1}; - } `; diff --git a/browser/data-browser/src/components/SideBar/index.tsx b/browser/data-browser/src/components/SideBar/index.tsx index 0c1c18236..3ac8575a3 100644 --- a/browser/data-browser/src/components/SideBar/index.tsx +++ b/browser/data-browser/src/components/SideBar/index.tsx @@ -5,7 +5,6 @@ import { useSettings } from '../../helpers/AppSettings'; import { SideBarDrive } from './SideBarDrive'; import { DragAreaBase, useResizable } from '../../hooks/useResizable'; import { useCombineRefs } from '../../hooks/useCombineRefs'; -import { NavBarSpacer } from '../NavBarSpacer'; import { OverlapSpacer } from './OverlapSpacer'; import { AppMenu } from './AppMenu'; import { About } from './About'; @@ -16,6 +15,7 @@ import { SideBarPanel } from './SideBarPanel'; import { Panel, usePanelList } from './usePanelList'; import { SIDEBAR_WIDTH_PROP } from './SidebarCSSVars'; import { useRef, type JSX } from 'react'; +import { CalculatedPageHeight } from '../../globalCssVars'; /** Amount of pixels where the sidebar automatically shows */ export const SIDEBAR_TOGGLE_WIDTH = 600; @@ -68,7 +68,6 @@ export function SideBar(): JSX.Element { exposed={sidebarVisible} {...listeners} > - {/* The key is set to make sure the component is re-loaded when the baseURL changes */} - {!isRearanging && ( (p => ({ p.exposed ? '0' : `calc(var(${SIDEBAR_WIDTH_PROP}) * -1 + 0.5rem)`}; /* When the user is hovering, show half opacity */ opacity: ${p => (p.exposed ? 1 : 0)}; - height: 100dvh; + height: ${CalculatedPageHeight.var()}; width: var(${SIDEBAR_WIDTH_PROP}); position: ${p => (p.locked ? 'relative' : 'absolute')}; border-right: ${p => `1px solid ${p.theme.colors.bg2}`}; @@ -142,6 +140,7 @@ const StyledNav = styled.nav.attrs(p => ({ flex-direction: column; overflow-y: auto; overflow-x: hidden; + padding-bottom: ${p => p.theme.size()}; `; const MenuWrapper = styled.div` diff --git a/browser/data-browser/src/components/SkeletonButton.tsx b/browser/data-browser/src/components/SkeletonButton.tsx new file mode 100644 index 000000000..99c198c7c --- /dev/null +++ b/browser/data-browser/src/components/SkeletonButton.tsx @@ -0,0 +1,32 @@ +import { styled } from 'styled-components'; +import { transition } from '../helpers/transition'; + +export const SkeletonButton = styled.button` + display: flex; + justify-content: center; + color: ${p => p.theme.colors.textLight}; + background: none; + appearance: none; + border: 1px dashed ${p => p.theme.colors.bg2}; + border-radius: ${p => p.theme.radius}; + + cursor: pointer; + ${transition('color', 'border')} + + & svg { + ${transition('transform')} + } + &:hover, + &:focus-visible { + color: ${p => p.theme.colors.main}; + border: 1px solid ${p => p.theme.colors.main}; + + & svg { + transform: scale(1.3); + } + } + + &:active { + background-color: ${p => p.theme.colors.bg1}; + } +`; diff --git a/browser/data-browser/src/components/Tag/CreateTagRow.tsx b/browser/data-browser/src/components/Tag/CreateTagRow.tsx index 1532bf74b..ea7d81bb5 100644 --- a/browser/data-browser/src/components/Tag/CreateTagRow.tsx +++ b/browser/data-browser/src/components/Tag/CreateTagRow.tsx @@ -25,6 +25,7 @@ export function CreateTagRow({ parent, onNewTag }: CreateTagRowProps) { ['tag', tagName], parent, ); + const tag = await store.newResource({ subject, parent, @@ -60,7 +61,7 @@ export function CreateTagRow({ parent, onNewTag }: CreateTagRowProps) { ); return ( - + { @@ -38,12 +39,14 @@ const useTagData = (subject: string) => { export function Tag({ subject, + selected, children, }: React.PropsWithChildren): JSX.Element { const { color, text } = useTagData(subject); + const className = selected ? 'selected-tag' : ''; return ( - + {text} {children} @@ -55,10 +58,14 @@ interface TagWrapperProps { } const TagWrapper = styled.span` - --tag-dark-color: ${props => setLightness(0.11, props.color)}; - --tag-mid-color: ${props => setLightness(0.4, props.color)}; - --tag-light-color: ${props => - setSaturation(0.5, setLightness(0.9, props.color))}; + --tag-dark-color: ${p => setLightness(0.11, p.color)}; + --tag-mid-color: ${p => setLightness(0.4, p.color)}; + --tag-light-color: ${p => setSaturation(0.5, setLightness(0.9, p.color))}; + --tag-shadow-color: ${p => + transparentize( + p.theme.darkMode ? 0.2 : 0.5, + setLightness(p.theme.darkMode ? 0.7 : 0.4, p.color), + )}; display: inline-flex; gap: 1ch; align-items: center; @@ -75,7 +82,7 @@ const TagWrapper = styled.span` p.theme.darkMode ? 'var(--tag-dark-color)' : 'var(--tag-light-color)'}; &.selected-tag { - text-decoration: underline; + box-shadow: 0 0px 10px 0px var(--tag-shadow-color); } `; @@ -84,7 +91,7 @@ interface SelectableTagProps extends TagProps { selected: boolean; } -export function SelectableTag({ +export function TagButton({ onClick, selected, subject, diff --git a/browser/data-browser/src/components/Tag/TagBar.tsx b/browser/data-browser/src/components/Tag/TagBar.tsx new file mode 100644 index 000000000..9471a2957 --- /dev/null +++ b/browser/data-browser/src/components/Tag/TagBar.tsx @@ -0,0 +1,141 @@ +import { + dataBrowser, + useArray, + useCanWrite, + useResource, + useStore, + type Resource, + type Store, +} from '@tomic/react'; +import { FaPlus, FaTags } from 'react-icons/fa6'; +import { Row } from '../Row'; +import * as RadixPopover from '@radix-ui/react-popover'; +import { SkeletonButton } from '../SkeletonButton'; +import styled from 'styled-components'; +import { ResourceInline } from '../../views/ResourceInline'; +import { useEffect, useState } from 'react'; +import { TagSelectPopover } from './TagSelectPopover'; + +interface TagBarProps { + resource: Resource; +} + +const getResourcesDrive = async (resource: Resource, store: Store) => { + const ancestry = await store.getResourceAncestry(resource); + const driveSubject = ancestry.at(-1); + + if (!driveSubject) { + throw new Error('ResourceWithoutDrive'); + } + + return driveSubject; +}; + +const useDriveTags = (resource: Resource) => { + const store = useStore(); + const [driveSubject, setDriveSubject] = useState(); + const drive = useResource(driveSubject); + const [driveTags, setDriveTags] = useArray( + drive, + dataBrowser.properties.tagList, + { + commit: true, + }, + ); + + const canCreateTags = useCanWrite(drive); + + useEffect(() => { + getResourcesDrive(resource, store).then(setDriveSubject); + }, [resource, store]); + + const addDriveTag = (tagSubject: string) => { + return setDriveTags([...driveTags, tagSubject]); + }; + + return { + driveTags, + addDriveTag, + driveSubject, + canCreateTags, + }; +}; + +export const TagBar: React.FC = ({ resource }) => { + const { driveTags, addDriveTag, driveSubject, canCreateTags } = + useDriveTags(resource); + const [tags, setTags] = useArray(resource, dataBrowser.properties.tags, { + commit: true, + }); + + const handleNewTag = (newTag: string) => { + addDriveTag(newTag); + }; + + if (driveSubject === undefined || resource.loading) { + return ( + + + + + + + ); + } + + return ( + + + {tags.map(tag => ( + + ))} + + + + } + /> + + ); +}; + +interface SimpleTagBarProps { + resource: Resource; + small?: boolean; +} + +export const SimpleTagBar: React.FC = ({ + resource, + small, +}) => { + const [tags] = useArray(resource, dataBrowser.properties.tags); + + if (tags.length === 0) { + return null; + } + + return ( + + {tags.map(tag => ( + + ))} + + ); +}; + +const NewTagButton = styled(SkeletonButton)` + padding-inline: ${p => p.theme.size(4)}; + padding-block: 0.4em; + border-radius: 1em; +`; diff --git a/browser/data-browser/src/components/Tag/TagSelectPopover.tsx b/browser/data-browser/src/components/Tag/TagSelectPopover.tsx new file mode 100644 index 000000000..83b57e4cf --- /dev/null +++ b/browser/data-browser/src/components/Tag/TagSelectPopover.tsx @@ -0,0 +1,210 @@ +import { styled } from 'styled-components'; +import { Popover } from '../Popover'; +import { CreateTagRow } from './CreateTagRow'; +import { useEffect, useRef, useState } from 'react'; +import { Checkbox } from '../forms/Checkbox'; +import { InputWrapper, InputStyled } from '../forms/InputStyles'; +import { Column } from '../Row'; +import { Tag } from './Tag'; +import { useStore, type Resource } from '@tomic/react'; +import { ScrollArea } from '../ScrollArea'; +import { useSelectedIndex } from '../../hooks/useSelectedIndex'; + +interface TagSelectPopoverProps { + tags: string[]; + selectedTags: string[]; + setSelectedTags: (tags: string[]) => void; + onNewTag?: (tag: string) => void; + newTagParent?: string; + Trigger: React.ReactNode; +} + +export const TagSelectPopover: React.FC = ({ + tags, + selectedTags, + setSelectedTags, + onNewTag, + Trigger, + newTagParent, +}) => { + const store = useStore(); + + const [popoverVisible, setPopoverVisible] = useState(false); + const [filterValue, setFilterValue] = useState(''); + + const filteredTags = tags + .map(subject => { + const tag = store.getResourceLoading(subject); + + return { subject, title: tag.title }; + }) + .filter(tag => tag.title.includes(filterValue)) + .map(t => t.subject); + + const { selectedIndex, onKeyDown, onMouseOver, resetIndex, usingKeyboard } = + useSelectedIndex(filteredTags, index => { + if (index !== undefined) { + const tag = filteredTags[index]; + modifyTags(!selectedTags.includes(tag), tag); + } + }); + + const handleNewTag = async (tag: Resource) => { + try { + await tag.save(); + onNewTag?.(tag.subject); + setSelectedTags([...selectedTags, tag.subject]); + } catch (error) { + console.error(error); + } + }; + + const reset = () => { + resetIndex(); + setFilterValue(''); + }; + + const modifyTags = (add: boolean, tag: string) => { + if (add) { + setSelectedTags([...selectedTags, tag]); + } else if (selectedTags.includes(tag)) { + setSelectedTags(selectedTags.filter(t => t !== tag)); + } + }; + + return ( + { + setPopoverVisible(open); + reset(); + }} + Trigger={Trigger} + noArrow + > + + + + { + setFilterValue(e.target.value); + // Reset selected index when the filter changes + resetIndex(); + }} + onKeyDown={onKeyDown} + /> + + + + {tags.length === 0 && ( + There are no tags yet. + )} + {filteredTags.map((tag, index) => { + const isSelected = selectedIndex === index; + + return ( + + {/* eslint-disable-next-line jsx-a11y/label-has-associated-control */} + + + ); + })} + + + {onNewTag && !!newTagParent && ( + + )} + + + + ); +}; + +const AutoscrollListItem: React.FC< + React.PropsWithChildren<{ selected: boolean; blockAutoscroll: boolean }> +> = ({ selected, children, blockAutoscroll }) => { + const ref = useRef(null); + + useEffect(() => { + if (selected && !blockAutoscroll) { + ref.current?.scrollIntoView({ block: 'nearest' }); + } + }, [selected, blockAutoscroll]); + + return
  • {children}
  • ; +}; + +const StyledPopover = styled(Popover)` + margin-top: ${p => p.theme.size(2)}; + background-color: ${p => p.theme.colors.bg}; +`; +const TagPopoverContentWrapper = styled.div` + padding: 1rem; + + width: fit-content; +`; + +const TagList = styled.ul` + margin: 2px; + padding-block: 10px; + display: flex; + flex-direction: column; + height: 100%; + + & li { + list-style: none; + margin: 0; + user-select: none; + + & label { + height: 100%; + padding: ${p => p.theme.size(2)}; + border-radius: ${p => p.theme.radius}; + display: flex; + align-items: center; + gap: 1ch; + cursor: pointer; + + &[data-selected='true'] { + background-color: ${p => p.theme.colors.mainSelectedBg}; + } + } + } +`; + +const StyledScrollArea = styled(ScrollArea)` + height: min(20rem, 30dvh); +`; + +const EmptyMessage = styled.div` + height: 100%; + display: grid; + place-items: center; + color: ${p => p.theme.colors.textLight}; +`; diff --git a/browser/data-browser/src/components/forms/Checkbox.tsx b/browser/data-browser/src/components/forms/Checkbox.tsx index 565a267d8..192636da3 100644 --- a/browser/data-browser/src/components/forms/Checkbox.tsx +++ b/browser/data-browser/src/components/forms/Checkbox.tsx @@ -1,6 +1,7 @@ import { styled } from 'styled-components'; import type { JSX } from 'react'; +import { transition } from '../../helpers/transition'; interface CheckboxProps extends Omit< @@ -8,11 +9,13 @@ interface CheckboxProps 'type' | 'onChange' > { checked?: boolean; + selected?: boolean; onChange: (value: boolean) => void; } export function Checkbox({ checked, + selected, onChange, ...props }: CheckboxProps): JSX.Element { @@ -22,6 +25,7 @@ export function Checkbox({ return ( p.theme.colors.bg1}; + background-color: ${p => p.theme.colors.bg}; border: 1px solid ${p => p.theme.colors.bg2}; width: 1rem; height: 1rem; border-radius: 3px; - + cursor: pointer; position: relative; + appearance: none; - &:checked { - border: none; - } - - &:checked::before { - content: ''; + &::before { position: absolute; inset: 0; width: 100%; height: 100%; border-radius: 2px; - background-color: ${p => p.theme.colors.main}; + background-color: ${p => p.theme.colors.bg}; + ${transition('opacity', 'background-color')} } - &:checked::after { + &::after { --inset: 3px; --size: calc(100% - (var(--inset) * 2)); - content: ''; position: absolute; inset: var(--inset); width: var(--size); @@ -67,6 +67,32 @@ const InputCheckBox = styled.input` background-color: ${p => p.theme.colors.bg}; clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%); } + + &:checked { + border: none; + + &::before { + background-color: ${p => p.theme.colors.main}; + content: ''; + } + + &::after { + content: ''; + } + } + + &:focus-visible, + &:hover, + &[data-selected='true'] { + &:not(:checked)::before { + background-color: ${p => p.theme.colors.main}; + content: ''; + opacity: ${p => (p.theme.darkMode ? 0.5 : 0.2)}; + } + &:not(:checked)::after { + content: ''; + } + } `; export const CheckboxLabel = styled.label` diff --git a/browser/data-browser/src/components/forms/ValueForm/ValueForm.tsx b/browser/data-browser/src/components/forms/ValueForm/ValueForm.tsx index 7e56ddf66..b42a508f8 100644 --- a/browser/data-browser/src/components/forms/ValueForm/ValueForm.tsx +++ b/browser/data-browser/src/components/forms/ValueForm/ValueForm.tsx @@ -87,7 +87,10 @@ const ValueFormWrapper = styled.div` max-width: 100%; `; -const EditButton = styled.div` +const EditButton = styled.button` + appearance: none; + background: none; + border: none; position: absolute; top: 0; color: ${p => p.theme.colors.main}; diff --git a/browser/data-browser/src/globalCssVars.ts b/browser/data-browser/src/globalCssVars.ts index fff29c1ed..8916dac8d 100644 --- a/browser/data-browser/src/globalCssVars.ts +++ b/browser/data-browser/src/globalCssVars.ts @@ -1,3 +1,4 @@ import { CSSVar } from './helpers/CSSVar'; export const CurrentBackgroundColor = new CSSVar('current-background-color'); +export const CalculatedPageHeight = new CSSVar('calculated-page-height'); diff --git a/browser/data-browser/src/hooks/useQueryScope.ts b/browser/data-browser/src/hooks/useQueryScope.ts index 00e8fb1b0..a07a4fc0e 100644 --- a/browser/data-browser/src/hooks/useQueryScope.ts +++ b/browser/data-browser/src/hooks/useQueryScope.ts @@ -1,6 +1,6 @@ import { useSearch } from '@tanstack/react-router'; import { paths } from '../routes/paths'; -import { SearchRoute } from '../routes/SearchRoute'; +import { SearchRoute } from '../routes/Search/SearchRoute'; export interface QueryScopeHandler { scope: string | undefined; diff --git a/browser/data-browser/src/hooks/useSelectedIndex.ts b/browser/data-browser/src/hooks/useSelectedIndex.ts new file mode 100644 index 000000000..30ee2a59b --- /dev/null +++ b/browser/data-browser/src/hooks/useSelectedIndex.ts @@ -0,0 +1,70 @@ +import { useEffect, useState } from 'react'; +import { loopingIndex } from '../helpers/loopingIndex'; + +export function useSelectedIndex( + list: T[], + onSelect: (index: number | undefined) => void, +): { + selectedIndex: number | undefined; + onKeyDown: (e: React.KeyboardEvent) => void; + onMouseOver: (index: number) => void; + onClick: (index: number) => void; + resetIndex: () => void; + usingKeyboard: boolean; +} { + const [selectedIndex, setSelectedIndex] = useState(0); + const [usingKeyboard, setUsingKeyboard] = useState(false); + + const onKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'ArrowDown') { + e.preventDefault(); + setSelectedIndex(prev => { + if (prev === undefined) return 0; + + return loopingIndex(prev + 1, list.length); + }); + } + + if (e.key === 'ArrowUp') { + e.preventDefault(); + setSelectedIndex(prev => { + if (prev === undefined) return list.length - 1; + + return loopingIndex(prev - 1, list.length); + }); + } + + if (e.key === 'Enter') { + onSelect(selectedIndex); + } + + setUsingKeyboard(true); + }; + + const onMouseOver = (index: number) => { + setSelectedIndex(index); + + setUsingKeyboard(false); + }; + + const onClick = (index: number) => { + onSelect(index); + }; + + const resetIndex = () => { + setSelectedIndex(undefined); + }; + + useEffect(() => { + setSelectedIndex(undefined); + }, [list]); + + return { + selectedIndex, + onKeyDown, + onMouseOver, + onClick, + resetIndex, + usingKeyboard, + }; +} diff --git a/browser/data-browser/src/routes/Router.tsx b/browser/data-browser/src/routes/Router.tsx index 792277f22..fb07eb4e5 100644 --- a/browser/data-browser/src/routes/Router.tsx +++ b/browser/data-browser/src/routes/Router.tsx @@ -1,6 +1,6 @@ import { createRoute, createRouter, Link } from '@tanstack/react-router'; import { ShowRoute } from './ShowRoute'; -import { SearchRoute } from './SearchRoute'; +import { SearchRoute } from './Search/SearchRoute'; import { NewRoute } from './NewResource/NewRoute'; import { AppSettingsRoute } from './AppSettings'; import { EditRoute } from './EditRoute'; diff --git a/browser/data-browser/src/routes/Search/SearchRoute.tsx b/browser/data-browser/src/routes/Search/SearchRoute.tsx new file mode 100644 index 000000000..4a2421f4c --- /dev/null +++ b/browser/data-browser/src/routes/Search/SearchRoute.tsx @@ -0,0 +1,244 @@ +import { useEffect, useRef, useState, type JSX } from 'react'; +import { ContainerNarrow } from '../../components/Containers'; +import { useHotkeys } from 'react-hotkeys-hook'; +import { constructOpenURL } from '../../helpers/navigation'; +import ResourceCard from '../../views/Card/ResourceCard'; +import { dataBrowser, useServerSearch } from '@tomic/react'; +import { ErrorLook } from '../../components/ErrorLook'; +import { styled } from 'styled-components'; +import { FaSearch } from 'react-icons/fa'; +import { useQueryScopeHandler } from '../../hooks/useQueryScope'; +import { useSettings } from '../../helpers/AppSettings'; +import { Column, Row } from '../../components/Row'; +import { Main } from '../../components/Main'; +import { useNavigateWithTransition } from '../../hooks/useNavigateWithTransition'; +import { createRoute } from '@tanstack/react-router'; +import { pathNames } from '../paths'; +import { appRoute } from '../RootRoutes'; +import { base64StringToFilter } from './searchUtils'; +import { InlineFormattedResourceList } from '../../components/InlineFormattedResourceList'; + +type SearchRouteQueryParams = { + query?: string; + queryscope?: string; + /** Base64 encoded filter object */ + filters?: string; +}; + +export const SearchRoute = createRoute({ + path: pathNames.search, + component: () => , + getParentRoute: () => appRoute, + validateSearch: { + parse: (search: Record): SearchRouteQueryParams => { + return { + query: (search.query as string) ?? undefined, + queryscope: (search.queryscope as string) ?? undefined, + filters: (search.filters as string) ?? undefined, + }; + }, + }, +}); + +/** Full text search route */ +export function Search(): JSX.Element { + const { query, filters: filtersBase64 } = SearchRoute.useSearch({ + select: state => ({ query: state.query, filters: state.filters }), + }); + const { drive } = useSettings(); + const { scope } = useQueryScopeHandler(); + + const filters = filtersBase64 ? base64StringToFilter(filtersBase64) : {}; + const filterIsEmpty = Object.keys(filters).length === 0; + const tags = (filters[dataBrowser.properties.tags] as string[]) ?? []; + + const [selectedIndex, setSelected] = useState(0); + const { results, loading, error } = useServerSearch(query, { + debounce: 0, + parents: scope || drive, + include: true, + filters, + allowEmptyQuery: !filterIsEmpty, + }); + + const navigate = useNavigateWithTransition(); + + const resultsDiv = useRef(null); + + useHotkeys( + 'enter', + e => { + e.preventDefault(); + // Get the current subject from the latest results and selectedIndex + const selectedSubject = results[selectedIndex]; + + if (selectedSubject) { + //@ts-ignore blur does exist though + document?.activeElement?.blur(); + const openURL = constructOpenURL(selectedSubject); + navigate(openURL); + } + }, + { enableOnTags: ['INPUT'], enableOnContentEditable: true }, + // Explicitly include results and selectedIndex in the dependency array + [results, selectedIndex, navigate], + ); + + useHotkeys( + 'up', + e => { + e.preventDefault(); + setSelected(prev => (prev > 0 ? prev - 1 : 0)); + }, + { enableOnTags: ['INPUT'], enableOnContentEditable: true }, + [selectedIndex], + ); + + useHotkeys( + 'down', + e => { + e.preventDefault(); + setSelected(prev => + prev === results.length - 1 ? results.length - 1 : prev + 1, + ); + }, + { enableOnTags: ['INPUT'], enableOnContentEditable: true }, + [selectedIndex], + ); + + let heading: string | undefined = 'No hits'; + + if (!query) { + heading = 'Enter a search query'; + } + + if (loading) { + heading = 'Loading results...'; + } + + if (results.length > 0) { + heading = undefined; + } + + const showHelperMessage = !query && filterIsEmpty; + + useEffect(() => { + setSelected(0); + }, [results]); + + return ( +
    + + {error ? ( + {error.message} + ) : ( + <> + + + + + {heading ? ( + heading + ) : ( + <> + {results.length}{' '} + {results.length > 1 ? 'Results' : 'Result'} for{' '} + {query} + + )} + + + {tags.length > 0 && ( + + With Tags: + + + + + )} + {showHelperMessage && ( + + Search matches on the names and descriptions of resources. + Additionally you can search for resources with specific tags + by adding tag:[name] to your search. + + )} + + {results.map((subject, index) => ( + + ))} + + + + )} + +
    + ); +} + +interface SelectableResultProps { + subject: string; + initialInView: boolean; + selected: boolean; +} + +const SelectableResult: React.FC = ({ + subject, + initialInView, + selected, +}) => { + const ref = useRef(null); + + useEffect(() => { + if (ref.current && selected) { + ref.current.scrollIntoView({ block: 'nearest', behavior: 'instant' }); + } + }, [selected]); + + return ( +
    + +
    + ); +}; + +const Heading = styled.h1` + color: ${p => p.theme.colors.text}; + display: flex; + align-items: center; + gap: 0.7ch; + white-space: nowrap; + overflow: hidden; + line-height: 1.5; + + & > span { + overflow: hidden; + text-overflow: ellipsis; + } +`; + +const QueryText = styled.span` + color: ${p => p.theme.colors.textLight}; +`; + +const TagHeading = styled.span` + color: ${p => p.theme.colors.textLight}; + font-weight: bold; +`; + +const HelperMessage = styled.p` + color: ${p => p.theme.colors.textLight}; + border: 1px solid ${p => p.theme.colors.bg2}; + padding: 1rem; + border-radius: 0.5rem; +`; diff --git a/browser/data-browser/src/routes/Search/searchUtils.ts b/browser/data-browser/src/routes/Search/searchUtils.ts new file mode 100644 index 000000000..a0d33a689 --- /dev/null +++ b/browser/data-browser/src/routes/Search/searchUtils.ts @@ -0,0 +1,9 @@ +type FilterObject = Record; + +export function filterToBase64String(filter: FilterObject): string { + return btoa(JSON.stringify(filter)); +} + +export function base64StringToFilter(base64String: string): FilterObject { + return JSON.parse(atob(base64String)); +} diff --git a/browser/data-browser/src/routes/SearchRoute.tsx b/browser/data-browser/src/routes/SearchRoute.tsx deleted file mode 100644 index 5bb9d80e0..000000000 --- a/browser/data-browser/src/routes/SearchRoute.tsx +++ /dev/null @@ -1,168 +0,0 @@ -import { useRef, useState, type JSX } from 'react'; -import { ContainerNarrow } from '../components/Containers'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { constructOpenURL } from '../helpers/navigation'; -import ResourceCard from '../views/Card/ResourceCard'; -import { useServerSearch } from '@tomic/react'; -import { ErrorLook } from '../components/ErrorLook'; -import { styled } from 'styled-components'; -import { FaSearch } from 'react-icons/fa'; -import { useQueryScopeHandler } from '../hooks/useQueryScope'; -import { useSettings } from '../helpers/AppSettings'; -import { Column } from '../components/Row'; -import { Main } from '../components/Main'; -import { useNavigateWithTransition } from '../hooks/useNavigateWithTransition'; -import { createRoute } from '@tanstack/react-router'; -import { pathNames } from './paths'; -import { appRoute } from './RootRoutes'; - -type SearchRouteQueryParams = { - query?: string; - queryscope?: string; -}; - -export const SearchRoute = createRoute({ - path: pathNames.search, - component: () => , - getParentRoute: () => appRoute, - validateSearch: { - parse: (search: Record): SearchRouteQueryParams => { - return { - query: (search.query as string) ?? undefined, - queryscope: (search.queryscope as string) ?? undefined, - }; - }, - }, -}); - -/** Full text search route */ -export function Search(): JSX.Element { - const query = SearchRoute.useSearch({ select: state => state.query }); - const { drive } = useSettings(); - const { scope } = useQueryScopeHandler(); - - const [selectedIndex, setSelected] = useState(0); - const { results, loading, error } = useServerSearch(query, { - debounce: 0, - parents: scope || drive, - include: true, - }); - const navigate = useNavigateWithTransition(); - const resultsDiv = useRef(null); - - function selectResult(index: number) { - setSelected(index); - const currentElm = resultsDiv?.current?.children[index]; - currentElm?.scrollIntoView({ block: 'nearest' }); - } - - useHotkeys( - 'enter', - e => { - e.preventDefault(); - const subject = - resultsDiv?.current?.children[selectedIndex]?.getAttribute('about'); - - if (subject) { - //@ts-ignore blur does exist though - document?.activeElement?.blur(); - const openURL = constructOpenURL(subject); - navigate(openURL); - } - }, - { enableOnTags: ['INPUT'] }, - ); - useHotkeys( - 'up', - e => { - e.preventDefault(); - const newSelected = selectedIndex > 0 ? selectedIndex - 1 : 0; - selectResult(newSelected); - }, - { enableOnTags: ['INPUT'] }, - [selectedIndex, selectResult], - ); - useHotkeys( - 'down', - e => { - e.preventDefault(); - const newSelected = - selectedIndex === results.length - 1 - ? results.length - 1 - : selectedIndex + 1; - selectResult(newSelected); - }, - { enableOnTags: ['INPUT'] }, - [selectedIndex, selectResult], - ); - - let message: string | undefined = 'No hits'; - - if (query?.length === 0) { - message = 'Enter a search query'; - } - - if (loading) { - message = 'Loading results...'; - } - - if (results.length > 0) { - message = undefined; - } - - return ( -
    - - {error ? ( - {error.message} - ) : ( - <> - - - - {message ? ( - message - ) : ( - <> - {results.length} {results.length > 1 ? 'Results' : 'Result'}{' '} - for {query} - - )} - - - - {results.map((subject, index) => ( - - ))} - - - )} - -
    - ); -} - -const Heading = styled.h1` - color: ${p => p.theme.colors.text}; - display: flex; - align-items: center; - gap: 0.7ch; - white-space: nowrap; - overflow: hidden; - line-height: 1.5; - margin-bottom: ${p => p.theme.size(8)}; - - & > span { - overflow: hidden; - text-overflow: ellipsis; - } -`; - -const QueryText = styled.span` - color: ${p => p.theme.colors.textLight}; -`; diff --git a/browser/data-browser/src/routes/ShowRoute.tsx b/browser/data-browser/src/routes/ShowRoute.tsx index 097860de4..f3d1a8a5a 100644 --- a/browser/data-browser/src/routes/ShowRoute.tsx +++ b/browser/data-browser/src/routes/ShowRoute.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { Client } from '@tomic/react'; import ResourcePage from '../views/ResourcePage'; -import { Search } from './SearchRoute'; +import { Search } from './Search/SearchRoute'; import { About } from './AboutRoute'; import { createRoute } from '@tanstack/react-router'; import { appRoute } from './RootRoutes'; diff --git a/browser/data-browser/src/views/Card/ResourceCard.tsx b/browser/data-browser/src/views/Card/ResourceCard.tsx index 3753e0f53..fc6b42e5f 100644 --- a/browser/data-browser/src/views/Card/ResourceCard.tsx +++ b/browser/data-browser/src/views/Card/ResourceCard.tsx @@ -25,7 +25,8 @@ import { ElementCard } from './ElementCard'; import { ArticleCard } from '../Article'; import { styled } from 'styled-components'; import { ResourceCardTitle } from './ResourceCardTitle'; -import { Column } from '../../components/Row'; +import { Column, Row } from '../../components/Row'; +import { Tag } from '../../components/Tag'; interface ResourceCardProps extends CardViewPropsBase { /** The subject URL - the identifier of the resource. */ @@ -121,12 +122,18 @@ export function ResourceCardDefault({ }: CardViewProps): JSX.Element { const [isA] = useArray(resource, core.properties.isA); const isAResource = useResource(isA[0]); + const [tags] = useArray(resource, dataBrowser.properties.tags); return ( - {isAResource.title} + {isAResource.title} + + {tags.map(tag => ( + + ))} + - - - {resource.title} - + + + + + {resource.title} + + {children} ); @@ -41,7 +43,6 @@ const Title = styled.h2` const TitleRow = styled(Row)` max-width: 100%; - height: 2rem; overflow: hidden; color: ${({ theme }) => theme.colors.textLight}; diff --git a/browser/data-browser/src/views/ChatRoomPage.tsx b/browser/data-browser/src/views/ChatRoomPage.tsx index 9a522d1de..5b7d7c388 100644 --- a/browser/data-browser/src/views/ChatRoomPage.tsx +++ b/browser/data-browser/src/views/ChatRoomPage.tsx @@ -26,6 +26,8 @@ import { editURL } from '../helpers/navigation'; import { ResourceInline } from './ResourceInline'; import { ResourcePageProps } from './ResourcePage'; import { useNavigateWithTransition } from '../hooks/useNavigateWithTransition'; +import { TagBar } from '../components/Tag/TagBar'; +import { Column } from '../components/Row'; /** Full page ChatRoom that shows a message list and a form to add Messages. */ export function ChatRoomPage({ resource }: ResourcePageProps) { @@ -135,38 +137,41 @@ export function ChatRoomPage({ resource }: ResourcePageProps) { return ( - - - - - {isReplyTo && ( - - - - - )} - - - sendMessage()} - > - Send - - - + + + + + + + {isReplyTo && ( + + + + + )} + + + sendMessage()} + > + Send + + + + ); } diff --git a/browser/data-browser/src/views/CrashPage.tsx b/browser/data-browser/src/views/CrashPage.tsx index 1ece7985b..1d0540b6c 100644 --- a/browser/data-browser/src/views/CrashPage.tsx +++ b/browser/data-browser/src/views/CrashPage.tsx @@ -7,6 +7,7 @@ import { Button } from '../components/Button'; import { Column, Row } from '../components/Row'; import type { JSX } from 'react'; +import { styled } from 'styled-components'; type ErrorPageProps = { resource?: Resource; @@ -24,25 +25,32 @@ function CrashPage({ clearError, }: ErrorPageProps): JSX.Element { return ( - - - {children ? children : } - - {clearError && } - - - - + + + + {children ? children : } + + {clearError && } + + + + + ); } export default CrashPage; + +const StyledMain = styled.main` + height: 100dvh; + overflow: auto; +`; diff --git a/browser/data-browser/src/views/DocumentPage.tsx b/browser/data-browser/src/views/DocumentPage.tsx index 71e4114f3..7bf929f1d 100644 --- a/browser/data-browser/src/views/DocumentPage.tsx +++ b/browser/data-browser/src/views/DocumentPage.tsx @@ -35,6 +35,8 @@ import toast from 'react-hot-toast'; import { shortcuts } from '../components/HotKeyWrapper'; import { EditableTitle } from '../components/EditableTitle'; import { FileDropZone } from '../components/forms/FileDropzone/FileDropzone'; +import { Column, Row } from '../components/Row'; +import { TagBar } from '../components/Tag/TagBar'; /** A full page, editable document, consisting of Elements */ export function DocumentPage({ resource }: ResourcePageProps): JSX.Element { @@ -313,8 +315,8 @@ function DocumentPageEdit({ } return ( - <> -
    + + -
    - +
    + {err?.message && {err.message}} - + ); } @@ -372,8 +374,8 @@ function DocumentPageShow({ const canWrite = useCanWrite(resource); return ( - <> -
    + +

    {resource.title}

    {canWrite && ( )} +
    + +
    + {elements.map(subject => ( + + ))}
    - {elements.map(subject => ( - - ))} - +
    ); } diff --git a/browser/data-browser/src/views/File/FileCard.tsx b/browser/data-browser/src/views/File/FileCard.tsx index 1d59574f0..709b04416 100644 --- a/browser/data-browser/src/views/File/FileCard.tsx +++ b/browser/data-browser/src/views/File/FileCard.tsx @@ -1,12 +1,13 @@ import { useMemo, type JSX } from 'react'; import { AtomicLink } from '../../components/AtomicLink'; -import { Row } from '../../components/Row'; +import { Column } from '../../components/Row'; import { useFileInfo } from '../../hooks/useFile'; import { CardViewProps } from '../Card/CardViewProps'; import { ResourceCardTitle } from '../Card/ResourceCardTitle'; import { ErrorBoundary } from '../ErrorPage'; import { DownloadIconButton } from './DownloadButton'; import { FilePreview } from './FilePreview'; +import { SimpleTagBar } from '../../components/Tag/TagBar'; function FileCard(props: CardViewProps): JSX.Element { const FileError = useMemo(() => { @@ -37,12 +38,12 @@ function FileCardInner({ resource }: CardViewProps): JSX.Element { const { downloadFile, bytes } = useFileInfo(resource); return ( - <> - - + + - + + - + ); } diff --git a/browser/data-browser/src/views/File/FilePage.tsx b/browser/data-browser/src/views/File/FilePage.tsx index e18221b8f..9e6f0f728 100644 --- a/browser/data-browser/src/views/File/FilePage.tsx +++ b/browser/data-browser/src/views/File/FilePage.tsx @@ -10,6 +10,7 @@ import { useMediaQuery } from '../../hooks/useMediaQuery'; import { ResourcePageProps } from '../ResourcePage'; import { DownloadButton, DownloadIconButton } from './DownloadButton'; import { FilePreview } from './FilePreview'; +import { TagBar } from '../../components/Tag/TagBar'; /** Full page File resource for showing and downloading files */ export function FilePage({ resource }: ResourcePageProps) { @@ -28,6 +29,7 @@ export function FilePage({ resource }: ResourcePageProps) { )} + diff --git a/browser/data-browser/src/views/FolderPage/index.tsx b/browser/data-browser/src/views/FolderPage/index.tsx index 9452627d1..fe170fab3 100644 --- a/browser/data-browser/src/views/FolderPage/index.tsx +++ b/browser/data-browser/src/views/FolderPage/index.tsx @@ -14,6 +14,8 @@ import { DisplayStyleButton } from './DisplayStyleButton'; import { GridView } from './GridView'; import { ListView } from './ListView'; import { useLocalStorage } from '../../hooks/useLocalStorage'; +import { TagBar } from '../../components/Tag/TagBar'; +import { Column, Row } from '../../components/Row'; type PreferredFolderStyles = Record; @@ -60,42 +62,42 @@ export function FolderPage({ return ( - - - - - - - - - - - + +
    + + + + +
    + + + + + + +
    ); } -const TitleBar = styled.div` - padding: ${p => p.theme.margin}rem; -`; - -const TitleBarInner = styled.div` - display: flex; +const TitleBarInner = styled(Row)` width: var(--container-width); margin-inline: auto; - justify-content: space-between; + + input { + margin-bottom: 0; + } `; const Wrapper = styled.div` width: 100%; - padding: ${p => p.theme.margin}rem; flex: 1; `; @@ -106,7 +108,8 @@ interface FullPageWrapperProps { const FullPageWrapper = styled.div` --container-width: min(1300px, 100%); min-height: ${p => p.theme.heights.fullPage}; - padding-bottom: ${p => p.theme.heights.floatingSearchBarPadding}; display: flex; flex-direction: column; + padding: ${p => p.theme.size()}; + padding-bottom: ${p => p.theme.heights.floatingSearchBarPadding}; `; diff --git a/browser/data-browser/src/views/ResourceInline/TagInline.tsx b/browser/data-browser/src/views/ResourceInline/TagInline.tsx index 593d23cdc..184213af7 100644 --- a/browser/data-browser/src/views/ResourceInline/TagInline.tsx +++ b/browser/data-browser/src/views/ResourceInline/TagInline.tsx @@ -17,4 +17,9 @@ export function TagInline({ const TagWrapper = styled.span` display: inline-block; padding-block: 2px; + + &:hover, + &:focus-visible { + filter: brightness(1.05); + } `; diff --git a/browser/data-browser/src/views/ResourcePageDefault.tsx b/browser/data-browser/src/views/ResourcePageDefault.tsx index b6e1f1a16..1c0587ecf 100644 --- a/browser/data-browser/src/views/ResourcePageDefault.tsx +++ b/browser/data-browser/src/views/ResourcePageDefault.tsx @@ -24,6 +24,7 @@ import { useNavigateWithTransition } from '../hooks/useNavigateWithTransition'; import { editURL } from '../helpers/navigation'; import type { JSX } from 'react'; +import { TagBar } from '../components/Tag/TagBar'; /** * The properties that are shown in an alternative, custom way in default views. @@ -47,6 +48,7 @@ export const defaultHiddenProps = [ // Shown in CommitDetail commits.properties.lastCommit, dataBrowser.properties.subResources, + dataBrowser.properties.tags, ]; /** @@ -79,6 +81,7 @@ export function ResourcePageDefault({ + {filteredTags.map((v, i) => ( - column.subject; @@ -139,6 +140,7 @@ export function TablePage({ resource }: ResourcePageProps): JSX.Element { + Not used in any properties; + return null; } return ( diff --git a/browser/e2e/tests/search.spec.ts b/browser/e2e/tests/search.spec.ts index a65ea89a9..118df859b 100644 --- a/browser/e2e/tests/search.spec.ts +++ b/browser/e2e/tests/search.spec.ts @@ -11,12 +11,13 @@ import { setTitle, sideBarNewResourceTestId, contextMenuClick, + timestamp, } from './test-utils'; test.describe('search', async () => { test.beforeEach(before); test('text search', async ({ page }) => { - await page.fill(addressBar, 'welcome'); + await addressBar(page).fill('welcome'); await expect(page.locator('text=Welcome to your')).toBeVisible(); await page.keyboard.press('Enter'); await expect( @@ -62,7 +63,7 @@ test.describe('search', async () => { await page.reload(); await contextMenuClick('scope', page); // Search for 'Avocado' - await page.locator('[data-test="address-bar"]').type('Avocado'); + await addressBar(page).type('Avocado'); // I don't like the `.first` here, but for some reason there is one frame where // Multiple hits render, which fails the tests. await expect(page.locator('h2:text("Avocado Cake")').first()).toBeVisible(); @@ -76,4 +77,64 @@ test.describe('search', async () => { page.locator('h2:text("Avocado Salad")').first(), ).toBeVisible(); }); + + test('Add tags and search for them', async ({ page }) => { + // Sign in + await signIn(page); + + // Create a new drive + const { driveTitle: _driveTitle } = await newDrive(page); + + // Create a folder + const folderName = `TagTestFolder-${timestamp()}`; + await page.getByTestId(sideBarNewResourceTestId).click(); + await page.locator('button:has-text("folder")').click(); + await setTitle(page, folderName); + + // Add tags to the folder using the TagBar + // Click on the "+" button in the TagBar + const firstTagName = `first-tag`; + await page.getByTitle('Add tags').click(); + + // Create a new tag + await page.getByPlaceholder('New tag').fill(firstTagName); + await page.getByRole('button', { name: 'Add tag', exact: true }).click(); + + // Add a second tag + const secondTagName = `second-tag`; + await expect(page.getByPlaceholder('New tag')).toHaveValue(''); + + await page.getByPlaceholder('New tag').fill(secondTagName); + await page.getByRole('button', { name: 'Add tag', exact: true }).click(); + await page.keyboard.press('Escape'); + await expect(page.getByRole('link', { name: firstTagName })).toBeVisible(); + await expect(page.getByRole('link', { name: secondTagName })).toBeVisible(); + + // Wait for the index to be rebuilt + await page.waitForTimeout(REBUILD_INDEX_TIME); + + // Search for the folder by the first tag + await addressBar(page).fill('tag:first'); + await page.keyboard.press('Enter'); + + // Verify the folder is found in search results + await expect(page.getByRole('heading', { name: folderName })).toBeVisible(); + + // Search for the folder by the second tag + await addressBar(page).fill(`tag:${secondTagName}`); + await page.keyboard.press('Enter'); + + // Verify the folder is found in search results + await expect(page.getByRole('heading', { name: folderName })).toBeVisible(); + + // Verify that searching for a non-existent tag doesn't find the folder + const nonExistentTag = `nonexistent-tag`; + await addressBar(page).fill(`tag:${nonExistentTag}`); + await page.keyboard.press('Enter'); + + // Verify the folder is not found + await expect( + page.getByRole('heading', { name: folderName }), + ).not.toBeVisible(); + }); }); diff --git a/browser/e2e/tests/test-utils.ts b/browser/e2e/tests/test-utils.ts index df5861d4f..2b939fd9e 100644 --- a/browser/e2e/tests/test-utils.ts +++ b/browser/e2e/tests/test-utils.ts @@ -37,7 +37,7 @@ export const publicReadRightLocator = (page: Page) => ) .first(); export const contextMenu = '[data-test="context-menu"]'; -export const addressBar = '[data-test="address-bar"]'; +export const addressBar = (page: Page) => page.getByTestId('adress-bar'); export const newDriveMenuItem = '[data-test="menu-item-new-drive"]'; export const defaultDevServer = 'http://localhost:9883'; @@ -124,7 +124,7 @@ export async function makeDrivePublic(page: Page) { } export async function openSubject(page: Page, subject: string) { - await page.fill(addressBar, subject); + await addressBar(page).fill(subject); await expect(page.locator(`main[about="${subject}"]`).first()).toBeVisible(); } diff --git a/browser/lib/src/ontologies/dataBrowser.ts b/browser/lib/src/ontologies/dataBrowser.ts index e984c0222..e09b4cdc0 100644 --- a/browser/lib/src/ontologies/dataBrowser.ts +++ b/browser/lib/src/ontologies/dataBrowser.ts @@ -56,6 +56,7 @@ export const dataBrowser = { subResources: 'https://atomicdata.dev/properties/subresources', tableColumnWidths: 'https://atomicdata.dev/properties/tableColumnWidths', tags: 'https://atomicdata.dev/properties/tags', + tagList: 'https://atomicdata.dev/ontology/data-browser/property/tag-list', url: 'https://atomicdata.dev/property/url', }, __classDefs: { @@ -313,6 +314,7 @@ declare module '../index.js' { [dataBrowser.properties.subResources]: string[]; [dataBrowser.properties.tableColumnWidths]: string; [dataBrowser.properties.tags]: string[]; + [dataBrowser.properties.tagList]: string[]; [dataBrowser.properties.url]: string; } @@ -341,6 +343,7 @@ declare module '../index.js' { [dataBrowser.properties.subResources]: 'subResources'; [dataBrowser.properties.tableColumnWidths]: 'tableColumnWidths'; [dataBrowser.properties.tags]: 'tags'; + [dataBrowser.properties.tagList]: 'tagList'; [dataBrowser.properties.url]: 'url'; } } diff --git a/browser/lib/src/search.ts b/browser/lib/src/search.ts index 2576913ff..52c5f0ad1 100644 --- a/browser/lib/src/search.ts +++ b/browser/lib/src/search.ts @@ -9,7 +9,7 @@ export interface SearchOpts { parents?: string[] | string; /** Property-Value pair of set filters. */ filters?: { - [subject: string]: string; + [subject: string]: string | number | string[]; }; } @@ -50,11 +50,22 @@ export function escapeTantivyKey(key: string) { } /** Uses Tantivy query syntax */ -function buildFilterString(filters: Record): string { +function buildFilterString( + filters: Record, +): string { return Object.entries(filters) .map(([key, value]) => { - return value && `${escapeTantivyKey(key)}:"${value}"`; + if (value === undefined) { + return undefined; + } + + if (Array.isArray(value)) { + return value.map(v => `${escapeTantivyKey(key)}:"${v}"`).join(' AND '); + } + + return `${escapeTantivyKey(key)}:"${value}"`; }) + .filter(x => x !== undefined) .join(' AND '); } @@ -71,7 +82,13 @@ export function buildSearchSubject( const hasFilters = filters && Object.keys(filters).length > 0 && - Object.values(filters).filter(v => v && v.length > 0).length > 0; + Object.values(filters).some(v => { + if (Array.isArray(v)) { + return v.length > 0; + } + + return v !== undefined; + }); query && url.searchParams.set('q', query); include && url.searchParams.set('include', include.toString()); @@ -85,7 +102,6 @@ export function buildSearchSubject( url.searchParams.append('parents', parents); } } - // parents && url.searchParams.set('parents', JSON.stringify(parents)); return url.toString(); } diff --git a/browser/lib/src/store.ts b/browser/lib/src/store.ts index ee1622665..248c420d4 100644 --- a/browser/lib/src/store.ts +++ b/browser/lib/src/store.ts @@ -877,6 +877,10 @@ export class Store { if (lastResource) { lastAncestor = lastResource.get(core.properties.parent) as string; + if (lastAncestor === undefined) { + break; + } + if (ancestry.includes(lastAncestor)) { throw new Error( `Resource ${resource.subject} ancestry is cyclical. ${lastAncestor} is already in the ancestry}`, diff --git a/browser/pnpm-lock.yaml b/browser/pnpm-lock.yaml index 5073dac17..f6c16462a 100644 --- a/browser/pnpm-lock.yaml +++ b/browser/pnpm-lock.yaml @@ -64,10 +64,10 @@ importers: version: 5.6.3 vite: specifier: ^5.4.10 - version: 5.4.10(@types/node@20.17.0)(terser@5.36.0) + version: 5.4.10(@types/node@20.17.0)(terser@5.39.0) vitest: specifier: ^2.1.3 - version: 2.1.3(@types/node@20.17.0)(terser@5.36.0) + version: 2.1.3(@types/node@20.17.0)(terser@5.39.0) cli: dependencies: @@ -268,10 +268,10 @@ importers: version: 1.8.8 '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)) + version: 4.3.4(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) babel-plugin-react-compiler: - specifier: 19.0.0-beta-37ed2a7-20241206 - version: 19.0.0-beta-37ed2a7-20241206 + specifier: 19.0.0-beta-21e868a-20250216 + version: 19.0.0-beta-21e868a-20250216 babel-plugin-styled-components: specifier: ^2.1.4 version: 2.1.4(@babel/core@7.26.0)(styled-components@6.1.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0)) @@ -292,16 +292,16 @@ importers: version: 5.6.3 vite: specifier: ^5.4.10 - version: 5.4.10(@types/node@20.17.0)(terser@5.36.0) + version: 5.4.10(@types/node@20.17.0)(terser@5.39.0) vite-plugin-prismjs: specifier: ^0.0.11 version: 0.0.11(prismjs@1.29.0) vite-plugin-pwa: specifier: ^0.20.5 - version: 0.20.5(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.1.0) + version: 0.20.5(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.1.0) vite-plugin-webfont-dl: specifier: ^3.9.5 - version: 3.9.5(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)) + version: 3.9.5(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) e2e: devDependencies: @@ -318,6 +318,134 @@ importers: specifier: ^2.0.1 version: 2.0.1 + e2e/template-tests/nextjs-site: + dependencies: + '@t3-oss/env-nextjs': + specifier: ^0.11.1 + version: 0.11.1(typescript@5.6.3)(zod@3.23.8) + '@tomic/lib': + specifier: ^0.40.0 + version: link:../../../lib + '@tomic/react': + specifier: ^0.40.0 + version: link:../../../react + clsx: + specifier: ^2.1.1 + version: 2.1.1 + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 + modern-css-reset: + specifier: ^1.4.0 + version: 1.4.0 + next: + specifier: 15.0.4 + version: 15.0.4(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(@playwright/test@1.50.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: + specifier: 19.0.0 + version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) + remark: + specifier: ^15.0.1 + version: 15.0.1 + remark-html: + specifier: ^16.0.1 + version: 16.0.1 + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: + '@tomic/cli': + specifier: ^0.40.0 + version: link:../../../cli + '@types/node': + specifier: ^20 + version: 20.17.0 + '@types/react': + specifier: 19.0.1 + version: 19.0.1 + '@types/react-dom': + specifier: 19.0.1 + version: 19.0.1 + eslint: + specifier: ^9.13.0 + version: 9.13.0(jiti@2.3.3) + eslint-config-next: + specifier: 15.0.2 + version: 15.0.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + typescript: + specifier: ^5 + version: 5.6.3 + + e2e/template-tests/sveltekit-site: + dependencies: + '@tomic/lib': + specifier: ^0.40.0 + version: 0.40.0 + '@tomic/svelte': + specifier: ^0.40.0 + version: 0.40.0(@tomic/lib@0.40.0)(svelte@5.1.4) + svelte-markdown: + specifier: ^0.4.1 + version: 0.4.1(svelte@5.1.4) + devDependencies: + '@sveltejs/adapter-auto': + specifier: ^3.3.1 + version: 3.3.1(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))) + '@sveltejs/adapter-node': + specifier: ^5.2.9 + version: 5.2.12(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))) + '@sveltejs/kit': + specifier: ^2.7.3 + version: 2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) + '@sveltejs/vite-plugin-svelte': + specifier: ^4.0.0-next.6 + version: 4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) + '@tomic/cli': + specifier: ^0.39.0 + version: 0.39.0(@tomic/lib@0.40.0) + '@types/eslint': + specifier: ^9.6.1 + version: 9.6.1 + eslint: + specifier: ^9.13.0 + version: 9.13.0(jiti@2.3.3) + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-svelte: + specifier: ^2.46.0 + version: 2.46.0(eslint@9.13.0(jiti@2.3.3))(svelte@5.1.4)(ts-node@10.9.2(@swc/core@1.7.39)(@types/node@20.17.0)(typescript@5.6.3)) + globals: + specifier: ^15.11.0 + version: 15.11.0 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + prettier-plugin-svelte: + specifier: ^3.2.7 + version: 3.2.7(prettier@3.3.3)(svelte@5.1.4) + svelte: + specifier: ^5.1.4 + version: 5.1.4 + svelte-check: + specifier: ^4.0.5 + version: 4.1.4(picomatch@4.0.2)(svelte@5.1.4)(typescript@5.6.3) + typescript: + specifier: ^5.6.3 + version: 5.6.3 + typescript-eslint: + specifier: ^8.11.0 + version: 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + vite: + specifier: ^5.4.10 + version: 5.4.10(@types/node@20.17.0)(terser@5.39.0) + vitest: + specifier: ^2.1.3 + version: 2.1.3(@types/node@20.17.0)(terser@5.39.0) + lib: dependencies: '@noble/ed25519': @@ -359,7 +487,7 @@ importers: version: 5.6.3 vitest: specifier: ^2.1.3 - version: 2.1.3(@types/node@20.17.0)(terser@5.36.0) + version: 2.1.3(@types/node@20.17.0)(terser@5.39.0) react: dependencies: @@ -400,16 +528,16 @@ importers: devDependencies: '@sveltejs/adapter-auto': specifier: ^3.3.0 - version: 3.3.0(@sveltejs/kit@2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0))) + version: 3.3.0(@sveltejs/kit@2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))) '@sveltejs/kit': specifier: ^2.7.2 - version: 2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)) + version: 2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) '@sveltejs/package': specifier: ^2.3.6 version: 2.3.6(svelte@5.1.4)(typescript@5.6.3) '@sveltejs/vite-plugin-svelte': specifier: ^4.0.0 - version: 4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)) + version: 4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -448,10 +576,10 @@ importers: version: 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) vite: specifier: ^5.4.10 - version: 5.4.10(@types/node@20.17.0)(terser@5.36.0) + version: 5.4.10(@types/node@20.17.0)(terser@5.39.0) vitest: specifier: ^2.1.3 - version: 2.1.3(@types/node@20.17.0)(terser@5.36.0) + version: 2.1.3(@types/node@20.17.0)(terser@5.39.0) packages: @@ -490,6 +618,10 @@ packages: resolution: {integrity: sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + '@babel/core@7.26.0': resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} @@ -498,32 +630,42 @@ packages: resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + '@babel/generator@7.26.9': + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} engines: {node: '>=6.9.0'} - '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': - resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==} + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.25.9': resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.25.9': resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.25.9': - resolution: {integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==} + '@babel/helper-create-class-features-plugin@7.26.9': + resolution: {integrity: sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.26.3': + resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.2': - resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + '@babel/helper-define-polyfill-provider@0.6.3': + resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -549,6 +691,10 @@ packages: resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + '@babel/helper-remap-async-to-generator@7.25.9': resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} engines: {node: '>=6.9.0'} @@ -561,9 +707,11 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.25.9': - resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==} + '@babel/helper-replace-supers@7.26.5': + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 '@babel/helper-skip-transparent-expression-wrappers@7.25.9': resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} @@ -599,6 +747,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} engines: {node: '>=6.9.0'} @@ -642,14 +795,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.25.9': - resolution: {integrity: sha512-4GHX5uzr5QMOOuzV0an9MFju4hKlm0OyePl/lHhcsTVae5t/IKVHnb8W67Vr6FuLlk5lPqLB7n7O+K5R46emYg==} + '@babel/plugin-syntax-import-assertions@7.26.0': + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.25.9': - resolution: {integrity: sha512-u3EN9ub8LyYvgTnrgp8gboElouayiwPdnM7x5tcnW3iSt09/lQYPwMNK40I9IUxo7QOZhAsPHCmmuO7EPdruqg==} + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -672,8 +825,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.25.9': - resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==} + '@babel/plugin-transform-async-generator-functions@7.26.8': + resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -684,8 +837,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.25.9': - resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==} + '@babel/plugin-transform-block-scoped-functions@7.26.5': + resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -702,8 +855,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.25.9': - resolution: {integrity: sha512-UIf+72C7YJ+PJ685/PpATbCz00XqiFEzHX5iysRwfvNT0Ko+FaXSvRgLytFSp8xUItrG9pFM/KoBBZDrY/cYyg==} + '@babel/plugin-transform-class-static-block@7.26.0': + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 @@ -750,8 +903,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.25.9': - resolution: {integrity: sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==} + '@babel/plugin-transform-exponentiation-operator@7.26.3': + resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -762,8 +915,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.25.9': - resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} + '@babel/plugin-transform-for-of@7.26.9': + resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -804,8 +957,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.25.9': - resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==} + '@babel/plugin-transform-modules-commonjs@7.26.3': + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -834,8 +987,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.25.9': - resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} + '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': + resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -912,6 +1065,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-regexp-modifiers@7.26.0': + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/plugin-transform-reserved-words@7.25.9': resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} engines: {node: '>=6.9.0'} @@ -936,14 +1095,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.25.9': - resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} + '@babel/plugin-transform-template-literals@7.26.8': + resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.25.9': - resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} + '@babel/plugin-transform-typeof-symbol@7.26.7': + resolution: {integrity: sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -972,8 +1131,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.25.9': - resolution: {integrity: sha512-XqDEt+hfsQukahSX9JOBDHhpUHDhj2zGSxoqWQFCMajOSBnbhBdgON/bU/5PkBA1yX5tqW6tTzuIPVsZTQ7h5Q==} + '@babel/preset-env@7.26.9': + resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -987,14 +1146,26 @@ packages: resolution: {integrity: sha512-4zpTHZ9Cm6L9L+uIqghQX8ZXg8HKFcjYO3qHoO8zTmRm6HQUJ8SSJ+KRvbMBZn0EGVlT4DRYeQ/6hjlyXBh+Kg==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.26.9': + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} + engines: {node: '>=6.9.0'} + '@babel/template@7.25.9': resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.9': resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.26.9': + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} + engines: {node: '>=6.9.0'} + '@babel/types@7.25.6': resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} @@ -1007,6 +1178,10 @@ packages: resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + engines: {node: '>=6.9.0'} + '@bugsnag/browser@7.25.0': resolution: {integrity: sha512-PzzWy5d9Ly1CU1KkxTB6ZaOw/dO+CYSfVtqxVJccy832e6+7rW/dvSw5Jy7rsNhgcKSKjZq86LtNkPSvritOLA==} @@ -1081,6 +1256,9 @@ packages: peerDependencies: react: '>=16.8.0' + '@emnapi/runtime@1.3.1': + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emoji-mart/react@1.1.1': resolution: {integrity: sha512-NMlFNeWgv1//uPsvLxvGQoIerPuVdXwK/EUek8OOkJ6wVOWPUizRBJU0hDqWZCOROVpfBgCemaC3m6jDOXi03g==} peerDependencies: @@ -1771,6 +1949,111 @@ packages: '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@import-maps/resolve@1.0.1': resolution: {integrity: sha512-tWZNBIS1CoekcwlMuyG2mr0a1Wo5lb5lEHwwWvZo+5GLgr3e9LLDTtmgtCWEwBpXMkxn9D+2W9j2FY6eZQq0tA==} @@ -1786,6 +2069,10 @@ packages: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1993,6 +2280,60 @@ packages: engines: {node: ^14.18.0 || >=16.0.0} hasBin: true + '@next/env@15.0.4': + resolution: {integrity: sha512-WNRvtgnRVDD4oM8gbUcRc27IAhaL4eXQ/2ovGbgLnPGUvdyDr8UdXP4Q/IBDdAdojnD2eScryIDirv0YUCjUVw==} + + '@next/eslint-plugin-next@15.0.2': + resolution: {integrity: sha512-R9Jc7T6Ge0txjmqpPwqD8vx6onQjynO9JT73ArCYiYPvSrwYXepH/UY/WdKDY8JPWJl72sAE4iGMHPeQ5xdEWg==} + + '@next/swc-darwin-arm64@15.0.4': + resolution: {integrity: sha512-QecQXPD0yRHxSXWL5Ff80nD+A56sUXZG9koUsjWJwA2Z0ZgVQfuy7gd0/otjxoOovPVHR2eVEvPMHbtZP+pf9w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.0.4': + resolution: {integrity: sha512-pb7Bye3y1Og3PlCtnz2oO4z+/b3pH2/HSYkLbL0hbVuTGil7fPen8/3pyyLjdiTLcFJ+ymeU3bck5hd4IPFFCA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.0.4': + resolution: {integrity: sha512-12oSaBFjGpB227VHzoXF3gJoK2SlVGmFJMaBJSu5rbpaoT5OjP5OuCLuR9/jnyBF1BAWMs/boa6mLMoJPRriMA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.0.4': + resolution: {integrity: sha512-QARO88fR/a+wg+OFC3dGytJVVviiYFEyjc/Zzkjn/HevUuJ7qGUUAUYy5PGVWY1YgTzeRYz78akQrVQ8r+sMjw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.0.4': + resolution: {integrity: sha512-Z50b0gvYiUU1vLzfAMiChV8Y+6u/T2mdfpXPHraqpypP7yIT2UV9YBBhcwYkxujmCvGEcRTVWOj3EP7XW/wUnw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.0.4': + resolution: {integrity: sha512-7H9C4FAsrTAbA/ENzvFWsVytqRYhaJYKa2B3fyQcv96TkOGVMcvyS6s+sj4jZlacxxTcn7ygaMXUPkEk7b78zw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@15.0.4': + resolution: {integrity: sha512-Z/v3WV5xRaeWlgJzN9r4PydWD8sXV35ywc28W63i37G2jnUgScA4OOgS8hQdiXLxE3gqfSuHTicUhr7931OXPQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.0.4': + resolution: {integrity: sha512-NGLchGruagh8lQpDr98bHLyWJXOBSmkEAfK980OiNBa7vNm6PsNoPvzTfstT78WyOeMRQphEQ455rggd7Eo+Dw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@noble/ed25519@1.6.0': resolution: {integrity: sha512-UKju89WV37IUALIMfKhKW3psO8AqmrE/GvH6QbPKjzolQ98zM7WmGUeY+xdIgSf5tqPFf75ZCYMgym6E9Jsw3Q==} @@ -2012,6 +2353,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + '@octokit/auth-token@4.0.0': resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} engines: {node: '>= 18'} @@ -2513,8 +2858,35 @@ packages: '@types/babel__core': optional: true - '@rollup/plugin-node-resolve@15.3.0': - resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==} + '@rollup/plugin-commonjs@28.0.2': + resolution: {integrity: sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@15.3.1': + resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@16.0.0': + resolution: {integrity: sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 @@ -2546,8 +2918,8 @@ packages: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} - '@rollup/pluginutils@5.1.3': - resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -2638,6 +3010,9 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@rushstack/eslint-patch@1.10.5': + resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} + '@rushstack/node-core-library@5.10.0': resolution: {integrity: sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw==} peerDependencies: @@ -2684,6 +3059,25 @@ packages: peerDependencies: '@sveltejs/kit': ^2.0.0 + '@sveltejs/adapter-auto@3.3.1': + resolution: {integrity: sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==} + peerDependencies: + '@sveltejs/kit': ^2.0.0 + + '@sveltejs/adapter-node@5.2.12': + resolution: {integrity: sha512-0bp4Yb3jKIEcZWVcJC/L1xXp9zzJS4hDwfb4VITAkfT4OVdkspSHsx7YhqJDbb2hgLl6R9Vs7VQR+fqIVOxPUQ==} + peerDependencies: + '@sveltejs/kit': ^2.4.0 + + '@sveltejs/kit@2.17.3': + resolution: {integrity: sha512-GcNaPDr0ti4O/TonPewkML2DG7UVXkSxPN3nPMlpmx0Rs4b2kVP4gymz98WEHlfzPXdd4uOOT1Js26DtieTNBQ==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.3 || ^6.0.0 + '@sveltejs/kit@2.7.2': resolution: {integrity: sha512-bFwrl+0bNr0/DHQZM0INwwSPNYqDjfsKRhUoa6rj9d8tDZzszBrJ3La6/HVFxWGONEigtG+SzHXa1BEa1BLdwA==} engines: {node: '>=18.13'} @@ -2787,13 +3181,34 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/types@0.1.13': - resolution: {integrity: sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==} + '@swc/helpers@0.5.13': + resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} + + '@swc/types@0.1.17': + resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@t3-oss/env-core@0.11.1': + resolution: {integrity: sha512-MaxOwEoG1ntCFoKJsS7nqwgcxLW1SJw238AJwfJeaz3P/8GtkxXZsPPolsz1AdYvUTbe3XvqZ/VCdfjt+3zmKw==} + peerDependencies: + typescript: '>=5.0.0' + zod: ^3.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@t3-oss/env-nextjs@0.11.1': + resolution: {integrity: sha512-rx2XL9+v6wtOqLNJbD5eD8OezKlQD1BtC0WvvtHwBgK66jnF5+wGqtgkKK4Ygie1LVmoDClths2T4tdFmRvGrQ==} + peerDependencies: + typescript: '>=5.0.0' + zod: ^3.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@tanstack/history@1.95.0': resolution: {integrity: sha512-w1/yWuIBqmG0Z0MPMf1OuOCce7FXyVH4L4dIA4rvpnjIUCH8qRUgloFAVg37nTMUbOmhMsY2NZDxCpKBv+CLJg==} engines: {node: '>=12'} @@ -2984,6 +3399,21 @@ packages: '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + '@tomic/cli@0.39.0': + resolution: {integrity: sha512-A0zH830nMywkBvGjVm6ZUuvTJLDtFR3MuZ9Sx//BNzM1bs3Ckn++Nt509ohUkRaFPem/XBwstC9p0Q1+SRaeIQ==} + hasBin: true + peerDependencies: + '@tomic/lib': 0.39.0 + + '@tomic/lib@0.40.0': + resolution: {integrity: sha512-Js8e6EEAnC0zKmk7OuHWv+fkA+2i8C/H2HI8IARD8HPBHO1t4cwnuMsNhVQght3i5d/CSdYysvg44DAiGFGgbQ==} + + '@tomic/svelte@0.40.0': + resolution: {integrity: sha512-x8RZM2TUxuoB8rYxU3ZEHLU5XNHPEbNxCG/OqAFRXdQGZkZwfcR1pDJfD7pK94X+xwSl18W2yfv+TQTn+alIgw==} + peerDependencies: + '@tomic/lib': 0.40.0 + svelte: ^4.0.0 + '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -3175,6 +3605,9 @@ packages: '@types/markdown-it@14.1.2': resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/marked@5.0.2': + resolution: {integrity: sha512-OucS4KMHhFzhz27KxmWg7J+kIYqyqoW5kdIEI319hqARQQUTqhao3M/F+uFnDXD0Rg72iDDZxZNxq5gvctmLlg==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -3496,6 +3929,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -3668,6 +4106,10 @@ packages: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -3714,6 +4156,10 @@ packages: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + arrify@3.0.0: resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} engines: {node: '>=12'} @@ -3736,6 +4182,10 @@ packages: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} @@ -3784,18 +4234,18 @@ packages: b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} - babel-plugin-polyfill-corejs2@0.4.11: - resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + babel-plugin-polyfill-corejs2@0.4.12: + resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.10.6: - resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + babel-plugin-polyfill-corejs3@0.11.1: + resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.2: - resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + babel-plugin-polyfill-regenerator@0.6.3: + resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -3804,8 +4254,8 @@ packages: peerDependencies: prismjs: ^1.18.0 - babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206: - resolution: {integrity: sha512-nnkrHpeDKM8A5laq9tmFvvGbbDQ7laGfQLp50cvCkCXmWrPcZdCtaQpNh8UJS/yLREJnv2R4JDL5ADfxyAn+yQ==} + babel-plugin-react-compiler@19.0.0-beta-21e868a-20250216: + resolution: {integrity: sha512-WDOBsm9t9P0RADm8CSlav5OqWvs+3mZFvrBo/qf3vuNtdz78OG5TFxOy7De8ePR3rA6qg1Qmcjjae6nR1pOpCA==} babel-plugin-styled-components@2.1.4: resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} @@ -3903,6 +4353,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -3935,6 +4390,10 @@ packages: peerDependencies: esbuild: '>=0.18' + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + byline@5.0.0: resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} engines: {node: '>=0.10.0'} @@ -3959,10 +4418,22 @@ packages: resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} engines: {node: '>=6'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + callsite@1.0.0: resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} @@ -3985,8 +4456,8 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001669: - resolution: {integrity: sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==} + caniuse-lite@1.0.30001700: + resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} canvas@2.11.2: resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} @@ -4122,6 +4593,9 @@ packages: cli-width@2.2.1: resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + clipboardy@4.0.0: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} @@ -4291,8 +4765,8 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - core-js-compat@3.38.1: - resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} + core-js-compat@3.40.0: + resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -4436,14 +4910,26 @@ packages: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + data-view-byte-length@1.0.1: resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} engines: {node: '>= 0.4'} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.0: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + date-time@3.1.0: resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} engines: {node: '>=6'} @@ -4473,6 +4959,15 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decache@4.6.2: resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} @@ -4660,6 +5155,10 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -4674,6 +5173,9 @@ packages: engines: {node: '>=0.10.0'} hasBin: true + electron-to-chromium@1.5.102: + resolution: {integrity: sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==} + electron-to-chromium@1.5.45: resolution: {integrity: sha512-vOzZS6uZwhhbkZbcRyiy99Wg+pYFV5hk+5YaECvx0+Z31NR3Tt5zS6dze2OepT6PCTzVzT0dIJItti+uAW5zmw==} @@ -4709,6 +5211,10 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -4743,10 +5249,18 @@ packages: resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -4762,10 +5276,18 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} @@ -4773,6 +5295,10 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} @@ -4833,6 +5359,15 @@ packages: peerDependencies: eslint: '>=6.0.0' + eslint-config-next@15.0.2: + resolution: {integrity: sha512-N8o6cyUXzlMmQbdc2Kc83g1qomFi3ITqrAZfubipVKET2uR2mCStyGRcx/r8WiAIVMul2KfwRiCHBkTpBvGBmA==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + eslint-config-prettier@9.1.0: resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true @@ -4842,6 +5377,19 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-typescript@3.8.3: + resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + eslint-module-utils@2.12.0: resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} @@ -4905,6 +5453,12 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint-plugin-react-hooks@5.1.0: + resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + eslint-plugin-react@7.37.2: resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} engines: {node: '>=4'} @@ -4956,6 +5510,9 @@ packages: esm-env@1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + espree@10.2.0: resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5054,6 +5611,10 @@ packages: resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} engines: {node: '>=4'} + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -5084,6 +5645,10 @@ packages: fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -5137,6 +5702,14 @@ packages: picomatch: optional: true + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -5289,6 +5862,10 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} @@ -5358,6 +5935,10 @@ packages: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -5390,6 +5971,10 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} @@ -5412,6 +5997,10 @@ packages: resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} @@ -5428,9 +6017,16 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + get-them-args@1.3.2: resolution: {integrity: sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==} + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} @@ -5533,6 +6129,10 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + got@12.6.1: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} engines: {node: '>=14.16'} @@ -5546,12 +6146,20 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + h3@1.13.0: resolution: {integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==} has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -5571,10 +6179,18 @@ packages: resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} @@ -5594,6 +6210,12 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + hast-util-to-jsx-runtime@2.3.2: resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} @@ -5627,6 +6249,9 @@ packages: html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -5770,6 +6395,10 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -5794,6 +6423,10 @@ packages: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -5804,9 +6437,17 @@ packages: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -5815,10 +6456,17 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} + is-bun-module@1.3.0: + resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -5827,14 +6475,26 @@ packages: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + is-data-view@1.0.1: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} engines: {node: '>= 0.4'} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -5848,6 +6508,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -5855,6 +6519,10 @@ packages: is-finalizationregistry@1.0.2: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} @@ -5875,6 +6543,10 @@ packages: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -5919,6 +6591,10 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -5955,6 +6631,9 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} @@ -5962,6 +6641,10 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + is-regexp@1.0.0: resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} engines: {node: '>=0.10.0'} @@ -5974,6 +6657,10 @@ packages: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -5990,14 +6677,26 @@ packages: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -6027,6 +6726,10 @@ packages: is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + is-weakset@2.0.3: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} @@ -6097,6 +6800,10 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -6106,6 +6813,11 @@ packages: engines: {node: '>=6'} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -6443,11 +7155,20 @@ packages: engines: {node: '>= 12'} hasBin: true + marked@5.1.2: + resolution: {integrity: sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==} + engines: {node: '>= 16'} + hasBin: true + marked@9.1.6: resolution: {integrity: sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==} engines: {node: '>= 16'} hasBin: true + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + maxstache-stream@1.0.4: resolution: {integrity: sha512-v8qlfPN0pSp7bdSoLo1NTjG43GXGqk5W2NWFnOCq2GlmFFqebGzPCjLKSbShuqIOVorOtZSAy7O/S1OCCRONUw==} @@ -6744,6 +7465,9 @@ packages: mlly@1.7.2: resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==} + modern-css-reset@1.4.0: + resolution: {integrity: sha512-0crZmSFmrxkI7159rvQWjpDhy0u4+Awg/iOycJdlVn0RSeft/a+6BrQHR3IqvmdK25sqt0o6Z5Ap7cWgUee2rw==} + module-definition@5.0.1: resolution: {integrity: sha512-kvw3B4G19IXk+BOXnYq/D/VeO9qfHaapMeuS7w7sNUqmGaA6hywdFHMi+VWeR9wUScXM7XjoryTffCZ5B0/8IA==} engines: {node: '>=14'} @@ -6821,6 +7545,27 @@ packages: resolution: {integrity: sha512-PLw+IskyiY+GZNvheR0JgBXIuwebKowY/JU1QBArnXT5Tza1cFbSRr2LJVdiAJCvtbYY73CapfJeSMp36nRjjQ==} engines: {node: ^14.16.0 || >=16.0.0} + next@15.0.4: + resolution: {integrity: sha512-nuy8FH6M1FG0lktGotamQDCXhh5hZ19Vo0ht1AOIQWrYJLP598TIUagKtvJrfJ5AGwB/WmDqkKaKhMpVifvGPA==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -6869,6 +7614,9 @@ packages: node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-source-walk@6.0.2: resolution: {integrity: sha512-jn9vOIK/nfqoFCcpK89/VCVaLg1IHE6UVfDOzvqmANaJ/rWCTEdH8RZ1V278nv2jr36BJdyQXIAavBLXpzdlag==} engines: {node: '>=14'} @@ -6946,6 +7694,10 @@ packages: resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -6954,6 +7706,10 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + object.entries@1.1.8: resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} @@ -7036,6 +7792,10 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} @@ -7323,6 +8083,10 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + postcss-load-config@3.1.4: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} @@ -7378,6 +8142,10 @@ packages: peerDependencies: postcss: ^8.2.9 + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.4.38: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} @@ -7478,6 +8246,9 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + property-information@7.0.0: + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + prosemirror-changeset@2.2.1: resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} @@ -7794,6 +8565,10 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + reflect.getprototypeof@1.0.6: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} @@ -7815,8 +8590,12 @@ packages: resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} - regexpu-core@6.1.1: - resolution: {integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} engines: {node: '>=4'} registry-auth-token@5.0.2: @@ -7830,13 +8609,16 @@ packages: regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.11.1: - resolution: {integrity: sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==} + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true remark-gfm@4.0.0: resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + remark-html@16.0.1: + resolution: {integrity: sha512-B9JqA5i0qZe0Nsf49q3OXyGvyXuZFDzAP2iOFLEumymuYJITVpiH1IgsTEwTpdptDmZlMDMWeDmSawdaJIGCXQ==} + remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} @@ -7846,6 +8628,9 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} @@ -7881,6 +8666,11 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -7965,6 +8755,10 @@ packages: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -7974,10 +8768,18 @@ packages: safe-json-stringify@1.2.0: resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + safe-regex2@3.1.0: resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} @@ -7994,6 +8796,10 @@ packages: scheduler@0.25.0: resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} @@ -8043,6 +8849,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -8053,6 +8863,10 @@ packages: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -8071,10 +8885,26 @@ packages: shiki@0.14.7: resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -8195,6 +9025,9 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + stack-generator@2.0.10: resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} @@ -8222,6 +9055,10 @@ packages: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + streamx@2.20.1: resolution: {integrity: sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==} @@ -8261,9 +9098,17 @@ packages: resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} engines: {node: '>= 0.4'} + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} @@ -8271,6 +9116,10 @@ packages: string.prototype.trimend@1.0.8: resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} @@ -8307,6 +9156,10 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -8363,6 +9216,19 @@ packages: react: '>= 16.8.0' react-dom: '>= 16.8.0' + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + stylis@4.3.0: resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==} @@ -8408,6 +9274,14 @@ packages: peerDependencies: svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 + svelte-check@4.1.4: + resolution: {integrity: sha512-v0j7yLbT29MezzaQJPEDwksybTE2Ups9rUxEXy92T06TiA0cbqcO8wAOwNUVkFW6B0hsYHA+oAX3BS8b/2oHtw==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' + svelte-eslint-parser@0.43.0: resolution: {integrity: sha512-GpU52uPKKcVnh8tKN5P4UZpJ/fUDndmq7wfsvoVXsyP+aY0anol7Yqo01fyrlaWGMFfm4av5DyrjlaXdLRJvGA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8417,6 +9291,11 @@ packages: svelte: optional: true + svelte-markdown@0.4.1: + resolution: {integrity: sha512-pOlLY6EruKJaWI9my/2bKX8PdTeP5CM0s4VMmwmC2prlOkjAf+AOmTM4wW/l19Y6WZ87YmP8+ZCJCCwBChWjYw==} + peerDependencies: + svelte: ^4.0.0 + svelte-preprocess@5.1.4: resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==} engines: {node: '>= 16.0.0'} @@ -8480,6 +9359,10 @@ packages: tabtab@3.0.2: resolution: {integrity: sha512-jANKmUe0sIQc/zTALTBy186PoM/k6aPrh3A7p6AaAfF6WPSbTx1JYeGIGH162btpH+mmVEXln+UxwViZHO2Jhg==} + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} @@ -8517,8 +9400,8 @@ packages: resolution: {integrity: sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==} engines: {node: '>=12'} - terser@5.36.0: - resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==} + terser@5.39.0: + resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} engines: {node: '>=10'} hasBin: true @@ -8577,6 +9460,10 @@ packages: tinyexec@0.3.1: resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + tinyglobby@0.2.9: resolution: {integrity: sha512-8or1+BGEdk1Zkkw2ii16qSS7uVrQJPre5A9o/XkWPATkk23FZh/15BKFxPnlTy6vkljZxLqYCzzBMj30ZrSvjw==} engines: {node: '>=12.0.0'} @@ -8773,18 +9660,34 @@ packages: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + typed-array-length@1.0.6: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -8848,6 +9751,10 @@ packages: unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} @@ -8995,6 +9902,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + update-notifier@7.3.1: resolution: {integrity: sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==} engines: {node: '>=18'} @@ -9206,10 +10119,18 @@ packages: which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + which-builtin-type@1.1.4: resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} engines: {node: '>= 0.4'} + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} @@ -9218,6 +10139,10 @@ packages: resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -9492,6 +10417,8 @@ snapshots: '@babel/compat-data@7.25.9': {} + '@babel/compat-data@7.26.8': {} + '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 @@ -9505,7 +10432,7 @@ snapshots: '@babel/traverse': 7.25.9 '@babel/types': 7.26.3 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -9520,16 +10447,17 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 - '@babel/helper-annotate-as-pure@7.25.9': + '@babel/generator@7.26.9': dependencies: - '@babel/types': 7.26.3 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 - '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': + '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/traverse': 7.25.9 '@babel/types': 7.26.3 - transitivePeerDependencies: - - supports-color '@babel/helper-compilation-targets@7.25.9': dependencies: @@ -9539,6 +10467,14 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@7.26.5': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -9552,28 +10488,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0)': + '@babel/helper-create-class-features-plugin@7.26.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-annotate-as-pure': 7.25.9 - regexpu-core: 6.1.1 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.26.9 semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.26.0)': + '@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 - debug: 4.3.7(supports-color@9.4.0) + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.2.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + debug: 4.4.0(supports-color@9.4.0) lodash.debounce: 4.0.8 - resolve: 1.22.8 + resolve: 1.22.10 transitivePeerDependencies: - supports-color '@babel/helper-member-expression-to-functions@7.25.9': dependencies: '@babel/traverse': 7.25.9 - '@babel/types': 7.26.3 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color @@ -9595,16 +10544,18 @@ snapshots: '@babel/helper-optimise-call-expression@7.25.9': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.9 '@babel/helper-plugin-utils@7.25.9': {} + '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color @@ -9617,17 +10568,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-simple-access@7.25.9': + '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.0)': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.3 + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: '@babel/traverse': 7.25.9 - '@babel/types': 7.26.3 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color @@ -9639,9 +10592,9 @@ snapshots: '@babel/helper-wrap-function@7.25.9': dependencies: - '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.3 + '@babel/template': 7.26.9 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color @@ -9652,34 +10605,38 @@ snapshots: '@babel/parser@7.25.9': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.9 '@babel/parser@7.26.3': dependencies: '@babel/types': 7.26.3 + '@babel/parser@7.26.9': + dependencies: + '@babel/types': 7.26.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: @@ -9688,8 +10645,8 @@ snapshots: '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color @@ -9705,15 +10662,15 @@ snapshots: dependencies: '@babel/core': 7.26.0 - '@babel/plugin-syntax-import-assertions@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-import-attributes@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': dependencies: @@ -9723,20 +10680,20 @@ snapshots: '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color @@ -9744,34 +10701,34 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color @@ -9779,10 +10736,10 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) - '@babel/traverse': 7.25.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.0) + '@babel/traverse': 7.26.9 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -9790,53 +10747,50 @@ snapshots: '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/template': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/template': 7.26.9 '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 - transitivePeerDependencies: - - supports-color + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color @@ -9844,46 +10798,45 @@ snapshots: '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-simple-access': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color @@ -9891,9 +10844,9 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.9 transitivePeerDependencies: - supports-color @@ -9901,55 +10854,55 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.0) transitivePeerDependencies: - supports-color '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color @@ -9957,13 +10910,13 @@ snapshots: '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color @@ -9971,15 +10924,15 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': dependencies: @@ -9994,23 +10947,29 @@ snapshots: '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 regenerator-transform: 0.15.2 + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color @@ -10018,47 +10977,47 @@ snapshots: '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-typeof-symbol@7.26.7(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.26.5 - '@babel/preset-env@7.25.9(@babel/core@7.26.0)': + '@babel/preset-env@7.26.9(@babel/core@7.26.0)': dependencies: - '@babel/compat-data': 7.25.9 + '@babel/compat-data': 7.26.8 '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-validator-option': 7.25.9 '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0) '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) @@ -10066,16 +11025,16 @@ snapshots: '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0) '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0) '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) - '@babel/plugin-syntax-import-assertions': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-syntax-import-attributes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0) '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.0) '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.0) '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-class-static-block': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0) '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) @@ -10083,21 +11042,21 @@ snapshots: '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.0) '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.0) '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.0) '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) @@ -10108,21 +11067,22 @@ snapshots: '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0) '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.0) + '@babel/plugin-transform-typeof-symbol': 7.26.7(@babel/core@7.26.0) '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.0) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.26.0) - core-js-compat: 3.38.1 + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.40.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -10130,20 +11090,30 @@ snapshots: '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/types': 7.26.3 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/types': 7.26.9 esutils: 2.0.3 '@babel/runtime@7.25.9': dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.26.9': + dependencies: + regenerator-runtime: 0.14.1 + '@babel/template@7.25.9': dependencies: '@babel/code-frame': 7.26.2 '@babel/parser': 7.26.3 '@babel/types': 7.26.3 + '@babel/template@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@babel/traverse@7.25.9': dependencies: '@babel/code-frame': 7.26.2 @@ -10151,7 +11121,19 @@ snapshots: '@babel/parser': 7.26.3 '@babel/template': 7.25.9 '@babel/types': 7.26.3 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.26.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + debug: 4.4.0(supports-color@9.4.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -10172,6 +11154,11 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@babel/types@7.26.9': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@bugsnag/browser@7.25.0': dependencies: '@bugsnag/core': 7.25.0 @@ -10257,6 +11244,11 @@ snapshots: react: 19.0.0 tslib: 2.8.0 + '@emnapi/runtime@1.3.1': + dependencies: + tslib: 2.8.0 + optional: true + '@emoji-mart/react@1.1.1(emoji-mart@5.6.0)(react@19.0.0)': dependencies: emoji-mart: 5.6.0 @@ -10570,7 +11562,7 @@ snapshots: '@eslint/config-array@0.18.0': dependencies: '@eslint/object-schema': 2.1.4 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10580,7 +11572,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -10594,7 +11586,7 @@ snapshots: '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 espree: 10.2.0 globals: 14.0.0 ignore: 5.3.2 @@ -10677,7 +11669,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10692,6 +11684,81 @@ snapshots: '@iarna/toml@2.2.5': {} + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.3.1 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + '@import-maps/resolve@1.0.1': {} '@isaacs/cliui@8.0.2': @@ -10717,13 +11784,19 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/sourcemap-codec@1.5.0': {} @@ -11125,6 +12198,36 @@ snapshots: - encoding - supports-color + '@next/env@15.0.4': {} + + '@next/eslint-plugin-next@15.0.2': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@15.0.4': + optional: true + + '@next/swc-darwin-x64@15.0.4': + optional: true + + '@next/swc-linux-arm64-gnu@15.0.4': + optional: true + + '@next/swc-linux-arm64-musl@15.0.4': + optional: true + + '@next/swc-linux-x64-gnu@15.0.4': + optional: true + + '@next/swc-linux-x64-musl@15.0.4': + optional: true + + '@next/swc-win32-arm64-msvc@15.0.4': + optional: true + + '@next/swc-win32-x64-msvc@15.0.4': + optional: true + '@noble/ed25519@1.6.0': {} '@noble/hashes@0.5.9': {} @@ -11141,6 +12244,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@nolyfill/is-core-module@1.0.39': {} + '@octokit/auth-token@4.0.0': {} '@octokit/core@5.2.0': @@ -11638,16 +12743,44 @@ snapshots: transitivePeerDependencies: - supports-color - '@rollup/plugin-node-resolve@15.3.0(rollup@2.79.2)': + '@rollup/plugin-commonjs@28.0.2(rollup@4.24.0)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.24.0) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.4.2(picomatch@4.0.2) + is-reference: 1.2.1 + magic-string: 0.30.12 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.24.0 + + '@rollup/plugin-json@6.1.0(rollup@4.24.0)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@2.79.2) + '@rollup/pluginutils': 5.1.4(rollup@4.24.0) + optionalDependencies: + rollup: 4.24.0 + + '@rollup/plugin-node-resolve@15.3.1(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@2.79.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.8 + resolve: 1.22.10 optionalDependencies: rollup: 2.79.2 + '@rollup/plugin-node-resolve@16.0.0(rollup@4.24.0)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.24.0) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.10 + optionalDependencies: + rollup: 4.24.0 + '@rollup/plugin-replace@2.4.2(rollup@2.79.2)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@2.79.2) @@ -11658,7 +12791,7 @@ snapshots: dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 - terser: 5.36.0 + terser: 5.39.0 optionalDependencies: rollup: 2.79.2 @@ -11674,7 +12807,7 @@ snapshots: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/pluginutils@5.1.3(rollup@2.79.2)': + '@rollup/pluginutils@5.1.4(rollup@2.79.2)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 @@ -11682,6 +12815,14 @@ snapshots: optionalDependencies: rollup: 2.79.2 + '@rollup/pluginutils@5.1.4(rollup@4.24.0)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.24.0 + '@rollup/rollup-android-arm-eabi@4.24.0': optional: true @@ -11732,6 +12873,8 @@ snapshots: '@rtsao/scc@1.1.0': {} + '@rushstack/eslint-patch@1.10.5': {} + '@rushstack/node-core-library@5.10.0(@types/node@20.17.0)': dependencies: ajv: 8.13.0 @@ -11784,16 +12927,46 @@ snapshots: ejs: 3.1.10 json5: 2.2.3 magic-string: 0.25.9 - string.prototype.matchall: 4.0.11 + string.prototype.matchall: 4.0.12 + + '@sveltejs/adapter-auto@3.3.0(@sveltejs/kit@2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))': + dependencies: + '@sveltejs/kit': 2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) + import-meta-resolve: 4.1.0 - '@sveltejs/adapter-auto@3.3.0(@sveltejs/kit@2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)))': + '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))': dependencies: - '@sveltejs/kit': 2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)) + '@sveltejs/kit': 2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) + import-meta-resolve: 4.1.0 + + '@sveltejs/adapter-node@5.2.12(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))': + dependencies: + '@rollup/plugin-commonjs': 28.0.2(rollup@4.24.0) + '@rollup/plugin-json': 6.1.0(rollup@4.24.0) + '@rollup/plugin-node-resolve': 16.0.0(rollup@4.24.0) + '@sveltejs/kit': 2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) + rollup: 4.24.0 + + '@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))': + dependencies: + '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) + '@types/cookie': 0.6.0 + cookie: 0.6.0 + devalue: 5.1.1 + esm-env: 1.2.2 import-meta-resolve: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.12 + mrmime: 2.0.0 + sade: 1.8.1 + set-cookie-parser: 2.7.1 + sirv: 3.0.0 + svelte: 5.1.4 + vite: 5.4.10(@types/node@20.17.0)(terser@5.39.0) - '@sveltejs/kit@2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0))': + '@sveltejs/kit@2.7.2(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)) + '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.1.1 @@ -11807,7 +12980,7 @@ snapshots: sirv: 3.0.0 svelte: 5.1.4 tiny-glob: 0.2.9 - vite: 5.4.10(@types/node@20.17.0)(terser@5.36.0) + vite: 5.4.10(@types/node@20.17.0)(terser@5.39.0) '@sveltejs/package@2.3.6(svelte@5.1.4)(typescript@5.6.3)': dependencies: @@ -11820,25 +12993,25 @@ snapshots: transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0))': + '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)) - debug: 4.3.7(supports-color@9.4.0) + '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) + debug: 4.3.7 svelte: 5.1.4 - vite: 5.4.10(@types/node@20.17.0)(terser@5.36.0) + vite: 5.4.10(@types/node@20.17.0)(terser@5.39.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0))': + '@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)) - debug: 4.3.7(supports-color@9.4.0) + '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)))(svelte@5.1.4)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) + debug: 4.3.7 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.12 svelte: 5.1.4 - vite: 5.4.10(@types/node@20.17.0)(terser@5.36.0) - vitefu: 1.0.3(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)) + vite: 5.4.10(@types/node@20.17.0)(terser@5.39.0) + vitefu: 1.0.3(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) transitivePeerDependencies: - supports-color @@ -11875,7 +13048,7 @@ snapshots: '@swc/core@1.7.39': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.13 + '@swc/types': 0.1.17 optionalDependencies: '@swc/core-darwin-arm64': 1.7.39 '@swc/core-darwin-x64': 1.7.39 @@ -11889,10 +13062,13 @@ snapshots: '@swc/core-win32-x64-msvc': 1.7.39 optional: true - '@swc/counter@0.1.3': - optional: true + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.13': + dependencies: + tslib: 2.8.0 - '@swc/types@0.1.13': + '@swc/types@0.1.17': dependencies: '@swc/counter': 0.1.3 optional: true @@ -11901,6 +13077,19 @@ snapshots: dependencies: defer-to-connect: 2.0.1 + '@t3-oss/env-core@0.11.1(typescript@5.6.3)(zod@3.23.8)': + dependencies: + zod: 3.23.8 + optionalDependencies: + typescript: 5.6.3 + + '@t3-oss/env-nextjs@0.11.1(typescript@5.6.3)(zod@3.23.8)': + dependencies: + '@t3-oss/env-core': 0.11.1(typescript@5.6.3)(zod@3.23.8) + zod: 3.23.8 + optionalDependencies: + typescript: 5.6.3 + '@tanstack/history@1.95.0': {} '@tanstack/react-router@1.95.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': @@ -12112,6 +13301,25 @@ snapshots: '@tokenizer/token@0.3.0': {} + '@tomic/cli@0.39.0(@tomic/lib@0.40.0)': + dependencies: + '@tomic/lib': 0.40.0 + chalk: 5.3.0 + prettier: 3.0.3 + + '@tomic/lib@0.40.0': + dependencies: + '@noble/ed25519': 1.6.0 + '@noble/hashes': 0.5.9 + base64-arraybuffer: 1.0.2 + fast-json-stable-stringify: 2.1.0 + ulidx: 2.4.1 + + '@tomic/svelte@0.40.0(@tomic/lib@0.40.0)(svelte@5.1.4)': + dependencies: + '@tomic/lib': 0.40.0 + svelte: 5.1.4 + '@trysound/sax@0.2.0': {} '@tsconfig/node10@1.0.11': {} @@ -12134,16 +13342,16 @@ snapshots: '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.25.9 '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/types': 7.25.9 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.25.9 '@types/cookie@0.6.0': {} @@ -12332,6 +13540,8 @@ snapshots: '@types/linkify-it': 5.0.0 '@types/mdurl': 2.0.0 + '@types/marked@5.0.2': {} + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -12432,6 +13642,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': + dependencies: + '@eslint-community/regexpp': 4.11.1 + '@typescript-eslint/parser': 7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 9.13.0(jiti@2.3.3) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.11.1 @@ -12456,20 +13684,33 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 eslint: 8.57.1 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.7 + eslint: 9.13.0(jiti@2.3.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.11.0 '@typescript-eslint/types': 8.11.0 '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.11.0 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 eslint: 9.13.0(jiti@2.3.3) optionalDependencies: typescript: 5.6.3 @@ -12490,7 +13731,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.6.3) - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 eslint: 8.57.1 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: @@ -12498,11 +13739,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + debug: 4.3.7 + eslint: 9.13.0(jiti@2.3.3) + ts-api-utils: 1.3.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/type-utils@8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.3) '@typescript-eslint/utils': 8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -12520,7 +13773,7 @@ snapshots: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.4.0(supports-color@9.4.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 @@ -12534,7 +13787,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -12549,7 +13802,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.11.0 '@typescript-eslint/visitor-keys': 8.11.0 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -12571,6 +13824,17 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@2.3.3)) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/utils@8.11.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@2.3.3)) @@ -12617,14 +13881,14 @@ snapshots: - encoding - supports-color - '@vitejs/plugin-react@4.3.4(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0))': + '@vitejs/plugin-react@4.3.4(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.10(@types/node@20.17.0)(terser@5.36.0) + vite: 5.4.10(@types/node@20.17.0)(terser@5.39.0) transitivePeerDependencies: - supports-color @@ -12635,13 +13899,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.3(@vitest/spy@2.1.3)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0))': + '@vitest/mocker@2.1.3(@vitest/spy@2.1.3)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))': dependencies: '@vitest/spy': 2.1.3 estree-walker: 3.0.3 magic-string: 0.30.12 optionalDependencies: - vite: 5.4.10(@types/node@20.17.0)(terser@5.36.0) + vite: 5.4.10(@types/node@20.17.0)(terser@5.39.0) '@vitest/pretty-format@2.1.3': dependencies: @@ -12752,15 +14016,17 @@ snapshots: acorn@8.13.0: {} + acorn@8.14.0: {} + agent-base@6.0.2(supports-color@9.4.0): dependencies: - debug: 4.3.7(supports-color@9.4.0) + debug: 4.4.0(supports-color@9.4.0) transitivePeerDependencies: - supports-color agent-base@7.1.1: dependencies: - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -12934,6 +14200,11 @@ snapshots: call-bind: 1.0.7 is-array-buffer: 3.0.4 + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + is-array-buffer: 3.0.5 + array-flatten@1.1.1: {} array-includes@3.1.8: @@ -13006,6 +14277,16 @@ snapshots: is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + is-array-buffer: 3.0.5 + arrify@3.0.0: {} ascii-table@0.0.9: {} @@ -13018,6 +14299,8 @@ snapshots: astral-regex@2.0.0: {} + async-function@1.0.0: {} + async-sema@3.1.1: {} async@1.5.2: {} @@ -13060,27 +14343,27 @@ snapshots: b4a@1.6.7: {} - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.26.0): + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): dependencies: - '@babel/compat-data': 7.25.9 + '@babel/compat-data': 7.26.8 '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.0): dependencies: '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) - core-js-compat: 3.38.1 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.40.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.26.0): + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0): dependencies: '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) transitivePeerDependencies: - supports-color @@ -13088,9 +14371,9 @@ snapshots: dependencies: prismjs: 1.29.0 - babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206: + babel-plugin-react-compiler@19.0.0-beta-21e868a-20250216: dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.9 babel-plugin-styled-components@2.1.4(@babel/core@7.26.0)(styled-components@6.1.13(react-dom@19.0.0(react@19.0.0))(react@19.0.0)): dependencies: @@ -13226,11 +14509,18 @@ snapshots: browserslist@4.24.2: dependencies: - caniuse-lite: 1.0.30001669 + caniuse-lite: 1.0.30001700 electron-to-chromium: 1.5.45 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001700 + electron-to-chromium: 1.5.102 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + buffer-crc32@0.2.13: {} buffer-crc32@1.0.0: {} @@ -13260,6 +14550,10 @@ snapshots: esbuild: 0.24.0 load-tsconfig: 0.2.5 + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + byline@5.0.0: {} bytes@3.1.2: {} @@ -13280,6 +14574,11 @@ snapshots: cachedir@2.4.0: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -13288,6 +14587,18 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.2.7 + callsite@1.0.0: {} callsites@3.1.0: {} @@ -13300,7 +14611,7 @@ snapshots: camelize@1.0.1: {} - caniuse-lite@1.0.30001669: {} + caniuse-lite@1.0.30001700: {} canvas@2.11.2: dependencies: @@ -13442,6 +14753,8 @@ snapshots: cli-width@2.2.1: {} + client-only@0.0.1: {} + clipboardy@4.0.0: dependencies: execa: 8.0.1 @@ -13611,9 +14924,9 @@ snapshots: cookie@0.7.2: {} - core-js-compat@3.38.1: + core-js-compat@3.40.0: dependencies: - browserslist: 4.24.2 + browserslist: 4.24.4 core-util-is@1.0.3: {} @@ -13766,18 +15079,36 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.1 + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + date-time@3.1.0: dependencies: time-zone: 1.0.0 @@ -13790,7 +15121,11 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.7(supports-color@9.4.0): + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.0(supports-color@9.4.0): dependencies: ms: 2.1.3 optionalDependencies: @@ -13964,6 +15299,12 @@ snapshots: dotenv@16.4.5: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + eastasianwidth@0.2.0: {} ecdsa-sig-formatter@1.0.11: @@ -13976,6 +15317,8 @@ snapshots: dependencies: jake: 10.9.2 + electron-to-chromium@1.5.102: {} + electron-to-chromium@1.5.45: {} email-addresses@5.0.0: {} @@ -14000,6 +15343,11 @@ snapshots: dependencies: once: 1.4.0 + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -14072,10 +15420,66 @@ snapshots: unbox-primitive: 1.0.2 which-typed-array: 1.1.15 + es-abstract@1.23.9: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} + es-errors@1.3.0: {} es-iterator-helpers@1.1.0: @@ -14101,12 +15505,23 @@ snapshots: dependencies: es-errors: 1.3.0 + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 @@ -14117,6 +15532,12 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + es6-promise@3.3.1: {} es6-promisify@6.1.1: {} @@ -14251,6 +15672,26 @@ snapshots: eslint: 9.13.0(jiti@2.3.3) semver: 7.6.3 + eslint-config-next@15.0.2(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3): + dependencies: + '@next/eslint-plugin-next': 15.0.2 + '@rushstack/eslint-patch': 1.10.5 + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/parser': 7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-jsx-a11y: 6.10.1(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-react: 7.37.2(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-react-hooks: 5.1.0(eslint@9.13.0(jiti@2.3.3)) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + eslint-config-prettier@9.1.0(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -14267,6 +15708,21 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.0(supports-color@9.4.0) + enhanced-resolve: 5.18.1 + eslint: 9.13.0(jiti@2.3.3) + get-tsconfig: 4.10.0 + is-bun-module: 1.3.0 + stable-hash: 0.0.4 + tinyglobby: 0.2.12 + optionalDependencies: + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.13.0(jiti@2.3.3)) + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 @@ -14277,6 +15733,17 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)))(eslint@9.13.0(jiti@2.3.3)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)) + transitivePeerDependencies: + - supports-color + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 @@ -14306,6 +15773,35 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.13.0(jiti@2.3.3)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.13.0(jiti@2.3.3) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)))(eslint@9.13.0(jiti@2.3.3)) + hasown: 2.0.2 + is-core-module: 2.15.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + string.prototype.trimend: 1.0.8 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + eslint-plugin-jsx-a11y@6.10.1(eslint@8.57.1): dependencies: aria-query: 5.3.2 @@ -14326,6 +15822,26 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.1 + eslint-plugin-jsx-a11y@6.10.1(eslint@9.13.0(jiti@2.3.3)): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.10.2 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.1.0 + eslint: 9.13.0(jiti@2.3.3) + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.0.3 + string.prototype.includes: 2.0.1 + eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.2.5): dependencies: eslint: 8.57.1 @@ -14352,6 +15868,10 @@ snapshots: dependencies: eslint: 8.57.1 + eslint-plugin-react-hooks@5.1.0(eslint@9.13.0(jiti@2.3.3)): + dependencies: + eslint: 9.13.0(jiti@2.3.3) + eslint-plugin-react@7.37.2(eslint@8.57.1): dependencies: array-includes: 3.1.8 @@ -14374,6 +15894,28 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 + eslint-plugin-react@7.37.2(eslint@9.13.0(jiti@2.3.3)): + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.1.0 + eslint: 9.13.0(jiti@2.3.3) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + string.prototype.repeat: 1.0.0 + eslint-plugin-svelte@2.46.0(eslint@9.13.0(jiti@2.3.3))(svelte@5.1.4)(ts-node@10.9.2(@swc/core@1.7.39)(@types/node@20.17.0)(typescript@5.6.3)): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@2.3.3)) @@ -14420,7 +15962,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -14467,7 +16009,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 escape-string-regexp: 4.0.0 eslint-scope: 8.1.0 eslint-visitor-keys: 4.1.0 @@ -14494,6 +16036,8 @@ snapshots: esm-env@1.0.0: {} + esm-env@1.2.2: {} + espree@10.2.0: dependencies: acorn: 8.13.0 @@ -14644,6 +16188,10 @@ snapshots: ext-list: 2.2.2 sort-keys-length: 1.0.1 + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + extend@3.0.2: {} external-editor@3.1.0: @@ -14654,7 +16202,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -14674,6 +16222,14 @@ snapshots: fast-fifo@1.3.2: {} + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -14743,6 +16299,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + fecha@4.2.3: {} fetch-blob@3.2.0: @@ -14906,12 +16466,16 @@ snapshots: follow-redirects@1.15.9(debug@4.3.7): optionalDependencies: - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 for-each@0.3.3: dependencies: is-callable: 1.2.7 + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.3 @@ -14984,6 +16548,15 @@ snapshots: es-abstract: 1.23.3 functions-have-names: 1.2.3 + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + functions-have-names@1.2.3: {} fuzzy@0.1.3: {} @@ -15019,6 +16592,19 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} get-own-enumerable-property-symbols@3.0.2: {} @@ -15031,6 +16617,11 @@ snapshots: get-port@6.1.2: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-stream@5.2.0: dependencies: pump: 3.0.2 @@ -15045,8 +16636,18 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.2.4 + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + get-them-args@1.3.2: {} + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 + get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -15174,6 +16775,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + gopd@1.2.0: {} + got@12.6.1: dependencies: '@sindresorhus/is': 5.6.0 @@ -15194,6 +16797,13 @@ snapshots: graphemer@1.4.0: {} + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + h3@1.13.0: dependencies: cookie-es: 1.2.2 @@ -15209,6 +16819,8 @@ snapshots: has-bigints@1.0.2: {} + has-bigints@1.1.0: {} + has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -15221,8 +16833,14 @@ snapshots: has-proto@1.0.3: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + has-symbols@1.0.3: {} + has-symbols@1.1.0: {} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 @@ -15242,6 +16860,26 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-sanitize@5.0.2: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.0 + unist-util-position: 5.0.0 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + hast-util-to-jsx-runtime@2.3.2: dependencies: '@types/estree': 1.0.6 @@ -15290,6 +16928,8 @@ snapshots: html-url-attributes@3.0.1: {} + html-void-elements@3.0.0: {} + http-cache-semantics@4.1.1: {} http-errors@1.8.1: @@ -15336,14 +16976,14 @@ snapshots: https-proxy-agent@5.0.1(supports-color@9.4.0): dependencies: agent-base: 6.0.2(supports-color@9.4.0) - debug: 4.3.7(supports-color@9.4.0) + debug: 4.4.0(supports-color@9.4.0) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -15438,6 +17078,12 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + invariant@2.2.4: dependencies: loose-envify: 1.4.0 @@ -15491,6 +17137,12 @@ snapshots: call-bind: 1.0.7 get-intrinsic: 1.2.4 + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} @@ -15499,10 +17151,22 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -15512,36 +17176,66 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 + is-bun-module@1.3.0: + dependencies: + semver: 7.6.3 + is-callable@1.2.7: {} is-core-module@2.15.1: dependencies: hasown: 2.0.2 + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-typed-array: 1.1.15 + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-decimal@2.0.1: {} is-docker@2.2.1: {} is-docker@3.0.0: {} + is-extendable@0.1.1: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: dependencies: call-bind: 1.0.7 + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.3 + is-fullwidth-code-point@2.0.0: {} is-fullwidth-code-point@3.0.0: {} @@ -15556,6 +17250,13 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -15587,6 +17288,11 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-number@7.0.0: {} is-obj@1.0.1: {} @@ -15605,6 +17311,10 @@ snapshots: is-plain-obj@4.1.0: {} + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.6 + is-reference@3.0.2: dependencies: '@types/estree': 1.0.6 @@ -15614,6 +17324,13 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + is-regexp@1.0.0: {} is-set@2.0.3: {} @@ -15622,6 +17339,10 @@ snapshots: dependencies: call-bind: 1.0.7 + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.3 + is-stream@2.0.1: {} is-stream@3.0.0: {} @@ -15632,14 +17353,29 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-string@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + is-typedarray@1.0.0: {} is-unicode-supported@0.1.0: {} @@ -15658,6 +17394,10 @@ snapshots: dependencies: call-bind: 1.0.7 + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.3 + is-weakset@2.0.3: dependencies: call-bind: 1.0.7 @@ -15727,12 +17467,19 @@ snapshots: js-tokens@4.0.0: {} + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + js-yaml@4.1.0: dependencies: argparse: 2.0.1 jsesc@3.0.2: {} + jsesc@3.1.0: {} + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -15880,7 +17627,7 @@ snapshots: cli-truncate: 2.1.0 commander: 6.2.1 cosmiconfig: 7.1.0 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 dedent: 0.7.0 enquirer: 2.4.1 execa: 4.1.0 @@ -16105,8 +17852,12 @@ snapshots: marked@4.3.0: {} + marked@5.1.2: {} + marked@9.1.6: {} + math-intrinsics@1.1.0: {} + maxstache-stream@1.0.4: dependencies: maxstache: 1.0.7 @@ -16477,7 +18228,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -16576,6 +18327,8 @@ snapshots: pkg-types: 1.2.1 ufo: 1.5.4 + modern-css-reset@1.4.0: {} + module-definition@5.0.1: dependencies: ast-module-types: 5.0.0 @@ -16657,7 +18410,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cron-parser: 4.9.0 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 decache: 4.6.2 dot-prop: 9.0.0 dotenv: 16.4.5 @@ -16793,6 +18546,33 @@ snapshots: p-wait-for: 4.1.0 qs: 6.13.0 + next@15.0.4(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(@playwright/test@1.50.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + '@next/env': 15.0.4 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.13 + busboy: 1.6.0 + caniuse-lite: 1.0.30001700 + postcss: 8.4.31 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + styled-jsx: 5.1.6(@babel/core@7.26.0)(react@19.0.0) + optionalDependencies: + '@next/swc-darwin-arm64': 15.0.4 + '@next/swc-darwin-x64': 15.0.4 + '@next/swc-linux-arm64-gnu': 15.0.4 + '@next/swc-linux-arm64-musl': 15.0.4 + '@next/swc-linux-x64-gnu': 15.0.4 + '@next/swc-linux-x64-musl': 15.0.4 + '@next/swc-win32-arm64-msvc': 15.0.4 + '@next/swc-win32-x64-msvc': 15.0.4 + '@opentelemetry/api': 1.8.0 + '@playwright/test': 1.50.0 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -16833,6 +18613,8 @@ snapshots: node-releases@2.0.18: {} + node-releases@2.0.19: {} + node-source-walk@6.0.2: dependencies: '@babel/parser': 7.26.3 @@ -16861,7 +18643,7 @@ snapshots: normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.15.1 + is-core-module: 2.16.1 semver: 7.6.3 validate-npm-package-license: 3.0.4 @@ -16915,6 +18697,8 @@ snapshots: object-inspect@1.13.2: {} + object-inspect@1.13.4: {} + object-keys@1.1.1: {} object.assign@4.1.5: @@ -16924,6 +18708,15 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + object.entries@1.1.8: dependencies: call-bind: 1.0.7 @@ -17027,6 +18820,12 @@ snapshots: os-tmpdir@1.0.2: {} + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-cancelable@3.0.0: {} p-event@4.2.0: @@ -17287,6 +19086,8 @@ snapshots: possible-typed-array-names@1.0.0: {} + possible-typed-array-names@1.1.0: {} + postcss-load-config@3.1.4(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.39)(@types/node@20.17.0)(typescript@5.6.3)): dependencies: lilconfig: 2.1.0 @@ -17325,6 +19126,12 @@ snapshots: postcss: 8.4.47 quote-unquote: 1.0.0 + postcss@8.4.31: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.4.38: dependencies: nanoid: 3.3.7 @@ -17434,6 +19241,8 @@ snapshots: property-information@6.5.0: {} + property-information@7.0.0: {} + prosemirror-changeset@2.2.1: dependencies: prosemirror-transform: 1.10.2 @@ -17826,6 +19635,17 @@ snapshots: real-require@0.2.0: {} + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + reflect.getprototypeof@1.0.6: dependencies: call-bind: 1.0.7 @@ -17846,7 +19666,7 @@ snapshots: regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.25.9 + '@babel/runtime': 7.26.9 regexp.prototype.flags@1.5.3: dependencies: @@ -17855,12 +19675,21 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.2 - regexpu-core@6.1.1: + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpu-core@6.2.0: dependencies: regenerate: 1.4.2 regenerate-unicode-properties: 10.2.0 regjsgen: 0.8.0 - regjsparser: 0.11.1 + regjsparser: 0.12.0 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.0 @@ -17874,7 +19703,7 @@ snapshots: regjsgen@0.8.0: {} - regjsparser@0.11.1: + regjsparser@0.12.0: dependencies: jsesc: 3.0.2 @@ -17889,6 +19718,14 @@ snapshots: transitivePeerDependencies: - supports-color + remark-html@16.0.1: + dependencies: + '@types/mdast': 4.0.4 + hast-util-sanitize: 5.0.2 + hast-util-to-html: 9.0.5 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 @@ -17912,6 +19749,15 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + remove-trailing-separator@1.1.0: {} repeat-string@1.6.1: {} @@ -17932,6 +19778,12 @@ snapshots: resolve-pkg-maps@1.0.0: {} + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + resolve@1.22.8: dependencies: is-core-module: 2.15.1 @@ -18032,18 +19884,37 @@ snapshots: has-symbols: 1.0.3 isarray: 2.0.5 + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + has-symbols: 1.1.0 + isarray: 2.0.5 + safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} safe-json-stringify@1.2.0: {} + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + safe-regex2@3.1.0: dependencies: ret: 0.4.3 @@ -18061,6 +19932,11 @@ snapshots: scheduler@0.25.0: {} + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + secure-json-parse@2.7.0: {} seek-bzip@1.0.6: @@ -18128,6 +20004,12 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + setprototypeof@1.2.0: {} shallowequal@1.1.0: {} @@ -18143,6 +20025,33 @@ snapshots: tar-fs: 3.0.6 tunnel-agent: 0.6.0 + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + optional: true + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -18160,6 +20069,26 @@ snapshots: vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -18167,6 +20096,14 @@ snapshots: get-intrinsic: 1.2.4 object-inspect: 1.13.2 + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -18290,6 +20227,8 @@ snapshots: sprintf-js@1.0.3: {} + stable-hash@0.0.4: {} + stack-generator@2.0.10: dependencies: stackframe: 1.3.4 @@ -18308,6 +20247,8 @@ snapshots: stdin-discarder@0.2.2: {} + streamsearch@1.1.0: {} + streamx@2.20.1: dependencies: fast-fifo: 1.3.2 @@ -18366,11 +20307,37 @@ snapshots: set-function-name: 2.0.2 side-channel: 1.0.6 + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 es-abstract: 1.23.3 + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 @@ -18384,6 +20351,13 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 @@ -18427,6 +20401,8 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-bom-string@1.0.0: {} + strip-bom@3.0.0: {} strip-comments@2.0.1: {} @@ -18479,6 +20455,13 @@ snapshots: stylis: 4.3.2 tslib: 2.6.2 + styled-jsx@5.1.6(@babel/core@7.26.0)(react@19.0.0): + dependencies: + client-only: 0.0.1 + react: 19.0.0 + optionalDependencies: + '@babel/core': 7.26.0 + stylis@4.3.0: {} stylis@4.3.2: {} @@ -18539,6 +20522,18 @@ snapshots: - stylus - sugarss + svelte-check@4.1.4(picomatch@4.0.2)(svelte@5.1.4)(typescript@5.6.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + chokidar: 4.0.1 + fdir: 6.4.2(picomatch@4.0.2) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.1.4 + typescript: 5.6.3 + transitivePeerDependencies: + - picomatch + svelte-eslint-parser@0.43.0(svelte@5.1.4): dependencies: eslint-scope: 7.2.2 @@ -18549,6 +20544,12 @@ snapshots: optionalDependencies: svelte: 5.1.4 + svelte-markdown@0.4.1(svelte@5.1.4): + dependencies: + '@types/marked': 5.0.2 + marked: 5.1.2 + svelte: 5.1.4 + svelte-preprocess@5.1.4(@babel/core@7.26.0)(postcss-load-config@3.1.4(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.39)(@types/node@20.17.0)(typescript@5.6.3)))(postcss@8.4.47)(svelte@5.1.4)(typescript@5.6.3): dependencies: '@types/pug': 2.0.10 @@ -18605,7 +20606,7 @@ snapshots: tabtab@3.0.2: dependencies: - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 es6-promisify: 6.1.1 inquirer: 6.5.2 minimist: 1.2.8 @@ -18614,6 +20615,8 @@ snapshots: transitivePeerDependencies: - supports-color + tapable@2.2.1: {} + tar-fs@2.1.1: dependencies: chownr: 1.1.4 @@ -18675,10 +20678,10 @@ snapshots: ansi-escapes: 5.0.0 supports-hyperlinks: 2.3.0 - terser@5.36.0: + terser@5.39.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.13.0 + acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -18734,6 +20737,11 @@ snapshots: tinyexec@0.3.1: {} + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + tinyglobby@0.2.9: dependencies: fdir: 6.4.2(picomatch@4.0.2) @@ -18855,7 +20863,7 @@ snapshots: cac: 6.7.14 chokidar: 4.0.1 consola: 3.2.3 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 esbuild: 0.24.0 joycon: 3.1.1 picocolors: 1.1.1 @@ -18916,6 +20924,12 @@ snapshots: es-errors: 1.3.0 is-typed-array: 1.1.13 + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -18924,6 +20938,14 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 @@ -18933,6 +20955,16 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 @@ -18942,6 +20974,15 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 @@ -18998,6 +21039,13 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + unbzip2-stream@1.4.3: dependencies: buffer: 5.7.1 @@ -19120,6 +21168,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + update-notifier@7.3.1: dependencies: boxen: 8.0.1 @@ -19195,12 +21249,12 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@2.1.3(@types/node@20.17.0)(terser@5.36.0): + vite-node@2.1.3(@types/node@20.17.0)(terser@5.39.0): dependencies: cac: 6.7.14 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 pathe: 1.1.2 - vite: 5.4.10(@types/node@20.17.0)(terser@5.36.0) + vite: 5.4.10(@types/node@20.17.0)(terser@5.39.0) transitivePeerDependencies: - '@types/node' - less @@ -19220,28 +21274,28 @@ snapshots: - prismjs - supports-color - vite-plugin-pwa@0.20.5(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.1.0): + vite-plugin-pwa@0.20.5(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.1.0): dependencies: - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 pretty-bytes: 6.1.1 tinyglobby: 0.2.9 - vite: 5.4.10(@types/node@20.17.0)(terser@5.36.0) + vite: 5.4.10(@types/node@20.17.0)(terser@5.39.0) workbox-build: 7.1.1(@types/babel__core@7.20.5) workbox-window: 7.1.0 transitivePeerDependencies: - supports-color - vite-plugin-webfont-dl@3.9.5(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)): + vite-plugin-webfont-dl@3.9.5(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)): dependencies: axios: 1.7.7 clean-css: 5.3.3 flat-cache: 5.0.0 picocolors: 1.1.1 - vite: 5.4.10(@types/node@20.17.0)(terser@5.36.0) + vite: 5.4.10(@types/node@20.17.0)(terser@5.39.0) transitivePeerDependencies: - debug - vite@5.4.10(@types/node@20.17.0)(terser@5.36.0): + vite@5.4.10(@types/node@20.17.0)(terser@5.39.0): dependencies: esbuild: 0.21.5 postcss: 8.4.47 @@ -19249,23 +21303,23 @@ snapshots: optionalDependencies: '@types/node': 20.17.0 fsevents: 2.3.3 - terser: 5.36.0 + terser: 5.39.0 - vitefu@1.0.3(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)): + vitefu@1.0.3(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)): optionalDependencies: - vite: 5.4.10(@types/node@20.17.0)(terser@5.36.0) + vite: 5.4.10(@types/node@20.17.0)(terser@5.39.0) - vitest@2.1.3(@types/node@20.17.0)(terser@5.36.0): + vitest@2.1.3(@types/node@20.17.0)(terser@5.39.0): dependencies: '@vitest/expect': 2.1.3 - '@vitest/mocker': 2.1.3(@vitest/spy@2.1.3)(vite@5.4.10(@types/node@20.17.0)(terser@5.36.0)) + '@vitest/mocker': 2.1.3(@vitest/spy@2.1.3)(vite@5.4.10(@types/node@20.17.0)(terser@5.39.0)) '@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.2 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 magic-string: 0.30.12 pathe: 1.1.2 std-env: 3.7.0 @@ -19273,8 +21327,8 @@ snapshots: tinyexec: 0.3.1 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.10(@types/node@20.17.0)(terser@5.36.0) - vite-node: 2.1.3(@types/node@20.17.0)(terser@5.36.0) + vite: 5.4.10(@types/node@20.17.0)(terser@5.39.0) + vite-node: 2.1.3(@types/node@20.17.0)(terser@5.39.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.17.0 @@ -19299,7 +21353,7 @@ snapshots: dependencies: chalk: 4.1.2 commander: 9.5.0 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -19336,6 +21390,14 @@ snapshots: is-string: 1.0.7 is-symbol: 1.0.4 + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + which-builtin-type@1.1.4: dependencies: function.prototype.name: 1.1.6 @@ -19351,6 +21413,22 @@ snapshots: which-collection: 1.0.2 which-typed-array: 1.1.15 + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + which-collection@1.0.2: dependencies: is-map: 2.0.3 @@ -19366,6 +21444,15 @@ snapshots: gopd: 1.0.1 has-tostringtag: 1.0.2 + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.5 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -19426,10 +21513,10 @@ snapshots: dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) '@babel/core': 7.26.0 - '@babel/preset-env': 7.25.9(@babel/core@7.26.0) - '@babel/runtime': 7.25.9 + '@babel/preset-env': 7.26.9(@babel/core@7.26.0) + '@babel/runtime': 7.26.9 '@rollup/plugin-babel': 5.3.1(@babel/core@7.26.0)(@types/babel__core@7.20.5)(rollup@2.79.2) - '@rollup/plugin-node-resolve': 15.3.0(rollup@2.79.2) + '@rollup/plugin-node-resolve': 15.3.1(rollup@2.79.2) '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) '@rollup/plugin-terser': 0.4.4(rollup@2.79.2) '@surma/rollup-plugin-off-main-thread': 2.2.3 diff --git a/lib/defaults/default_store.json b/lib/defaults/default_store.json index 4e3bddc8d..22097005f 100644 --- a/lib/defaults/default_store.json +++ b/lib/defaults/default_store.json @@ -1172,5 +1172,16 @@ "https://atomicdata.dev/property/url" ], "https://atomicdata.dev/properties/shortname": "bookmark" + }, + { + "@id": "https://atomicdata.dev/ontology/data-browser/property/tag-list", + "https://atomicdata.dev/properties/classtype": "https://atomicdata.dev/classes/Tag", + "https://atomicdata.dev/properties/datatype": "https://atomicdata.dev/datatypes/resourceArray", + "https://atomicdata.dev/properties/description": "List of tags available in a drive.", + "https://atomicdata.dev/properties/isA": [ + "https://atomicdata.dev/classes/Property" + ], + "https://atomicdata.dev/properties/parent": "https://atomicdata.dev/properties", + "https://atomicdata.dev/properties/shortname": "tag-list" } ] diff --git a/server/src/commit_monitor.rs b/server/src/commit_monitor.rs index 4e18a61ca..ebc97fefe 100644 --- a/server/src/commit_monitor.rs +++ b/server/src/commit_monitor.rs @@ -119,18 +119,17 @@ impl CommitMonitor { tracing::debug!("No subscribers for {}", target); } + self.search_state.remove_resource(&target)?; + // Update the search index if let Some(resource) = &msg.commit_response.resource_new { // We could one day re-(allow) to keep old resources, // but then we also should index the older versions when re-indexing. - self.search_state.remove_resource(&target)?; // Add new resource to search index self.search_state.add_resource(resource, &self.store)?; - self.run_expensive_next_tick = true; - } else { - // If there is no new resource, it must have been deleted, so let's remove it from the search index. - self.search_state.remove_resource(&target)?; } + + self.run_expensive_next_tick = true; Ok(()) } diff --git a/server/src/config.rs b/server/src/config.rs index 6a0f60c96..191b67188 100644 --- a/server/src/config.rs +++ b/server/src/config.rs @@ -74,6 +74,10 @@ pub struct Opts { #[clap(long, env = "ATOMIC_DATA_DIR")] pub data_dir: Option, + /// Path for the atomic data cache folder. Contains search index, temp files and more. Default value depends on your OS. + #[clap(long, env = "ATOMIC_CACHE_DIR")] + pub cache_dir: Option, + /// CAUTION: Skip authentication checks, making all data publicly readable. Improves performance. #[clap(long, env = "ATOMIC_PUBLIC_MODE")] pub public_mode: bool, @@ -203,6 +207,21 @@ pub fn read_opts() -> Opts { Opts::parse() } +pub fn build_temp_config(random_id: &str) -> AtomicServerResult { + let opts = Opts::parse_from([ + "atomic-server", + "--initialize", + "--data-dir", + &format!("./.temp/{}/db", random_id), + "--config-dir", + &format!("./.temp/{}/config", random_id), + "--cache-dir", + &format!("./.temp/{}/cache", random_id), + ]); + + build_config(opts) +} + /// Creates the server config, reads .env values and sets defaults pub fn build_config(opts: Opts) -> AtomicServerResult { // Directories & file system @@ -242,9 +261,12 @@ pub fn build_config(opts: Opts) -> AtomicServerResult { // Cache data - let cache_dir = project_dirs.cache_dir(); + let cache_dir = opts + .cache_dir + .clone() + .unwrap_or_else(|| project_dirs.cache_dir().to_owned()); - let mut search_index_path = cache_dir.to_owned(); + let mut search_index_path = cache_dir; search_index_path.push("search_index"); let initialize = !std::path::Path::exists(&store_path) || opts.initialize; diff --git a/server/src/search.rs b/server/src/search.rs index 0de28ca12..1bf8e7fc8 100644 --- a/server/src/search.rs +++ b/server/src/search.rs @@ -105,7 +105,7 @@ impl SearchState { #[tracing::instrument(skip(self, store))] pub fn add_resource(&self, resource: &Resource, store: &Db) -> AtomicServerResult<()> { let fields = self.get_schema_fields()?; - let subject = resource.get_subject(); + let subject = resource.get_subject().to_string(); let writer = self.writer.read()?; let mut doc = tantivy::TantivyDocument::default(); @@ -153,7 +153,19 @@ impl SearchState { pub fn build_schema() -> AtomicServerResult { let mut schema_builder = tantivy::schema::Schema::builder(); // The STORED flag makes the index store the full values. Can be useful. - schema_builder.add_text_field("subject", TEXT | STORED); + + // The raw tokenizer is used to index the subject field as is, without any tokenization. + // If we don't do this the subject will be split into multiple tokens which breaks the search. + schema_builder.add_text_field( + "subject", + tantivy::schema::TextOptions::default() + .set_stored() + .set_indexing_options( + tantivy::schema::TextFieldIndexing::default() + .set_tokenizer("raw") + .set_index_option(tantivy::schema::IndexRecordOption::Basic), + ), + ); schema_builder.add_text_field("title", TEXT | STORED); schema_builder.add_text_field("description", TEXT | STORED); schema_builder.add_json_field("propvals", STORED | TEXT); @@ -177,6 +189,12 @@ pub fn get_index(config: &Config) -> AtomicServerResult<(IndexWriter, tantivy::I e ) })?; + + // Register the raw tokenizer + index + .tokenizers() + .register("raw", tantivy::tokenizer::RawTokenizer::default()); + let heap_size_bytes = 50_000_000; let index_writer = index.writer(heap_size_bytes)?; Ok((index_writer, index)) @@ -245,9 +263,9 @@ fn get_resource_title(resource: &Resource) -> String { #[cfg(test)] mod tests { + use super::*; use atomic_lib::{urls, Resource, Storelike}; - use super::resource_to_facet; #[test] fn facet_contains_subfacet() { let store = atomic_lib::Db::init_temp("facet_contains").unwrap(); @@ -278,11 +296,66 @@ mod tests { let query_facet_direct_parent = resource_to_facet(&resources[1], &store).unwrap(); let query_facet_root = resource_to_facet(&resources[0], &store).unwrap(); - // println!("Index: {:?}", index_facet); - // println!("query direct: {:?}", query_facet_direct_parent); - // println!("query root: {:?}", query_facet_root); - assert!(query_facet_direct_parent.is_prefix_of(&index_facet)); assert!(query_facet_root.is_prefix_of(&index_facet)); } + + #[test] + fn test_update_resource() { + let unique_string = atomic_lib::utils::random_string(10); + + let config = crate::config::build_temp_config(&unique_string) + .map_err(|e| format!("Initialization failed: {}", e)) + .expect("failed init config"); + + let store = atomic_lib::Db::init_temp(&unique_string).unwrap(); + + let search_state = SearchState::new(&config).unwrap(); + let fields = search_state.get_schema_fields().unwrap(); + + // Create initial resource + let mut resource = Resource::new_generate_subject(&store); + resource + .set_string(urls::NAME.into(), "Initial Title", &store) + .unwrap(); + store.add_resource(&resource).unwrap(); + + // Add to search index + search_state.add_resource(&resource, &store).unwrap(); + search_state.writer.write().unwrap().commit().unwrap(); + + // Update the resource + resource + .set_string(urls::NAME.into(), "Updated Title", &store) + .unwrap(); + resource.save(&store).unwrap(); + + // Update in search index + search_state + .remove_resource(resource.get_subject()) + .unwrap(); + search_state.add_resource(&resource, &store).unwrap(); + search_state.writer.write().unwrap().commit().unwrap(); + + // Make sure changes are visible to searcher + search_state.reader.reload().unwrap(); + + let searcher = search_state.reader.searcher(); + + // Search for the old title - should return no results + let query_parser = + tantivy::query::QueryParser::for_index(&search_state.index, vec![fields.title]); + let query = query_parser.parse_query("Initial").unwrap(); + let top_docs = searcher + .search(&query, &tantivy::collector::TopDocs::with_limit(1)) + .unwrap(); + assert_eq!(top_docs.len(), 0, "Old title should not be found in index"); + + // Search for the new title - should return one result + let query = query_parser.parse_query("Updated").unwrap(); + let top_docs = searcher + .search(&query, &tantivy::collector::TopDocs::with_limit(1)) + .unwrap(); + assert_eq!(top_docs.len(), 1, "New title should be found in index"); + } }