diff --git a/app/components/animation-options.tsx b/app/components/animation-options.tsx index 69f6641..59f6f56 100644 --- a/app/components/animation-options.tsx +++ b/app/components/animation-options.tsx @@ -7,7 +7,6 @@ */ import { InputNumber } from '~/lib/ui/src' -import type { SourceType } from './ascii-art-generator' import { Container } from './container' interface AnimationOptionsProps { @@ -21,23 +20,15 @@ interface AnimationOptionsProps { frameRate: number }>, ) => void - sourceType?: SourceType } -export function AnimationOptions({ - settings, - updateSettings, - sourceType = 'code', -}: AnimationOptionsProps) { - const isMediaSource = sourceType === 'gif' - +export function AnimationOptions({ settings, updateSettings }: AnimationOptionsProps) { return ( updateSettings({ animationLength: val })} - disabled={isMediaSource} > Animation Length diff --git a/app/components/ascii-art-generator.tsx b/app/components/ascii-art-generator.tsx index e1086e3..43ab023 100644 --- a/app/components/ascii-art-generator.tsx +++ b/app/components/ascii-art-generator.tsx @@ -5,6 +5,7 @@ * * Copyright Oxide Computer Company */ + import { decompressFrames, ParsedFrame, ParsedGif, parseGIF } from 'gifuct-js' import { motion } from 'motion/react' import { useCallback, useEffect, useRef, useState } from 'react' @@ -17,23 +18,25 @@ import { ExportOptions } from '~/components/export-options' import { OutputOptions } from '~/components/output-options' import { PreprocessingOptions } from '~/components/preprocessing-options' import { SourceSelector } from '~/components/source-selector' -import type { Data, Program } from '~/lib/animation' -import { createCodeAsciiProgram, createImageAsciiProgram } from '~/lib/ascii-program' +import { exampleImage } from '~/exampleImage' +import { useEsbuild } from '~/hooks/use-esbuild' +import type { Program } from '~/lib/animation' +import { createProgramFromProcessor, generateImageCode } from '~/lib/ascii-program' +import { processCodeModule } from '~/lib/code-processor' import { DitheringAlgorithm, processAnimatedMedia, - processCodeModule, processImage, - type CachedMediaData, } from '~/lib/image-processor' +import type { AsciiImageData } from '~/lib/types' import { cn } from '~/lib/utils' -import { DEFAULT_SETTINGS, exampleImage, TEMPLATES, TemplateType } from '~/templates' +import { DEFAULT_SETTINGS, TEMPLATES, TemplateType } from '~/templates' import { AnimationOptions } from './animation-options' import { CodeSidebar } from './code-sidebar' import { ProjectManagement } from './project-management' +import { DelayedSpinner } from './spinner' -export type SourceType = 'image' | 'code' | 'gif' export type GridType = 'none' | 'horizontal' | 'vertical' | 'both' export type ColorMappingType = 'brightness' | 'hue' | 'saturation' @@ -42,9 +45,9 @@ export interface AsciiSettings { name: string } source: { - type: SourceType data: string | null code: string + fileName: string imageDimensions?: { width: number; height: number } } preprocessing: { @@ -78,24 +81,31 @@ export interface AsciiSettings { } export function AsciiArtGenerator() { + const { + esbuildService, + isInitialized: esbuildInitialized, + isInitializing: esbuildInitializing, + } = useEsbuild() + // Core state const [settings, setSettings] = useState(DEFAULT_SETTINGS) const [program, setProgram] = useState(null) const [processedImageUrl, setProcessedImageUrl] = useState(null) const [animationController, setAnimationController] = useState(null) const [dragActive, setDragActive] = useState(false) - const [pendingCode, setPendingCode] = useState(settings.source.code) + const [pendingCode, setPendingCode] = useState('') const [projectName, setProjectName] = useState('') const [templateType, setTemplateType] = useState('') + const [currentImageData, setCurrentImageData] = useState(null) + const [currentFrames, setCurrentFrames] = useState(null) // Processing state const [isExporting, setIsExporting] = useState(false) const [_isProcessing, setIsProcessing] = useState(false) - const [cachedMedia, setCachedMedia] = useState(null) const [showCodeSidebar, setShowCodeSidebar] = useState(false) const [showSidebar, setShowSidebar] = useState(true) - const lastProcessedSettings = useRef(null) + const prevSettings = useRef(null) const isInitialMount = useRef(true) const handleBeforeUnload = (event: BeforeUnloadEvent) => { @@ -118,6 +128,10 @@ export function AsciiArtGenerator() { } } + // Clear image source state when loading templates + setCurrentImageData(null) + setCurrentFrames(null) + toast(`Applied "${TEMPLATES[template].meta.name}" template`) // Remove template parameter from URL after loading template @@ -130,6 +144,8 @@ export function AsciiArtGenerator() { // Load template from URL parameter on mount useEffect(() => { + if (!esbuildInitialized || esbuildInitializing) return + const urlParams = new URLSearchParams(window.location.search) const templateParam = urlParams.get('template') @@ -139,13 +155,11 @@ export function AsciiArtGenerator() { } // only need to run on load // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) + }, [esbuildInitialized, esbuildInitializing]) useEffect(() => { // Check if the user has loaded some media or modified the code - const isSourceDirty = - (settings.source.type !== 'code' && settings.source.data !== null) || - pendingCode !== DEFAULT_SETTINGS.source.code + const isSourceDirty = settings.source.data !== null || pendingCode !== '' if (isSourceDirty) { window.addEventListener('beforeunload', handleBeforeUnload) @@ -165,9 +179,9 @@ export function AsciiArtGenerator() { // Check if settings have meaningfully changed if ( - lastProcessedSettings.current && + prevSettings.current && R.isDeepEqual( - getRelevantSettings(lastProcessedSettings.current), + getRelevantSettings(prevSettings.current), getRelevantSettings(settings), ) ) { @@ -183,20 +197,9 @@ export function AsciiArtGenerator() { const getRelevantSettings = (settings: AsciiSettings) => { const { source, preprocessing, output, animation } = settings - // For code sources, we only care about the code and dimensions - if (source.type === 'code') { - return { - sourceType: source.type, - code: source.code, - columns: output.columns, - rows: output.rows, - frameRate: animation.frameRate, - } - } - return { - sourceType: source.type, sourceData: source.data, + code: source.code, preprocessing, columns: output.columns, rows: output.rows, @@ -207,34 +210,54 @@ export function AsciiArtGenerator() { } const processCurrentSettings = async () => { - if (!settings.source.data && settings.source.type !== 'code') { + if (!settings.source.data && !settings.source.code) { return } - - setIsProcessing(true) - try { - const { source, output } = settings - const columns = output.columns - const rows = output.rows - - switch (source.type) { - case 'image': - if (source.data) { - await processStaticImage(source.data, columns, rows, settings) + const columns = settings.output.columns + const rows = settings.output.rows + + const shouldProcess = + prevSettings && prevSettings.current + ? haveProcessingSettingsChanged(prevSettings.current, settings) + : true + + let imageData = currentImageData + let frames = currentFrames + + if (shouldProcess && settings.source.data) { + if (settings.source.data.includes('data:image/gif')) { + const gifResult = await processGifSource(settings.source.data, settings) + if (gifResult) { + // Update state with processed data + if (gifResult.processedImageUrl) { + setProcessedImageUrl(gifResult.processedImageUrl) + } + + imageData = gifResult.imageData + frames = gifResult.frames } - break - case 'gif': - if (source.data) { - await processAnimatedSource(source.type, source.data, columns, rows, settings) + } else { + const staticResult = await processStaticImage(settings.source.data, settings) + if (staticResult) { + // Update state with processed data + if (staticResult.processedImageUrl) { + setProcessedImageUrl(staticResult.processedImageUrl) + } + + imageData = staticResult.imageData + frames = null } - break - case 'code': - await processCodeSource(columns, rows, settings) - break + } } - lastProcessedSettings.current = structuredClone(settings) + setCurrentImageData(imageData) + setCurrentFrames(frames) + + await processCodeSource(columns, rows, settings, imageData, frames) + + // Update cache entry after processing is complete + prevSettings.current = settings } catch (error) { console.error('Error processing:', error) toast(error instanceof Error ? error.message : 'Unknown error') @@ -243,221 +266,54 @@ export function AsciiArtGenerator() { } } - const processStaticImage = async ( - imageData: string, - columns: number, - rows: number, - currentSettings: AsciiSettings, - ) => { + const processStaticImage = async (imageData: string, currentSettings: AsciiSettings) => { try { const result = await processImage(imageData, currentSettings) if (result.processedImageUrl) { setProcessedImageUrl(result.processedImageUrl) } - - const newProgram = await createImageAsciiProgram(result.data, columns, rows) - setProgram(newProgram) - } catch (error) { - handleProcessingError('processing image', error) - } - } - - const processAnimatedSource = async ( - sourceType: 'gif', - sourceData: string, - columns: number, - rows: number, - currentSettings: AsciiSettings, - ) => { - const canReuseCache = - cachedMedia && cachedMedia.type === sourceType && cachedMedia.sourceUrl === sourceData - - try { - if (canReuseCache) { - const processingSettingsChanged = haveProcessingSettingsChanged( - cachedMedia, - currentSettings, - ) - - if (processingSettingsChanged) { - // Settings have changed, reprocess the cached raw frames - await reprocessCachedFrames(cachedMedia, columns, rows, currentSettings) - } else { - // Settings haven't changed, use existing processed frames - await reuseExistingFrames(cachedMedia, columns, rows, currentSettings) - } - } else { - await processGifSource(sourceData, columns, rows, currentSettings) + setCurrentImageData(result.data) + setCurrentFrames(null) + + // Only generate initial code if pendingCode is empty + if (pendingCode === '') { + const code = generateImageCode() + setPendingCode(code) + updateSettings('source', { code }) } - } catch (error) { - handleProcessingError('processing animated source', error) - } - } - - const processCodeSource = async ( - columns: number, - rows: number, - currentSettings: AsciiSettings, - ) => { - try { - const module = processCodeModule(currentSettings.source.code) - if (!module) { - toast('Could not process your code. Check for syntax errors.') - return - } - - const newProgram = await createCodeAsciiProgram( - columns, - rows, - currentSettings.animation.frameRate, - module, - ) - - setProgram(newProgram) - } catch (error) { - handleProcessingError('processing code', error) - } - } - - // Check if processing settings have changed requiring reprocessing - const haveProcessingSettingsChanged = ( - cache: CachedMediaData, - currentSettings: AsciiSettings, - ) => { - if (!cache.processedFrames) return true - - const { settings: cachedSettings } = cache.processedFrames - const { output, preprocessing } = currentSettings - - return ( - cachedSettings.columns !== output.columns || - cachedSettings.rows !== output.rows || - cachedSettings.characterSet !== output.characterSet || - cachedSettings.colorMapping !== output.colorMapping || - cachedSettings.whitePoint !== preprocessing.whitePoint || - cachedSettings.blackPoint !== preprocessing.blackPoint || - cachedSettings.brightness !== preprocessing.brightness || - cachedSettings.invert !== preprocessing.invert || - cachedSettings.dithering !== preprocessing.dithering || - cachedSettings.ditheringAlgorithm !== preprocessing.ditheringAlgorithm - ) - } - - // Reprocess cached frames with new settings - const reprocessCachedFrames = async ( - cache: CachedMediaData, - columns: number, - rows: number, - currentSettings: AsciiSettings, - ) => { - const processFrames = async (): Promise<{ frames: number }> => { - const result = await processAnimatedMedia(cache.rawFrames, currentSettings) - - // Update cache with newly processed frames - updateMediaCache(cache, result.frames, currentSettings) - setProcessedImageUrl(result.firstFrameUrl || null) - - // Create program with newly processed frames - const newProgram = await createImageAsciiProgram( - result.firstFrameData, - columns, - rows, - result.frames, - currentSettings.animation.frameRate, - ) - - setProgram(newProgram) - return { frames: result.frames.length } - } - - // Show a promise-based toast that updates its state - toast.promise(processFrames(), { - loading: 'Applying new visual settings...', - success: (data) => `Reprocessed ${data.frames} frames with new settings`, - error: (error) => - `Error: ${error instanceof Error ? error.message : 'Could not apply settings'}`, - }) - } - - // Update the media cache with new processed frames - const updateMediaCache = ( - cache: CachedMediaData, - frames: Data[], - currentSettings: AsciiSettings, - ) => { - setCachedMedia({ - ...cache, - processedFrames: { - settings: { - columns: currentSettings.output.columns, - rows: currentSettings.output.rows, - characterSet: currentSettings.output.characterSet, - colorMapping: currentSettings.output.colorMapping, - whitePoint: currentSettings.preprocessing.whitePoint, - blackPoint: currentSettings.preprocessing.blackPoint, - brightness: currentSettings.preprocessing.brightness, - invert: currentSettings.preprocessing.invert, - dithering: currentSettings.preprocessing.dithering, - ditheringAlgorithm: currentSettings.preprocessing.ditheringAlgorithm, - }, - frames, - }, - }) - } - - // Use cached frames without reprocessing - const reuseExistingFrames = async ( - cache: CachedMediaData, - columns: number, - rows: number, - currentSettings: AsciiSettings, - ) => { - toast('Applying cached frames...') - - try { - // Use cached frames directly - const processedFrames = cache.processedFrames!.frames - - // Create program with cached frames - const newProgram = await createImageAsciiProgram( - processedFrames[0], // First frame - columns, - rows, - processedFrames, - currentSettings.animation.frameRate, - ) - // Set the first frame as preview - if (cache.rawFrames.length > 0) { - setProcessedImageUrl(cache.rawFrames[0].dataUrl) + return { + imageData: result.data, + processedImageUrl: result.processedImageUrl, } - - setProgram(newProgram) - - toast(`Loaded ${processedFrames.length} frames from cache`) } catch (error) { - handleProcessingError('loading cached', error) - - // If using cached frames fails, try reprocessing - await processGifSource(cache.sourceUrl, columns, rows, currentSettings) + handleProcessingError('processing image', error) + return null } } // Process GIF source using gifuct-js const processGifSource = async ( gifData: string, - columns: number, - rows: number, currentSettings: AsciiSettings, - ) => { - const processGif = async (): Promise<{ frames: number }> => { + ): Promise<{ + imageData: AsciiImageData + frames: AsciiImageData[] + processedImageUrl: string | null + } | null> => { + const processGif = async (): Promise<{ + frames: number + imageData: AsciiImageData + framesData: AsciiImageData[] + processedImageUrl: string | null + }> => { // Convert data URL to binary data const bytes = dataUrlToUint8Array(gifData) // Parse the GIF and extract frames // Fix type issue by creating proper ArrayBuffer - const buffer = bytes.buffer + const buffer = bytes.buffer as ArrayBuffer const gif = parseGIF(buffer) const frames = decompressFrames(gif, true) @@ -471,52 +327,105 @@ export function AsciiArtGenerator() { // Process all extracted frames const result = await processAnimatedMedia(rawFrames, currentSettings) - // Create cache entry - setCachedMedia({ - type: 'gif', - sourceUrl: gifData, - rawFrames, - processedFrames: { - settings: { - columns: currentSettings.output.columns, - rows: currentSettings.output.rows, - characterSet: currentSettings.output.characterSet, - whitePoint: currentSettings.preprocessing.whitePoint, - blackPoint: currentSettings.preprocessing.blackPoint, - brightness: currentSettings.preprocessing.brightness, - invert: currentSettings.preprocessing.invert, - dithering: currentSettings.preprocessing.dithering, - ditheringAlgorithm: currentSettings.preprocessing.ditheringAlgorithm, - colorMapping: currentSettings.output.colorMapping, - }, - frames: result.frames, - }, - }) - // Set preview setProcessedImageUrl(result.firstFrameUrl) - // Create animated program - const newProgram = await createImageAsciiProgram( - result.firstFrameData, - columns, - rows, - result.frames, - currentSettings.animation.frameRate, - ) + setCurrentImageData(result.firstFrameData) + setCurrentFrames(result.frames) - setProgram(newProgram) - updateSettings('animation', { animationLength: result.frames.length }) + // Only generate initial code if pendingCode is empty + if (pendingCode === '') { + const code = generateImageCode() + setPendingCode(code) + updateSettings('source', { code }) + } + // Only update animation length if it's different to prevent infinite loop + if (currentSettings.animation.animationLength !== result.frames.length) { + updateSettings('animation', { animationLength: result.frames.length }) + } - return { frames: result.frames.length } + return { + frames: result.frames.length, + imageData: result.firstFrameData, + framesData: result.frames, + processedImageUrl: result.firstFrameUrl, + } } - toast.promise(processGif(), { - loading: 'Processing GIF frames...', - success: (data) => `Processed ${data.frames} frames successfully`, - error: (error) => - `Error: ${error instanceof Error ? error.message : 'Could not process GIF'}`, - }) + try { + toast.loading('Processing GIF frames...') + const result = await processGif() + toast.dismiss() + toast.success(`Processed ${result.frames} frames successfully`) + return { + imageData: result.imageData, + frames: result.framesData, + processedImageUrl: result.processedImageUrl, + } + } catch (_error) { + toast.dismiss() + toast.error(_error instanceof Error ? _error.message : 'Could not process GIF') + return null + } + } + + const processCodeSource = async ( + columns: number, + rows: number, + currentSettings: AsciiSettings, + imageData: AsciiImageData | null, + frames: AsciiImageData[] | null, + ) => { + try { + const result = await processCodeModule(currentSettings.source.code, { + esbuildService: esbuildService, + timeout: 5000, + imageData: imageData, + frames: frames || undefined, + settings: currentSettings, + }) + + if (!result.success || !result.module) { + toast(result.error || 'Could not process your code. Check for syntax errors.') + return + } + + const newProgram = await createProgramFromProcessor(result, { + width: columns, + height: rows, + frameRate: currentSettings.animation.frameRate, + }) + + setProgram(newProgram) + } catch (error) { + handleProcessingError('processing code', error) + } + } + + // Check if processing settings have changed requiring reprocessing + const haveProcessingSettingsChanged = ( + lastProcessedSettings: AsciiSettings, + currentSettings: AsciiSettings, + ) => { + const { output, preprocessing, source } = currentSettings + const { + output: prevOutput, + preprocessing: prevPreprocessing, + source: prevSource, + } = lastProcessedSettings + + return ( + prevSource.data !== source.data || + prevOutput.columns !== output.columns || + prevOutput.rows !== output.rows || + prevOutput.colorMapping !== output.colorMapping || + prevPreprocessing.whitePoint !== preprocessing.whitePoint || + prevPreprocessing.blackPoint !== preprocessing.blackPoint || + prevPreprocessing.brightness !== preprocessing.brightness || + prevPreprocessing.invert !== preprocessing.invert || + prevPreprocessing.dithering !== preprocessing.dithering || + prevPreprocessing.ditheringAlgorithm !== preprocessing.ditheringAlgorithm + ) } // Helper functions @@ -628,24 +537,6 @@ export function AsciiArtGenerator() { const updateSettings = useCallback( (section: K, newValues: Partial) => { setSettings((prev) => { - // Handle special case for source type changes - if ( - section === 'source' && - 'type' in newValues && - newValues.type !== prev.source.type - ) { - setProgram(null) - setProcessedImageUrl(null) - setCachedMedia(null) - - if (animationController) { - setAnimationController(null) - } - - // Reset last processed settings - lastProcessedSettings.current = null - } - return { ...prev, [section]: { @@ -655,7 +546,7 @@ export function AsciiArtGenerator() { } }) }, - [animationController], + [], ) const setAspectRatioFromImage = ( @@ -673,9 +564,28 @@ export function AsciiArtGenerator() { } // Helper to update both source and aspect ratio in a single batch update - const updateSourceAndAspectRatio = async (imageUrl: string, type: 'image' | 'gif') => { + const updateSourceAndAspectRatio = async ( + imageUrl: string, + type: 'image' | 'gif', + fileName?: string, + ) => { const { aspectRatio, width, height } = await setAspectRatioFromImage(imageUrl) + if (type === 'image') { + updateSettings('animation', { animationLength: 1 }) + } + + // Generate filename for screenshots if not provided + const finalFileName = + fileName || + (() => { + const now = new Date() + const hours = now.getHours().toString().padStart(2, '0') + const minutes = now.getMinutes().toString().padStart(2, '0') + const seconds = now.getSeconds().toString().padStart(2, '0') + return `Img-${hours}-${minutes}-${seconds}.png` + })() + // Update all settings at once to avoid race conditions setSettings((prev) => ({ ...prev, @@ -684,6 +594,7 @@ export function AsciiArtGenerator() { data: imageUrl, type, imageDimensions: { width, height }, // Store dimensions with source + fileName: finalFileName, }, output: { ...prev.output, @@ -693,7 +604,6 @@ export function AsciiArtGenerator() { }, })) - setShowCodeSidebar(false) return true } @@ -724,7 +634,7 @@ export function AsciiArtGenerator() { const reader = new FileReader() reader.onload = (e) => { const result = e.target?.result as string - updateSourceAndAspectRatio(result, sourceType) + updateSourceAndAspectRatio(result, sourceType, file.name) } reader.readAsDataURL(file) return true @@ -774,15 +684,15 @@ export function AsciiArtGenerator() { const handleExampleScriptClick = useCallback(() => { // Open code sidebar and load the clock example setShowCodeSidebar(true) - const defaultTemplate = TEMPLATES.default - setPendingCode(defaultTemplate.source.code) - updateSettings('source', { - type: 'code', - data: null, - code: defaultTemplate.source.code, - }) - updateSettings('output', defaultTemplate.output) - updateSettings('animation', defaultTemplate.animation) + const template = TEMPLATES.sin + setPendingCode(template.source.code) + updateSettings('source', template.source) + updateSettings('output', template.output) + updateSettings('export', template.export) + updateSettings('preprocessing', template.preprocessing) + updateSettings('meta', template.meta) + updateSettings('source', template.source) + updateSettings('animation', template.animation) }, [updateSettings]) const handleTemplateChange = (template: TemplateType) => { @@ -802,8 +712,8 @@ export function AsciiArtGenerator() { if (projectData.settings) { setSettings(projectData.settings as AsciiSettings) - // If the imported project is a code project, show the code sidebar - if (projectData.settings.source.type === 'code') { + // If the imported project has code, show the code sidebar + if (projectData.settings.source.code) { // Pass this information up to the parent handleCodeProjectLoaded(projectData.settings.source.code) } @@ -862,34 +772,24 @@ export function AsciiArtGenerator() { />
- {/* Preprocessing (for non-code sources) */} - {settings.source.type !== 'code' && ( - <> - updateSettings('preprocessing', changes)} - /> -
- - )} + {/* Preprocessing (always visible) */} + updateSettings('preprocessing', changes)} + /> +
{/* Output Options */} updateSettings('output', changes)} - sourceType={settings.source.type} sourceImageDimensions={settings.source.imageDimensions} /> - {/* Animation Options (for animated content) */} - {(settings.source.type === 'code' || settings.source.type === 'gif') && ( - <> -
- updateSettings('animation', changes)} - sourceType={settings.source.type} - /> - - )} + {/* Animation Options (always visible) */} +
+ updateSettings('animation', changes)} + />
{/* Export Options */}
- {/* Main Content Area */} -
-
- {/* ASCII Preview */} -
- {dragActive && ( -
- )} - updateSourceAndAspectRatio(exampleImage, 'image')} +
+ + {/* Main Content Area */} + {esbuildInitialized && !esbuildInitializing && ( +
+ {/* ASCII Preview */} +
+ {dragActive && ( +
+ )} + + updateSourceAndAspectRatio(exampleImage, 'image', 'example-grad.png') + } + /> +
+ + {/* Code Sidebar */} + updateSettings('source', changes)} + isOpen={showCodeSidebar} />
- - {/* Code Sidebar */} - updateSettings('source', changes)} - isOpen={showCodeSidebar} - /> -
+ )}
) diff --git a/app/components/ascii-preview.tsx b/app/components/ascii-preview.tsx index 1967bdf..3745f8b 100644 --- a/app/components/ascii-preview.tsx +++ b/app/components/ascii-preview.tsx @@ -14,6 +14,7 @@ import { Resize16Icon, } from '@oxide/design-system/icons/react' import useResizeObserver from '@react-hook/resize-observer' +import { motion } from 'motion/react' import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react' import { useHotkeys } from 'react-hotkeys-hook' @@ -21,14 +22,13 @@ import type { createAnimation, Program } from '~/lib/animation' import { InputButton, InputNumber } from '~/lib/ui/src' import AsciiAnimation from './ascii-animation' -import type { GridType, SourceType } from './ascii-art-generator' +import type { GridType } from './ascii-art-generator' import { calculateContentDimensions } from './dimension-utils' import { GridOverlay } from './grid-overlay' interface AsciiPreviewProps { program: Program | null dimensions: { width: number; height: number } - sourceType: SourceType gridType: GridType showUnderlyingImage: boolean underlyingImageUrl: string | null @@ -53,20 +53,29 @@ const DemoCard = ({ icon, title, onClick, + index, }: { icon: React.ReactNode title: string onClick?: () => void + index: number }) => ( - + ) const useSize = (target: HTMLDivElement | null) => { @@ -85,7 +94,6 @@ const useSize = (target: HTMLDivElement | null) => { export function AsciiPreview({ program, dimensions, - sourceType, gridType, showUnderlyingImage, underlyingImageUrl, @@ -193,6 +201,7 @@ export function AsciiPreview({
} title="Upload image or GIF" onClick={() => { @@ -205,11 +214,13 @@ export function AsciiPreview({ }} /> } title="Run example script" onClick={onExampleScriptClick} /> } title="Use example image" onClick={onExampleImageClick} @@ -231,35 +242,37 @@ export function AsciiPreview({
{/* Zoom controls */} {program && ( -
- - - - - - - setAutoFit(!autoFit)} - > - - +
+
+ + + + + + + setAutoFit(!autoFit)} + > + + +
)} {/* ASCII preview container */} @@ -330,12 +343,11 @@ export function AsciiPreview({
- {(sourceType === 'code' || sourceType === 'gif') && settings.animationLength > 1 && ( + {settings.animationLength > 1 && ( )}
@@ -374,12 +386,10 @@ function FrameSlider({ frame, totalFrames, animationController, - sourceType, }: { frame: number totalFrames: number animationController: AnimationController - sourceType?: SourceType }) { const [playing, setPlaying] = useState( animationController && animationController.getState().playing ? true : false, @@ -412,7 +422,7 @@ function FrameSlider({ } } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [sourceType]) + }, []) return (
diff --git a/app/components/aspect-ratio-input-number.tsx b/app/components/aspect-ratio-input-number.tsx index 1222dda..139d675 100644 --- a/app/components/aspect-ratio-input-number.tsx +++ b/app/components/aspect-ratio-input-number.tsx @@ -9,7 +9,6 @@ import { useCallback, useEffect, useState } from 'react' import { InputNumber, InputSwitch } from '~/lib/ui/src' -import { SourceType } from './ascii-art-generator' import { CHAR_HEIGHT, CHAR_WIDTH } from './dimension-utils' export interface AspectRatioInputNumberProps { @@ -27,7 +26,6 @@ export interface AspectRatioInputNumberProps { maxHeight?: number disabled?: boolean className?: string - sourceType: SourceType } const calculateAspectRatio = (w: number, h: number) => (w * CHAR_WIDTH) / (h * CHAR_HEIGHT) @@ -48,7 +46,6 @@ export const AspectRatioInputNumber = ({ aspectRatio, onAspectRatioChange, disabled = false, - sourceType, }: AspectRatioInputNumberProps) => { const [isLocked, setIsLocked] = useState(aspectRatio !== undefined) @@ -138,11 +135,11 @@ export const AspectRatioInputNumber = ({ ) useEffect(() => { - if (aspectRatioFromImg && sourceType !== 'code' && !aspectRatio) { + if (aspectRatioFromImg && !aspectRatio) { // Set aspect ratio from image dimensions when enabled onAspectRatioChange(calculateAspectRatio(width, height)) } - }, [aspectRatioFromImg, sourceType, aspectRatio, width, height, onAspectRatioChange]) + }, [aspectRatioFromImg, aspectRatio, width, height, onAspectRatioChange]) // Syncing dimensions when aspect ratio changes externally useEffect(() => { @@ -204,18 +201,17 @@ export const AspectRatioInputNumber = ({ Aspect Ratio - {sourceType !== 'code' && ( - { - if (onAspectRatioFromImgChange) { - onAspectRatioFromImgChange(checked) - } - }} - > - Use Image Ratio - - )} + {/* Hide if no image data? */} + { + if (onAspectRatioFromImgChange) { + onAspectRatioFromImgChange(checked) + } + }} + > + Use Image Ratio +
)} diff --git a/app/components/asset-export.tsx b/app/components/asset-export.tsx index dfcee96..1618a3c 100644 --- a/app/components/asset-export.tsx +++ b/app/components/asset-export.tsx @@ -18,7 +18,6 @@ import type { Program } from '~/lib/animation' import { InputButton, InputNumber, InputSwitch } from '~/lib/ui/src' import { InputSelect } from '~/lib/ui/src/components/InputSelect/InputSelect' -import { type SourceType } from './ascii-art-generator' import { getContent, type AnimationController } from './ascii-preview' import { Container } from './container' import { @@ -37,13 +36,11 @@ interface ExportDimensions { interface AssetExportProps { program: Program | null - sourceType: SourceType animationController: AnimationController animationLength: number isExporting: boolean setIsExporting: (exporting: boolean) => void dimensions: { width: number; height: number } - gridType?: 'none' | 'horizontal' | 'vertical' | 'both' disabled: boolean exportSettings: { textColor: string @@ -54,7 +51,6 @@ interface AssetExportProps { export function AssetExport({ program, - sourceType, animationController, animationLength, isExporting, @@ -64,7 +60,7 @@ export function AssetExport({ exportSettings, }: AssetExportProps) { const [exportFormat, setExportFormat] = useState( - sourceType === 'code' ? 'frames' : 'png', + animationLength > 1 ? 'frames' : 'png', ) const [exportDimensions, setExportDimensions] = useState({ width: 1920, @@ -153,22 +149,19 @@ export function AssetExport({ }, [exportFormat, ffmpegLoaded]) useEffect(() => { - const isAnimated = - (sourceType === 'code' || sourceType === 'gif') && animationLength > 1 + const isAnimated = animationLength > 1 if (isAnimated) { setExportFormat('frames') } else { setExportFormat('png') } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [sourceType]) + }, [animationLength]) const exportContent = async () => { if (!program) return - const isAnimated = - (sourceType === 'code' || sourceType === 'gif') && animationController + const isAnimated = animationController && animationLength > 1 const totalFrames = isAnimated ? animationLength : 1 try { setIsExporting(true) @@ -441,9 +434,12 @@ export function AssetExport({ // Read the output file const data = await ffmpeg.readFile(outputFilename) - const blob = new Blob([data instanceof Uint8Array ? data.buffer : data], { - type: exportFormat === 'mp4' ? 'video/mp4' : 'image/gif', - }) + const blob = new Blob( + [data instanceof Uint8Array ? (data.buffer as ArrayBuffer) : data], + { + type: exportFormat === 'mp4' ? 'video/mp4' : 'image/gif', + }, + ) // Save the video saveAs(blob, `ascii-animation.${exportFormat}`) @@ -583,7 +579,7 @@ export function AssetExport({ setExportFormat(value as ExportFormat) }} options={ - (sourceType === 'code' || sourceType === 'gif') && animationLength > 1 + animationLength > 1 ? (['mp4', 'gif', 'frames'] as ExportFormat[]) : (['svg', 'png'] as ExportFormat[]) } @@ -693,7 +689,7 @@ export function AssetExport({ > {exportFormat === 'mp4' || exportFormat === 'gif' ? `Export as ${exportFormat.toUpperCase()}` - : sourceType === 'code' || sourceType === 'gif' + : animationLength > 1 ? `Export ${exportFormat === 'frames' ? 'Frames' : 'Frame'}` : 'Export Image'} diff --git a/app/components/code-editor.tsx b/app/components/code-editor.tsx index 701b2f5..1f90d0e 100644 --- a/app/components/code-editor.tsx +++ b/app/components/code-editor.tsx @@ -176,7 +176,7 @@ const oxideDarkExtension = [theme, syntaxHighlighting(highlightStyle)] export default function CodeEditor({ value, onChange, editorViewRef }: CodeEditorProps) { const editorExtensions = [ - javascript({ jsx: false, typescript: false }), + javascript({ jsx: false, typescript: true }), EditorView.lineWrapping, oxideDarkExtension, ] @@ -192,7 +192,7 @@ export default function CodeEditor({ value, onChange, editorViewRef }: CodeEdito highlightActiveLine: true, highlightSelectionMatches: false, drawSelection: false, - autocompletion: true, + autocompletion: false, foldGutter: true, indentOnInput: true, history: true, diff --git a/app/components/code-sidebar.tsx b/app/components/code-sidebar.tsx index 5e11907..9767a8c 100644 --- a/app/components/code-sidebar.tsx +++ b/app/components/code-sidebar.tsx @@ -7,9 +7,15 @@ */ import { redo, undo } from '@codemirror/commands' import { EditorView } from '@codemirror/view' -import { DirectionDownIcon, Info12Icon } from '@oxide/design-system/icons/react' +import { + AddRoundel12Icon, + DirectionDownIcon, + Info12Icon, +} from '@oxide/design-system/icons/react' +import * as Accordion from '@radix-ui/react-accordion' import { motion } from 'motion/react' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { flushSync } from 'react-dom' import { useHotkeys } from 'react-hotkeys-hook' import { InputButton, InputNumber, InputSwitch } from '~/lib/ui/src' @@ -17,7 +23,6 @@ import { LinkButton } from '~/lib/ui/src/components/InputButton/InputButton' import { InputText } from '~/lib/ui/src/components/InputText/InputText' import { cn } from '~/lib/utils' -import type { SourceType } from './ascii-art-generator' import CodeEditor from './code-editor' interface CodeSidebarProps { @@ -26,7 +31,6 @@ interface CodeSidebarProps { isOpen: boolean updateSettings: ( settings: Partial<{ - type: SourceType data: string | null code: string }>, @@ -49,10 +53,10 @@ interface ControlVariable { } // Regex patterns used throughout parsing -const PATTERNS = { - ROOT_OBJECT: /const\s+(\w+)\s*=\s*\{\s*([^}]*)\s*\}\s*;?\s*\/\/~\s*(.+)/, - MULTI_OBJECT: /const\s+(\w+)\s*=\s*\{/, - SIMPLE_VAR: /const\s+(\w+)\s*=\s*(.+?);?\s*\/\/~\s*(.+)/, +export const PATTERNS = { + ROOT_OBJECT: /const\s+(\w+)(?:\s*:\s*[^=]+)?\s*=\s*\{\s*([^}]*)\s*\}\s*;?\s*\/\/~\s*(.+)/, + MULTI_OBJECT: /const\s+(\w+)(?:\s*:\s*[^=]+)?\s*=\s*\{/, + SIMPLE_VAR: /const\s+(\w+)(?:\s*:\s*[^=]+)?\s*=\s*(?!\s*\{)(.+?);?\s*\/\/~\s*(.+)/, NESTED_OBJECT: /\s*(\w+):\s*\{\s*([^}]+)\s*\},?\s*\/\/~\s*(.+)/, OBJECT_PROP: /\s*(\w+):\s*(.+?),?\s*\/\/~\s*(.+)/, PROP_VALUE: /(\w+):\s*([^,}]+)/g, @@ -60,6 +64,73 @@ const PATTERNS = { STEP: /step=(\d+(?:\.\d+)?)/, } as const +const UTILS = [ + { + name: 'checkerboard', + description: 'Generates a checkerboard pattern value for given coordinates', + type: '(x: number, y: number, size?: number) => number', + example: 'const value = checkerboard(coord.x, coord.y, 8)', + importStatement: "import { checkerboard } from '@/utils'", + }, + { + name: 'stripes', + description: 'Creates striped patterns in horizontal, vertical, or diagonal directions', + type: '(x: number, y: number, stripeWidth?: number, direction?: "horizontal" | "vertical" | "diagonal") => number', + example: 'const value = stripes(coord.x, coord.y, 4, "diagonal")', + importStatement: "import { stripes } from '@/utils'", + }, + { + name: 'value-to-char', + description: 'Converts a 0-1 value to an ASCII character for rendering', + type: '(value: number, chars?: string) => string', + example: `import { valueToChar, getImageValue } from '@/utils' +import { imageData } from '@/imageData' +import { characterSet } from '@/settings' + +function main(pos, context) { + const value = getImageValue(imageData, pos.x, pos.y) + return { char: valueToChar(value, characterSet) } +}`, + importStatement: + "import { valueToChar } from '@/utils'\nimport { characterSet } from '@/settings'", + }, + { + name: 'get-image-value', + description: 'Gets a value from 2D image data array with bounds checking', + type: '(data: number[][], x: number, y: number) => number', + example: `import { getImageValue, valueToChar } from '@/utils' +import { imageData, frames } from '@/imageData' +import { characterSet } from '@/settings' + +function main(pos, context) { + // Use animated frames if available + const data = frames && frames.length > 0 + ? frames[context.frame % frames.length] + : imageData + + const value = getImageValue(data, pos.x, pos.y) + return { char: valueToChar(value, characterSet) } +}`, + importStatement: + "import { getImageValue } from '@/utils'\nimport { characterSet } from '@/settings'", + }, + { + name: 'simplex-noise', + description: + 'Generates smooth, continuous noise values\nfor procedural textures and patterns', + type: 'createNoise2D: () => (x: number, y: number) => number', + example: `function boot() { + noise2D = createNoise2D() +} + +function main(coord, context, cursor, buffer) { + const noise = noise2D(coord.x * 0.01, coord.y * 0.01) + return noise > 0 ? 1 : 0 +}`, + importStatement: "import { createNoise2D } from 'simplex-noise'", + }, +] as const + function parseControlConfig( name: string, valueStr: string, @@ -301,14 +372,37 @@ export function CodeSidebar({ const [isResizing, setIsResizing] = useState(false) const editorViewRef = useRef(null) const [controlsOpen, setControlsOpen] = useState(true) + const [utilsOpen, setUtilsOpen] = useState(false) const [autoRun, setAutoRun] = useState(true) const updateTimeoutRef = useRef(null) const handleUndo = () => editorViewRef.current && undo(editorViewRef.current) const handleRedo = () => editorViewRef.current && redo(editorViewRef.current) - const handleCodeRun = () => - updateSettings({ data: null, code: pendingCode, type: 'code' }) - const handleCodeChange = (value: string) => setPendingCode(value) + const handleCodeRun = () => updateSettings({ code: pendingCode }) + const handleCodeChange = (value: string) => flushSync(() => setPendingCode(value)) + + const addImport = (importStatement: string) => { + if (!editorViewRef.current) return + + const currentContent = editorViewRef.current.state.doc.toString() + + // Check if import already exists + if (currentContent.includes(importStatement)) { + return + } + + // Always add import at the beginning of the file + const insertText = `${importStatement}\n` + + // Apply change + const transaction = editorViewRef.current.state.update({ + changes: { from: 0, insert: insertText }, + }) + editorViewRef.current.dispatch(transaction) + + const newContent = transaction.state.doc.toString() + flushSync(() => setPendingCode(newContent)) + } const handleMouseMove = useCallback((e: MouseEvent) => { if (!isDragging.current) return @@ -410,12 +504,12 @@ export function CodeSidebar({ editorViewRef.current.dispatch(transaction) const newContent = transaction.state.doc.toString() - setPendingCode(newContent) + flushSync(() => setPendingCode(newContent)) // Debounced auto-run if (autoRun) { updateTimeoutRef.current = window.setTimeout(() => { - updateSettings({ data: null, code: newContent, type: 'code' }) + updateSettings({ data: null, code: newContent }) updateTimeoutRef.current = null }, 100) } @@ -572,17 +666,88 @@ export function CodeSidebar({ />
+
+ + {utilsOpen && ( +
+
+ + {UTILS.map((util) => ( + + + +
+ + {util.name} +
+
+
+ +
+
+ {util.description} +
+
+
+ Type +
+
+                                {util.type}
+                              
+
+
+
+ Example +
+
+                                {util.example}
+                              
+
+ { + addImport(util.importStatement) + }} + className="flex items-center gap-1.5" + > + Import + +
+
+
+ ))} +
+
+
+ )} +
+ {controlVariables.length > 0 && (
diff --git a/app/components/output-options.tsx b/app/components/output-options.tsx index 3ddf0ec..bf2c0f1 100644 --- a/app/components/output-options.tsx +++ b/app/components/output-options.tsx @@ -5,13 +5,13 @@ * * Copyright Oxide Computer Company */ -import { useState } from 'react' +import { useEffect, useState } from 'react' import { InputSwitch } from '~/lib/ui/src' import { InputSelect } from '~/lib/ui/src/components/InputSelect/InputSelect' import { InputText } from '~/lib/ui/src/components/InputText/InputText' -import type { ColorMappingType, GridType, SourceType } from './ascii-art-generator' +import type { ColorMappingType, GridType } from './ascii-art-generator' import { AspectRatioInputNumber } from './aspect-ratio-input-number' import { Container } from './container' @@ -38,7 +38,6 @@ interface OutputOptionsProps { colorMapping: ColorMappingType }>, ) => void - sourceType: SourceType sourceImageDimensions?: { width: number; height: number } } @@ -73,10 +72,18 @@ const gridOptions: GridType[] = ['none', 'horizontal', 'vertical', 'both'] const colorMappingOptions: ColorMappingType[] = ['brightness', 'hue', 'saturation'] +const findMatchingCharacterSet = (characterSet: string): CharacterSet => { + for (const [key, value] of Object.entries(predefinedCharacterSets)) { + if (value === characterSet) { + return key as CharacterSet + } + } + return 'custom' +} + export function OutputOptions({ settings, updateSettings, - sourceType, sourceImageDimensions, }: OutputOptionsProps) { const [selectedCharSet, setSelectedCharSet] = useState('standard') @@ -94,46 +101,47 @@ export function OutputOptions({ setSelectedCharSet('custom') } + useEffect(() => { + const matchingSet = findMatchingCharacterSet(settings.characterSet) + setSelectedCharSet(matchingSet) + }, [settings.characterSet]) + return ( - {sourceType !== 'code' && ( - <> - - value={selectedCharSet as CharacterSet} - onChange={handleCharacterSetChange} - options={characterSets} - labelize={(label) => label} - placeholder="Select a character set" - > - Character Set - - -
- -
- - - value={settings.colorMapping} - onChange={(value) => updateSettings({ colorMapping: value })} - options={colorMappingOptions} - labelize={(option) => { - const labels = { - brightness: 'Brightness', - hue: 'Hue', - saturation: 'Saturation', - } - return labels[option] - }} - > - Color Mapping - - - )} + + value={selectedCharSet as CharacterSet} + onChange={handleCharacterSetChange} + options={characterSets} + labelize={(label) => label} + placeholder="Select a character set" + > + Character Set + + +
+ +
+ + + value={settings.colorMapping} + onChange={(value) => updateSettings({ colorMapping: value })} + options={colorMappingOptions} + labelize={(option) => { + const labels = { + brightness: 'Brightness', + hue: 'Hue', + saturation: 'Saturation', + } + return labels[option] + }} + > + Color Mapping + { updateSettings({ useImageAspectRatio: value }) - if (value && (sourceType === 'image' || sourceType === 'gif')) { - if (sourceImageDimensions) { - // Use stored dimensions if available - const aspectRatio = sourceImageDimensions.width / sourceImageDimensions.height - updateSettings({ aspectRatio }) - } + if (sourceImageDimensions) { + // Use stored dimensions if available + const aspectRatio = sourceImageDimensions.width / sourceImageDimensions.height + updateSettings({ aspectRatio }) } }} onAspectRatioChange={(value) => updateSettings({ aspectRatio: value })} - sourceType={sourceType} /> @@ -173,16 +178,14 @@ export function OutputOptions({ Grid Lines - {sourceType === 'image' && ( -
- updateSettings({ showUnderlyingImage: checked })} - > - Show Image - -
- )} +
+ updateSettings({ showUnderlyingImage: checked })} + > + Show Underlying Image + +
) } diff --git a/app/components/source-selector.tsx b/app/components/source-selector.tsx index 1c71cb9..878d1fb 100644 --- a/app/components/source-selector.tsx +++ b/app/components/source-selector.tsx @@ -12,7 +12,6 @@ import { useHotkeys } from 'react-hotkeys-hook' import { InputButton } from '~/lib/ui/src' -import type { SourceType } from './ascii-art-generator' import { Container } from './container' import { PasteConfirmationDialog } from './paste-confirmation' @@ -25,9 +24,9 @@ export function SourceSelector({ setShowCodeSidebar: (val: boolean) => void showCodeSidebar: boolean settings: { - type: SourceType data: string | null code: string + fileName: string | null } processFile: (file: File, dataUrl?: string) => boolean // Add this prop type }) { @@ -104,7 +103,7 @@ export function SourceSelector({
+ {settings.data && ( +
+
Source:
+
{settings.fileName}
+ {/**/} +
+ )}
) } diff --git a/app/components/spinner.tsx b/app/components/spinner.tsx new file mode 100644 index 0000000..bbd3bc2 --- /dev/null +++ b/app/components/spinner.tsx @@ -0,0 +1,78 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright Oxide Computer Company + */ + +import { useEffect, useRef, useState } from 'react' +import { useInterval } from 'usehooks-ts' + +export const Spinner = ({ className }: { className?: string }) => { + const chars = ['|', '/', '—', '\\'] + + const [loader, setLoader] = useState({ + char: chars[0], + index: 0, + }) + + useInterval(() => { + let index = loader.index + if (index < chars.length - 1) { + index++ + } else { + index = 0 + } + + setLoader({ + char: chars[index], + index: index, + }) + }, 150) + + return {loader.char} +} + +/** Overlay spinner that only shows after a delay */ +export const DelayedSpinner = ({ + isLoading, + delay = 250, +}: { + isLoading: boolean + delay?: number +}) => { + const [showSpinner, setShowSpinner] = useState(false) + const showTimeout = useRef(null) + + useEffect(() => { + if (isLoading) { + // Show spinner after delay + showTimeout.current = setTimeout(() => { + setShowSpinner(true) + }, delay) + } else { + // Clear timeout and hide spinner immediately when loading stops + if (showTimeout.current) { + clearTimeout(showTimeout.current) + showTimeout.current = null + } + setShowSpinner(false) + } + + return () => { + if (showTimeout.current) { + clearTimeout(showTimeout.current) + } + } + }, [isLoading, delay]) + + if (!showSpinner) return null + + return ( +
+ +
Initializing…
+
+ ) +} diff --git a/app/exampleImage.ts b/app/exampleImage.ts new file mode 100644 index 0000000..9167de1 --- /dev/null +++ b/app/exampleImage.ts @@ -0,0 +1,10 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright Oxide Computer Company + */ + +export const exampleImage = + 'data:image/png;base64,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' diff --git a/app/hooks/use-esbuild.tsx b/app/hooks/use-esbuild.tsx new file mode 100644 index 0000000..2b6471a --- /dev/null +++ b/app/hooks/use-esbuild.tsx @@ -0,0 +1,52 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright Oxide Computer Company + */ +import * as esbuild from 'esbuild-wasm' +import { useEffect, useRef, useState } from 'react' + +export type EsbuildService = typeof esbuild + +export function useEsbuild() { + const esbuildService = useRef(null) + const [isInitialized, setIsInitialized] = useState(false) + const [isInitializing, setIsInitializing] = useState(false) + const initializationAttempted = useRef(false) + + useEffect(() => { + const initializeEsbuild = async () => { + // Prevent double initialization in StrictMode + if (initializationAttempted.current) { + return + } + + initializationAttempted.current = true + setIsInitializing(true) + + try { + await esbuild.initialize({ + wasmURL: 'https://unpkg.com/esbuild-wasm@0.25.9/esbuild.wasm', + }) + esbuildService.current = esbuild + setIsInitialized(true) + } catch (error) { + console.error('Failed to initialize esbuild:', error) + setIsInitialized(false) + initializationAttempted.current = false // Allow retry on error + } finally { + setIsInitializing(false) + } + } + + initializeEsbuild() + }, []) + + return { + esbuildService: esbuildService.current, + isInitialized, + isInitializing, + } +} diff --git a/app/index.css b/app/index.css index b3e7ee9..e4c20b6 100644 --- a/app/index.css +++ b/app/index.css @@ -103,4 +103,31 @@ .dedent { @apply mt-2 flex flex-col gap-2 border-l py-1 pl-3 border-default; } + + /* Accordion animations */ + @keyframes slideDown { + from { + height: 0; + } + to { + height: var(--radix-accordion-content-height); + } + } + + @keyframes slideUp { + from { + height: var(--radix-accordion-content-height); + } + to { + height: 0; + } + } + + .animate-slideDown { + animation: slideDown 300ms cubic-bezier(0.87, 0, 0.13, 1); + } + + .animate-slideUp { + animation: slideUp 300ms cubic-bezier(0.87, 0, 0.13, 1); + } } diff --git a/app/lib/ascii-program.ts b/app/lib/ascii-program.ts index f241093..ce57db1 100644 --- a/app/lib/ascii-program.ts +++ b/app/lib/ascii-program.ts @@ -5,81 +5,87 @@ * * Copyright Oxide Computer Company */ -import type { Program } from './animation' -import type { Data } from './types' - -export async function createImageAsciiProgram( - asciiData: Data = {}, - width = 80, - height = 40, - frames?: Data[], - frameRate: number = 30, -): Promise { - const w = Math.max(1, width) - const h = Math.max(1, height) - - // Default program - const program: Program = { - settings: { - fps: frameRate, - cols: w, - rows: h, - }, - boot: (_context, _buffer, userData) => { - userData.asciiData = asciiData +/** + * Unified ASCII Program Generator + * + * This module provides a unified approach for creating ASCII art programs + * from both images and code. All programs are processed through the same + * pipeline using esbuild-wasm. + * + * Example usage: + * + * // For image data: + * const imageProgram = await createUnifiedImageProgram( + * imageData, // ImageData with 0-1 values + * 80, 40, // width, height + * frames, // optional animation frames + * 30, // frame rate + * { esbuildService } + * ) + * + * // For code: + * const codeProgram = await createUnifiedCodeProgram( + * userCode, // string containing main/boot/pre/post functions + * 80, 40, // width, height + * 30, // frame rate + * { esbuildService } + * ) + * + * // The generated code can import: + * // import { valueToChar, getImageValue } from '@/utils' + * // import { imageData, frames } from '@/imageData' + */ +import type { Program } from './animation' +import { ModuleProcessingResult } from './code-processor' - // If we have animation frames, store them - if (frames && frames.length > 0) { - userData.frames = frames - userData.isAnimated = true - userData.frameCount = frames.length - } - }, +export function generateImageCode(): string { + return ` +import { valueToChar, getImageValue } from '@/utils' +import { imageData, frames } from '@/imageData' +import { characterSet } from '@/settings' - main: (pos, context, _cursor, _buffer, userData) => { - const { x, y } = pos +const isAnimated = frames !== null && frames !== undefined +const frameCount = isAnimated ? frames.length : 0 - // If we have animation frames, use the current frame based on context.frame - if (userData.isAnimated && userData.frames) { - const frameIndex = context.frame % userData.frameCount - const currentFrame = userData.frames[frameIndex] +function main(pos, context) { + const { x, y } = pos - if (currentFrame && currentFrame[x] && currentFrame[x][y]) { - return { - char: currentFrame[x][y].char || ' ', - } - } - } - // Otherwise use the static data - else if (userData.asciiData && userData.asciiData[x] && userData.asciiData[x][y]) { - return { - char: userData.asciiData[x][y].char || ' ', - } - } + let value = 0 - return { - char: ' ', - } - }, + if (isAnimated && frames) { + const frameIndex = context.frame % frameCount + const currentFrame = frames[frameIndex] + value = getImageValue(currentFrame, x, y) + } else { + value = getImageValue(imageData, x, y) } - return program + return { + char: valueToChar(value, characterSet) + } +} +`.trim() } -export async function createCodeAsciiProgram( - width: number, - height: number, - frameRate: number, - programModuleLoader: { load: () => Promise }, +/** + * Creates a program from the unified processor result + */ +export async function createProgramFromProcessor( + processorResult: ModuleProcessingResult, + settings: { width: number; height: number; frameRate: number }, ): Promise { - const w = Math.max(1, width) - const h = Math.max(1, height) + if (!processorResult.success || !processorResult.module) { + return null + } + + const w = Math.max(1, settings.width) + const h = Math.max(1, settings.height) let programModule = null - if (typeof programModuleLoader.load === 'function') { + if (typeof processorResult.module.load === 'function') { try { - programModule = await programModuleLoader.load() + programModule = await processorResult.module.load() } catch (error) { console.error('Failed to load program module:', error) return null @@ -97,7 +103,7 @@ export async function createCodeAsciiProgram( // Default program const program: Program = { settings: { - fps: frameRate, + fps: settings.frameRate, cols: w, rows: h, }, diff --git a/app/lib/code-processor.ts b/app/lib/code-processor.ts new file mode 100644 index 0000000..5d2c3be --- /dev/null +++ b/app/lib/code-processor.ts @@ -0,0 +1,314 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright Oxide Computer Company + */ +import { BuildResult, Plugin } from 'esbuild-wasm' + +import { AsciiSettings } from '~/components/ascii-art-generator' +import { type EsbuildService } from '~/hooks/use-esbuild' + +import type { Program } from './animation' +import * as localUtils from './localUtils' + +// Cache for fetched modules +const moduleCache = new Map() + +export interface CodeProcessorOptions { + esbuildService: EsbuildService | null + timeout?: number + target?: string + imageData?: unknown + frames?: unknown[] + settings?: unknown +} + +interface LoadProcessedModule { + load(): Promise +} + +export interface ProcessedModule { + main?: Program['main'] + boot?: Program['boot'] + pre?: Program['pre'] + post?: Program['post'] +} + +export interface ModuleProcessingResult { + success: boolean + module?: LoadProcessedModule + error?: string + warnings?: string[] +} + +function isUrl(path: string): boolean { + return path.startsWith('https://') || path.startsWith('http://') +} + +function resolveUnpkgUrl(packageName: string): string { + return `https://unpkg.com/${packageName}?module` +} + +function handlePluginError(path: string, error: unknown) { + const message = error instanceof Error ? error.message : 'Unknown error' + console.error('Plugin error for:', path, message) + return { + errors: [ + { + text: `Failed to load module: ${message}`, + location: null, + }, + ], + } +} + +export async function processCodeModule( + code: string, + options: CodeProcessorOptions, +): Promise { + const { esbuildService, timeout = 5000 } = options + + try { + if (!esbuildService) { + throw new Error('esbuild service not provided') + } + + const result: BuildResult = await esbuildService.build({ + entryPoints: ['input.ts'], + bundle: true, + minify: false, + format: 'esm', + platform: 'browser', + write: false, + treeShaking: false, + plugins: [ + createLocalUtilsPlugin(), + createImageDataPlugin(options.imageData, options.frames), + createSettingsPlugin(options.settings), + createModuleResolutionPlugin(code), + ], + define: { + global: 'globalThis', + 'process.env.NODE_ENV': '"production"', + }, + external: [], + }) + + if (result.warnings.length > 0) { + console.warn('esbuild warnings:', result.warnings) + } + + if (!result.outputFiles || result.outputFiles.length === 0) { + throw new Error('No output files generated') + } + + const transformedCode = result.outputFiles[0].text + const moduleExports = await executeCodeSafely(transformedCode, timeout) + + return { + success: true, + module: { + async load() { + return moduleExports + }, + }, + warnings: result.warnings.map((w) => w.text), + } + } catch (error) { + console.error('Error processing code module:', error) + return { + success: false, + error: error instanceof Error ? error.message : 'Unknown error occurred', + } + } +} + +async function executeCodeSafely(code: string, timeout: number): Promise { + return new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => { + reject(new Error(`Code execution timed out after ${timeout}ms`)) + }, timeout) + + try { + const blob = new Blob([code], { type: 'application/javascript' }) + const moduleUrl = URL.createObjectURL(blob) + + import(moduleUrl) + .then((module) => { + URL.revokeObjectURL(moduleUrl) + clearTimeout(timeoutId) + resolve({ + main: module.main, + boot: module.boot, + pre: module.pre, + post: module.post, + }) + }) + .catch((error) => { + URL.revokeObjectURL(moduleUrl) + clearTimeout(timeoutId) + reject(error) + }) + } catch (error) { + clearTimeout(timeoutId) + reject(error) + } + }) +} + +function createLocalUtilsPlugin(): Plugin { + return { + name: 'local-utils-plugin', + setup(build) { + // Resolve local utils imports + build.onResolve({ filter: /^@\/utils$/ }, () => ({ + path: 'local-utils', + namespace: 'local', + })) + + // Load local utils + build.onLoad({ filter: /^local-utils$/, namespace: 'local' }, () => { + const utilsExports = Object.entries(localUtils) + .filter(([, value]) => typeof value === 'function') + .map(([key, fn]) => `export const ${key} = ${fn.toString()};`) + .join('\n') + + return { + loader: 'ts', + contents: `// Pattern generation utilities\n${utilsExports}`, + } + }) + }, + } +} + +function createImageDataPlugin(imageData?: unknown, frames?: unknown[]): Plugin { + return { + name: 'image-data-plugin', + setup(build) { + // Resolve image data imports + build.onResolve({ filter: /^@\/imageData$/ }, () => ({ + path: 'image-data', + namespace: 'imageData', + })) + + // Load image data + build.onLoad({ filter: /^image-data$/, namespace: 'imageData' }, () => { + const imageDataStr = imageData ? JSON.stringify(imageData, null, 2) : '{}' + const framesStr = frames ? JSON.stringify(frames, null, 2) : 'null' + + return { + loader: 'ts', + contents: `// Image data exports +export const imageData = ${imageDataStr}; +export const frames = ${framesStr};`, + } + }) + }, + } +} + +function createSettingsPlugin(settings?: unknown): Plugin { + return { + name: 'settings-plugin', + setup(build) { + // Resolve settings imports + build.onResolve({ filter: /^@\/settings$/ }, () => ({ + path: 'settings', + namespace: 'settings', + })) + + // Load settings + build.onLoad({ filter: /^settings$/, namespace: 'settings' }, () => { + const settingsObj = settings as AsciiSettings + const characterSet = settingsObj.output.characterSet || '@%#*+=-:. ' + + return { + loader: 'ts', + contents: `// Settings exports +export const characterSet = ${JSON.stringify(characterSet)};`, + } + }) + }, + } +} + +function createModuleResolutionPlugin(userCode: string): Plugin { + return { + name: 'module-resolution-plugin', + setup(build) { + // Handle entry point + build.onResolve({ filter: /^input\.ts$/ }, () => ({ + path: 'input.ts', + namespace: 'app', + })) + + // Handle relative imports + build.onResolve({ filter: /^\.+\// }, (args) => ({ + path: new URL(args.path, 'https://unpkg.com' + args.resolveDir + '/').href, + namespace: 'app', + })) + + // Handle npm packages and URLs + build.onResolve({ filter: /.*/ }, (args) => { + if (isUrl(args.path)) { + return { path: args.path, namespace: 'app' } + } + + const resolvedPath = resolveUnpkgUrl(args.path) + console.log('Resolved:', resolvedPath) + return { path: resolvedPath, namespace: 'app' } + }) + + // Load entry point with user code + build.onLoad({ filter: /^input\.ts$/, namespace: 'app' }, () => ({ + loader: 'ts', + contents: ` +${userCode} + +// Export functions if they exist +const _main = typeof main !== 'undefined' ? main : undefined; +const _boot = typeof boot !== 'undefined' ? boot : undefined; +const _pre = typeof pre !== 'undefined' ? pre : undefined; +const _post = typeof post !== 'undefined' ? post : undefined; + +export { _main as main, _boot as boot, _pre as pre, _post as post }; + `, + })) + + // Load external modules + build.onLoad({ filter: /.*/, namespace: 'app' }, async (args) => { + // Check cache first + const cachedContent = moduleCache.get(args.path) + if (cachedContent) { + return { + loader: 'ts', + contents: cachedContent, + resolveDir: new URL('./', args.path).pathname, + } + } + + // Fetch and cache + try { + const response = await fetch(args.path) + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`) + } + + const contents = await response.text() + moduleCache.set(args.path, contents) + + return { + loader: 'ts', + contents, + resolveDir: new URL('./', response.url).pathname, + } + } catch (error) { + return handlePluginError(args.path, error) + } + }) + }, + } +} diff --git a/app/lib/image-processor.ts b/app/lib/image-processor.ts index 047b186..12d4680 100644 --- a/app/lib/image-processor.ts +++ b/app/lib/image-processor.ts @@ -7,7 +7,7 @@ */ import type { AsciiSettings } from '~/components/ascii-art-generator' -import type { Data } from './types' +import type { AsciiImageData } from './types' // Types export interface CachedMediaData { @@ -16,7 +16,7 @@ export interface CachedMediaData { rawFrames: MediaFrame[] processedFrames?: { settings: MediaProcessingSettings - frames: Data[] + frames: AsciiImageData[] } } @@ -45,12 +45,12 @@ export type MediaProcessingSettings = { colorMapping: string } -export type ProcessingResult = { - data: Data +export type ImageProcessingResult = { + data: AsciiImageData width: number height: number processedImageUrl?: string - frames?: Data[] + frames?: AsciiImageData[] rawFrames?: MediaFrame[] frameCount?: number sourceFps?: number @@ -62,12 +62,12 @@ export async function processAnimatedMedia( settings: AsciiSettings, progressCallback?: (frame: number) => void, ): Promise<{ - frames: Data[] - firstFrameData: Data + frames: AsciiImageData[] + firstFrameData: AsciiImageData firstFrameUrl: string | null }> { - const processedFrames: Data[] = [] - let firstFrameData: Data = {} + const processedFrames: AsciiImageData[] = [] + let firstFrameData: AsciiImageData = {} let firstFrameUrl: string | null = null for (let i = 0; i < rawFrames.length; i++) { @@ -96,9 +96,9 @@ export async function processImage( imageData: string, settings: AsciiSettings, extractFrames: boolean = false, -): Promise { +): Promise { return new Promise((resolve) => { - if (extractFrames && settings.source.type === 'gif') { + if (extractFrames && imageData.includes('data:image/gif')) { handleGifExtraction(imageData, settings, resolve) return } @@ -137,17 +137,15 @@ export async function processImage( } // Helper functions -function createFallbackResponse(settings: AsciiSettings): ProcessingResult { +function createFallbackResponse(settings: AsciiSettings): ImageProcessingResult { const width = settings.output.columns || 80 const height = settings.output.rows || 40 - const data: Data = {} + const data: AsciiImageData = {} for (let x = 0; x < width; x++) { data[x] = {} for (let y = 0; y < height; y++) { - data[x][y] = { - char: '?', - } + data[x][y] = 0.5 // Default to middle density } } @@ -158,7 +156,7 @@ async function processImageData( sourceCanvas: HTMLCanvasElement, settings: AsciiSettings, ): Promise<{ - data: Data + data: AsciiImageData processedImageUrl?: string }> { const ctx = sourceCanvas.getContext('2d')! @@ -271,11 +269,10 @@ function convertPixelsToAscii( width: number, height: number, settings: AsciiSettings, -): Data { - const characterSet = settings.output.characterSet +): AsciiImageData { const colorMapping = settings.output.colorMapping - const data: Data = {} + const data: AsciiImageData = {} for (let y = 0; y < height; y++) { for (let x = 0; x < width; x++) { @@ -312,18 +309,15 @@ function convertPixelsToAscii( settings.preprocessing.whitePoint, ) - // Map to character - const charIndex = Math.floor((mappingValue / 255) * (characterSet.length - 1)) - const char = characterSet[charIndex] || ' ' + // Convert to 0-1 value + const normalizedValue = mappingValue / 255 // Initialize column if needed if (!data[x]) { data[x] = {} } - data[x][y] = { - char, - } + data[x][y] = normalizedValue } } @@ -544,7 +538,7 @@ function applyBayer(data: Uint8ClampedArray, width: number, height: number) { function handleGifExtraction( imageData: string, settings: AsciiSettings, - resolve: (value: ProcessingResult) => void, + resolve: (value: ImageProcessingResult) => void, ) { const img = new Image() img.onload = async () => { @@ -589,10 +583,10 @@ async function extractFirstGifFrame(img: HTMLImageElement, settings: AsciiSettin async function extractMultipleGifFrames( img: HTMLImageElement, - initialFrame: { data: Data; processedImageUrl?: string }, + initialFrame: { data: AsciiImageData; processedImageUrl?: string }, settings: AsciiSettings, -): Promise { - const frames: Data[] = [initialFrame.data] +): Promise { + const frames: AsciiImageData[] = [initialFrame.data] const totalFrames = Math.min(24, settings.animation.animationLength) try { @@ -628,9 +622,9 @@ async function loadGifFrame( frameImg: HTMLImageElement, originalImg: HTMLImageElement, frameIndex: number, - initialFrame: { data: Data; processedImageUrl?: string }, + initialFrame: { data: AsciiImageData; processedImageUrl?: string }, settings: AsciiSettings, -): Promise { +): Promise { return new Promise((resolveFrame) => { frameImg.onload = async () => { const frameCanvas = document.createElement('canvas') @@ -659,30 +653,3 @@ async function loadGifFrame( frameImg.src = originalImg.src + cacheBuster }) } - -// Code module processing -export function processCodeModule(code: string) { - try { - const wrappedCode = ` - ${code} - return { - main: typeof main === 'function' ? main : undefined, - boot: typeof boot === 'function' ? boot : undefined, - pre: typeof pre === 'function' ? pre : undefined, - post: typeof post === 'function' ? post : undefined - }; - ` - - const moduleFn = new Function(wrappedCode) - const moduleExports = moduleFn() - - return { - async load() { - return moduleExports - }, - } - } catch (error) { - console.error('Error preparing user code module:', error) - return null - } -} diff --git a/app/lib/localUtils/image.ts b/app/lib/localUtils/image.ts new file mode 100644 index 0000000..ac42c96 --- /dev/null +++ b/app/lib/localUtils/image.ts @@ -0,0 +1,40 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright Oxide Computer Company + */ + +/** + * Converts a 0-1 value to an ASCII character for rendering + * @param value - Normalized value between 0 and 1 + * @param chars - Optional character set to use (defaults to density-based ASCII) + * @returns ASCII character representing the value + */ +export function valueToChar(value: number, chars?: string): string { + // Clamp value between 0 and 1 + const clampedValue = Math.max(0, Math.min(1, value)) + + // Default ASCII density characters (from darkest to lightest) + const defaultChars = '@%#*+=-:. ' + const charSet = chars || defaultChars + + // Map value to character index + const index = Math.floor(clampedValue * (charSet.length - 1)) + return charSet[index] +} + +/** + * Gets a value from 2D image data array + * @param data - 2D array of 0-1 values [x][y] + * @param x - X coordinate + * @param y - Y coordinate + * @returns Value at coordinates or 0 if out of bounds + */ +export function getImageValue(data: number[][], x: number, y: number): number { + if (!data || !data[x] || data[x][y] === undefined) { + return 0 + } + return data[x][y] +} diff --git a/app/lib/localUtils/index.ts b/app/lib/localUtils/index.ts new file mode 100644 index 0000000..7f8eae1 --- /dev/null +++ b/app/lib/localUtils/index.ts @@ -0,0 +1,10 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright Oxide Computer Company + */ + +export * from './patterns' +export * from './image' diff --git a/app/lib/localUtils/patterns.ts b/app/lib/localUtils/patterns.ts new file mode 100644 index 0000000..28ba051 --- /dev/null +++ b/app/lib/localUtils/patterns.ts @@ -0,0 +1,45 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright Oxide Computer Company + */ + +/** + * Generates a checkerboard pattern value for given coordinates + * @param x - X coordinate of the cell + * @param y - Y coordinate of the cell + * @param size - Size of each checker square + * @returns 0 or 1 representing the checkerboard pattern + */ +export function checkerboard(x: number, y: number, size: number = 8): number { + const checkerX = Math.floor(x / size) + const checkerY = Math.floor(y / size) + return (checkerX + checkerY) % 2 +} + +/** + * Generates a striped pattern value for given coordinates + * @param x - X coordinate of the cell + * @param y - Y coordinate of the cell + * @param stripeWidth - Width of each stripe + * @param direction - Direction of stripes ('horizontal' | 'vertical' | 'diagonal') + * @returns 0 or 1 representing the striped pattern + */ +export function stripes( + x: number, + y: number, + stripeWidth: number = 4, + direction: 'horizontal' | 'vertical' | 'diagonal' = 'vertical', +): number { + switch (direction) { + case 'horizontal': + return Math.floor(y / stripeWidth) % 2 + case 'diagonal': + return Math.floor((x + y) / stripeWidth) % 2 + case 'vertical': + default: + return Math.floor(x / stripeWidth) % 2 + } +} diff --git a/app/lib/types.ts b/app/lib/types.ts index ce3c0d7..98308d8 100644 --- a/app/lib/types.ts +++ b/app/lib/types.ts @@ -18,6 +18,12 @@ export interface Data { } } +export interface AsciiImageData { + [x: number]: { + [y: number]: number // 0-1 values + } +} + export const emptyCell: Cell = { char: ' ', } diff --git a/app/scripts/sin.ts b/app/scripts/sin.ts new file mode 100644 index 0000000..7e6ff98 --- /dev/null +++ b/app/scripts/sin.ts @@ -0,0 +1,35 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright Oxide Computer Company + */ + +export const sin = `/** +@author ertdfgcvb +@url https://play.ertdfgcvb.xyz/#/src/basics/time_milliseconds +*/ +import { characterSet } from '@/settings' + +const speed = 1; //~ number 0-10 step=0.5 +const amplitude = 18; //~ number 1-50 + +// Renders each cell +function main(coord, context, cursor, buffer) { + const t = context.frame * 0.01 * speed + const x = coord.x + const y = coord.y + const o = Math.sin(y * Math.sin(t) * 0.2 + x * 0.04 + t) * amplitude + const i = Math.round(Math.abs(x + y + o)) % characterSet.length + return characterSet[i] +} + +// Optional: Runs once at startup +function boot(context, buffer, userData) {} + +// Optional: Runs at the start of each frame +function pre(context, cursor, buffer, userData) {} + +// Optional: Runs after each frame is complete +function post(context, cursor, buffer, userData) {}` diff --git a/app/scripts/unpkg-demo.ts b/app/scripts/unpkg-demo.ts new file mode 100644 index 0000000..abec3cf --- /dev/null +++ b/app/scripts/unpkg-demo.ts @@ -0,0 +1,40 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright Oxide Computer Company + */ + +export const unpkgDemo = `import { createNoise2D } from 'simplex-noise' + +const speed = 2; //~ number 0-100 step=1 +const scaleX = 3.45; //~ number 1-50 +const scaleY = 2; //~ number 1-50 + +let noise2D +const characters = ' .:-=' + +function boot() { + noise2D = createNoise2D() +} + +function main(coord, context, cursor, buffer) { + const { x, y } = coord + const { cols, rows } = context + + // Normalize coordinates + const nx = x / cols + const ny = y / rows + + const time = context.frame * speed * 0.001 + + const noise = noise2D(nx * scaleX + time, ny * scaleY + time * 0.5) * 0.5 + + // Map to character index + const normalized = (noise + 1) * 0.5 // Convert from [-1,1] to [0,1] + const charIndex = Math.floor(normalized * characters.length) + const clampedIndex = Math.max(0, Math.min(charIndex, characters.length - 1)) + + return characters[clampedIndex] +}` diff --git a/app/templates.ts b/app/templates.ts index ce20ba5..f23ff23 100644 --- a/app/templates.ts +++ b/app/templates.ts @@ -7,44 +7,19 @@ */ import { AsciiSettings } from './components/ascii-art-generator' import { predefinedCharacterSets } from './components/output-options' +import { exampleImage } from './exampleImage' import { clock } from './scripts/clock' import { coins } from './scripts/coins' import { numbers } from './scripts/numbers' - -export const DEFAULT_CODE = `/** -@author ertdfgcvb -@url https://play.ertdfgcvb.xyz/#/src/basics/time_milliseconds -*/ - -const pattern = 'ABCxyz01═|+:. '; //~ text -const speed = 1; //~ number 0-10 step=0.5 -const amplitude = 18; //~ number 1-50 - -// Renders each cell -function main(coord, context, cursor, buffer) { - const t = context.frame * 0.01 * speed - const x = coord.x - const y = coord.y - const o = Math.sin(y * Math.sin(t) * 0.2 + x * 0.04 + t) * amplitude - const i = Math.round(Math.abs(x + y + o)) % pattern.length - return pattern[i] -} - -// Optional: Runs once at startup -function boot(context, buffer, userData) {} - -// Optional: Runs at the start of each frame -function pre(context, cursor, buffer, userData) {} - -// Optional: Runs after each frame is complete -function post(context, cursor, buffer, userData) {}` +import { sin } from './scripts/sin' +import { unpkgDemo } from './scripts/unpkg-demo' export const DEFAULT_SETTINGS: AsciiSettings = { meta: { name: 'Default' }, source: { - type: 'image', data: null, - code: DEFAULT_CODE, + code: '', + fileName: '', }, preprocessing: { brightness: 0, @@ -76,13 +51,21 @@ export const DEFAULT_SETTINGS: AsciiSettings = { } export const TEMPLATES = { - default: DEFAULT_SETTINGS, + sin: { + ...DEFAULT_SETTINGS, + meta: { name: 'Sin' }, + source: { data: null, code: sin }, + animation: { + animationLength: 900, + frameRate: 15, + }, + }, custom: { ...DEFAULT_SETTINGS, meta: { name: 'Custom Project' } }, clock: { ...DEFAULT_SETTINGS, meta: { name: 'Clock' }, - source: { type: 'code', data: null, code: clock }, - output: { ...DEFAULT_SETTINGS, columns: 61, rows: 9, grid: 'both' }, + source: { data: null, code: clock }, + output: { ...DEFAULT_SETTINGS.output, columns: 61, rows: 9, grid: 'both' }, animation: { animationLength: 900, frameRate: 15, @@ -91,8 +74,8 @@ export const TEMPLATES = { numbers: { ...DEFAULT_SETTINGS, meta: { name: 'Numbers' }, - source: { type: 'code', data: null, code: numbers }, - output: { ...DEFAULT_SETTINGS, columns: 98, rows: 9, grid: 'both' }, + source: { data: null, code: numbers }, + output: { ...DEFAULT_SETTINGS.output, columns: 98, rows: 9, grid: 'both' }, animation: { animationLength: 1, frameRate: 1, @@ -101,8 +84,73 @@ export const TEMPLATES = { coins: { ...DEFAULT_SETTINGS, meta: { name: 'Coins' }, - source: { type: 'code', data: null, code: coins }, - output: { ...DEFAULT_SETTINGS, columns: 120, rows: 40, grid: 'none' }, + source: { data: null, code: coins }, + output: { ...DEFAULT_SETTINGS.output, columns: 120, rows: 40, grid: 'none' }, + animation: { + animationLength: 100, + frameRate: 30, + }, + }, + unpkgDemo: { + ...DEFAULT_SETTINGS, + meta: { name: 'Perlin Noise (Unpkg)' }, + source: { data: null, code: unpkgDemo }, + output: { ...DEFAULT_SETTINGS.output, columns: 80, rows: 40, grid: 'none' }, + animation: { + animationLength: 300, + frameRate: 30, + }, + }, + localPattern: { + ...DEFAULT_SETTINGS, + meta: { name: 'Local Pattern' }, + source: { + data: null, + code: `import { checkerboard } from '@/utils' + +function main(coord, context, cursor, buffer) { + const value = checkerboard(coord.x, coord.y, 4) + return value === 1 ? '█' : ' ' +}`, + }, + output: { ...DEFAULT_SETTINGS.output, columns: 80, rows: 24, grid: 'both' }, + animation: { + animationLength: 1, + frameRate: 1, + }, + }, + imageCode: { + ...DEFAULT_SETTINGS, + meta: { name: 'Image code' }, + source: { + data: exampleImage, + fileName: 'example-grad.png', + code: `import { valueToChar, getImageValue } from '@/utils' +import { imageData, frames } from '@/imageData' +import { characterSet } from '@/settings' + +const speed = 4; //~ number 0-20 step=1 + +const { sin, abs } = Math + +function main(pos, context) { + const { x, y } = pos + + let value = getImageValue(imageData, x, y) + + const mod = abs(sin(y + context.frame * speed * 0.01)) + return { + char: valueToChar(value * mod, characterSet) + } +}`, + }, + output: { + ...DEFAULT_SETTINGS.output, + characterSet: '=-:. ', + columns: 80, + rows: 40, + grid: 'none', + }, animation: { animationLength: 100, frameRate: 30, @@ -111,6 +159,3 @@ export const TEMPLATES = { } export type TemplateType = keyof typeof TEMPLATES - -export const exampleImage = - 'data:image/png;base64,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' diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..1ccdca5 --- /dev/null +++ b/bun.lock @@ -0,0 +1,1521 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "mitos", + "dependencies": { + "@ariakit/react": "^0.4.15", + "@codemirror/lang-javascript": "^6.2.3", + "@codemirror/language": "^6.11.0", + "@codemirror/state": "^6.5.2", + "@codemirror/view": "^6.36.4", + "@ffmpeg/ffmpeg": "^0.12.15", + "@ffmpeg/util": "^0.12.2", + "@ianvs/prettier-plugin-sort-imports": "^4.4.1", + "@oxide/design-system": "^2.5.0", + "@radix-ui/react-accordion": "^1.2.11", + "@react-hook/resize-observer": "^2.0.2", + "@uiw/react-codemirror": "^4.23.10", + "clsx": "^2.1.1", + "esbuild-wasm": "^0.25.9", + "eslint-config-prettier": "^10.1.1", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-prettier": "^5.2.3", + "eslint-plugin-react": "^7.37.4", + "file-saver": "^2.0.5", + "gifuct-js": "^2.1.2", + "html2canvas-pro": "^1.5.8", + "jszip": "^3.10.1", + "motion": "^12.16.0", + "prettier": "^3.5.3", + "prettier-plugin-tailwindcss": "^0.6.11", + "react": "^19.0.0", + "react-aria": "^3.38.1", + "react-dom": "^19.0.0", + "react-hotkeys-hook": "^4.6.1", + "react-stately": "^3.36.1", + "remeda": "^2.21.2", + "sonner": "^2.0.2", + "tailwind-merge": "^2.5.5", + "tailwindcss-animate": "^1.0.7", + "usehooks-ts": "^3.1.1", + "vite-tsconfig-paths": "^5.1.4", + }, + "devDependencies": { + "@eslint/compat": "^1.2.8", + "@eslint/js": "^9.21.0", + "@types/bun": "^1.2.19", + "@types/file-saver": "^2.0.7", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.22.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "postcss": "^8", + "tailwindcss": "^3.4.17", + "typescript": "~5.7.2", + "typescript-eslint": "^8.24.1", + "vite": "^6.2.0", + }, + }, + }, + "packages": { + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@ariakit/core": ["@ariakit/core@0.4.15", "", {}, "sha512-vvxmZvkNhiisKM+Y1TbGMUfVVchV/sWu9F0xw0RYADXcimWPK31dd9JnIZs/OQ5pwAryAHmERHwuGQVESkSjwQ=="], + + "@ariakit/react": ["@ariakit/react@0.4.17", "", { "dependencies": { "@ariakit/react-core": "0.4.17" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-HQaIboE2axtlncJz1hRTaiQfJ1GGjhdtNcAnPwdjvl2RybfmlHowIB+HTVBp36LzroKPs/M4hPCxk7XTaqRZGg=="], + + "@ariakit/react-core": ["@ariakit/react-core@0.4.17", "", { "dependencies": { "@ariakit/core": "0.4.15", "@floating-ui/dom": "^1.0.0", "use-sync-external-store": "^1.2.0" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-kFF6n+gC/5CRQIyaMTFoBPio2xUe0k9rZhMNdUobWRmc/twfeLVkODx+8UVYaNyKilTge8G0JFqwvFKku/jKEw=="], + + "@asciidoctor/core": ["@asciidoctor/core@3.0.4", "", { "dependencies": { "@asciidoctor/opal-runtime": "3.0.1", "unxhr": "1.2.0" } }, "sha512-41SDMi7iRRBViPe0L6VWFTe55bv6HEOJeRqMj5+E5wB1YPdUPuTucL4UAESPZM6OWmn4t/5qM5LusXomFUVwVQ=="], + + "@asciidoctor/opal-runtime": ["@asciidoctor/opal-runtime@3.0.1", "", { "dependencies": { "glob": "8.1.0", "unxhr": "1.2.0" } }, "sha512-iW7ACahOG0zZft4A/4CqDcc7JX+fWRNjV5tFAVkNCzwZD+EnFolPaUOPYt8jzadc0+Bgd80cQTtRMQnaaV1kkg=="], + + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + + "@babel/compat-data": ["@babel/compat-data@7.27.5", "", {}, "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg=="], + + "@babel/core": ["@babel/core@7.27.4", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.4", "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.27.4", "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g=="], + + "@babel/generator": ["@babel/generator@7.27.5", "", { "dependencies": { "@babel/parser": "^7.27.5", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.27.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helpers": ["@babel/helpers@7.27.6", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.27.6" } }, "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug=="], + + "@babel/parser": ["@babel/parser@7.27.5", "", { "dependencies": { "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" } }, "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg=="], + + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], + + "@babel/runtime": ["@babel/runtime@7.27.6", "", {}, "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q=="], + + "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], + + "@babel/traverse": ["@babel/traverse@7.27.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA=="], + + "@babel/types": ["@babel/types@7.27.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q=="], + + "@codemirror/autocomplete": ["@codemirror/autocomplete@6.18.6", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0" } }, "sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg=="], + + "@codemirror/commands": ["@codemirror/commands@6.8.1", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.4.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } }, "sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw=="], + + "@codemirror/lang-javascript": ["@codemirror/lang-javascript@6.2.4", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA=="], + + "@codemirror/language": ["@codemirror/language@6.11.1", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.23.0", "@lezer/common": "^1.1.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0", "style-mod": "^4.0.0" } }, "sha512-5kS1U7emOGV84vxC+ruBty5sUgcD0te6dyupyRVG2zaSjhTDM73LhVKUtVwiqSe6QwmEoA4SCiU8AKPFyumAWQ=="], + + "@codemirror/lint": ["@codemirror/lint@6.8.5", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.35.0", "crelt": "^1.0.5" } }, "sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA=="], + + "@codemirror/search": ["@codemirror/search@6.5.11", "", { "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "crelt": "^1.0.5" } }, "sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA=="], + + "@codemirror/state": ["@codemirror/state@6.5.2", "", { "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA=="], + + "@codemirror/theme-one-dark": ["@codemirror/theme-one-dark@6.1.2", "", { "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/highlight": "^1.0.0" } }, "sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA=="], + + "@codemirror/view": ["@codemirror/view@6.37.1", "", { "dependencies": { "@codemirror/state": "^6.5.0", "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "sha512-Qy4CAUwngy/VQkEz0XzMKVRcckQuqLYWKqVpDDDghBe5FSXSqfVrJn49nw3ePZHxRUz4nRmb05Lgi+9csWo4eg=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.5", "", { "os": "android", "cpu": "arm" }, "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.5", "", { "os": "android", "cpu": "arm64" }, "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.5", "", { "os": "android", "cpu": "x64" }, "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.5", "", { "os": "linux", "cpu": "arm" }, "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.5", "", { "os": "linux", "cpu": "x64" }, "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.5", "", { "os": "none", "cpu": "arm64" }, "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.5", "", { "os": "none", "cpu": "x64" }, "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.5", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.5", "", { "os": "win32", "cpu": "x64" }, "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/compat": ["@eslint/compat@1.2.9", "", { "peerDependencies": { "eslint": "^9.10.0" } }, "sha512-gCdSY54n7k+driCadyMNv8JSPzYLeDVM/ikZRtvtROBpRdFSkS8W9A82MqsaY7lZuwL0wiapgD0NT1xT0hyJsA=="], + + "@eslint/config-array": ["@eslint/config-array@0.20.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.2.2", "", {}, "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg=="], + + "@eslint/core": ["@eslint/core@0.14.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.28.0", "", {}, "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.1", "", { "dependencies": { "@eslint/core": "^0.14.0", "levn": "^0.4.1" } }, "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w=="], + + "@ffmpeg/ffmpeg": ["@ffmpeg/ffmpeg@0.12.15", "", { "dependencies": { "@ffmpeg/types": "^0.12.4" } }, "sha512-1C8Obr4GsN3xw+/1Ww6PFM84wSQAGsdoTuTWPOj2OizsRDLT4CXTaVjPhkw6ARyDus1B9X/L2LiXHqYYsGnRFw=="], + + "@ffmpeg/types": ["@ffmpeg/types@0.12.4", "", {}, "sha512-k9vJQNBGTxE5AhYDtOYR5rO5fKsspbg51gbcwtbkw2lCdoIILzklulcjJfIDwrtn7XhDeF2M+THwJ2FGrLeV6A=="], + + "@ffmpeg/util": ["@ffmpeg/util@0.12.2", "", {}, "sha512-ouyoW+4JB7WxjeZ2y6KpRvB+dLp7Cp4ro8z0HIVpZVCM7AwFlHa0c4R8Y/a4M3wMqATpYKhC7lSFHQ0T11MEDw=="], + + "@floating-ui/core": ["@floating-ui/core@1.7.1", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.7.1", "", { "dependencies": { "@floating-ui/core": "^1.7.1", "@floating-ui/utils": "^0.2.9" } }, "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ=="], + + "@floating-ui/react": ["@floating-ui/react@0.27.12", "", { "dependencies": { "@floating-ui/react-dom": "^2.1.3", "@floating-ui/utils": "^0.2.9", "tabbable": "^6.0.0" }, "peerDependencies": { "react": ">=17.0.0", "react-dom": ">=17.0.0" } }, "sha512-kKlWNrpIQxF1B/a2MZvE0/uyKby4960yjO91W7nVyNKmmfNi62xU9HCjL1M1eWzx/LFj/VPSwJVbwQk9Pq/68A=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.3", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="], + + "@formatjs/ecma402-abstract": ["@formatjs/ecma402-abstract@2.3.4", "", { "dependencies": { "@formatjs/fast-memoize": "2.2.7", "@formatjs/intl-localematcher": "0.6.1", "decimal.js": "^10.4.3", "tslib": "^2.8.0" } }, "sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA=="], + + "@formatjs/fast-memoize": ["@formatjs/fast-memoize@2.2.7", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ=="], + + "@formatjs/icu-messageformat-parser": ["@formatjs/icu-messageformat-parser@2.11.2", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.4", "@formatjs/icu-skeleton-parser": "1.8.14", "tslib": "^2.8.0" } }, "sha512-AfiMi5NOSo2TQImsYAg8UYddsNJ/vUEv/HaNqiFjnI3ZFfWihUtD5QtuX6kHl8+H+d3qvnE/3HZrfzgdWpsLNA=="], + + "@formatjs/icu-skeleton-parser": ["@formatjs/icu-skeleton-parser@1.8.14", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.4", "tslib": "^2.8.0" } }, "sha512-i4q4V4qslThK4Ig8SxyD76cp3+QJ3sAqr7f6q9VVfeGtxG9OhiAk3y9XF6Q41OymsKzsGQ6OQQoJNY4/lI8TcQ=="], + + "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.6.1", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg=="], + + "@headlessui/react": ["@headlessui/react@2.2.4", "", { "dependencies": { "@floating-ui/react": "^0.26.16", "@react-aria/focus": "^3.20.2", "@react-aria/interactions": "^3.25.0", "@tanstack/react-virtual": "^3.13.9", "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-lz+OGcAH1dK93rgSMzXmm1qKOJkBUqZf1L4M8TWLNplftQD3IkoEDdUFNfAn4ylsN6WOTVtWaLmvmaHOUk1dTA=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@ianvs/prettier-plugin-sort-imports": ["@ianvs/prettier-plugin-sort-imports@4.4.2", "", { "dependencies": { "@babel/generator": "^7.26.2", "@babel/parser": "^7.26.2", "@babel/traverse": "^7.25.9", "@babel/types": "^7.26.0", "semver": "^7.5.2" }, "peerDependencies": { "@vue/compiler-sfc": "2.7.x || 3.x", "prettier": "2 || 3 || ^4.0.0-0" }, "optionalPeers": ["@vue/compiler-sfc"] }, "sha512-KkVFy3TLh0OFzimbZglMmORi+vL/i2OFhEs5M07R9w0IwWAGpsNNyE4CY/2u0YoMF5bawKC2+8/fUH60nnNtjw=="], + + "@internationalized/date": ["@internationalized/date@3.8.2", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA=="], + + "@internationalized/message": ["@internationalized/message@3.1.8", "", { "dependencies": { "@swc/helpers": "^0.5.0", "intl-messageformat": "^10.1.0" } }, "sha512-Rwk3j/TlYZhn3HQ6PyXUV0XP9Uv42jqZGNegt0BXlxjE6G3+LwHjbQZAGHhCnCPdaA6Tvd3ma/7QzLlLkJxAWA=="], + + "@internationalized/number": ["@internationalized/number@3.6.3", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-p+Zh1sb6EfrfVaS86jlHGQ9HA66fJhV9x5LiE5vCbZtXEHAuhcmUZUdZ4WrFpUBfNalr2OkAJI5AcKEQF+Lebw=="], + + "@internationalized/string": ["@internationalized/string@3.2.7", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-D4OHBjrinH+PFZPvfCXvG28n2LSykWcJ7GIioQL+ok0LON15SdfoUssoHzzOUmVZLbRoREsQXVzA6r8JKsbP6A=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@lezer/common": ["@lezer/common@1.2.3", "", {}, "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA=="], + + "@lezer/highlight": ["@lezer/highlight@1.2.1", "", { "dependencies": { "@lezer/common": "^1.0.0" } }, "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA=="], + + "@lezer/javascript": ["@lezer/javascript@1.5.1", "", { "dependencies": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.1.3", "@lezer/lr": "^1.3.0" } }, "sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw=="], + + "@lezer/lr": ["@lezer/lr@1.4.2", "", { "dependencies": { "@lezer/common": "^1.0.0" } }, "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA=="], + + "@marijn/find-cluster-break": ["@marijn/find-cluster-break@1.0.2", "", {}, "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@oxide/design-system": ["@oxide/design-system@2.7.0", "", { "dependencies": { "@floating-ui/react": "^0.27.4", "@headlessui/react": "^2.2.0", "@radix-ui/react-accordion": "^1.2.2", "@radix-ui/react-tabs": "^1.1.3", "classnames": "^2.5.1", "shiki": "^1.24.0" }, "peerDependencies": { "@asciidoctor/core": "^3.0.0", "@oxide/react-asciidoc": "^1.0.4", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-W/RruOKkZ8q0aezWNpnO9FCTo+CWFSRzrl9afKzhGxnB1v9405c8Kx/JvlH5tXc6GK9uRuLKavDI6sN3Ci1d4Q=="], + + "@oxide/react-asciidoc": ["@oxide/react-asciidoc@1.1.3", "", { "dependencies": { "html-react-parser": "^5.1.15" }, "peerDependencies": { "@asciidoctor/core": "^3.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-enuuEK1Ebg+ULi1DhLhJN4yZscwGHRDmId1ABc9W/1mgrV3Z5D+fGRGBiJK2aqx7AgWHUXf85VhIau+xjDGcjA=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@pkgr/core": ["@pkgr/core@0.2.7", "", {}, "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg=="], + + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="], + + "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collapsible": "1.1.11", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A=="], + + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg=="], + + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], + + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], + + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA=="], + + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.10", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], + + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], + + "@react-aria/breadcrumbs": ["@react-aria/breadcrumbs@3.5.25", "", { "dependencies": { "@react-aria/i18n": "^3.12.10", "@react-aria/link": "^3.8.2", "@react-aria/utils": "^3.29.1", "@react-types/breadcrumbs": "^3.7.14", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-c8Ipp7EoFXlPKpOUJne6JlG823KwtqMyFsTpU0LS0DE9IEfnAIKanc5X+kChNmooKHq4V8QNyUxTf8WyBKU9+Q=="], + + "@react-aria/button": ["@react-aria/button@3.13.2", "", { "dependencies": { "@react-aria/interactions": "^3.25.2", "@react-aria/toolbar": "3.0.0-beta.17", "@react-aria/utils": "^3.29.1", "@react-stately/toggle": "^3.8.5", "@react-types/button": "^3.12.2", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-iPlSR225CSOit+57SrDfEF3lDuQvjRBYj1HFyGsLk91HfV3vDRgkKiou8uhOHk+B3afGJRwot8/Sr9MvNOfeQg=="], + + "@react-aria/calendar": ["@react-aria/calendar@3.8.2", "", { "dependencies": { "@internationalized/date": "^3.8.2", "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/live-announcer": "^3.4.3", "@react-aria/utils": "^3.29.1", "@react-stately/calendar": "^3.8.2", "@react-types/button": "^3.12.2", "@react-types/calendar": "^3.7.2", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-RXVECPB3gP5SZvfKwlqLKCWEFzJh6AcDQQSRkArlyLyHRAHHcniKO3hW90pRWKmEUSVUAZdoCA6XkRL3dXGYXw=="], + + "@react-aria/checkbox": ["@react-aria/checkbox@3.15.6", "", { "dependencies": { "@react-aria/form": "^3.0.17", "@react-aria/interactions": "^3.25.2", "@react-aria/label": "^3.7.19", "@react-aria/toggle": "^3.11.4", "@react-aria/utils": "^3.29.1", "@react-stately/checkbox": "^3.6.15", "@react-stately/form": "^3.1.5", "@react-stately/toggle": "^3.8.5", "@react-types/checkbox": "^3.9.5", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-5OHrrihjCNBRB93KysXfHZBLUSGh43fC3DTfH9LWDxfpo38//VkaDXZezA0zg+a43D3kTq6tOSNgHq3sUk/Q5Q=="], + + "@react-aria/color": ["@react-aria/color@3.0.8", "", { "dependencies": { "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/numberfield": "^3.11.15", "@react-aria/slider": "^3.7.20", "@react-aria/spinbutton": "^3.6.16", "@react-aria/textfield": "^3.17.4", "@react-aria/utils": "^3.29.1", "@react-aria/visually-hidden": "^3.8.24", "@react-stately/color": "^3.8.6", "@react-stately/form": "^3.1.5", "@react-types/color": "^3.0.6", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-zGEptdwSCcLS/Z+LARmCyv4ptLIYtLIXHtgFSDAaF5ssY0whMOT0yAmOJz4T4ldnaWbBsLIz9O3PbUzNy83L2A=="], + + "@react-aria/combobox": ["@react-aria/combobox@3.12.4", "", { "dependencies": { "@react-aria/focus": "^3.20.4", "@react-aria/i18n": "^3.12.10", "@react-aria/listbox": "^3.14.5", "@react-aria/live-announcer": "^3.4.3", "@react-aria/menu": "^3.18.4", "@react-aria/overlays": "^3.27.2", "@react-aria/selection": "^3.24.2", "@react-aria/textfield": "^3.17.4", "@react-aria/utils": "^3.29.1", "@react-stately/collections": "^3.12.5", "@react-stately/combobox": "^3.10.6", "@react-stately/form": "^3.1.5", "@react-types/button": "^3.12.2", "@react-types/combobox": "^3.13.6", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-RvIEz2JK6Ndi0VhhNPYzfHbvq6rj7o2SwhhrcN5cKPC0lGgTXgHJheTq2kMu7ctO/C+Yx/3d0LQC/fOnbKH8zA=="], + + "@react-aria/datepicker": ["@react-aria/datepicker@3.14.4", "", { "dependencies": { "@internationalized/date": "^3.8.2", "@internationalized/number": "^3.6.3", "@internationalized/string": "^3.2.7", "@react-aria/focus": "^3.20.4", "@react-aria/form": "^3.0.17", "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/label": "^3.7.19", "@react-aria/spinbutton": "^3.6.16", "@react-aria/utils": "^3.29.1", "@react-stately/datepicker": "^3.14.2", "@react-stately/form": "^3.1.5", "@react-types/button": "^3.12.2", "@react-types/calendar": "^3.7.2", "@react-types/datepicker": "^3.12.2", "@react-types/dialog": "^3.5.19", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-VoVLqTSttvHE1h8nrF2L7r1SDN0VCv5UtIlYqUxK4Gk/5Z7Pboo7aY2OAhgpycm9ZUfWio/VVAtj6oMoWHjxQw=="], + + "@react-aria/dialog": ["@react-aria/dialog@3.5.26", "", { "dependencies": { "@react-aria/interactions": "^3.25.2", "@react-aria/overlays": "^3.27.2", "@react-aria/utils": "^3.29.1", "@react-types/dialog": "^3.5.19", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-X4KKf0OPHIje+68I0GRDkIcg+qsrBEQskl72aX7GQy6oNBta3ZTxQJrK2HTYdBDJnr1ADQdxYi+pZ5zPYDjODA=="], + + "@react-aria/disclosure": ["@react-aria/disclosure@3.0.6", "", { "dependencies": { "@react-aria/ssr": "^3.9.9", "@react-aria/utils": "^3.29.1", "@react-stately/disclosure": "^3.0.5", "@react-types/button": "^3.12.2", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-swO7U2G1Qhelj08RUiPQ8OEwDWDGj7DgWBmMyU2HjVEihR9wlvwsJTvzmxNQvJJT0l1bxQ/tM4RWxdUycUYy7A=="], + + "@react-aria/dnd": ["@react-aria/dnd@3.10.0", "", { "dependencies": { "@internationalized/string": "^3.2.7", "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/live-announcer": "^3.4.3", "@react-aria/overlays": "^3.27.2", "@react-aria/utils": "^3.29.1", "@react-stately/collections": "^3.12.5", "@react-stately/dnd": "^3.6.0", "@react-types/button": "^3.12.2", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-kW8TE4MLiTZJWnXSH+/6HeEtCOP20S+3m0BpToOzZhlpETSWJj6WcTRrM9ygt86v+lD4Vb92aQPdB75NVCbSAg=="], + + "@react-aria/focus": ["@react-aria/focus@3.20.4", "", { "dependencies": { "@react-aria/interactions": "^3.25.2", "@react-aria/utils": "^3.29.1", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-E9M/kPYvF1fBZpkRXsKqMhvBVEyTY7vmkHeXLJo6tInKQOjYyYs0VeWlnGnxBjQIAH7J7ZKAORfTFQQHyhoueQ=="], + + "@react-aria/form": ["@react-aria/form@3.0.17", "", { "dependencies": { "@react-aria/interactions": "^3.25.2", "@react-aria/utils": "^3.29.1", "@react-stately/form": "^3.1.5", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-d7Cic5OGBqI/OMUuHlPrPn6udSvjdpurrrwbnSYzrGlVhDmKLUdrLTtBL8O1MPzluAyW52azqJXSpsjwh288KA=="], + + "@react-aria/grid": ["@react-aria/grid@3.14.1", "", { "dependencies": { "@react-aria/focus": "^3.20.4", "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/live-announcer": "^3.4.3", "@react-aria/selection": "^3.24.2", "@react-aria/utils": "^3.29.1", "@react-stately/collections": "^3.12.5", "@react-stately/grid": "^3.11.3", "@react-stately/selection": "^3.20.3", "@react-types/checkbox": "^3.9.5", "@react-types/grid": "^3.3.3", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-znYb6S97yS36nw0liNFYFPmMyhhiUGvhtSXvkPEEU+bxw94O6jbLNwyJKrlUUSNDW3XINasIIY7EhC66QMbSFw=="], + + "@react-aria/gridlist": ["@react-aria/gridlist@3.13.1", "", { "dependencies": { "@react-aria/focus": "^3.20.4", "@react-aria/grid": "^3.14.1", "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/selection": "^3.24.2", "@react-aria/utils": "^3.29.1", "@react-stately/collections": "^3.12.5", "@react-stately/list": "^3.12.3", "@react-stately/tree": "^3.9.0", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-tdcKDtzQcvT5U7mBbasiV/uHfwQmkYszyjKUZWigO54YNoz5Zp3RFfS14Mv6NAft2cse8Bj9oEyf8HMUT8KEZA=="], + + "@react-aria/i18n": ["@react-aria/i18n@3.12.10", "", { "dependencies": { "@internationalized/date": "^3.8.2", "@internationalized/message": "^3.1.8", "@internationalized/number": "^3.6.3", "@internationalized/string": "^3.2.7", "@react-aria/ssr": "^3.9.9", "@react-aria/utils": "^3.29.1", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-1j00soQ2W0nTgzaaIsGFdMF/5aN60AEdCJPhmXGZiuWdWzMxObN9LQ9vdzYPTjTqyqMdSaSp9DZKs5I26Xovpw=="], + + "@react-aria/interactions": ["@react-aria/interactions@3.25.2", "", { "dependencies": { "@react-aria/ssr": "^3.9.9", "@react-aria/utils": "^3.29.1", "@react-stately/flags": "^3.1.2", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-BWyZXBT4P17b9C9HfOIT2glDFMH9nUCfQF7vZ5FEeXNBudH/8OcSbzyBUG4Dg3XPtkOem5LP59ocaizkl32Tvg=="], + + "@react-aria/label": ["@react-aria/label@3.7.19", "", { "dependencies": { "@react-aria/utils": "^3.29.1", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-ZJIj/BKf66q52idy24ErzX77vDGuyQn4neWtu51RRSk4npI3pJqEPsdkPCdo2dlBCo/Uc1pfuLGg2hY3N/ni9Q=="], + + "@react-aria/landmark": ["@react-aria/landmark@3.0.4", "", { "dependencies": { "@react-aria/utils": "^3.29.1", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-1U5ce6cqg1qGbK4M4R6vwrhUrKXuUzReZwHaTrXxEY22IMxKDXIZL8G7pFpcKix2XKqjLZWf+g8ngGuNhtQ2QQ=="], + + "@react-aria/link": ["@react-aria/link@3.8.2", "", { "dependencies": { "@react-aria/interactions": "^3.25.2", "@react-aria/utils": "^3.29.1", "@react-types/link": "^3.6.2", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-LScn5bRlBrv7yt2y06Ul3vNo8BOYHwZXjk47XCJTdt/QWhuU15oG0sRjJ1OIWgZ96jtW7u6YZ1PQtwX55gl7Dw=="], + + "@react-aria/listbox": ["@react-aria/listbox@3.14.5", "", { "dependencies": { "@react-aria/interactions": "^3.25.2", "@react-aria/label": "^3.7.19", "@react-aria/selection": "^3.24.2", "@react-aria/utils": "^3.29.1", "@react-stately/collections": "^3.12.5", "@react-stately/list": "^3.12.3", "@react-types/listbox": "^3.7.1", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-6fIIr7KqJyS6+7FzRUT3TJozcImJG38kkPtzEpwhmPzWNDWEu307BOjIMw0AHs+m1pT7wspCzg3KOTppw8S4eg=="], + + "@react-aria/live-announcer": ["@react-aria/live-announcer@3.4.3", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-nbBmx30tW53Vlbq3BbMxHGbHa7vGE9ItacI+1XAdH2UZDLtdZA5J6U9YC6lokKQCv+aEVO6Zl9YG4yp57YwnGw=="], + + "@react-aria/menu": ["@react-aria/menu@3.18.4", "", { "dependencies": { "@react-aria/focus": "^3.20.4", "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/overlays": "^3.27.2", "@react-aria/selection": "^3.24.2", "@react-aria/utils": "^3.29.1", "@react-stately/collections": "^3.12.5", "@react-stately/menu": "^3.9.5", "@react-stately/selection": "^3.20.3", "@react-stately/tree": "^3.9.0", "@react-types/button": "^3.12.2", "@react-types/menu": "^3.10.2", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-iLioNOnHhltIq7JtLkeSXA1bFt3rUdUwnc8j20LXlzhDgH/56Xi1sxOCzaGo33mDPT16ANJG4IolVzg0+tnb2g=="], + + "@react-aria/meter": ["@react-aria/meter@3.4.24", "", { "dependencies": { "@react-aria/progress": "^3.4.24", "@react-types/meter": "^3.4.10", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-IYI0Z2pwMvIe8r/3G3PHhM4G/KRiW1ssFCBZdCjBbSpl6/EkmrHiyeaBYG0j8Ux8tmRmXiMVjxLdDlCJQDH7mQ=="], + + "@react-aria/numberfield": ["@react-aria/numberfield@3.11.15", "", { "dependencies": { "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/spinbutton": "^3.6.16", "@react-aria/textfield": "^3.17.4", "@react-aria/utils": "^3.29.1", "@react-stately/form": "^3.1.5", "@react-stately/numberfield": "^3.9.13", "@react-types/button": "^3.12.2", "@react-types/numberfield": "^3.8.12", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-iQuXWn6BGneSBZrRURkntfivY9noUiq/JLs9KjtaSm9V0X4THevB9xXQLL0qLJ+n5YHOM6skRyoCRaweYY5IhA=="], + + "@react-aria/overlays": ["@react-aria/overlays@3.27.2", "", { "dependencies": { "@react-aria/focus": "^3.20.4", "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/ssr": "^3.9.9", "@react-aria/utils": "^3.29.1", "@react-aria/visually-hidden": "^3.8.24", "@react-stately/overlays": "^3.6.17", "@react-types/button": "^3.12.2", "@react-types/overlays": "^3.8.16", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-lWerY4caK2+AXzdPhUqAov3Di2mSfIKdaEEj+99iXeH85zzs2cbWZRvvCwwVGQ0GprypxETz1jb1Wq/55xDALw=="], + + "@react-aria/progress": ["@react-aria/progress@3.4.24", "", { "dependencies": { "@react-aria/i18n": "^3.12.10", "@react-aria/label": "^3.7.19", "@react-aria/utils": "^3.29.1", "@react-types/progress": "^3.5.13", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-lpMVrZlSo1Dulo67COCNrcRkJ+lRrC2PI3iRoOIlqw1Ljz4KFoSGyRudg/MLJ/YrQ+6zmNdz5ytdeThrZwHpPQ=="], + + "@react-aria/radio": ["@react-aria/radio@3.11.4", "", { "dependencies": { "@react-aria/focus": "^3.20.4", "@react-aria/form": "^3.0.17", "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/label": "^3.7.19", "@react-aria/utils": "^3.29.1", "@react-stately/radio": "^3.10.14", "@react-types/radio": "^3.8.10", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-kxML2cuI4/5AlSSzOAwXVXoouvrICxGdWbs0ze0IHaGkw6p3oKa5By6I6tT0+8/Kxy6ZFeCL+l/PU6K/ysAdAA=="], + + "@react-aria/searchfield": ["@react-aria/searchfield@3.8.5", "", { "dependencies": { "@react-aria/i18n": "^3.12.10", "@react-aria/textfield": "^3.17.4", "@react-aria/utils": "^3.29.1", "@react-stately/searchfield": "^3.5.13", "@react-types/button": "^3.12.2", "@react-types/searchfield": "^3.6.3", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-HLHT2xc6USM/SbqFYz2gbREq7IcWfO+845ao/GCxy6Rx8eGD3OV09jgd+JlcSNJb2WiTpKhkSeX3wf7VgzPw2g=="], + + "@react-aria/select": ["@react-aria/select@3.15.6", "", { "dependencies": { "@react-aria/form": "^3.0.17", "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/label": "^3.7.19", "@react-aria/listbox": "^3.14.5", "@react-aria/menu": "^3.18.4", "@react-aria/selection": "^3.24.2", "@react-aria/utils": "^3.29.1", "@react-aria/visually-hidden": "^3.8.24", "@react-stately/select": "^3.6.14", "@react-types/button": "^3.12.2", "@react-types/select": "^3.9.13", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-r/XU5PJY/V8LTklaiO7n3BDG9gVg/Dp3p7IwgGCYUbLuF9+8yMh858teOEJr3FYKLPr/nZLZQE08oJuADkCLEw=="], + + "@react-aria/selection": ["@react-aria/selection@3.24.2", "", { "dependencies": { "@react-aria/focus": "^3.20.4", "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/utils": "^3.29.1", "@react-stately/selection": "^3.20.3", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-YIdCYe1yXXfbZ0snUMWrQpOxtJO0+eHHp3+PSqZ/dyvLqMlTlYnOv2j5lc36sN0r1YWfN8OEpxzK3jHdD4M6yA=="], + + "@react-aria/separator": ["@react-aria/separator@3.4.10", "", { "dependencies": { "@react-aria/utils": "^3.29.1", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-T9hJpO6lfg6zHRbs5CZD0eZrWIIjN6LY+EC6X5pQJbJeq6HqviVSQx25q98K430S/EGwHRltY5Bwy+XwlMZfdA=="], + + "@react-aria/slider": ["@react-aria/slider@3.7.20", "", { "dependencies": { "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/label": "^3.7.19", "@react-aria/utils": "^3.29.1", "@react-stately/slider": "^3.6.5", "@react-types/shared": "^3.30.0", "@react-types/slider": "^3.7.12", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-ciRfI0ya89pm4R+2RE7vLhu5OjdsAQfzghVI5Eh5AHpwjajMJ41O4Vkyt2ci5KTcjwg80CFftAWmF02w2hKR5Q=="], + + "@react-aria/spinbutton": ["@react-aria/spinbutton@3.6.16", "", { "dependencies": { "@react-aria/i18n": "^3.12.10", "@react-aria/live-announcer": "^3.4.3", "@react-aria/utils": "^3.29.1", "@react-types/button": "^3.12.2", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Ko1e9GeQiiEXeR3IyPT8STS1Pw4k/1OBs9LqI3WKlHFwH5M8q3DbbaMOgekD41/CPVBKmCcqFM7K7Wu9kFrT2A=="], + + "@react-aria/ssr": ["@react-aria/ssr@3.9.9", "", { "dependencies": { "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-2P5thfjfPy/np18e5wD4WPt8ydNXhij1jwA8oehxZTFqlgVMGXzcWKxTb4RtJrLFsqPO7RUQTiY8QJk0M4Vy2g=="], + + "@react-aria/switch": ["@react-aria/switch@3.7.4", "", { "dependencies": { "@react-aria/toggle": "^3.11.4", "@react-stately/toggle": "^3.8.5", "@react-types/shared": "^3.30.0", "@react-types/switch": "^3.5.12", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-6Ue6GXBGMPc5uNwu6A4XHOEK5n/3OmgW/kgCmFVi2dh4QqkASSdadaizS/2uENWfgKTlEpd0Wy3PSfpubL+hCg=="], + + "@react-aria/table": ["@react-aria/table@3.17.4", "", { "dependencies": { "@react-aria/focus": "^3.20.4", "@react-aria/grid": "^3.14.1", "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/live-announcer": "^3.4.3", "@react-aria/utils": "^3.29.1", "@react-aria/visually-hidden": "^3.8.24", "@react-stately/collections": "^3.12.5", "@react-stately/flags": "^3.1.2", "@react-stately/table": "^3.14.3", "@react-types/checkbox": "^3.9.5", "@react-types/grid": "^3.3.3", "@react-types/shared": "^3.30.0", "@react-types/table": "^3.13.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-zhqrt6Uk66wrgaIHrPUv3nguVMGMnPtqUmp0K2gibhNucN0iJ6zILoaq8vMmFH+9PmUqoiPJXq18czs2CluT6Q=="], + + "@react-aria/tabs": ["@react-aria/tabs@3.10.4", "", { "dependencies": { "@react-aria/focus": "^3.20.4", "@react-aria/i18n": "^3.12.10", "@react-aria/selection": "^3.24.2", "@react-aria/utils": "^3.29.1", "@react-stately/tabs": "^3.8.3", "@react-types/shared": "^3.30.0", "@react-types/tabs": "^3.3.16", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-aXY83zqLStlf/v8vP2OvlrLsujCNWGqfL3hMVDF1PNqRJGllMejzkzbZNf4fUQDTX+e2zNDv6SH4IRJ4k9sKlw=="], + + "@react-aria/tag": ["@react-aria/tag@3.6.1", "", { "dependencies": { "@react-aria/gridlist": "^3.13.1", "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/label": "^3.7.19", "@react-aria/selection": "^3.24.2", "@react-aria/utils": "^3.29.1", "@react-stately/list": "^3.12.3", "@react-types/button": "^3.12.2", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-oTEDqOejjltr64ADpgMA3eB/G4bJ2Y9TlQwW33l6XWAjtKKZScBhGrf9l10NTQphZf4QxMnucIHo8IV2eKSmjg=="], + + "@react-aria/textfield": ["@react-aria/textfield@3.17.4", "", { "dependencies": { "@react-aria/form": "^3.0.17", "@react-aria/interactions": "^3.25.2", "@react-aria/label": "^3.7.19", "@react-aria/utils": "^3.29.1", "@react-stately/form": "^3.1.5", "@react-stately/utils": "^3.10.7", "@react-types/shared": "^3.30.0", "@react-types/textfield": "^3.12.3", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-dcQQKVgH/zv3wExcmpH7yMA2d4oPO3JF9L1HdwNvPHScnfbr404ZVEKjrIlxEvzq7V5yKky5q8171jmp+YOPyw=="], + + "@react-aria/toast": ["@react-aria/toast@3.0.4", "", { "dependencies": { "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/landmark": "^3.0.4", "@react-aria/utils": "^3.29.1", "@react-stately/toast": "^3.1.1", "@react-types/button": "^3.12.2", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-oH1WZfwdaryiggqxu1r1Jq1/fF8n9AVD3euamkJmXq5/t9IJUYLzct4w54QqjQ0KhtbHp+7n55QvvhZ9cW3XEg=="], + + "@react-aria/toggle": ["@react-aria/toggle@3.11.4", "", { "dependencies": { "@react-aria/interactions": "^3.25.2", "@react-aria/utils": "^3.29.1", "@react-stately/toggle": "^3.8.5", "@react-types/checkbox": "^3.9.5", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-RwWyFiM+dBsiulT1ziGdG5+cy/F/7hFVb1Ddyc90HNLqRuX2sAX3ysm0YmiiNpnHwGQR/kPd1ulTSqQ+ps9wiQ=="], + + "@react-aria/toolbar": ["@react-aria/toolbar@3.0.0-beta.17", "", { "dependencies": { "@react-aria/focus": "^3.20.4", "@react-aria/i18n": "^3.12.10", "@react-aria/utils": "^3.29.1", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-YGLDOATMla9Y7Yk2P8qK3zcTrxQClf2ZLS8Wj14RY4le/r6F2rGJqkGhVFPyoNAtwsRr4bzD7CGERe4NUAPrqQ=="], + + "@react-aria/tooltip": ["@react-aria/tooltip@3.8.4", "", { "dependencies": { "@react-aria/interactions": "^3.25.2", "@react-aria/utils": "^3.29.1", "@react-stately/tooltip": "^3.5.5", "@react-types/shared": "^3.30.0", "@react-types/tooltip": "^3.4.18", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-WwooDvXb64mGwZUZQj4tYcJEFSXLIxDywT97K9U4fLUhrNcQ8KdxdhPjyPOEXxscPfdJDyKKckhRiKl91UoKsg=="], + + "@react-aria/tree": ["@react-aria/tree@3.1.0", "", { "dependencies": { "@react-aria/gridlist": "^3.13.1", "@react-aria/i18n": "^3.12.10", "@react-aria/selection": "^3.24.2", "@react-aria/utils": "^3.29.1", "@react-stately/tree": "^3.9.0", "@react-types/button": "^3.12.2", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-GBg01P04fLY16ZHLYcP9nLGis2MGQSpiP8rMG0t5jqddJdx+v8IL28f9mcHw+NSRgZm28NHQThTkH31SUxXppQ=="], + + "@react-aria/utils": ["@react-aria/utils@3.29.1", "", { "dependencies": { "@react-aria/ssr": "^3.9.9", "@react-stately/flags": "^3.1.2", "@react-stately/utils": "^3.10.7", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-yXMFVJ73rbQ/yYE/49n5Uidjw7kh192WNN9PNQGV0Xoc7EJUlSOxqhnpHmYTyO0EotJ8fdM1fMH8durHjUSI8g=="], + + "@react-aria/visually-hidden": ["@react-aria/visually-hidden@3.8.24", "", { "dependencies": { "@react-aria/interactions": "^3.25.2", "@react-aria/utils": "^3.29.1", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-vhGhALs/PGdTs/7GD2hsy7CF1LBF9QlL57HkRSu8kfiuiA7rqRTqYg6q723OvaFsspj3DCxP2MLQhvvZSWe7Ng=="], + + "@react-hook/latest": ["@react-hook/latest@1.0.3", "", { "peerDependencies": { "react": ">=16.8" } }, "sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg=="], + + "@react-hook/passive-layout-effect": ["@react-hook/passive-layout-effect@1.2.1", "", { "peerDependencies": { "react": ">=16.8" } }, "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg=="], + + "@react-hook/resize-observer": ["@react-hook/resize-observer@2.0.2", "", { "dependencies": { "@react-hook/latest": "^1.0.2", "@react-hook/passive-layout-effect": "^1.2.0" }, "peerDependencies": { "react": ">=18" } }, "sha512-tzKKzxNpfE5TWmxuv+5Ae3IF58n0FQgQaWJmcbYkjXTRZATXxClnTprQ2uuYygYTpu1pqbBskpwMpj6jpT1djA=="], + + "@react-stately/calendar": ["@react-stately/calendar@3.8.2", "", { "dependencies": { "@internationalized/date": "^3.8.2", "@react-stately/utils": "^3.10.7", "@react-types/calendar": "^3.7.2", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-IGSbTgCMiGYisQ+CwH31wek10UWvNZ1LVwhr0ZNkhDIRtj+p+FuLNtBnmT1CxTFe2Y4empAxyxNA0QSjQrOtvQ=="], + + "@react-stately/checkbox": ["@react-stately/checkbox@3.6.15", "", { "dependencies": { "@react-stately/form": "^3.1.5", "@react-stately/utils": "^3.10.7", "@react-types/checkbox": "^3.9.5", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-jt3Kzbk6heUMtAlCbUwnrEBknnzFhPBFMEZ00vff7VyhDXup7DJcJRxreloHepARZLIhLhC5QPyO5GS4YOHlvw=="], + + "@react-stately/collections": ["@react-stately/collections@3.12.5", "", { "dependencies": { "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-5SIb+6nF9cyu+WXqZ6io56BtdOu8FjSQQaaLCCpfAC6fc6zHRk8by0WreRmvJ5/Kn8oq2FNJtCNRvluM0Z01UA=="], + + "@react-stately/color": ["@react-stately/color@3.8.6", "", { "dependencies": { "@internationalized/number": "^3.6.3", "@internationalized/string": "^3.2.7", "@react-stately/form": "^3.1.5", "@react-stately/numberfield": "^3.9.13", "@react-stately/slider": "^3.6.5", "@react-stately/utils": "^3.10.7", "@react-types/color": "^3.0.6", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-KBpnXt31hCgdYq1a7PxUspK990/V5hPO4LqJ1K89p7r2t4OF66IBW5FmOS7KY6p1bGOoZgbk9m5w+yUeQq4wmw=="], + + "@react-stately/combobox": ["@react-stately/combobox@3.10.6", "", { "dependencies": { "@react-stately/collections": "^3.12.5", "@react-stately/form": "^3.1.5", "@react-stately/list": "^3.12.3", "@react-stately/overlays": "^3.6.17", "@react-stately/select": "^3.6.14", "@react-stately/utils": "^3.10.7", "@react-types/combobox": "^3.13.6", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-XOfG90MQPfPCNjl2KJOKuFFzx2ULlwnJ/QXl9zCQUtUBOExbFRHldj5E4NPcH14AVeYZX6DBn4GTS9ocOVbE7Q=="], + + "@react-stately/data": ["@react-stately/data@3.13.1", "", { "dependencies": { "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-hKEvHCM/nHM6FFJz3gT6Ms85H+qNhXfHDYP/TU7XiDoeVHzUpj2Yc3xGsIty6/K2k7jrblUj+LuKmdvidd9mug=="], + + "@react-stately/datepicker": ["@react-stately/datepicker@3.14.2", "", { "dependencies": { "@internationalized/date": "^3.8.2", "@internationalized/string": "^3.2.7", "@react-stately/form": "^3.1.5", "@react-stately/overlays": "^3.6.17", "@react-stately/utils": "^3.10.7", "@react-types/datepicker": "^3.12.2", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-KvOUFz/o+hNIb7oCli6nxBdDurbGjRjye6U99GEYAx6timXOjiIJvtKQyqCLRowGYtCS6GH41yM6DhJ2MlMF8w=="], + + "@react-stately/disclosure": ["@react-stately/disclosure@3.0.5", "", { "dependencies": { "@react-stately/utils": "^3.10.7", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Rh+y+XAUNwyFvvzBS/MtFvdWHC38mXI99S6mdNe3e5Og8IZxLBDtvwBCzrT30YzYqN40yd3alm9xLzpYXsvYYA=="], + + "@react-stately/dnd": ["@react-stately/dnd@3.6.0", "", { "dependencies": { "@react-stately/selection": "^3.20.3", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-H0zWOjjoocM+8r5rJ2x0B66NXZd2+7lF1zhomoMoR5+57DA5hWZTY0tht21DKjNoFk4f96Ythh0jRLziQbSkBw=="], + + "@react-stately/flags": ["@react-stately/flags@3.1.2", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg=="], + + "@react-stately/form": ["@react-stately/form@3.1.5", "", { "dependencies": { "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-wOs0SVXFgNr1aIdywiNH1MhxrFlN5YxBr1k9y3Z7lX+pc/MGRJFTgfDDw5JDxvwLH9joJ9ciniCdWep9L/TqcQ=="], + + "@react-stately/grid": ["@react-stately/grid@3.11.3", "", { "dependencies": { "@react-stately/collections": "^3.12.5", "@react-stately/selection": "^3.20.3", "@react-types/grid": "^3.3.3", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-/YurYfPARtgsgS5f8rklB7ZQu6MWLdpfTHuwOELEUZ4L52S2gGA5VfLxDnAsHHnu5XHFI3ScuYLAvjWN0rgs/Q=="], + + "@react-stately/list": ["@react-stately/list@3.12.3", "", { "dependencies": { "@react-stately/collections": "^3.12.5", "@react-stately/selection": "^3.20.3", "@react-stately/utils": "^3.10.7", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-RiqYyxPYAF3YRBEin8/WHC8/hvpZ/fG1Tx3h1W4aXU5zTIBuy0DrjRKePwP90oCiDpztgRXePLlzhgWeKvJEow=="], + + "@react-stately/menu": ["@react-stately/menu@3.9.5", "", { "dependencies": { "@react-stately/overlays": "^3.6.17", "@react-types/menu": "^3.10.2", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Y+PqHBaQToo6ooCB4i4RoNfRiHbd4iozmLWePBrF4d/zBzJ9p+/5O6XIWFxLw4O128Tg3tSMGuwrxfecPDYHzA=="], + + "@react-stately/numberfield": ["@react-stately/numberfield@3.9.13", "", { "dependencies": { "@internationalized/number": "^3.6.3", "@react-stately/form": "^3.1.5", "@react-stately/utils": "^3.10.7", "@react-types/numberfield": "^3.8.12", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-FWbbL4E3+5uctPGVtDwHzeNXgyFw0D3glOJhgW1QHPn3qIswusn0z/NjFSuCVOSpri8BZYIrTPUQHpRJPnjgRw=="], + + "@react-stately/overlays": ["@react-stately/overlays@3.6.17", "", { "dependencies": { "@react-stately/utils": "^3.10.7", "@react-types/overlays": "^3.8.16", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-bkGYU4NPC/LgX9OGHLG8hpf9QDoazlb6fKfD+b5o7GtOdctBqCR287T/IBOQyvHqpySqrQ8XlyaGxJPGIcCiZw=="], + + "@react-stately/radio": ["@react-stately/radio@3.10.14", "", { "dependencies": { "@react-stately/form": "^3.1.5", "@react-stately/utils": "^3.10.7", "@react-types/radio": "^3.8.10", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Y7xizUWJ0YJ8pEtqMeKOibX21B5dk56fHgMHXYLeUEm43y5muWQft2YvP0/n4mlkP2Isbk96kPbv7/ez3Gi+lA=="], + + "@react-stately/searchfield": ["@react-stately/searchfield@3.5.13", "", { "dependencies": { "@react-stately/utils": "^3.10.7", "@react-types/searchfield": "^3.6.3", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-JNvsnvK6A1057hQREHabRYAAtwj2vl20oqGBvl1IleKlFe3KInV9WBY5l6zR3RXrnCPHVvJuzGe2R7+g142Mnw=="], + + "@react-stately/select": ["@react-stately/select@3.6.14", "", { "dependencies": { "@react-stately/form": "^3.1.5", "@react-stately/list": "^3.12.3", "@react-stately/overlays": "^3.6.17", "@react-types/select": "^3.9.13", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-HvbL9iMGwbev0FR6PzivhjKEcXADgcJC/IzUkLqPfg4KKMuYhM/XvbJjWXn/QpD3/XT+A5+r5ExUHu7wiDP93w=="], + + "@react-stately/selection": ["@react-stately/selection@3.20.3", "", { "dependencies": { "@react-stately/collections": "^3.12.5", "@react-stately/utils": "^3.10.7", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-TLyjodgFHn5fynQnRmZ5YX1HRY0KC7XBW0Nf2+q9mWk4gUxYm7RVXyYZvMIG1iKqinPYtySPRHdNzyXq9P9sxQ=="], + + "@react-stately/slider": ["@react-stately/slider@3.6.5", "", { "dependencies": { "@react-stately/utils": "^3.10.7", "@react-types/shared": "^3.30.0", "@react-types/slider": "^3.7.12", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-XnHSHbXeHiE5J7nsXQvlXaKaNn1Z4jO1aQyiZsolK1NXW6VMKVeAgZUBG45k7xQW06aRbjREMmiIz02mW8fajQ=="], + + "@react-stately/table": ["@react-stately/table@3.14.3", "", { "dependencies": { "@react-stately/collections": "^3.12.5", "@react-stately/flags": "^3.1.2", "@react-stately/grid": "^3.11.3", "@react-stately/selection": "^3.20.3", "@react-stately/utils": "^3.10.7", "@react-types/grid": "^3.3.3", "@react-types/shared": "^3.30.0", "@react-types/table": "^3.13.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-PwE5pCplLSDckvgmNLVaHyQyX04A62kxdouFh1dVHeGEPfOYsO9WhvyisLxbH7X8Dbveheq/tSTelYDi6LXEJA=="], + + "@react-stately/tabs": ["@react-stately/tabs@3.8.3", "", { "dependencies": { "@react-stately/list": "^3.12.3", "@react-types/shared": "^3.30.0", "@react-types/tabs": "^3.3.16", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-FujQCHppXyeHs2v5FESekxodsBJ5T0k1f7sm0ViNYqgrnE5XwqX8Y4/tdr0fqGF6S+BBllH+Q9yKWipDc6OM8g=="], + + "@react-stately/toast": ["@react-stately/toast@3.1.1", "", { "dependencies": { "@swc/helpers": "^0.5.0", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-W4a6xcsFt/E+aHmR2eZK+/p7Y5rdyXSCQ5gKSnbck+S3lijEWAyV45Mv8v95CQqu0bQijj6sy2Js1szq10HVwg=="], + + "@react-stately/toggle": ["@react-stately/toggle@3.8.5", "", { "dependencies": { "@react-stately/utils": "^3.10.7", "@react-types/checkbox": "^3.9.5", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-BSvuTDVFzIKxpNg9Slf+RdGpva7kBO8xYaec2TW9m6Ag9AOmiDwUzzDAO0DRsc7ArSaLLFaQ/pdmmT6TxAUQIA=="], + + "@react-stately/tooltip": ["@react-stately/tooltip@3.5.5", "", { "dependencies": { "@react-stately/overlays": "^3.6.17", "@react-types/tooltip": "^3.4.18", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-/zbl7YxneGDGGzdMPSEYUKsnVRGgvsr80ZjQYBHL82N4tzvtkRwmzvzN9ipAtza+0jmeftt3N+YSyxvizVbeKA=="], + + "@react-stately/tree": ["@react-stately/tree@3.9.0", "", { "dependencies": { "@react-stately/collections": "^3.12.5", "@react-stately/selection": "^3.20.3", "@react-stately/utils": "^3.10.7", "@react-types/shared": "^3.30.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-VpWAh36tbMHJ1CtglPQ81KPdpCfqFz9yAC6nQuL1x6Tmbs9vNEKloGILMI9/4qLzC+3nhCVJj6hN+xqS5/cMTg=="], + + "@react-stately/utils": ["@react-stately/utils@3.10.7", "", { "dependencies": { "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-cWvjGAocvy4abO9zbr6PW6taHgF24Mwy/LbQ4TC4Aq3tKdKDntxyD+sh7AkSRfJRT2ccMVaHVv2+FfHThd3PKQ=="], + + "@react-types/breadcrumbs": ["@react-types/breadcrumbs@3.7.14", "", { "dependencies": { "@react-types/link": "^3.6.2", "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-SbLjrKKupzCLbqHZIQYtQvtsXN53NPxOYyug6QfC4d7DcW1Q9wJ546fxb10Y83ftAJMMUHTatI6SenJVoqyUdA=="], + + "@react-types/button": ["@react-types/button@3.12.2", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-QLoSCX8E7NFIdkVMa65TPieve0rKeltfcIxiMtrphjfNn+83L0IHMcbhjf4r4W19c/zqGbw3E53Hx8mNukoTUw=="], + + "@react-types/calendar": ["@react-types/calendar@3.7.2", "", { "dependencies": { "@internationalized/date": "^3.8.2", "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Bp6fZo52fZdUjYbtJXcaLQ0jWEOeSoyZVwNyN5G6BmPyLP5nHxMPF+R1MPFR0fdpSI4/Sk78gWzoTuU5eOVQLw=="], + + "@react-types/checkbox": ["@react-types/checkbox@3.9.5", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-9y8zeGWT2xZ38/YC/rNd05pPV8W8vmqFygCpZFaa6dJeOsMgPU+rq+Ifh1G+34D/qGoZXQBzeCSCAKSNPaL7uw=="], + + "@react-types/color": ["@react-types/color@3.0.6", "", { "dependencies": { "@react-types/shared": "^3.30.0", "@react-types/slider": "^3.7.12" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-ZbbgzAWK56RMMZzRGhTAB9Fz9PGnj6ctc6VMqOyumCOF9NKkYgI0E2ssTY/iOXBazZvhhhGahbGl+kjmgWvS6g=="], + + "@react-types/combobox": ["@react-types/combobox@3.13.6", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-BOvlyoVtmQJLYtNt4w6RvRORqK4eawW48CcQIR93BU5YFcAGhpcvpjhTZXknSXumabpo1/XQKX4NOuXpfUZrAQ=="], + + "@react-types/datepicker": ["@react-types/datepicker@3.12.2", "", { "dependencies": { "@internationalized/date": "^3.8.2", "@react-types/calendar": "^3.7.2", "@react-types/overlays": "^3.8.16", "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-w3JIXZLLZ15zjrAjlnflmCXkNDmIelcaChhmslTVWCf0lUpgu1cUC4WAaS71rOgU03SCcrtQ0K9TsYfhnhhL7Q=="], + + "@react-types/dialog": ["@react-types/dialog@3.5.19", "", { "dependencies": { "@react-types/overlays": "^3.8.16", "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-+FIyFnoKIGNL20zG8Sye7rrRxmt5HoeaCaHhDCTtNtv8CZEhm3Z+kNd4gylgWAxZRhDtBRWko+ADqfN5gQrgKg=="], + + "@react-types/grid": ["@react-types/grid@3.3.3", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-VZAKO3XISc/3+a+DZ+hUx2NB/buOe2Ui2nISutv25foeXX4+YpWj5lXS74lJUCuVsSz6D6yoWvEajeUCYrNOxg=="], + + "@react-types/link": ["@react-types/link@3.6.2", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-CtCexoupcaFHJdVPRUpJ83uxK1U0bd9x9DhwRFMqqfPHufICkQkETIw2KIeZXRvMUMi2CSG/81XXy6K0K1MtNw=="], + + "@react-types/listbox": ["@react-types/listbox@3.7.1", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-WiCihJJpVWVEUxxZjhTbnG3Zq3q38XylKnvNelkVHbF+Y3+SXWN0Yyhk43J642G/d87lw1t60Tor0k96eaz4vw=="], + + "@react-types/menu": ["@react-types/menu@3.10.2", "", { "dependencies": { "@react-types/overlays": "^3.8.16", "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-TVQFGttaNCcIvy1MKavb9ZihJmng46uUtVF9oTG/VI/C4YEdzekteI6iSsXbjv5ZAvOKQR+S25IWCbK2W0YCjQ=="], + + "@react-types/meter": ["@react-types/meter@3.4.10", "", { "dependencies": { "@react-types/progress": "^3.5.13" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-soimx+MAngG5MjQplJNB9erPh+P3Er764PqGA75L6FFmf2KhgzMniSVAqyVOpZu7G3qK4O+ihMAYXf6pQMBkSg=="], + + "@react-types/numberfield": ["@react-types/numberfield@3.8.12", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-cI0Grj+iW5840gV80t7aXt7FZPbxMZufjuAop5taHe6RlHuLuODfz5n3kyu/NPHabruF26mVEu0BfIrwZyy+VQ=="], + + "@react-types/overlays": ["@react-types/overlays@3.8.16", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Aj9jIFwALk9LiOV/s3rVie+vr5qWfaJp/6aGOuc2StSNDTHvj1urSAr3T0bT8wDlkrqnlS4JjEGE40ypfOkbAA=="], + + "@react-types/progress": ["@react-types/progress@3.5.13", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-+4v++AP2xxYxjrTkIXlWWGUhPPIEBzyg76EW0SHKnD4pXxKigcIXEzRbxy62SMidTVdi7jh3tuicIP8OQxJ4cA=="], + + "@react-types/radio": ["@react-types/radio@3.8.10", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-hLOu2CXxzxQqkEkXSM71jEJMnU5HvSzwQ+DbJISDjgfgAKvZZHMQX94Fht2Vj+402OdI77esl3pJ1tlSLyV5VQ=="], + + "@react-types/searchfield": ["@react-types/searchfield@3.6.3", "", { "dependencies": { "@react-types/shared": "^3.30.0", "@react-types/textfield": "^3.12.3" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Uua7TYKR1QcJE2F4SAewxuxt8k8gd52zul2q5oMe5azsm2uoAtV/qpNHc7dfPAR97UgbrE/aNMlX57PEubiuLg=="], + + "@react-types/select": ["@react-types/select@3.9.13", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-R7zwck353RV60gZimZ8pDKaj50aEtGzU8gk0jC3aBkfzSUKFJ6jq1DJdqyVQSwXdmPDd9iuketeIUIpEO2teoA=="], + + "@react-types/shared": ["@react-types/shared@3.30.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-COIazDAx1ncDg046cTJ8SFYsX8aS3lB/08LDnbkH/SkdYrFPWDlXMrO/sUam8j1WWM+PJ+4d1mj7tODIKNiFog=="], + + "@react-types/slider": ["@react-types/slider@3.7.12", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-kOQLrENLpQzmu6TfavdW1yfEc8VPitT4ZNMKOK0h7x3LskEWjptxcZ4IBowEpqHwk0eMbI9lRE/3tsShGUoLwQ=="], + + "@react-types/switch": ["@react-types/switch@3.5.12", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-6Zz7i+L9k8zw2c3nO8XErxuIy7JVDptz1NTZMiUeyDtLmQnvEKnKPKNjo2j+C/OngtJqAPowC3xRvMXbSAcYqA=="], + + "@react-types/table": ["@react-types/table@3.13.1", "", { "dependencies": { "@react-types/grid": "^3.3.3", "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-fLPRXrZoplAGMjqxHVLMt7lB0qsiu1WHZmhKtroCEhTYwnLQKL84XFH4GV1sQgQ1GIShl3BUqWzrawU5tEaQkw=="], + + "@react-types/tabs": ["@react-types/tabs@3.3.16", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-z6AWq243EahGuT4PhIpJXZbFez6XhFWb4KwhSB2CqzHkG5bJJSgKYzIcNuBCLDxO7Qg25I+VpFJxGj+aqKFbzQ=="], + + "@react-types/textfield": ["@react-types/textfield@3.12.3", "", { "dependencies": { "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-72tt2GJSyVFPPqZLrlfWqVn5KRnWzXsXCZ3IDawcGunl4pu+2E24jd0CWN9kOi0ETO65flj2sljeytxKytXnlA=="], + + "@react-types/tooltip": ["@react-types/tooltip@3.4.18", "", { "dependencies": { "@react-types/overlays": "^3.8.16", "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-/eG8hiW0D4vaCqGDa4ttb+Jnbiz6nUr5+f+LRgz3AnIkdjS9eOhpn6vXMX4hkNgcN5FGfA4Uu1C1QdM6W97Kfw=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.9", "", {}, "sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.41.2", "", { "os": "android", "cpu": "arm" }, "sha512-YvIQXGGDzbOpkLuFcjGs+aiAi38D8FCyJanIdlcV2m9DWMJpHTSY8L9piO93VHBLRoe8O9C/FiycjnJ8+aP1tg=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.41.2", "", { "os": "android", "cpu": "arm64" }, "sha512-8AVWhLnN9FteevGP+9pj/Y79vqE9TdziZTe5XkN5Z9+9QY7TEBbr4iz2te8/vXbLSLEdmaQx+o2GWXrLXDKGPg=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.41.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-w/idsvFiipvVGDcXKu1pdiIEnh9V63NPjpo5E48BbbrhUzEQthVXylKjYKj9lgX+89Ao36BxArkKPxxs7aXn3g=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.41.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-oNUD4Kywoild1lsuUu1jydg3+IdQbyg4JNZb1+3Voh/revkYxMqMl4a/sZw5z+BSgFbXK6rR0RGutnHO8QS53g=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.41.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yKXgW9UF2f78/PaSAFgDJbrLB/aETxH98jJFIpqESLyhyRmEqZl1dqAoy0IigJJZdwP+ZJdLw2isKiwb1wAqcA=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.41.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-ye4rQ80/fAIcUyIil7S/IzGpHvlPUoZvUQSq0OmU+LXb/I9E5Brh7PKJ/K0plsLCQx9Hx01526Uf4Iy8RqmLJw=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.41.2", "", { "os": "linux", "cpu": "arm" }, "sha512-q2aqiDKNKNj9jG/6JIHakx1hmj6A8bxc3U6rpZjL8znx3O4OGpPJcyEiJSxmFd8olpjfRezh7PONU+3RTQmj0A=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.41.2", "", { "os": "linux", "cpu": "arm" }, "sha512-qDtvGRNcj2SCY+XFV24s6/vOV46fktFa3/AtedKLVJZdO/WGyOtDDq2zF7nNGhzJa0Tx7bvJ92z9PjjF7nKbBg=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.41.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Cg1ywrBHMMCj4Il0QdcVamt5UK9HQ1ntNUXzhAw4yZ2rTJGFkjnkYyEPEpunb1L9orm+g0kvtZUydShTtLUNkA=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.41.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-FxPrm21SE2/p+L/Qy2P6zPPWtbKRunZ71ChHXuZu6b//zOeDYCF7kbXiGdE7ZJgUvboLx8lQtov4jsz04zdmiw=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.41.2", "", { "os": "linux", "cpu": "none" }, "sha512-Bp2BYb+QWgefn2e8DblGUzejLEyhtG0DnIcSMzAzFtBK33ITvzLM9B8maTHPoy7Cx7XdxEb7l0iNKQAXBZ1NOw=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.41.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1DmJwH0PPRPjVwUGHINP1YiH7fO25mhpf2B5N8ubBQdOjEVTRI0x69m8eJGoUSLISoW0kgPX2zTAiHc4zllQ/g=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.41.2", "", { "os": "linux", "cpu": "none" }, "sha512-/9TBJIyoervs137gteTbzOSsIc/Io6xnXvjXYTEEqDRi3a9OokdBwfllN8AmPFGcU+WzoAiTc6n9SJiPohJ3CQ=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.41.2", "", { "os": "linux", "cpu": "none" }, "sha512-qqwpXqu6mV6Vm+EsU2NQk/xLiQfCv+NYmYNCYF8FFIf7kzlHvDoqiNaqqOw0hAr8O5nRBQO+H6X4qEw4Y/0b8w=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.41.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-j5oHqcj58pDqN3+CeJdTB3NfHipxIxVIH24VkRlVVhs9jJXks1ovtO4Tf6YxlBzf44ZTx9D2uhO9DZttC/wgUA=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.41.2", "", { "os": "linux", "cpu": "x64" }, "sha512-F3fxs7ajUNny4z1TsprdWB9gg8QRwSNSSILVfTmG8rXdeUFWuHEf3Uf5ltrdii8CkzZS3kD/VFPdNVdH3BOpIA=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.41.2", "", { "os": "linux", "cpu": "x64" }, "sha512-2S74RTJ1lJeiX+HSCxlLD/6Z6ndu9/+Huf8kYrI2XTCztFosOWsjPt+aD4cxBG1JTWjoiRYtutc8HABruppFQQ=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.41.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LOXSg8GprvL36erslsrNEUirlxy28JcuyTH5PYSBj8wwa0gDQlR8sZricFRbZGCzLhFixvmW2ozj7Mi+j023sg=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.41.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-PFhMLaWu0lFziS+buQIJ+YGaifkABS2TGtmeuPRrPO8JKcG17sDSNj358otAP45gIzRWd4o9QM8R+DurDWJgTA=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.41.2", "", { "os": "win32", "cpu": "x64" }, "sha512-AQ5GvrrLYw6dfkfT/bgYg1NU54exCKDrO9JKOE87zy2mdf2CyI6Vayy41r8Vo+kNDpqacaVQppwvYl30YGJu/Q=="], + + "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], + + "@shikijs/core": ["@shikijs/core@1.29.2", "", { "dependencies": { "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ=="], + + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@1.29.2", "", { "dependencies": { "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "oniguruma-to-es": "^2.2.0" } }, "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A=="], + + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@1.29.2", "", { "dependencies": { "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1" } }, "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA=="], + + "@shikijs/langs": ["@shikijs/langs@1.29.2", "", { "dependencies": { "@shikijs/types": "1.29.2" } }, "sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ=="], + + "@shikijs/themes": ["@shikijs/themes@1.29.2", "", { "dependencies": { "@shikijs/types": "1.29.2" } }, "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g=="], + + "@shikijs/types": ["@shikijs/types@1.29.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw=="], + + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], + + "@swc/helpers": ["@swc/helpers@0.5.17", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A=="], + + "@tanstack/react-virtual": ["@tanstack/react-virtual@3.13.9", "", { "dependencies": { "@tanstack/virtual-core": "3.13.9" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-SPWC8kwG/dWBf7Py7cfheAPOxuvIv4fFQ54PdmYbg7CpXfsKxkucak43Q0qKsxVthhUJQ1A7CIMAIplq4BjVwA=="], + + "@tanstack/virtual-core": ["@tanstack/virtual-core@3.13.9", "", {}, "sha512-3jztt0jpaoJO5TARe2WIHC1UQC3VMLAFUW5mmMo0yrkwtDB2AQP0+sh10BVUpWrnvHjSLvzFizydtEGLCJKFoQ=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.20.7", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng=="], + + "@types/bun": ["@types/bun@1.2.19", "", { "dependencies": { "bun-types": "1.2.19" } }, "sha512-d9ZCmrH3CJ2uYKXQIUuZ/pUnTqIvLDS0SK7pFmbx8ma+ziH/FRMoAq5bYpRG7y+w1gl+HgyNZbtqgMq4W4e2Lg=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/file-saver": ["@types/file-saver@2.0.7", "", {}, "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@types/react": ["@types/react@19.1.6", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q=="], + + "@types/react-dom": ["@types/react-dom@19.1.6", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.33.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.33.1", "@typescript-eslint/type-utils": "8.33.1", "@typescript-eslint/utils": "8.33.1", "@typescript-eslint/visitor-keys": "8.33.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.33.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.33.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.33.1", "@typescript-eslint/types": "8.33.1", "@typescript-eslint/typescript-estree": "8.33.1", "@typescript-eslint/visitor-keys": "8.33.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.33.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.33.1", "@typescript-eslint/types": "^8.33.1", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.33.1", "", { "dependencies": { "@typescript-eslint/types": "8.33.1", "@typescript-eslint/visitor-keys": "8.33.1" } }, "sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.33.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.33.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.33.1", "@typescript-eslint/utils": "8.33.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.33.1", "", {}, "sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.33.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.33.1", "@typescript-eslint/tsconfig-utils": "8.33.1", "@typescript-eslint/types": "8.33.1", "@typescript-eslint/visitor-keys": "8.33.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.33.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.33.1", "@typescript-eslint/types": "8.33.1", "@typescript-eslint/typescript-estree": "8.33.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.33.1", "", { "dependencies": { "@typescript-eslint/types": "8.33.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ=="], + + "@uiw/codemirror-extensions-basic-setup": ["@uiw/codemirror-extensions-basic-setup@4.23.12", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/lint": "^6.0.0", "@codemirror/search": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0" }, "peerDependencies": { "@codemirror/autocomplete": ">=6.0.0", "@codemirror/commands": ">=6.0.0", "@codemirror/language": ">=6.0.0", "@codemirror/lint": ">=6.0.0", "@codemirror/search": ">=6.0.0", "@codemirror/state": ">=6.0.0", "@codemirror/view": ">=6.0.0" } }, "sha512-l9vuiXOTFDBetYrRLDmz3jDxQHDsrVAZ2Y6dVfmrqi2AsulsDu+y7csW0JsvaMqo79rYkaIZg8yeqmDgMb7VyQ=="], + + "@uiw/react-codemirror": ["@uiw/react-codemirror@4.23.12", "", { "dependencies": { "@babel/runtime": "^7.18.6", "@codemirror/commands": "^6.1.0", "@codemirror/state": "^6.1.1", "@codemirror/theme-one-dark": "^6.0.0", "@uiw/codemirror-extensions-basic-setup": "4.23.12", "codemirror": "^6.0.0" }, "peerDependencies": { "@babel/runtime": ">=7.11.0", "@codemirror/state": ">=6.0.0", "@codemirror/theme-one-dark": ">=6.0.0", "@codemirror/view": ">=6.0.0", "codemirror": ">=6.0.0", "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-yseqWdzoAAGAW7i/NiU8YrfSLVOEBjQvSx1KpDTFVV/nn0AlAZoDVTIPEBgdXrPlVUQoCrwgpEaj3uZCklk9QA=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "@vitejs/plugin-react": ["@vitejs/plugin-react@4.5.1", "", { "dependencies": { "@babel/core": "^7.26.10", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@rolldown/pluginutils": "1.0.0-beta.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "sha512-uPZBqSI0YD4lpkIru6M35sIfylLGTyhGHvDZbNLuMA73lMlwJKz5xweH7FajfcCAc2HnINciejA9qTz0dr0M7A=="], + + "acorn": ["acorn@8.14.1", "", { "bin": "bin/acorn" }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], + + "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], + + "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="], + + "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], + + "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], + + "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], + + "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="], + + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + + "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base64-arraybuffer": ["base64-arraybuffer@1.0.2", "", {}, "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.25.0", "", { "dependencies": { "caniuse-lite": "^1.0.30001718", "electron-to-chromium": "^1.5.160", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": "cli.js" }, "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA=="], + + "bun-types": ["bun-types@1.2.19", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-uAOTaZSPuYsWIXRpj7o56Let0g/wjihKCkeRqUBhlLVM/Bt+Fj9xTo+LhC1OV1XDaGkz4hNC80et5xgy+9KTHQ=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001721", "", {}, "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "classnames": ["classnames@2.5.1", "", {}, "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "codemirror": ["codemirror@6.0.1", "", { "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/lint": "^6.0.0", "@codemirror/search": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0" } }, "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "crelt": ["crelt@1.0.6", "", {}, "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "css-line-break": ["css-line-break@2.1.0", "", { "dependencies": { "utrie": "^1.0.2" } }, "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": "bin/cssesc" }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], + + "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], + + "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], + + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "decimal.js": ["decimal.js@10.5.0", "", {}, "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], + + "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], + + "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], + + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.165", "", {}, "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw=="], + + "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], + + "entities": ["entities@6.0.0", "", {}, "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw=="], + + "es-abstract": ["es-abstract@1.24.0", "", { "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.4", "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.3.0", "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-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "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", "stop-iteration-iterator": "^1.1.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.19" } }, "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-iterator-helpers": ["es-iterator-helpers@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.4", "safe-array-concat": "^1.1.3" } }, "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], + + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], + + "esbuild": ["esbuild@0.25.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.5", "@esbuild/android-arm": "0.25.5", "@esbuild/android-arm64": "0.25.5", "@esbuild/android-x64": "0.25.5", "@esbuild/darwin-arm64": "0.25.5", "@esbuild/darwin-x64": "0.25.5", "@esbuild/freebsd-arm64": "0.25.5", "@esbuild/freebsd-x64": "0.25.5", "@esbuild/linux-arm": "0.25.5", "@esbuild/linux-arm64": "0.25.5", "@esbuild/linux-ia32": "0.25.5", "@esbuild/linux-loong64": "0.25.5", "@esbuild/linux-mips64el": "0.25.5", "@esbuild/linux-ppc64": "0.25.5", "@esbuild/linux-riscv64": "0.25.5", "@esbuild/linux-s390x": "0.25.5", "@esbuild/linux-x64": "0.25.5", "@esbuild/netbsd-arm64": "0.25.5", "@esbuild/netbsd-x64": "0.25.5", "@esbuild/openbsd-arm64": "0.25.5", "@esbuild/openbsd-x64": "0.25.5", "@esbuild/sunos-x64": "0.25.5", "@esbuild/win32-arm64": "0.25.5", "@esbuild/win32-ia32": "0.25.5", "@esbuild/win32-x64": "0.25.5" }, "bin": "bin/esbuild" }, "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ=="], + + "esbuild-wasm": ["esbuild-wasm@0.25.9", "", { "bin": { "esbuild": "bin/esbuild" } }, "sha512-Jpv5tCSwQg18aCqCRD3oHIX/prBhXMDapIoG//A+6+dV0e7KQMGFg85ihJ5T1EeMjbZjON3TqFy0VrGAnIHLDA=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.28.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.28.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "bin": "bin/eslint.js" }, "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ=="], + + "eslint-config-prettier": ["eslint-config-prettier@10.1.5", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": "bin/cli.js" }, "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw=="], + + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], + + "eslint-module-utils": ["eslint-module-utils@2.12.0", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg=="], + + "eslint-plugin-import": ["eslint-plugin-import@2.31.0", "", { "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-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.0", "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" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A=="], + + "eslint-plugin-prettier": ["eslint-plugin-prettier@5.4.1", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.11.7" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint"] }, "sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg=="], + + "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="], + + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], + + "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.20", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA=="], + + "eslint-scope": ["eslint-scope@8.3.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], + + "espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fdir": ["fdir@6.4.5", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "file-saver": ["file-saver@2.0.5", "", {}, "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "framer-motion": ["framer-motion@12.16.0", "", { "dependencies": { "motion-dom": "^12.16.0", "motion-utils": "^12.12.1", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid"] }, "sha512-xryrmD4jSBQrS2IkMdcTmiS4aSKckbS7kLDCuhUn9110SQKG1w3zlq1RTqCblewg+ZYe+m3sdtzQA6cRwo5g8Q=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "function.prototype.name": ["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" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], + + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "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" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], + + "gifuct-js": ["gifuct-js@2.1.2", "", { "dependencies": { "js-binary-schema-parser": "^2.0.3" } }, "sha512-rI2asw77u0mGgwhV3qA+OEgYqaDn5UNqgs+Bx0FGwSpuqfYn+Ir6RQY5ENNQ8SbIiG/m5gVa7CD5RriO4f4Lsg=="], + + "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": "dist/esm/bin.mjs" }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "globrex": ["globrex@0.1.2", "", {}, "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "html-dom-parser": ["html-dom-parser@5.1.1", "", { "dependencies": { "domhandler": "5.0.3", "htmlparser2": "10.0.0" } }, "sha512-+o4Y4Z0CLuyemeccvGN4bAO20aauB2N9tFEAep5x4OW34kV4PTarBHm6RL02afYt2BMKcr0D2Agep8S3nJPIBg=="], + + "html-react-parser": ["html-react-parser@5.2.5", "", { "dependencies": { "domhandler": "5.0.3", "html-dom-parser": "5.1.1", "react-property": "2.0.2", "style-to-js": "1.1.16" }, "peerDependencies": { "@types/react": "0.14 || 15 || 16 || 17 || 18 || 19", "react": "0.14 || 15 || 16 || 17 || 18 || 19" } }, "sha512-bRPdv8KTqG9CEQPMNGksDqmbiRfVQeOidry8pVetdh/1jQ1Edx4KX5m0lWvDD89Pt4CqTYjK1BLz6NoNVxN/Uw=="], + + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + + "html2canvas-pro": ["html2canvas-pro@1.5.11", "", { "dependencies": { "css-line-break": "^2.1.0", "text-segmentation": "^1.0.3" } }, "sha512-W4pEeKLG8+9a54RDOSiEKq7gRXXDzt0ORMaLXX+l6a3urSKbmnkmyzcRDCtgTOzmHLaZTLG2wiTQMJqKLlSh3w=="], + + "htmlparser2": ["htmlparser2@10.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.1", "entities": "^6.0.0" } }, "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "inline-style-parser": ["inline-style-parser@0.2.4", "", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="], + + "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + + "intl-messageformat": ["intl-messageformat@10.7.16", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.4", "@formatjs/fast-memoize": "2.2.7", "@formatjs/icu-messageformat-parser": "2.11.2", "tslib": "^2.8.0" } }, "sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug=="], + + "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], + + "is-async-function": ["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" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], + + "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], + + "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], + + "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], + + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], + + "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], + + "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], + + "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], + + "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], + + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "jiti": ["jiti@1.21.7", "", { "bin": "bin/jiti.js" }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "js-binary-schema-parser": ["js-binary-schema-parser@2.0.3", "", {}, "sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": "bin/js-yaml.js" }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": "bin/jsesc" }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json5": ["json5@2.2.3", "", { "bin": "lib/cli.js" }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], + + "jszip": ["jszip@3.10.1", "", { "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" } }, "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lie": ["lie@3.3.0", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ=="], + + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": "cli.js" }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "motion": ["motion@12.16.0", "", { "dependencies": { "framer-motion": "^12.16.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid"] }, "sha512-P3HA83fnPMEGBLfKdD5vDdjH1Aa3wM3jT3+HX3fCVpy/4/lJiqvABajLgZenBu+rzkFzmeaPkvT7ouf9Tq5tVQ=="], + + "motion-dom": ["motion-dom@12.16.0", "", { "dependencies": { "motion-utils": "^12.12.1" } }, "sha512-Z2nGwWrrdH4egLEtgYMCEN4V2qQt1qxlKy/uV7w691ztyA41Q5Rbn0KNGbsNVDZr9E8PD2IOQ3hSccRnB6xWzw=="], + + "motion-utils": ["motion-utils@12.12.1", "", {}, "sha512-f9qiqUHm7hWSLlNW8gS9pisnsN7CRFRD58vNjptKdsqFLpkVnX00TNeD6Q0d27V9KzT7ySFyK1TZ/DShfVOv6w=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": "bin/nanoid.cjs" }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["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.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="], + + "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], + + "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], + + "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "oniguruma-to-es": ["oniguruma-to-es@2.3.0", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^5.1.1", "regex-recursion": "^5.1.1" } }, "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], + + "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + + "postcss": ["postcss@8.5.4", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w=="], + + "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="], + + "postcss-js": ["postcss-js@4.0.1", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw=="], + + "postcss-load-config": ["postcss-load-config@4.0.2", "", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="], + + "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], + + "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.5.3", "", { "bin": "bin/prettier.cjs" }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], + + "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="], + + "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.6.12", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order", "prettier-plugin-svelte"] }, "sha512-OuTQKoqNwV7RnxTPwXWzOFXy6Jc4z8oeRZYGuMpRyG3WbuR3jjXdQFK8qFBMBx8UHWdHrddARz2fgUenild6aw=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], + + "react-aria": ["react-aria@3.41.0", "", { "dependencies": { "@internationalized/string": "^3.2.7", "@react-aria/breadcrumbs": "^3.5.25", "@react-aria/button": "^3.13.2", "@react-aria/calendar": "^3.8.2", "@react-aria/checkbox": "^3.15.6", "@react-aria/color": "^3.0.8", "@react-aria/combobox": "^3.12.4", "@react-aria/datepicker": "^3.14.4", "@react-aria/dialog": "^3.5.26", "@react-aria/disclosure": "^3.0.6", "@react-aria/dnd": "^3.10.0", "@react-aria/focus": "^3.20.4", "@react-aria/gridlist": "^3.13.1", "@react-aria/i18n": "^3.12.10", "@react-aria/interactions": "^3.25.2", "@react-aria/label": "^3.7.19", "@react-aria/landmark": "^3.0.4", "@react-aria/link": "^3.8.2", "@react-aria/listbox": "^3.14.5", "@react-aria/menu": "^3.18.4", "@react-aria/meter": "^3.4.24", "@react-aria/numberfield": "^3.11.15", "@react-aria/overlays": "^3.27.2", "@react-aria/progress": "^3.4.24", "@react-aria/radio": "^3.11.4", "@react-aria/searchfield": "^3.8.5", "@react-aria/select": "^3.15.6", "@react-aria/selection": "^3.24.2", "@react-aria/separator": "^3.4.10", "@react-aria/slider": "^3.7.20", "@react-aria/ssr": "^3.9.9", "@react-aria/switch": "^3.7.4", "@react-aria/table": "^3.17.4", "@react-aria/tabs": "^3.10.4", "@react-aria/tag": "^3.6.1", "@react-aria/textfield": "^3.17.4", "@react-aria/toast": "^3.0.4", "@react-aria/tooltip": "^3.8.4", "@react-aria/tree": "^3.1.0", "@react-aria/utils": "^3.29.1", "@react-aria/visually-hidden": "^3.8.24", "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-jg4aUQrsBTwgKitXlyLvEVSigzn79jNpgDP+mrrDIX8emzr+BBXx1x6WSVHDAESep72Xcp+zr9PbLmBCk3/nzQ=="], + + "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="], + + "react-hotkeys-hook": ["react-hotkeys-hook@4.6.2", "", { "peerDependencies": { "react": ">=16.8.1", "react-dom": ">=16.8.1" } }, "sha512-FmP+ZriY3EG59Ug/lxNfrObCnW9xQShgk7Nb83+CkpfkcCpfS95ydv+E9JuXA5cp8KtskU7LGlIARpkc92X22Q=="], + + "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "react-property": ["react-property@2.0.2", "", {}, "sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug=="], + + "react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], + + "react-stately": ["react-stately@3.39.0", "", { "dependencies": { "@react-stately/calendar": "^3.8.2", "@react-stately/checkbox": "^3.6.15", "@react-stately/collections": "^3.12.5", "@react-stately/color": "^3.8.6", "@react-stately/combobox": "^3.10.6", "@react-stately/data": "^3.13.1", "@react-stately/datepicker": "^3.14.2", "@react-stately/disclosure": "^3.0.5", "@react-stately/dnd": "^3.6.0", "@react-stately/form": "^3.1.5", "@react-stately/list": "^3.12.3", "@react-stately/menu": "^3.9.5", "@react-stately/numberfield": "^3.9.13", "@react-stately/overlays": "^3.6.17", "@react-stately/radio": "^3.10.14", "@react-stately/searchfield": "^3.5.13", "@react-stately/select": "^3.6.14", "@react-stately/selection": "^3.20.3", "@react-stately/slider": "^3.6.5", "@react-stately/table": "^3.14.3", "@react-stately/tabs": "^3.8.3", "@react-stately/toast": "^3.1.1", "@react-stately/toggle": "^3.8.5", "@react-stately/tooltip": "^3.5.5", "@react-stately/tree": "^3.9.0", "@react-types/shared": "^3.30.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-/8JC3Tmj7G8fHn47F88c6t5kFNhQAufwqjEKxYeNi7TPz9UL+35BeoH1poMmDHJsPz8qM/z4sWMzaW5AwYK8lQ=="], + + "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], + + "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "reflect.getprototypeof": ["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.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], + + "regex": ["regex@5.1.1", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw=="], + + "regex-recursion": ["regex-recursion@5.1.1", "", { "dependencies": { "regex": "^5.1.1", "regex-utilities": "^2.3.0" } }, "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w=="], + + "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], + + "regexp.prototype.flags": ["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" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], + + "remeda": ["remeda@2.22.6", "", { "dependencies": { "type-fest": "^4.41.0" } }, "sha512-Uc5x8dYtojNXcaPRdJ+nr5NHoM5yEYMBRALy405176+eNCqzsCa6OqYZ7ZK+ZeCdbW3t5Rdu6kjBBElaB/B0YQ=="], + + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rollup": ["rollup@4.41.2", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.41.2", "@rollup/rollup-android-arm64": "4.41.2", "@rollup/rollup-darwin-arm64": "4.41.2", "@rollup/rollup-darwin-x64": "4.41.2", "@rollup/rollup-freebsd-arm64": "4.41.2", "@rollup/rollup-freebsd-x64": "4.41.2", "@rollup/rollup-linux-arm-gnueabihf": "4.41.2", "@rollup/rollup-linux-arm-musleabihf": "4.41.2", "@rollup/rollup-linux-arm64-gnu": "4.41.2", "@rollup/rollup-linux-arm64-musl": "4.41.2", "@rollup/rollup-linux-loongarch64-gnu": "4.41.2", "@rollup/rollup-linux-powerpc64le-gnu": "4.41.2", "@rollup/rollup-linux-riscv64-gnu": "4.41.2", "@rollup/rollup-linux-riscv64-musl": "4.41.2", "@rollup/rollup-linux-s390x-gnu": "4.41.2", "@rollup/rollup-linux-x64-gnu": "4.41.2", "@rollup/rollup-linux-x64-musl": "4.41.2", "@rollup/rollup-win32-arm64-msvc": "4.41.2", "@rollup/rollup-win32-ia32-msvc": "4.41.2", "@rollup/rollup-win32-x64-msvc": "4.41.2", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-6VwIRjxJPRGfwtHnBWrApOrFposYNARbBUnBzWSBYutdukosTadkxSB1prmEd95jhiJ1uWtZOD3sDx7qfVwu4A=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], + + "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], + + "semver": ["semver@7.7.2", "", { "bin": "bin/semver.js" }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], + + "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], + + "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shiki": ["shiki@1.29.2", "", { "dependencies": { "@shikijs/core": "1.29.2", "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/langs": "1.29.2", "@shikijs/themes": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "sonner": ["sonner@2.0.5", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-YwbHQO6cSso3HBXlbCkgrgzDNIhws14r4MO87Ofy+cV2X7ES4pOoAK3+veSmVTvqNx1BWUxlhPmZzP00Crk2aQ=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], + + "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string.prototype.matchall": ["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.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="], + + "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="], + + "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], + + "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], + + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], + + "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "style-mod": ["style-mod@4.1.2", "", {}, "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw=="], + + "style-to-js": ["style-to-js@1.1.16", "", { "dependencies": { "style-to-object": "1.0.8" } }, "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw=="], + + "style-to-object": ["style-to-object@1.0.8", "", { "dependencies": { "inline-style-parser": "0.2.4" } }, "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g=="], + + "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "synckit": ["synckit@0.11.8", "", { "dependencies": { "@pkgr/core": "^0.2.4" } }, "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A=="], + + "tabbable": ["tabbable@6.2.0", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="], + + "tailwind-merge": ["tailwind-merge@2.6.0", "", {}, "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA=="], + + "tailwindcss": ["tailwindcss@3.4.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.6", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og=="], + + "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], + + "text-segmentation": ["text-segmentation@1.0.3", "", { "dependencies": { "utrie": "^1.0.2" } }, "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw=="], + + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], + + "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], + + "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], + + "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "bin": "bin/tsconfck.js" }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="], + + "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], + + "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], + + "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], + + "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], + + "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], + + "typescript-eslint": ["typescript-eslint@8.33.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.33.1", "@typescript-eslint/parser": "8.33.1", "@typescript-eslint/utils": "8.33.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A=="], + + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + + "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="], + + "unxhr": ["unxhr@1.2.0", "", {}, "sha512-6cGpm8NFXPD9QbSNx0cD2giy7teZ6xOkCUH3U89WKVkL9N9rBrWjlCwhR94Re18ZlAop4MOc3WU1M3Hv/bgpIw=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": "cli.js" }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "use-sync-external-store": ["use-sync-external-store@1.5.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A=="], + + "usehooks-ts": ["usehooks-ts@3.1.1", "", { "dependencies": { "lodash.debounce": "^4.0.8" }, "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-I4diPp9Cq6ieSUH2wu+fDAVQO43xwtulo+fKEidHUwZPnYImbtkTjzIJYcDcJqxgmX31GVqNFURodvcgHcW0pA=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "utrie": ["utrie@1.0.2", "", { "dependencies": { "base64-arraybuffer": "^1.0.2" } }, "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-message": ["vfile-message@4.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="], + + "vite": ["vite@6.3.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx"], "bin": "bin/vite.js" }, "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ=="], + + "vite-tsconfig-paths": ["vite-tsconfig-paths@5.1.4", "", { "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", "tsconfck": "^3.0.3" }, "peerDependencies": { "vite": "*" } }, "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w=="], + + "w3c-keyname": ["w3c-keyname@2.2.8", "", {}, "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], + + "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], + + "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], + + "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "yaml": ["yaml@2.8.0", "", { "bin": "bin.mjs" }, "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@asciidoctor/opal-runtime/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "@headlessui/react/@floating-ui/react": ["@floating-ui/react@0.26.28", "", { "dependencies": { "@floating-ui/react-dom": "^2.1.2", "@floating-ui/utils": "^0.2.8", "tabbable": "^6.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw=="], + + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], + + "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "rollup/@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], + + "safe-array-concat/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "safe-push-apply/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": "lib/cli.js" }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], + + "which-builtin-type/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "@asciidoctor/opal-runtime/glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "@asciidoctor/opal-runtime/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + } +} diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index db8d9c1..0000000 Binary files a/bun.lockb and /dev/null differ diff --git a/package.json b/package.json index 5318579..0fb22b7 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,10 @@ "preview": "vite preview", "tsc": "tsc", "lint": "eslint app", - "ci": "bun run fmt:check && bun run tsc && bun run lint" + "test": "bun test", + "test:watch": "bun test --watch", + "test:coverage": "bun test --coverage", + "ci": "bun run fmt:check && bun run tsc && bun run lint && bun run test" }, "dependencies": { "@ariakit/react": "^0.4.15", @@ -23,9 +26,11 @@ "@ffmpeg/util": "^0.12.2", "@ianvs/prettier-plugin-sort-imports": "^4.4.1", "@oxide/design-system": "^2.5.0", + "@radix-ui/react-accordion": "^1.2.11", "@react-hook/resize-observer": "^2.0.2", "@uiw/react-codemirror": "^4.23.10", "clsx": "^2.1.1", + "esbuild-wasm": "^0.25.9", "eslint-config-prettier": "^10.1.1", "eslint-plugin-import": "^2.31.0", "eslint-plugin-prettier": "^5.2.3", @@ -46,11 +51,13 @@ "sonner": "^2.0.2", "tailwind-merge": "^2.5.5", "tailwindcss-animate": "^1.0.7", + "usehooks-ts": "^3.1.1", "vite-tsconfig-paths": "^5.1.4" }, "devDependencies": { "@eslint/compat": "^1.2.8", "@eslint/js": "^9.21.0", + "@types/bun": "^1.2.19", "@types/file-saver": "^2.0.7", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", diff --git a/tests/control-variables.test.ts b/tests/control-variables.test.ts new file mode 100644 index 0000000..feecd42 --- /dev/null +++ b/tests/control-variables.test.ts @@ -0,0 +1,274 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright Oxide Computer Company + */ +import { describe, expect, test } from 'bun:test' + +import { PATTERNS } from '~/components/code-sidebar' + +describe('Control Variable Patterns', () => { + test('SIMPLE_VAR pattern should match basic variable declarations', () => { + const tests = [ + ['const speed = 5; //~ number 1-10', ['speed', '5', 'number 1-10']], + ['const enabled = true; //~ boolean', ['enabled', 'true', 'boolean']], + ['const text = "hello"; //~ text', ['text', '"hello"', 'text']], + ] + + tests.forEach(([line, expected]) => { + const match = (line as string).match(PATTERNS.SIMPLE_VAR) + + expect(match).not.toBeNull() + expect([match![1], match![2], match![3]]).toEqual(expected as string[]) + }) + }) + + test('SIMPLE_VAR pattern should match TypeScript typed variable declarations', () => { + const tests = [ + ['const speed: number = 5; //~ number 1-10', ['speed', '5', 'number 1-10']], + ['const enabled: boolean = true; //~ boolean', ['enabled', 'true', 'boolean']], + ['const text: string = "hello"; //~ text', ['text', '"hello"', 'text']], + ['const count: number = 42; //~ number 0-100', ['count', '42', 'number 0-100']], + ['const name: string = `world`; //~ text', ['name', '`world`', 'text']], + ] + + tests.forEach(([line, expected]) => { + const match = (line as string).match(PATTERNS.SIMPLE_VAR) + + expect(match).not.toBeNull() + expect([match![1], match![2], match![3]]).toEqual(expected as string[]) + }) + }) + + test('ROOT_OBJECT pattern should match inline object declarations', () => { + const line = 'const config = { x: 10, y: 20 }; //~ number 0-100' + const match = line.match(PATTERNS.ROOT_OBJECT) + + expect(match).not.toBeNull() + expect(match![1]).toBe('config') + expect(match![2]).toBe('x: 10, y: 20 ') + expect(match![3]).toBe('number 0-100') + }) + + test('ROOT_OBJECT pattern should match TypeScript typed inline object declarations', () => { + const tests = [ + [ + 'const config: { x: number; y: number } = { x: 10, y: 20 }; //~ number 0-100', + ['config', 'x: 10, y: 20 ', 'number 0-100'], + ], + [ + 'const position: Position = { x: 5, y: 15 }; //~ number 1-50', + ['position', 'x: 5, y: 15 ', 'number 1-50'], + ], + [ + 'const settings: any = { width: 800, height: 600 }; //~ number 100-2000', + ['settings', 'width: 800, height: 600 ', 'number 100-2000'], + ], + ] + + tests.forEach(([line, expected]) => { + const match = (line as string).match(PATTERNS.ROOT_OBJECT) + + expect(match).not.toBeNull() + expect([match![1], match![2], match![3]]).toEqual(expected as string[]) + }) + }) + + test('OBJECT_PROP pattern should match object properties', () => { + const line = ' width: 800, //~ number 100-2000' + const match = line.match(PATTERNS.OBJECT_PROP) + + expect(match).not.toBeNull() + expect(match![1]).toBe('width') + expect(match![2]).toBe('800') + expect(match![3]).toBe('number 100-2000') + }) + + test('RANGE pattern should extract min-max values', () => { + const tests = [ + ['number 1-10', ['1', '10']], + ['number -50-50', ['-50', '50']], + ['number 0.5-10.5', ['0.5', '10.5']], + ] + + tests.forEach(([config, expected]) => { + const match = (config as string).match(PATTERNS.RANGE) + expect(match).not.toBeNull() + expect([match![1], match![2]]).toEqual(expected as string[]) + }) + }) + + test('STEP pattern should extract step values', () => { + const config = 'number 1-10 step=0.5' + const match = config.match(PATTERNS.STEP) + + expect(match).not.toBeNull() + expect(match![1]).toBe('0.5') + }) +}) + +describe('Control Variable Parsing Integration', () => { + // Simple mock of the parseControlVariables function to test key scenarios + function extractControlVariables(code: string) { + const lines = code.split('\n') + const controls: Array<{ + name: string + type: string + value: string | number | boolean + }> = [] + + lines.forEach((line) => { + const simpleMatch = line.match(PATTERNS.SIMPLE_VAR) + if (simpleMatch) { + const [, name, valueStr, controlConfig] = simpleMatch + const type = controlConfig.trim().split(/\s+/)[0] + + let value: string | number | boolean = valueStr.trim() + if (type === 'number') value = parseFloat(value) + if (type === 'boolean') value = value === 'true' + if (type === 'text') value = (value as string).replace(/^['"`]|['"`]$/g, '') + + controls.push({ name, type, value }) + } + + const rootObjectMatch = line.match(PATTERNS.ROOT_OBJECT) + if (rootObjectMatch) { + const [, _objName, content, controlConfig] = rootObjectMatch + const type = controlConfig.trim().split(/\s+/)[0] + + let match + PATTERNS.PROP_VALUE.lastIndex = 0 + while ((match = PATTERNS.PROP_VALUE.exec(content)) !== null) { + const [, propName, valueStr] = match + let value: string | number | boolean = valueStr.trim() + if (type === 'number') value = parseFloat(value) + if (type === 'boolean') value = value === 'true' + if (type === 'text') value = (value as string).replace(/^['"`]|['"`]$/g, '') + + controls.push({ name: propName, type, value }) + } + } + }) + + return controls + } + + test('should parse simple variable declarations', () => { + const code = ` +const speed = 5; //~ number 1-10 +const enabled = true; //~ boolean +const message = "hello"; //~ text + ` + + const result = extractControlVariables(code) + + expect(result).toHaveLength(3) + expect(result[0]).toEqual({ name: 'speed', type: 'number', value: 5 }) + expect(result[1]).toEqual({ name: 'enabled', type: 'boolean', value: true }) + expect(result[2]).toEqual({ name: 'message', type: 'text', value: 'hello' }) + }) + + test('should parse TypeScript typed variable declarations', () => { + const code = ` +const speed: number = 5; //~ number 1-10 +const enabled: boolean = true; //~ boolean +const message: string = "hello"; //~ text +const count: number = 42; //~ number 0-100 +const active: boolean = false; //~ boolean + ` + + const result = extractControlVariables(code) + + expect(result).toHaveLength(5) + expect(result[0]).toEqual({ name: 'speed', type: 'number', value: 5 }) + expect(result[1]).toEqual({ name: 'enabled', type: 'boolean', value: true }) + expect(result[2]).toEqual({ name: 'message', type: 'text', value: 'hello' }) + expect(result[3]).toEqual({ name: 'count', type: 'number', value: 42 }) + expect(result[4]).toEqual({ name: 'active', type: 'boolean', value: false }) + }) + + test('should parse inline object declarations', () => { + const code = `const position = { x: 10, y: 20 }; //~ number 0-100` + + const result = extractControlVariables(code) + + expect(result.length).toBeGreaterThan(0) + expect(result.some((r) => r.name === 'x' && r.value === 10)).toBe(true) + expect(result.some((r) => r.name === 'y' && r.value === 20)).toBe(true) + }) + + test('should parse TypeScript typed inline object declarations', () => { + const code = `const position: { x: number; y: number } = { x: 10, y: 20 }; //~ number 0-100` + + const result = extractControlVariables(code) + + expect(result.length).toBeGreaterThan(0) + expect(result.some((r) => r.name === 'x' && r.value === 10)).toBe(true) + expect(result.some((r) => r.name === 'y' && r.value === 20)).toBe(true) + }) + + test('should handle different quote types in text values', () => { + const code = ` +const single = 'hello'; //~ text +const double = "world"; //~ text +const backtick = \`test\`; //~ text + ` + + const result = extractControlVariables(code) + + expect(result).toHaveLength(3) + expect(result[0].value).toBe('hello') + expect(result[1].value).toBe('world') + expect(result[2].value).toBe('test') + }) + + test('should ignore lines without control annotations', () => { + const code = ` +const regularVar = 10; +const speed = 5; //~ number 1-10 +const anotherVar = "test"; + ` + + const result = extractControlVariables(code) + + expect(result).toHaveLength(1) + expect(result[0].name).toBe('speed') + }) + + test('should handle mixed TypeScript typed and untyped variables', () => { + const code = ` +const speed = 5; //~ number 1-10 +const position: { x: number; y: number } = { x: 10, y: 20 }; //~ number 0-100 +const enabled: boolean = true; //~ boolean +const message = "hello"; //~ text + ` + + const result = extractControlVariables(code) + + expect(result).toHaveLength(5) + expect(result[0]).toEqual({ name: 'speed', type: 'number', value: 5 }) + expect(result.some((r) => r.name === 'x' && r.value === 10)).toBe(true) + expect(result.some((r) => r.name === 'y' && r.value === 20)).toBe(true) + expect(result.some((r) => r.name === 'enabled' && r.value === true)).toBe(true) + expect(result.some((r) => r.name === 'message' && r.value === 'hello')).toBe(true) + }) + + test('should handle complex TypeScript type annotations', () => { + const code = ` +const config: Record = { width: 800, height: 600 }; //~ number 100-2000 +const settings: any = { x: 5 }; //~ number 1-10 +const point: Point = { x: 15, y: 25 }; //~ number 0-50 + ` + + const result = extractControlVariables(code) + + expect(result.length).toBeGreaterThan(0) + expect(result.some((r) => r.name === 'width' && r.value === 800)).toBe(true) + expect(result.some((r) => r.name === 'height' && r.value === 600)).toBe(true) + expect(result.some((r) => r.name === 'x' && r.value === 5)).toBe(true) + expect(result.some((r) => r.name === 'x' && r.value === 15)).toBe(true) + expect(result.some((r) => r.name === 'y' && r.value === 25)).toBe(true) + }) +}) diff --git a/tsconfig.json b/tsconfig.json index b92ee29..5ea2cee 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,6 +20,8 @@ "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true, + "types": ["bun-types"], + "paths": { "~/*": ["./app/*"] }