diff --git a/.distignore b/.distignore index bc0bfe221..793bbc9a9 100755 --- a/.distignore +++ b/.distignore @@ -34,3 +34,5 @@ AGENTS.md .claude skills classes/Visualizer/Gutenberg/src +classes/Visualizer/ChartBuilder/src +classes/Visualizer/D3Renderer/src diff --git a/.github/workflows/build-dev-artifacts.yml b/.github/workflows/build-dev-artifacts.yml index 54722a208..8a6a1398a 100755 --- a/.github/workflows/build-dev-artifacts.yml +++ b/.github/workflows/build-dev-artifacts.yml @@ -31,6 +31,8 @@ jobs: run: | npm ci npm run gutenberg:build + npm run chartbuilder:build + npm run d3renderer:build CURRENT_VERSION=$(node -p -e "require('./package.json').version") COMMIT_HASH=$(git rev-parse --short HEAD) DEV_VERSION="${CURRENT_VERSION}-dev.${COMMIT_HASH}" diff --git a/.github/workflows/deploy-wporg.yml b/.github/workflows/deploy-wporg.yml index 2c4d342cf..3283b8e9a 100644 --- a/.github/workflows/deploy-wporg.yml +++ b/.github/workflows/deploy-wporg.yml @@ -16,6 +16,8 @@ jobs: run: | npm ci npm run gutenberg:build + npm run chartbuilder:build + npm run d3renderer:build composer install --no-dev --prefer-dist --no-progress --no-suggest - name: WordPress Plugin Deploy uses: 10up/action-wordpress-plugin-deploy@master diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 08808862e..33c6c874a 100755 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -25,6 +25,8 @@ jobs: run: | npm ci npm run gutenberg:build + npm run chartbuilder:build + npm run d3renderer:build npm install -g playwright-cli npx playwright install --with-deps chromium - name: Install composer deps diff --git a/.gitignore b/.gitignore index ca03439b9..7ff179d3f 100755 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ vendor artifacts .phpunit.result.cache classes/Visualizer/Gutenberg/build +classes/Visualizer/ChartBuilder/build +classes/Visualizer/D3Renderer/build diff --git a/classes/Visualizer/ChartBuilder/src/AIBuilder/DataSource.js b/classes/Visualizer/ChartBuilder/src/AIBuilder/DataSource.js new file mode 100644 index 000000000..b7b6ea6d6 --- /dev/null +++ b/classes/Visualizer/ChartBuilder/src/AIBuilder/DataSource.js @@ -0,0 +1,664 @@ +/** + * DataSource — Manual | File | URL (CSV/XLSX only) + */ +import { useState, useRef, useEffect } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { Box, Flex, Stack, Text } from '@chakra-ui/react'; +import { HotTable } from '@handsontable/react'; +import { uploadCsvString, uploadFile, uploadFileUrl } from './api'; + +// ── Warm neutral palette ────────────────────────────────────────────────────── +const C = { + bg: '#f6f7f7', + sidebar: '#f0f0f1', + border: '#dcdcde', + dark: '#1d2327', + gray1: '#646970', + gray2: '#8c8f94', + gray3: '#c3c4c7', + dim: '#f0f0f1', + hover: '#f6f7f7', +}; + +// ── Field atoms ─────────────────────────────────────────────────────────────── + +const FieldHint = ( { children } ) => ( + { children } +); + +const FieldLabel = ( { children } ) => ( + + { children } + +); + +const inputSx = { + '&::placeholder': { color: '#C4C2BC' }, + '&:focus': { borderColor: '#1C1C1E', boxShadow: '0 0 0 3px rgba(28,28,30,0.07)', outline: 'none' }, +}; + +const FieldInput = ( props ) => ( + +); + +// ── Source icons ────────────────────────────────────────────────────────────── + +function IconManual( { active } ) { + const c = active ? '#fff' : C.gray1; + return ( + + + + + + ); +} + +function IconSheet( { active } ) { + const c = active ? '#fff' : C.gray1; + return ( + + + + + ); +} + +function IconFile( { active } ) { + const c = active ? '#fff' : C.gray1; + return ( + + + + + + ); +} + +function IconUrl( { active } ) { + const c = active ? '#fff' : C.gray1; + return ( + + + + + ); +} + +const SOURCES = [ + { id: 'manual', Icon: IconManual, label: __( 'Manual', 'visualizer' ) }, + { id: 'sheet', Icon: IconSheet, label: __( 'Spreadsheet', 'visualizer' ) }, + { id: 'csv_file', Icon: IconFile, label: __( 'File', 'visualizer' ) }, + { id: 'url', Icon: IconUrl, label: __( 'URL', 'visualizer' ) }, +]; + +const SAMPLE_CSV = `Task,Hours per Day\nstring,number\nWork,11\nEat,2\nCommute,2\nWatch TV,2\nSleep,7`; +const PLACEHOLDER_CSV = `Month,Revenue,Costs\nstring,number,number\nJan,45000,32000\nFeb,52000,38000`; + +export default function DataSource( { chartId, uploadNonce, onDataReady, dataLoaded, initialCsvText = '', disabled = false, dataWarning = null, onClearWarning = null } ) { + const isPro = !! window?.vizAIBuilder?.isPro; + const [ source, setSource ] = useState( 'manual' ); + const [ loading, setLoading ] = useState( false ); + const [ error, setError ] = useState( null ); + + // Manual + const [ csvText, setCsvText ] = useState( '' ); + const [ sheetRows, setSheetRows ] = useState( [] ); + const sheetEditRef = useRef( false ); + const sheetHotRef = useRef( null ); + + // File + const [ file, setFile ] = useState( null ); + const fileInputRef = useRef( null ); + const skipUploadRef = useRef( false ); + + // URL + const [ fileUrl, setFileUrl ] = useState( '' ); + const lastCsvRef = useRef( null ); + + function parseCsv( text ) { + const lines = text.split( /\r?\n/ ).map( ( l ) => l.trim() ).filter( Boolean ); + if ( lines.length < 3 ) return null; + const header = lines[ 0 ]; + const types = lines[ 1 ]; + const data = lines.slice( 2 ).join( '\n' ); + return { header, types, data }; + } + + function csvToGrid( text ) { + const lines = text.split( /\r?\n/ ).filter( ( l ) => l.length ); + if ( lines.length === 0 ) { + return [ + [ 'Column 1', 'Column 2' ], + [ 'string', 'number' ], + [ '', '' ], + ]; + } + const rows = lines.map( ( line ) => line.split( ',' ) ); + const maxCols = Math.max( ...rows.map( ( r ) => r.length ) ); + return rows.map( ( r ) => [ ...r, ...Array( Math.max( 0, maxCols - r.length ) ).fill( '' ) ] ); + } + + function gridToCsv( rows ) { + return rows.map( ( r ) => r.join( ',' ) ).join( '\n' ); + } + + function cleanGrid( rows ) { + if ( ! rows || ! rows.length ) return rows; + const isEmpty = ( value ) => value === null || value === undefined || String( value ).trim() === ''; + let lastColIndex = -1; + rows.forEach( ( row ) => { + row.forEach( ( value, index ) => { + if ( ! isEmpty( value ) ) { + lastColIndex = Math.max( lastColIndex, index ); + } + } ); + } ); + lastColIndex = Math.max( lastColIndex, 1 ); + let trimmed = rows.map( ( row ) => row.slice( 0, lastColIndex + 1 ) ); + + let lastDataRow = -1; + for ( let i = 2; i < trimmed.length; i++ ) { + if ( trimmed[ i ].some( ( value ) => ! isEmpty( value ) ) ) { + lastDataRow = i; + } + } + const headerRows = trimmed.slice( 0, 2 ); + if ( lastDataRow >= 2 ) { + trimmed = headerRows.concat( trimmed.slice( 2, lastDataRow + 1 ) ); + } else { + trimmed = headerRows.concat( [ Array( lastColIndex + 1 ).fill( '' ) ] ); + } + return trimmed; + } + + function buildCsv( series = [], data = [] ) { + if ( ! series.length ) return ''; + const labels = series.map( ( s ) => s.label ).join( ',' ); + const types = series.map( ( s ) => s.type || 'string' ).join( ',' ); + const rows = ( data || [] ).map( ( row ) => row.join( ',' ) ); + return [ labels, types, ...rows ].join( '\n' ); + } + + function switchSource( id ) { + if ( id === 'manual' && source === 'sheet' ) { + const cleaned = cleanGrid( sheetRows ); + skipUploadRef.current = true; + setSheetRows( cleaned ); + setCsvText( gridToCsv( cleaned ) ); + } + setSource( id ); + setError( null ); + if ( onClearWarning ) onClearWarning(); + } + + // ── Auto-load effects ───────────────────────────────────────────────────── + + // Populate manual textarea from initialCsvText (edit mode), without triggering upload. + useEffect( () => { + if ( ! initialCsvText ) return; + skipUploadRef.current = true; + lastCsvRef.current = initialCsvText.trim(); + setCsvText( initialCsvText ); + }, [ initialCsvText ] ); // eslint-disable-line react-hooks/exhaustive-deps + + // Manual CSV: debounce 700 ms — uploads whenever the full CSV text changes. + useEffect( () => { + if ( disabled ) return; + if ( ( source !== 'manual' && source !== 'sheet' ) || ! csvText.trim() || ! chartId ) return; + if ( skipUploadRef.current ) { skipUploadRef.current = false; return; } + const trimmed = csvText.trim(); + if ( lastCsvRef.current === trimmed ) return; + const parsed = parseCsv( trimmed ); + if ( ! parsed ) { + setError( __( 'CSV must include header and types rows.', 'visualizer' ) ); + return; + } + const t = setTimeout( async () => { + setLoading( true ); setError( null ); + try { + const r = await uploadCsvString( chartId, uploadNonce, trimmed ); + onDataReady( r.series, r.data ); + lastCsvRef.current = trimmed; + } catch ( e ) { setError( e.message ); } + finally { setLoading( false ); } + }, 700 ); + return () => clearTimeout( t ); + }, [ source, csvText ] ); // eslint-disable-line react-hooks/exhaustive-deps + + // File and URL import are manual (button-triggered). + async function handleImportFile() { + if ( disabled || ! file || ! chartId ) return; + setLoading( true ); setError( null ); + try { + const r = await uploadFile( chartId, uploadNonce, file ); + onDataReady( r.series, r.data ); + const csv = buildCsv( r.series, r.data ); + if ( csv ) { + skipUploadRef.current = true; + setCsvText( csv ); + } + setSource( 'manual' ); + } catch ( e ) { setError( e.message ); } + finally { setLoading( false ); } + } + + async function handleImportUrl() { + if ( disabled || ! fileUrl.trim() || ! chartId ) return; + setLoading( true ); setError( null ); + try { + const r = await uploadFileUrl( chartId, uploadNonce, fileUrl.trim() ); + onDataReady( r.series, r.data ); + const csv = buildCsv( r.series, r.data ); + if ( csv ) { + skipUploadRef.current = true; + setCsvText( csv ); + } + setSource( 'manual' ); + } catch ( e ) { setError( e.message ); } + finally { setLoading( false ); } + } + + // Keep spreadsheet grid in sync with CSV when switching sources or external updates. + useEffect( () => { + if ( source !== 'sheet' ) return; + if ( sheetEditRef.current ) { sheetEditRef.current = false; return; } + setSheetRows( csvToGrid( csvText ) ); + }, [ source, csvText ] ); + + function updateSheetCell( rowIndex, colIndex, value ) { + setSheetRows( ( prev ) => { + const next = prev.map( ( r ) => [ ...r ] ); + if ( ! next[ rowIndex ] ) next[ rowIndex ] = []; + next[ rowIndex ][ colIndex ] = value; + sheetEditRef.current = true; + setCsvText( gridToCsv( next ) ); + return next; + } ); + } + + function addSheetRow() { + setSheetRows( ( prev ) => { + const cols = prev[ 0 ] ? prev[ 0 ].length : 2; + const next = [ ...prev, Array( cols ).fill( '' ) ]; + sheetEditRef.current = true; + setCsvText( gridToCsv( next ) ); + return next; + } ); + } + + function addSheetCol() { + setSheetRows( ( prev ) => { + const next = prev.map( ( r ) => [ ...r, '' ] ); + sheetEditRef.current = true; + setCsvText( gridToCsv( next ) ); + return next; + } ); + } + + return ( + + + { /* ── Source tabs ───────────────────────────────────────────── */ } + + { SOURCES.map( ( s ) => { + const selected = source === s.id; + return ( + switchSource( s.id ) } + transition="all 0.15s" + > + + + + + { s.label } + + + ); + } ) } + + + { ! isPro && source !== 'manual' && ( + + + { __( 'Unlock advanced data sources', 'visualizer' ) } + + + { __( 'Spreadsheet, File, and URL imports are available in Pro.', 'visualizer' ) } + + + { __( '• Spreadsheet editor', 'visualizer' ) } + { __( '• CSV & XLSX upload', 'visualizer' ) } + { __( '• Remote URL import', 'visualizer' ) } + + + + { __( 'Upgrade to Pro', 'visualizer' ) } + + + { __( 'Cancel anytime', 'visualizer' ) } + + + + ) } + + { /* ── 1. Manual ───────────────────────────────────────────────── */ } + { source === 'manual' && ( + + + + { __( 'CSV data', 'visualizer' ) } + + + { __( 'Row 1: labels · Row 2: types', 'visualizer' ) } + setCsvText( SAMPLE_CSV ) } + disabled={ disabled } + opacity={ disabled ? 0.6 : 1 } + style={ { cursor: disabled ? 'not-allowed' : 'pointer' } } + > + { __( 'Load sample', 'visualizer' ) } + + + + setCsvText( e.target.value ) } + disabled={ disabled } + sx={ { '&::placeholder': { color: C.gray3 } } } + /> + + ) } + + { /* ── 1b. Spreadsheet ─────────────────────────────────────────── */ } + { source === 'sheet' && isPro && ( + + + + { __( 'Spreadsheet', 'visualizer' ) } + + + { __( 'Row 1: labels · Row 2: types', 'visualizer' ) } + setCsvText( SAMPLE_CSV ) } + disabled={ disabled } + opacity={ disabled ? 0.6 : 1 } + style={ { cursor: disabled ? 'not-allowed' : 'pointer' } } + > + { __( 'Load sample', 'visualizer' ) } + + + + + { sheetRows.length ? ( + { + if ( ! changes || source === 'loadData' ) return; + changes.forEach( ( [ row, col, , value ] ) => { + updateSheetCell( row, col, value ?? '' ); + } ); + } } + /> + ) : ( + + { __( 'Loading spreadsheet…', 'visualizer' ) } + + ) } + + + + { __( 'Add row', 'visualizer' ) } + + + { __( 'Add column', 'visualizer' ) } + + + + ) } + + { /* ── 2. File ─────────────────────────────────────────────────── */ } + { source === 'csv_file' && isPro && ( + <> + + + { file ? file.name : __( 'Choose a file (.csv or .xlsx)', 'visualizer' ) } + + fileInputRef.current?.click() } + disabled={ disabled } + opacity={ disabled ? 0.6 : 1 } + > + { __( 'Browse', 'visualizer' ) } + + + + + { __( 'Import file', 'visualizer' ) } + + + setFile( e.target.files[ 0 ] || null ) } + /> + { __( 'Row 1 = column names · Row 2 = types (string / number / date / boolean)', 'visualizer' ) } + + ) } + + { /* ── 3. URL ──────────────────────────────────────────────────── */ } + { source === 'url' && isPro && ( + + + { __( 'Remote file URL', 'visualizer' ) } + setFileUrl( e.target.value ) } + disabled={ disabled } + /> + { __( 'Supports .csv and .xlsx · Google Spreadsheet share URLs accepted', 'visualizer' ) } + + + + { __( 'Import URL', 'visualizer' ) } + + + + ) } + + { /* ── Loading / error feedback ────────────────────────────────── */ } + { loading && ( + + + { __( 'Loading data…', 'visualizer' ) } + + ) } + { error && ( + + { error } + + ) } + { dataLoaded && ! loading && ! error && ( + + + + + + { __( 'Data loaded', 'visualizer' ) } + + ) } + { dataWarning && ( + + { dataWarning } + + ) } + + + ); +} diff --git a/classes/Visualizer/ChartBuilder/src/AIBuilder/api.js b/classes/Visualizer/ChartBuilder/src/AIBuilder/api.js new file mode 100644 index 000000000..8d8bcbf6d --- /dev/null +++ b/classes/Visualizer/ChartBuilder/src/AIBuilder/api.js @@ -0,0 +1,158 @@ +/** + * AJAX helpers for the AI Chart Builder. + * All calls go to admin-ajax.php using the vizAIBuilder global localized by PHP. + */ + +const { ajaxUrl, nonce } = window.vizAIBuilder || {}; + +async function post( action, body, options = {} ) { + const { nonceOverride = null, omitEmpty = false } = options; + const form = new FormData(); + form.append( 'action', action ); + form.append( 'nonce', nonceOverride || nonce ); + for ( const [ key, val ] of Object.entries( body ) ) { + if ( omitEmpty && ( val === null || val === undefined || val === '' ) ) { + continue; + } + form.append( key, val ); + } + const res = await fetch( ajaxUrl, { method: 'POST', body: form } ); + let json; + try { + json = await res.json(); + } catch { + throw new Error( 'Server returned an unexpected response.' ); + } + if ( ! json.success ) { + throw new Error( json.data?.message || 'Request failed.' ); + } + return json.data; +} + +/** Create an auto-draft chart post. Returns { chart_id, upload_nonce }. */ +export async function createChart() { + return post( 'visualizer-ai-create', {} ); +} + +/** Get the upload nonce for an existing chart (edit mode). Returns { upload_nonce }. */ +export async function getChartNonce( chartId ) { + return post( 'visualizer-ai-chart-nonce', { chart_id: chartId } ); +} + +/** Fetch chart data for edit mode. Returns { title, series, data, code }. */ +export async function fetchChart( chartId ) { + return post( 'visualizer-ai-fetch', { chart_id: chartId } ); +} + +/** Publish chart with D3 code. Returns { id, shortcode }. */ +export async function saveChart( chartId, title, code ) { + return post( 'visualizer-ai-save', { + chart_id: chartId, + title, + code, + } ); +} + +// ── Upload helpers ───────────────────────────────────────────────────────────── + +/** Upload pasted CSV string. Returns { series, data }. */ +export async function uploadCsvString( chartId, uploadNonce, csvData ) { + return post( 'visualizer-ai-upload', { + chart_id: chartId, + source_type: 'csv_string', + csv_data: csvData, + }, { nonceOverride: uploadNonce, omitEmpty: true } ); +} + +/** Upload a CSV or XLSX file. Returns { series, data }. */ +export async function uploadFile( chartId, uploadNonce, file ) { + const ext = file.name.split( '.' ).pop().toLowerCase(); + return post( 'visualizer-ai-upload', { + chart_id: chartId, + source_type: ext === 'xlsx' ? 'xlsx_file' : 'csv_file', + data_file: file, + }, { nonceOverride: uploadNonce, omitEmpty: true } ); +} + +/** Upload a remote CSV/XLSX URL. Returns { series, data }. */ +export async function uploadFileUrl( chartId, uploadNonce, url, schedule = '' ) { + return post( 'visualizer-ai-upload', { + chart_id: chartId, + source_type: 'file_url', + file_url: url, + schedule: schedule, + }, { nonceOverride: uploadNonce, omitEmpty: true } ); +} + +/** Upload a JSON URL source. Returns { series, data }. */ +export async function uploadJsonUrl( chartId, uploadNonce, params ) { + const { + url, root = '', paging = '', method = 'GET', + auth = '', username = '', password = '', headers = '', + schedule = '', + } = params; + return post( 'visualizer-ai-upload', { + chart_id: chartId, + source_type: 'json_url', + json_url: url, + json_root: root, + json_paging: paging, + json_method: method, + json_auth: auth, + json_username: username, + json_password: password, + json_headers: headers, + json_schedule: schedule, + }, { nonceOverride: uploadNonce, omitEmpty: true } ); +} + +// ── AI generation helpers ────────────────────────────────────────────────────── + +/** + * Start async chart generation. + * Pass existingCode (string) when refining so the agent has full context of the current chart. + * Returns { workflow_id }. + */ +export async function generateChart( chartId, prompt, series, data, existingCode = null, refImageBase64 = null, refImageMime = null ) { + const body = { + chart_id: chartId, + prompt, + series: JSON.stringify( series ), + data: JSON.stringify( data ), + }; + if ( existingCode ) { + body.existing_code = existingCode; + } + if ( refImageBase64 ) { + body.ref_image = refImageBase64; + body.ref_image_mime = refImageMime || 'image/jpeg'; + } + return post( 'visualizer-ai-generate', body ); +} + +/** + * Poll the status of an async generation job. + * Returns { status, output: { spec } | null }. + */ +export async function pollStatus( workflowId ) { + return post( 'visualizer-ai-status', { workflow_id: workflowId } ); +} + +/** Upload a database query source. Returns { series, data }. */ +export async function uploadDbQuery( chartId, uploadNonce, query, dbParams = {} ) { + const { + host = '', port = 3306, name = '', + username = '', password = '', type = 'mysql', + } = dbParams; + return post( 'visualizer-ai-upload', { + chart_id: chartId, + source_type: 'db_query', + db_query: query, + db_host: host, + db_port: port, + db_name: name, + db_username: username, + db_password: password, + db_type: type, + }, { nonceOverride: uploadNonce, omitEmpty: true } ); +} diff --git a/classes/Visualizer/ChartBuilder/src/AIBuilder/index.js b/classes/Visualizer/ChartBuilder/src/AIBuilder/index.js new file mode 100644 index 000000000..dcbbd0cb3 --- /dev/null +++ b/classes/Visualizer/ChartBuilder/src/AIBuilder/index.js @@ -0,0 +1,979 @@ +/** + * AI Builder — two-column layout matching layout.html design + * + * Left : Step 1 (DataSource) + Step 2 (Describe) + * Right : Live preview sidebar (560px) + * Footer: Cancel + Generate / Publish actions + */ +import { useState, useEffect, useRef } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { Box, Flex, Spinner, Text } from '@chakra-ui/react'; +import * as d3 from 'd3'; +import * as topojson from 'topojson-client'; +import CodeMirror from '@uiw/react-codemirror'; +import { javascript } from '@codemirror/lang-javascript'; +import { createChart, getChartNonce, fetchChart, saveChart, generateChart, pollStatus, uploadCsvString } from './api'; +import DataSource from './DataSource'; + +/** Convert Visualizer series + data arrays to plain objects for D3. */ +function toD3Values( series, data ) { + return data.map( ( row ) => { + const obj = {}; + series.forEach( ( col, i ) => { obj[ col.label ] = row[ i ]; } ); + return obj; + } ); +} + +/** Execute D3 code in a container element. Returns an error message if it fails. */ +function renderD3( code, container, series, data ) { + if ( ! code || ! container ) return; + const values = toD3Values( series, data ); + container.innerHTML = ''; + try { + // eslint-disable-next-line no-new-func + new Function( 'd3', 'topojson', 'container', 'data', code )( d3, topojson, container, values ); + return null; + } catch ( err ) { + const msg = `Chart error: ${ err.message }`; + container.innerHTML = `

${ msg }

`; + return msg; + } +} + +// ── Palette (matches ChooserModal / WP-admin style) ─────────────────────────── +const C = { + bg: '#f6f7f7', + sidebar: '#f0f0f1', + border: '#dcdcde', + dark: '#1d2327', + gray1: '#646970', + gray2: '#8c8f94', + gray3: '#c3c4c7', + dim: '#f0f0f1', + teal: '#39c3d2', +}; + +const PROMPT_PRESETS = [ + __( 'Bar chart comparing totals by category, sorted descending', 'visualizer' ), + __( 'Line chart showing trend over time with markers', 'visualizer' ), + __( 'Stacked area chart to show part-to-whole over time', 'visualizer' ), + __( 'Scatter plot showing correlation between two numeric fields', 'visualizer' ), + __( 'Pie chart showing share by category with labels', 'visualizer' ), +]; + +// ── Helpers ─────────────────────────────────────────────────────────────────── + +/** Reconstruct a CSV string from Visualizer series/data arrays for display. */ +function buildCsvFromData( series, data ) { + if ( ! Array.isArray( series ) || ! series.length ) return ''; + const labels = series.map( ( s ) => s.label ).join( ',' ); + const types = series.map( ( s ) => s.type || 'string' ).join( ',' ); + const rows = ( data || [] ).map( ( row ) => row.join( ',' ) ); + return [ labels, types, ...rows ].join( '\n' ); +} + +// ── Step badge ──────────────────────────────────────────────────────────────── +function StepBadge( { num, active } ) { + return ( + + + { num } + + + ); +} + +// ── Pill button (footer / misc) ─────────────────────────────────────────────── +function PillBtn( { children, onClick, disabled, bg = C.dark, color = 'white', border, borderColor, cursor } ) { + return ( + + { children } + + ); +} + +export default function AIBuilder( { onClose, initialChartId = null } ) { + const [ chartId, setChartId ] = useState( null ); + const [ uploadNonce, setUploadNonce ] = useState( null ); + const [ initError, setInitError ] = useState( null ); + + const [ series, setSeries ] = useState( [] ); + const [ data, setData ] = useState( [] ); + const [ previewSeries, setPreviewSeries ] = useState( [] ); + const [ previewData, setPreviewData ] = useState( [] ); + const [ dataLoaded, setDataLoaded ] = useState( false ); + const [ initialCsvText, setInitialCsvText ] = useState( '' ); + + const [ prompt, setPrompt ] = useState( '' ); + const [ refImage, setRefImage ] = useState( null ); + + const [ code, setCode ] = useState( null ); + const [ generating, setGenerating ] = useState( false ); + const [ genError, setGenError ] = useState( null ); + const [ renderError, setRenderError ] = useState( null ); + const [ editorError, setEditorError ] = useState( null ); + const [ dataIncompatible, setDataIncompatible ] = useState( null ); + const [ fixing, setFixing ] = useState( false ); + const [ editOpen, setEditOpen ] = useState( false ); + const [ draftCode, setDraftCode ] = useState( '' ); + + const [ title, setTitle ] = useState( '' ); + const [ saving, setSaving ] = useState( false ); + const [ saveError, setSaveError ] = useState( null ); + const [ shortcode, setShortcode ] = useState( null ); + const [ copied, setCopied ] = useState( false ); + + const previewRef = useRef( null ); + const fullscreenRef = useRef( null ); + const fullscreenOverlayRef = useRef( null ); + const refImageInputRef = useRef( null ); + const [ fullScreen, setFullScreen ] = useState( false ); + const lastSeriesKeyRef = useRef( null ); + const fixAttemptedRef = useRef( false ); + const codeOriginRef = useRef( 'agent' ); + const isLocked = generating || fixing; + const canGenerate = !! prompt?.trim() && ! generating && ! fixing; + + // Focus fullscreen overlay and enable Esc close. + useEffect( () => { + if ( ! fullScreen ) return; + fullscreenOverlayRef.current?.focus(); + const onKey = ( e ) => { + if ( e.key === 'Escape' ) setFullScreen( false ); + }; + window.addEventListener( 'keydown', onKey ); + return () => window.removeEventListener( 'keydown', onKey ); + }, [ fullScreen ] ); + + // Close editor on Escape. + useEffect( () => { + if ( ! editOpen ) return; + const onKey = ( e ) => { + if ( e.key === 'Escape' ) closeEditor(); + }; + window.addEventListener( 'keydown', onKey ); + return () => window.removeEventListener( 'keydown', onKey ); + }, [ editOpen ] ); + + // Prevent background page scroll while editor is open. + useEffect( () => { + if ( ! editOpen ) return; + const { body } = document; + const prevOverflow = body.style.overflow; + body.style.overflow = 'hidden'; + return () => { body.style.overflow = prevOverflow; }; + }, [ editOpen ] ); + + useEffect( () => { + if ( initialChartId ) { + // Edit mode: reuse the existing chart and fetch its upload nonce. + setChartId( parseInt( initialChartId, 10 ) ); + Promise.all( [ + getChartNonce( initialChartId ), + fetchChart( initialChartId ), + ] ) + .then( ( [ nonceRes, chartRes ] ) => { + setUploadNonce( nonceRes.upload_nonce ); + + const applyExisting = ( existing ) => { + if ( existing.title ) setTitle( existing.title ); + if ( existing.series ) setSeries( existing.series ); + if ( existing.data ) { setData( existing.data ); setDataLoaded( true ); } + if ( existing.series ) setPreviewSeries( existing.series ); + if ( existing.data ) setPreviewData( existing.data ); + if ( existing.series && existing.data ) { + const csv = buildCsvFromData( existing.series, existing.data ); + if ( csv ) setInitialCsvText( csv ); + } + if ( existing.code ) { + setCode( existing.code ); + } + }; + + // Prefer localized chart if present; fall back to fetch response. + const chartKey = 'visualizer-' + initialChartId; + const existing = window.visualizer?.charts?.[ chartKey ]; + if ( existing ) { + applyExisting( existing ); + } else if ( chartRes ) { + applyExisting( chartRes ); + } + } ) + .catch( ( e ) => setInitError( e.message ) ); + } else { + createChart() + .then( ( res ) => { setChartId( res.chart_id ); setUploadNonce( res.upload_nonce ); } ) + .catch( ( e ) => setInitError( e.message ) ); + } + }, [ initialChartId ] ); + + // Re-render preview whenever code or source data changes. + useEffect( () => { + const activeCode = editOpen ? draftCode : code; + if ( ! activeCode || ! previewRef.current ) return; + if ( ! Array.isArray( previewSeries ) || ! Array.isArray( previewData ) || previewSeries.length === 0 ) { + previewRef.current.innerHTML = ''; + return; + } + const err = renderD3( activeCode, previewRef.current, previewSeries, previewData ); + if ( editOpen ) { + setEditorError( err || null ); + return; + } + if ( err ) { + setRenderError( err ); + if ( codeOriginRef.current === 'agent' && ! fixing && ! fixAttemptedRef.current ) { + fixAttemptedRef.current = true; + autoFix( err ); + } + } else { + setRenderError( null ); + } + }, [ code, draftCode, editOpen, previewSeries, previewData ] ); + + // Fullscreen render + useEffect( () => { + if ( ! fullScreen || ! code || ! fullscreenRef.current ) return; + if ( ! Array.isArray( series ) || ! Array.isArray( data ) || series.length === 0 ) { + fullscreenRef.current.innerHTML = ''; + return; + } + + renderD3( code, fullscreenRef.current, series, data ); + + const onResize = () => renderD3( code, fullscreenRef.current, series, data ); + window.addEventListener( 'resize', onResize ); + + return () => { + window.removeEventListener( 'resize', onResize ); + if ( fullscreenRef.current ) fullscreenRef.current.innerHTML = ''; + }; + }, [ fullScreen, code, series, data ] ); + + function handleDataReady( newSeries, newData ) { + const nextKey = JSON.stringify( newSeries || [] ); + const seriesChanged = lastSeriesKeyRef.current && lastSeriesKeyRef.current !== nextKey; + setSeries( newSeries ); + setData( newData ); + setDataLoaded( true ); + + if ( seriesChanged ) { + setDataIncompatible( __( 'The column headers changed. Please regenerate to update the chart.', 'visualizer' ) ); + setRenderError( null ); + } else if ( code ) { + const testContainer = document.createElement( 'div' ); + const err = renderD3( code, testContainer, newSeries, newData ); + if ( err ) { + setDataIncompatible( __( 'These data changes do not match the current chart. Please regenerate to update the preview.', 'visualizer' ) ); + setRenderError( null ); + } else { + setPreviewSeries( newSeries ); + setPreviewData( newData ); + setDataIncompatible( null ); + } + } else { + setPreviewSeries( newSeries ); + setPreviewData( newData ); + setDataIncompatible( null ); + } + + setGenError( null ); + lastSeriesKeyRef.current = nextKey; + } + // Track series signature for edit-mode preload. + useEffect( () => { + if ( series && series.length ) { + lastSeriesKeyRef.current = JSON.stringify( series ); + } + }, [ series ] ); + + async function handleGenerate() { + if ( ! prompt?.trim() ) return; + setGenerating( true ); + setGenError( null ); + setRenderError( null ); + setDataIncompatible( null ); + fixAttemptedRef.current = false; + try { + // 1. Convert reference image to base64 if provided. + let refImageBase64 = null; + let refImageMime = null; + if ( refImage ) { + refImageBase64 = await new Promise( ( resolve, reject ) => { + const reader = new FileReader(); + reader.onload = () => resolve( reader.result.split( ',' )[ 1 ] ); + reader.onerror = () => reject( new Error( __( 'Failed to read image file.', 'visualizer' ) ) ); + reader.readAsDataURL( refImage ); + } ); + refImageMime = refImage.type || 'image/jpeg'; + } + + // 2. Kick off the async generation job. + // Pass the existing code when refining so the agent knows the current chart state. + const { workflow_id: workflowId } = await generateChart( chartId, prompt, series, data, code || null, refImageBase64, refImageMime ); + + // 3. Poll until complete or failed (max ~3 min, 2 s interval) + const MAX_POLLS = 90; + const POLL_MS = 2000; + let polls = 0; + + while ( polls < MAX_POLLS ) { + await new Promise( ( r ) => setTimeout( r, POLL_MS ) ); + polls++; + + const result = await pollStatus( workflowId ); + const status = result.status ?? result.workflowStatus; + + if ( status === 'completed' ) { + const newCode = result.output?.code; + const dataCsv = result.output?.data_csv || result.output?.csv || null; + if ( ! newCode ) throw new Error( __( 'Generation completed but no code was returned.', 'visualizer' ) ); + setCode( newCode ); + codeOriginRef.current = 'agent'; + if ( dataCsv && uploadNonce ) { + try { + const trimmedCsv = String( dataCsv ).trim(); + const parsed = await uploadCsvString( chartId, uploadNonce, trimmedCsv ); + setInitialCsvText( trimmedCsv ); + handleDataReady( parsed.series, parsed.data ); + } catch ( e ) { + setPreviewSeries( series ); + setPreviewData( data ); + setDataIncompatible( null ); + setGenError( __( 'Chart generated, but the extracted data could not be parsed. Please verify the data or regenerate.', 'visualizer' ) ); + } + } else { + setPreviewSeries( series ); + setPreviewData( data ); + setDataIncompatible( null ); + } + return; + } + + if ( status === 'failed' ) { + throw new Error( __( 'Chart generation failed. Please try again.', 'visualizer' ) ); + } + // status === 'queued' | 'running' — keep polling + } + + throw new Error( __( 'Generation timed out. Please try again.', 'visualizer' ) ); + } catch ( e ) { + setGenError( e.message ); + } finally { + setGenerating( false ); + } + } + + function buildFixPrompt( errorMessage ) { + const base = [ + 'The D3 code you returned threw a runtime/syntax error when executed.', + `Error: "${ errorMessage }"`, + 'Please fix the D3 code to resolve the error.', + 'Keep the chart intent the same and only return corrected D3 code.', + ].join( '\n' ); + if ( prompt?.trim() ) { + return `${ base }\n\nOriginal user request:\n${ prompt.trim() }`; + } + return base; + } + + async function autoFix( errorMessage ) { + if ( ! chartId || ! dataLoaded || fixing ) return; + setFixing( true ); + setGenError( null ); + try { + const fixPrompt = buildFixPrompt( errorMessage ); + const { workflow_id: workflowId } = await generateChart( chartId, fixPrompt, series, data, code || null, null, null ); + const MAX_POLLS = 60; + const POLL_MS = 2000; + let polls = 0; + + while ( polls < MAX_POLLS ) { + await new Promise( ( r ) => setTimeout( r, POLL_MS ) ); + polls++; + + const result = await pollStatus( workflowId ); + const status = result.status ?? result.workflowStatus; + + if ( status === 'completed' ) { + const newCode = result.output?.code; + if ( ! newCode ) throw new Error( __( 'Fix completed but no code was returned.', 'visualizer' ) ); + setCode( newCode ); + codeOriginRef.current = 'agent'; + setRenderError( null ); + return; + } + + if ( status === 'failed' ) { + throw new Error( __( 'Fix attempt failed. Please try again.', 'visualizer' ) ); + } + } + + throw new Error( __( 'Fix attempt timed out. Please try again.', 'visualizer' ) ); + } catch ( e ) { + setGenError( e.message ); + } finally { + setFixing( false ); + } + } + + async function handleFixClick() { + if ( ! renderError ) return; + await autoFix( renderError ); + } + + async function handleSave() { + if ( ! code ) return; + setSaving( true ); + setSaveError( null ); + try { + const res = await saveChart( chartId, title.trim() || __( 'AI Chart', 'visualizer' ), code ); + setShortcode( res.shortcode ); + } catch ( e ) { + setSaveError( e.message ); + } finally { + setSaving( false ); + } + } + + function handleCopy() { + navigator.clipboard?.writeText( shortcode ).catch( () => {} ); + setCopied( true ); + setTimeout( () => setCopied( false ), 2000 ); + } + + function appendPreset( text ) { + const next = prompt ? `${ prompt.trim() }\n${ text }` : text; + setPrompt( next ); + } + + function openEditor() { + setDraftCode( code || '' ); + setEditorError( null ); + setEditOpen( true ); + } + + function closeEditor() { + setEditOpen( false ); + setEditorError( null ); + } + + function saveEditor() { + if ( ! draftCode ) return; + if ( dataLoaded && Array.isArray( series ) && Array.isArray( data ) && series.length ) { + const testContainer = document.createElement( 'div' ); + const err = renderD3( draftCode, testContainer, series, data ); + if ( err ) { + setEditorError( err ); + return; + } + } + setCode( draftCode ); + codeOriginRef.current = 'manual'; + setPreviewSeries( series ); + setPreviewData( data ); + setDataIncompatible( null ); + setEditorError( null ); + setRenderError( null ); + fixAttemptedRef.current = false; + setEditOpen( false ); + } + + // ── Init / error states ─────────────────────────────────────────────────── + + if ( initError ) { + return ( + + + { initError } + + + ); + } + + if ( ! chartId ) { + return ( + + + { __( 'Initializing…', 'visualizer' ) } + + ); + } + + // ── Main layout ─────────────────────────────────────────────────────────── + + return ( + <> + { /* ════ Body ═══════════════════════════════════════════════════════ */ } + + + { /* ── Left panel ─────────────────────────────────────────────── */ } + + { editOpen ? ( + <> + + + { __( 'Edit D3 code', 'visualizer' ) } + + + { __( 'Back', 'visualizer' ) } + + + e.stopPropagation() } + sx={ { + '.cm-editor': { height: '100%' }, + '.cm-scroller': { height: '100%', overflow: 'auto' }, + } } + > + setDraftCode( value ) } + editable={ ! isLocked } + basicSetup={ { lineNumbers: true } } + /> + + { editorError && ( + + { editorError } + + ) } + + { __( 'Need a refresher? Read the D3 documentation to understand selections, scales, and shapes:', 'visualizer' ) }{' '} + + { __( 'd3js.org/getting-started', 'visualizer' ) } + + + + + { __( 'Cancel', 'visualizer' ) } + + + { __( 'Save', 'visualizer' ) } + + + + ) : ( + <> + { /* Step 1: Data source */ } + + + + { __( 'Data source', 'visualizer' ) } + + + + setDataIncompatible( null ) } + /> + { /* Divider */ } + + + { /* Step 2: Describe */ } + + + + + { __( 'Describe your chart', 'visualizer' ) } + + + + { /* Describe textarea box */ } + + setPrompt( e.target.value ) } + onKeyDown={ isLocked ? undefined : ( e ) => { + if ( e.key === 'Enter' && ! e.shiftKey ) { + e.preventDefault(); + if ( canGenerate ) handleGenerate(); + } + } } + disabled={ isLocked } + display="block" + sx={ { '&::placeholder': { color: C.gray3 } } } + /> + + { /* Reference image button */ } + refImageInputRef.current?.click() } + > + + + + { refImage ? refImage.name : __( 'Reference image', 'visualizer' ) } + + + { /* Generate / Regenerate button */ } + { ! shortcode && ( + + { generating ? ( + <>{ __( 'Generating…', 'visualizer' ) } + ) : fixing ? ( + <>{ __( 'Fixing…', 'visualizer' ) } + ) : code ? ( + __( '↺ Regenerate', 'visualizer' ) + ) : ( + <> + + + + + { __( 'Generate', 'visualizer' ) } + + ) } + + ) } + + + + { __( 'Press Enter to generate. Shift + Enter for a new line.', 'visualizer' ) } + + + setRefImage( e.target.files[ 0 ] || null ) } + /> + + { genError && ( + + { genError } + + ) } + { /* Prompt presets */ } + + + { __( 'Presets', 'visualizer' ) } + + + { PROMPT_PRESETS.map( ( preset ) => ( + appendPreset( preset ) } + > + { preset } + + ) ) } + + + { renderError && ( + + { renderError } + { fixAttemptedRef.current && ! fixing && ( + + + { __( 'Fix', 'visualizer' ) } + + + ) } + + ) } + + + ) } + + + { /* ── Right: rebuilt preview panel ─────────────────────────────── */ } + + + + + { __( 'Preview', 'visualizer' ) } + + + { __( 'Live rendering based on your data and prompt', 'visualizer' ) } + + + { ! editOpen && ( + + + { __( 'Edit code', 'visualizer' ) } + + { code && ( + setFullScreen( true ) } + > + { __( 'Full screen', 'visualizer' ) } + + ) } + + ) } + + + + svg': { width: '100% !important', height: '100% !important', display: 'block' }, + } } + > + + { ! code && ( + + + + { __( 'No chart yet', 'visualizer' ) } + + + { __( 'Load data and describe your chart to get started', 'visualizer' ) } + + + + ) } + + + { shortcode && ( + + + { __( 'Shortcode', 'visualizer' ) } + + + + { shortcode } + + + { copied ? __( 'Copied!', 'visualizer' ) : __( 'Copy', 'visualizer' ) } + + + + ) } + + + + { /* ════ Footer ══════════════════════════════════════════════════════ */ } + + { saveError && ( + { saveError } + ) } + + + { __( 'Cancel', 'visualizer' ) } + + + { code && ! shortcode && ! editOpen && ( + <> + + setTitle( e.target.value ) } + disabled={ isLocked } + px="10px" py="7px" borderRadius="8px" + border={ `1.5px solid ${ C.border }` } + fontSize="12px" color={ C.dark } + bg="white" outline="none" + sx={ { '&::placeholder': { color: C.gray3 }, '&:focus': { borderColor: C.dark } } } + /> + + + { saving ? __( 'Publishing…', 'visualizer' ) : __( 'Publish chart', 'visualizer' ) } + + + ) } + + { shortcode && ( + { onClose(); window.location.reload(); } } disabled={ isLocked } bg={ C.dark }> + { __( 'Done', 'visualizer' ) } + + ) } + + + { fullScreen && ( +
{ if ( e.target === e.currentTarget ) setFullScreen( false ); } } + tabIndex={ -1 } + ref={ fullscreenOverlayRef } + > +
+
+ { __( 'Full screen preview', 'visualizer' ) } + +
+
+
+
+ ) } + + { /* Editor now lives in the left panel, no modal */ } + + ); +} diff --git a/classes/Visualizer/ChartBuilder/src/ChooserModal.js b/classes/Visualizer/ChartBuilder/src/ChooserModal.js new file mode 100644 index 000000000..2eeb7d5aa --- /dev/null +++ b/classes/Visualizer/ChartBuilder/src/ChooserModal.js @@ -0,0 +1,110 @@ +/** + * ChooserModal + * + * Presents users with two options when creating a new chart: + * 1. Classic Builder — opens the existing iframe-based wizard + * 2. AI Chart Builder — opens the new D3-powered React wizard + */ +import { useEffect, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +function ChooserModal( { isOpen, onClassic, onAIBuilder, onClose } ) { + const [ rememberChoice, setRememberChoice ] = useState( false ); + + useEffect( () => { + if ( isOpen ) { + setRememberChoice( false ); + } + }, [ isOpen ] ); + + if ( ! isOpen ) { + return null; + } + + return ( +
+
+ + + +

+ { __( 'Create a New Chart', 'visualizer' ) } +

+ +

+ { __( 'Choose how you want to build your chart.', 'visualizer' ) } +

+ +
+ + + + + +
+ +
+ +

+ { __( 'We will open your selected builder by default next time.', 'visualizer' ) } +

+
+ + + +
+
+ ); +} + +export default ChooserModal; diff --git a/classes/Visualizer/ChartBuilder/src/index.js b/classes/Visualizer/ChartBuilder/src/index.js new file mode 100644 index 000000000..11a94a579 --- /dev/null +++ b/classes/Visualizer/ChartBuilder/src/index.js @@ -0,0 +1,128 @@ +/** + * Chart Builder — Entry point + * + * Mounts the ChooserModal + AI Builder wizard into #viz-chart-builder-root + * and registers window.vizOpenChartChooser for library.js to call. + */ +import { render, createElement, useState, useEffect } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { ChakraProvider, defaultSystem } from '@chakra-ui/react'; +import ChooserModal from './ChooserModal'; +import AIBuilder from './AIBuilder/index'; +import './style.scss'; + +const CHOOSER_STORAGE_KEY = 'viz_chart_builder_default'; + +function getStoredBuilderChoice() { + try { + return window.localStorage.getItem( CHOOSER_STORAGE_KEY ); + } catch ( err ) { + return null; + } +} + +function setStoredBuilderChoice( choice ) { + try { + window.localStorage.setItem( CHOOSER_STORAGE_KEY, choice ); + } catch ( err ) { + // ignore storage failures + } +} + +function ChartBuilderApp() { + // mode: 'hidden' | 'chooser' | 'ai-builder' + const [ mode, setMode ] = useState( 'hidden' ); + const [ classicCallback, setClassicCallback ] = useState( null ); + const [ editChartId, setEditChartId ] = useState( null ); + + useEffect( () => { + window.vizOpenChartChooser = ( cb ) => { + setEditChartId( null ); + setClassicCallback( () => cb ); + const storedChoice = getStoredBuilderChoice(); + if ( storedChoice === 'classic' ) { + cb(); + return; + } + if ( storedChoice === 'ai' ) { + setMode( 'ai-builder' ); + return; + } + setMode( 'chooser' ); + }; + window.vizOpenAIBuilderEdit = ( chartId ) => { + setEditChartId( String( chartId ) ); + setMode( 'ai-builder' ); + }; + window.vizOpenAIBuilderNew = () => { + setEditChartId( null ); + setMode( 'ai-builder' ); + }; + return () => { + delete window.vizOpenChartChooser; + delete window.vizOpenAIBuilderEdit; + delete window.vizOpenAIBuilderNew; + }; + }, [] ); + + function handleClassic( rememberChoice = false ) { + if ( rememberChoice ) { + setStoredBuilderChoice( 'classic' ); + } + setMode( 'hidden' ); + if ( typeof classicCallback === 'function' ) classicCallback(); + } + function handleAIBuilder( rememberChoice = false ) { + if ( rememberChoice ) { + setStoredBuilderChoice( 'ai' ); + } + setMode( 'ai-builder' ); + } + function handleClose() { setMode( 'hidden' ); setEditChartId( null ); } + + return ( + + + + { mode === 'ai-builder' && ( +
+
+ + { /* ── Header ── */ } +
+
+
+ + + + + +
+

+ { __( 'Visualizer', 'visualizer' ) } +

+
+ +
+ + +
+
+ ) } +
+ ); +} + +const mountPoint = document.getElementById( 'viz-chart-builder-root' ); +if ( mountPoint ) { + render( createElement( ChartBuilderApp ), mountPoint ); +} diff --git a/classes/Visualizer/ChartBuilder/src/style.scss b/classes/Visualizer/ChartBuilder/src/style.scss new file mode 100644 index 000000000..35d6bbfd6 --- /dev/null +++ b/classes/Visualizer/ChartBuilder/src/style.scss @@ -0,0 +1,356 @@ +// ─── Vega tooltip z-index fix (tooltip div is appended to body) ─────────────── +#vg-tooltip-element { + z-index: 100001 !important; +} + +// ─── Shared overlay / modal base ───────────────────────────────────────────── + +%overlay { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.55); + z-index: 100000; + display: flex; + align-items: center; + justify-content: center; +} + +%modal { + position: relative; + background: #fff; + border-radius: 10px; + box-shadow: 0 8px 40px rgba(0, 0, 0, 0.2); +} + +// ─── Chooser modal ──────────────────────────────────────────────────────────── + +.viz-chooser-overlay { + @extend %overlay; +} + +.viz-chooser-modal { + @extend %modal; + padding: 40px 36px 32px; + width: 580px; + max-width: calc(100vw - 32px); + text-align: center; +} + +.viz-chooser-close { + position: absolute; + top: 14px; + right: 16px; + background: none; + border: none; + font-size: 18px; + cursor: pointer; + color: #666; + padding: 4px 8px; + line-height: 1; + &:hover { color: #000; } +} + +.viz-chooser-title { + margin: 0 0 8px; + font-size: 20px; + font-weight: 600; + color: #1d2327; +} + +.viz-chooser-subtitle { + margin: 0 0 28px; + color: #646970; + font-size: 14px; +} + +.viz-chooser-options { + display: flex; + gap: 16px; + justify-content: center; + margin-bottom: 24px; +} + +.viz-chooser-option { + position: relative; + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + padding: 24px 16px 20px; + border: 2px solid #dcdcde; + border-radius: 8px; + background: #f6f7f7; + cursor: pointer; + transition: border-color 0.15s, box-shadow 0.15s, background 0.15s; + text-align: center; + + &:hover, &:focus-visible { + border-color: #2271b1; + background: #f0f6fc; + box-shadow: 0 0 0 3px rgba(34, 113, 177, 0.15); + outline: none; + } + + &--ai { + border-color: rgba(57, 195, 210, 0.45); + background: #eef9fb; + &:hover, &:focus-visible { + border-color: #39c3d2; + background: #e6f7fa; + box-shadow: 0 0 0 3px rgba(57, 195, 210, 0.18); + } + } +} + +.viz-chooser-option__badge { + position: absolute; + top: -10px; + right: -10px; + background: #39c3d2; + color: #fff; + font-size: 10px; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; + padding: 2px 8px; + border-radius: 12px; +} + +.viz-chooser-option__icon { + width: 48px; + height: 48px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + svg { width: 24px; height: 24px; } + + &--classic { background: #e0f0ff; color: #2271b1; } + &--ai { background: #dff6f9; color: #0b6b75; } +} + +.viz-chooser-option__title { + font-size: 15px; + font-weight: 600; + color: #1d2327; +} + +.viz-chooser-option__desc { + font-size: 12px; + color: #646970; + line-height: 1.5; +} + +.viz-chooser-remember { + display: flex; + flex-direction: column; + align-items: center; + gap: 6px; + margin-bottom: 14px; +} + +.viz-chooser-remember__label { + display: inline-flex; + align-items: center; + gap: 8px; + font-size: 13px; + color: #1d2327; + cursor: pointer; +} + +.viz-chooser-remember__label input { + width: 16px; + height: 16px; +} + +.viz-chooser-remember__help { + margin: 0; + font-size: 12px; + color: #646970; +} + +.viz-chooser-cancel { + background: none; + border: none; + color: #646970; + font-size: 13px; + cursor: pointer; + padding: 4px 8px; + text-decoration: underline; + &:hover { color: #1d2327; } +} + +// ─── AI Builder overlay / modal ─────────────────────────────────────────────── + +.viz-ai-builder-overlay { + @extend %overlay; +} + +.viz-ai-builder-modal { + @extend %modal; + width: calc(100vw - 48px); + max-width: 1400px; + height: calc(100vh - 48px); + overflow: hidden; + padding: 0; + display: flex; + flex-direction: column; +} + +.viz-ai-builder-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 14px 20px 14px 24px; + border-bottom: 1px solid #dcdcde; + background: #fff; + flex-shrink: 0; + z-index: 1; +} + +.viz-ai-builder-header__logo { + width: 30px; + height: 30px; + border-radius: 8px; + background: #39c3d2; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.viz-ai-builder-close { + background: none; + border: none; + padding: 6px; + border-radius: 6px; + cursor: pointer; + color: #8c8f94; + display: flex; + align-items: center; + justify-content: center; + transition: background 0.15s, color 0.15s; + &:hover { background: #f0f0f1; color: #1d2327; } +} + +// ─── Fullscreen preview ───────────────────────────────────────────────────── + +.viz-ai-fullscreen-overlay { + @extend %overlay; + z-index: 100002; +} + +.viz-ai-fullscreen-modal { + @extend %modal; + width: calc(100vw - 64px); + height: calc(100vh - 64px); + max-width: 1600px; + max-height: 1000px; + position: relative; + overflow: hidden; + display: flex; + flex-direction: column; +} + +.viz-ai-fullscreen-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 12px; + border-bottom: 1px solid #e2e3e6; + background: #fff; + font-size: 12px; + font-weight: 600; + color: #1d2327; +} + +.viz-ai-fullscreen-body { + width: 100%; + flex: 1; + min-height: 0; + > svg { + width: 100% !important; + height: 100% !important; + display: block; + } +} + +.viz-ai-fullscreen-close { + background: #fff; + border: 1px solid #dcdcde; + border-radius: 6px; + padding: 6px 10px; + cursor: pointer; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08); + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 12px; + color: #1d2327; + &:hover { filter: brightness(0.98); } +} + +// Ensure Handsontable context menu appears above modal layers. +.viz-ai-hot { + .htContextMenu, + .htContextMenu table { + z-index: 100010 !important; + } +} + +// Handsontable context menu is attached to body; keep it above overlays. +.htContextMenu, +.htContextMenu table { + z-index: 100010 !important; +} + +.viz-ai-builder-header__badge { + background: linear-gradient(135deg, #6c5ecf, #a855f7); + color: #fff; + font-size: 11px; + font-weight: 700; + letter-spacing: 0.06em; + padding: 3px 9px; + border-radius: 20px; +} + +.viz-ai-builder-header__title { + margin: 0; + font-size: 18px; + font-weight: 600; + color: #1d2327; +} + +// ─── Spinner (used in legacy classes, keep for compat) ──────────────────────── + +.viz-spinner { + display: inline-block; + width: 18px; + height: 18px; + border: 2px solid #dcdcde; + border-top-color: #6c5ecf; + border-radius: 50%; + animation: viz-spin 0.7s linear infinite; + flex-shrink: 0; + + &--sm { + width: 13px; + height: 13px; + } +} + +@keyframes viz-spin { + to { transform: rotate(360deg); } +} + +// ─── Shortcode code (used in legacy saved state) ────────────────────────────── + +.viz-shortcode-code { + background: #f6f7f7; + border: 1px solid #dcdcde; + border-radius: 4px; + padding: 6px 12px; + font-size: 13px; + font-family: monospace; +} diff --git a/classes/Visualizer/ChartBuilder/webpack.config.js b/classes/Visualizer/ChartBuilder/webpack.config.js new file mode 100644 index 000000000..5ce6f7cac --- /dev/null +++ b/classes/Visualizer/ChartBuilder/webpack.config.js @@ -0,0 +1,9 @@ +const defaultConfig = require( '@wordpress/scripts/config/webpack.config' ); + +module.exports = { + ...defaultConfig, + externals: { + ...defaultConfig.externals, + handsontable: 'Handsontable', + }, +}; diff --git a/classes/Visualizer/D3Renderer/src/index.js b/classes/Visualizer/D3Renderer/src/index.js new file mode 100644 index 000000000..a49acbcf3 --- /dev/null +++ b/classes/Visualizer/D3Renderer/src/index.js @@ -0,0 +1,155 @@ +/** + * D3.js frontend renderer for Visualizer. + * + * Listens to the `visualizer:render:chart:start` event fired by render-facade.js. + * For charts with library === 'd3', retrieves the stored D3 code, converts the + * series/data arrays to plain objects, and executes the code via new Function. + */ +import * as d3 from 'd3'; +import * as topojson from 'topojson-client'; + +/** Convert Visualizer series + data arrays to plain objects for D3. */ +function toD3Values( series, data ) { + if ( ! Array.isArray( series ) || ! Array.isArray( data ) ) return []; + return data.map( ( row ) => { + const obj = {}; + series.forEach( ( col, i ) => { + obj[ col.label ] = row[ i ]; + } ); + return obj; + } ); +} + +/** + * Render a single D3 chart into its container element. + * + * @param {string} id - DOM element ID of the container + * @param {object} chart - chart entry from visualizer.charts + */ +function renderD3Chart( id, chart ) { + const container = document.getElementById( id ); + if ( ! container ) return; + + const code = typeof chart.code === 'string' ? chart.code : null; + + if ( ! code ) { + container.innerHTML = '

No chart code found.

'; + return; + } + + const values = toD3Values( chart.series, chart.data ); + + function doRender() { + try { + // eslint-disable-next-line no-new-func + new Function( 'd3', 'topojson', 'container', 'data', code )( d3, topojson, container, values ); + } catch ( err ) { + container.innerHTML = '

Chart render error: ' + err.message + '

'; + } + } + + // Double requestAnimationFrame — ensures browser has completed layout before measuring. + requestAnimationFrame( () => requestAnimationFrame( doRender ) ); +} + +function ensurePngName( name ) { + if ( ! name ) return 'chart.png'; + return name.toLowerCase().endsWith( '.png' ) ? name : `${ name }.png`; +} + +function downloadDataUrl( dataUrl, name ) { + const link = document.createElement( 'a' ); + link.href = dataUrl; + link.download = ensurePngName( name ); + document.body.appendChild( link ); + link.click(); + link.remove(); +} + +function svgToPng( svg, callback ) { + const rect = svg.getBoundingClientRect(); + const width = parseFloat( svg.getAttribute( 'width' ) ) || rect.width || 800; + const height = parseFloat( svg.getAttribute( 'height' ) ) || rect.height || 600; + const clone = svg.cloneNode( true ); + clone.setAttribute( 'width', width ); + clone.setAttribute( 'height', height ); + const serializer = new XMLSerializer(); + const svgText = serializer.serializeToString( clone ); + const svgDataUrl = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent( svgText ); + + const img = new Image(); + img.onload = () => { + const canvas = document.createElement( 'canvas' ); + canvas.width = width; + canvas.height = height; + const ctx = canvas.getContext( '2d' ); + ctx.fillStyle = '#ffffff'; + ctx.fillRect( 0, 0, width, height ); + ctx.drawImage( img, 0, 0 ); + callback( canvas.toDataURL( 'image/png' ) ); + }; + img.onerror = () => callback( null ); + img.src = svgDataUrl; +} + +function handleImageAction( id, name, action ) { + const container = document.getElementById( id ); + if ( ! container ) return; + + const canvas = container.querySelector( 'canvas' ); + if ( canvas && typeof canvas.toDataURL === 'function' ) { + const img = canvas.toDataURL( 'image/png' ); + if ( action === 'print' ) { + const win = window.open(); + win.document.write( "
" ); + win.document.close(); + win.onload = function () { win.print(); setTimeout( win.close, 500 ); }; + } else { + downloadDataUrl( img, name ); + } + return; + } + + const svg = container.querySelector( 'svg' ); + if ( ! svg ) return; + + svgToPng( svg, ( img ) => { + if ( ! img ) return; + if ( action === 'print' ) { + const win = window.open(); + win.document.write( "
" ); + win.document.close(); + win.onload = function () { win.print(); setTimeout( win.close, 500 ); }; + } else { + downloadDataUrl( img, name ); + } + } ); +} + +( function ( $ ) { + $( 'body' ).on( 'visualizer:render:chart:start', function ( e, viz ) { + if ( ! viz.charts ) return; + + // Frontend mode: a specific chart ID is provided. + if ( viz.id ) { + const chart = viz.charts[ viz.id ]; + if ( chart && chart.library === 'd3' ) { + renderD3Chart( viz.id, chart ); + } + return; + } + + // Admin / batch mode: no specific ID — render all d3 charts. + Object.keys( viz.charts ).forEach( ( id ) => { + const chart = viz.charts[ id ]; + if ( chart && chart.library === 'd3' ) { + renderD3Chart( id, chart ); + } + } ); + } ); + + $( 'body' ).on( 'visualizer:action:specificchart', function ( event, v ) { + if ( v.action !== 'image' && v.action !== 'print' ) return; + handleImageAction( v.id, v?.dataObj?.name, v.action ); + } ); +} )( jQuery ); diff --git a/classes/Visualizer/Module.php b/classes/Visualizer/Module.php index 9762a56e2..121de51dc 100644 --- a/classes/Visualizer/Module.php +++ b/classes/Visualizer/Module.php @@ -585,6 +585,12 @@ protected function get_user_customization_js() { * Load the class for the given chart's chart type so that its assets can be loaded. */ protected function load_chart_type( $chart_id ) { + // D3/AI charts have no traditional type class — return the library string directly. + $lib = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_LIBRARY, true ); + if ( 'd3' === $lib ) { + return 'd3'; + } + $name = $this->load_chart_class_name( $chart_id ); $class = null; if ( class_exists( $name ) || true === apply_filters( 'visualizer_load_chart', false, $name ) ) { diff --git a/classes/Visualizer/Module/AIBuilder.php b/classes/Visualizer/Module/AIBuilder.php new file mode 100644 index 000000000..188c62408 --- /dev/null +++ b/classes/Visualizer/Module/AIBuilder.php @@ -0,0 +1,583 @@ +_addAction( 'wp_ajax_visualizer-ai-create', 'createChart' ); + $this->_addAction( 'wp_ajax_visualizer-ai-upload', 'uploadData' ); + $this->_addAction( 'wp_ajax_visualizer-ai-save', 'saveChart' ); + $this->_addAction( 'wp_ajax_visualizer-ai-generate', 'generateChart' ); + $this->_addAction( 'wp_ajax_visualizer-ai-status', 'chartStatus' ); + $this->_addAction( 'wp_ajax_visualizer-ai-chart-nonce', 'getChartNonce' ); + $this->_addAction( 'wp_ajax_visualizer-ai-fetch', 'fetchChart' ); + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + /** + * Get the Agents workflow slug. + * + * @return string + */ + private function _get_workflow_slug() { + return defined( 'VISUALIZER_AGENTS_WORKFLOW' ) ? VISUALIZER_AGENTS_WORKFLOW : 'visualizer-generate'; + } + + /** + * Resolve the license token used for agent authorization. + * + * @return string + */ + private function _get_agents_license_token() { + $license = get_option( 'visualizer_pro_license_data', 'free' ); + if ( ! empty( $license ) && is_object( $license ) ) { + $license = isset( $license->key ) ? $license->key : 'free'; + } else { + $license = 'free'; + } + + return (string) $license; + } + + /** + * Build request headers for the Agents service. + * + * @param bool $with_content_type Whether to include Content-Type header. + * @return array + */ + private function _get_agents_headers( $with_content_type = false ) { + $headers = array( + 'X-Site-Url' => home_url(), + 'Accept' => 'application/json', + ); + + if ( $with_content_type ) { + $headers['Content-Type'] = 'application/json'; + } + + $license = $this->_get_agents_license_token(); + if ( ! empty( $license ) ) { + $headers['Authorization'] = 'Bearer ' . base64_encode( $license ); + } + + return $headers; + } + + /** + * Verify nonce and capability for AI Builder requests. + */ + private function _verify_create_nonce(): void { + check_ajax_referer( 'visualizer-ai-builder', 'nonce' ); + if ( ! current_user_can( 'edit_posts' ) ) { + wp_send_json_error( array( 'message' => __( 'Unauthorized.', 'visualizer' ) ), 403 ); + } + } + + /** + * Persist chart data + series from a source. + * + * @param int $chart_id Chart ID. + * @param Visualizer_Source $source Data source instance. + */ + private function _persist( $chart_id, $source ): void { + update_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() ); + update_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() ); + update_post_meta( $chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, 0 ); + wp_update_post( + array( + 'ID' => $chart_id, + 'post_content' => $source->getData( false ), + ) + ); + } + + // ------------------------------------------------------------------------- + // AJAX: create draft + // ------------------------------------------------------------------------- + + /** + * AJAX: create a draft chart post for AI Builder. + */ + public function createChart(): void { + $this->_verify_create_nonce(); + + $chart_id = wp_insert_post( + array( + 'post_type' => Visualizer_Plugin::CPT_VISUALIZER, + 'post_status' => 'auto-draft', + 'post_title' => __( 'AI Chart', 'visualizer' ), + ), + true + ); + + if ( is_wp_error( $chart_id ) ) { + wp_send_json_error( array( 'message' => $chart_id->get_error_message() ) ); + } + + update_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_LIBRARY, 'd3' ); + update_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, 'Visualizer_Source_Csv' ); + + wp_send_json_success( + array( + 'chart_id' => $chart_id, + 'upload_nonce' => wp_create_nonce( 'visualizer-ai-upload-' . $chart_id ), + ) + ); + } + + // ------------------------------------------------------------------------- + // AJAX: get upload nonce for an existing chart (used in edit mode) + // ------------------------------------------------------------------------- + + /** + * AJAX: get upload nonce for an existing chart (edit mode). + */ + public function getChartNonce(): void { + $this->_verify_create_nonce(); + $chart_id = intval( isset( $_POST['chart_id'] ) ? $_POST['chart_id'] : 0 ); + if ( ! $chart_id || ! get_post( $chart_id ) ) { + wp_send_json_error( array( 'message' => __( 'Chart not found.', 'visualizer' ) ) ); + } + wp_send_json_success( + array( + 'upload_nonce' => wp_create_nonce( 'visualizer-ai-upload-' . $chart_id ), + ) + ); + } + + // ------------------------------------------------------------------------- + // AJAX: fetch chart data/spec for edit mode (used on refresh) + // ------------------------------------------------------------------------- + + /** + * AJAX: fetch chart data/spec for edit mode. + */ + public function fetchChart(): void { + $this->_verify_create_nonce(); + $chart_id = intval( isset( $_POST['chart_id'] ) ? $_POST['chart_id'] : 0 ); + $chart = $chart_id ? get_post( $chart_id ) : null; + if ( ! $chart || $chart->post_type !== Visualizer_Plugin::CPT_VISUALIZER ) { + wp_send_json_error( array( 'message' => __( 'Chart not found.', 'visualizer' ) ) ); + } + + $series = get_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, true ); + $data = Visualizer_Module::get_chart_data( $chart, '', false ); + $code = get_post_meta( $chart_id, self::CF_D3_CODE, true ); + + wp_send_json_success( + array( + 'title' => $chart->post_title, + 'series' => $series, + 'data' => $data, + 'code' => $code, + ) + ); + } + + // ------------------------------------------------------------------------- + // AJAX: upload / parse data + // ------------------------------------------------------------------------- + + /** + * Determines whether a remote URL serves an XLSX file. + * + * Uses wp_safe_remote_get() and checks ZIP magic number (PK\x03\x04). + * + * @access private + * @param string $url The remote URL to probe. + * @return bool TRUE if the file appears to be XLSX, FALSE otherwise. + */ + private static function _url_is_xlsx( $url ) { + $tmpfile = wp_tempnam( 'visualizer_xlsx_probe' ); + if ( ! $tmpfile ) { + return false; + } + + $response = wp_safe_remote_get( + $url, + array( + 'timeout' => 15, + 'redirection' => 5, + 'stream' => true, + 'filename' => $tmpfile, + 'headers' => array( 'Range' => 'bytes=0-3' ), + ) + ); + + if ( is_wp_error( $response ) ) { + @unlink( $tmpfile ); + return false; + } + + $body = file_get_contents( $tmpfile ); + @unlink( $tmpfile ); + + if ( ! empty( $body ) ) { + return 0 === strpos( $body, "PK\x03\x04" ); + } + + $content_type = wp_remote_retrieve_header( $response, 'content-type' ); + return is_string( $content_type ) && false !== stripos( $content_type, 'sheet' ); + } + + /** + * AJAX: upload/parse data for AI Builder. + */ + public function uploadData(): void { + $chart_id = intval( isset( $_POST['chart_id'] ) ? $_POST['chart_id'] : 0 ); + check_ajax_referer( 'visualizer-ai-upload-' . $chart_id, 'nonce' ); + + if ( ! current_user_can( 'edit_posts' ) ) { + wp_send_json_error( array( 'message' => __( 'Unauthorized.', 'visualizer' ) ), 403 ); + } + if ( ! get_post( $chart_id ) ) { + wp_send_json_error( array( 'message' => __( 'Chart not found.', 'visualizer' ) ) ); + } + + $source_type = isset( $_POST['source_type'] ) ? sanitize_key( $_POST['source_type'] ) : 'csv_string'; + $source = null; + $tmp_files = array(); + + switch ( $source_type ) { + + // ── Manual CSV text ────────────────────────────────────────────── + case 'csv_string': + if ( empty( $_POST['csv_data'] ) ) { + wp_send_json_error( array( 'message' => __( 'No data provided.', 'visualizer' ) ) ); + } + $tmp = tempnam( sys_get_temp_dir(), 'viz_ai_' ); + file_put_contents( $tmp, wp_unslash( $_POST['csv_data'] ) ); + $tmp_files[] = $tmp; + $source = new Visualizer_Source_Csv( $tmp ); + break; + + // ── CSV / XLSX file upload ──────────────────────────────────────── + case 'csv_file': + case 'xlsx_file': + if ( empty( $_FILES['data_file']['tmp_name'] ) ) { + wp_send_json_error( array( 'message' => __( 'No file uploaded.', 'visualizer' ) ) ); + } + $ext = strtolower( pathinfo( $_FILES['data_file']['name'], PATHINFO_EXTENSION ) ); + if ( $ext === 'xlsx' && class_exists( 'Visualizer_Source_Xlsx' ) ) { + $source = new Visualizer_Source_Xlsx( $_FILES['data_file']['tmp_name'] ); + } else { + $source = new Visualizer_Source_Csv( $_FILES['data_file']['tmp_name'] ); + } + break; + + // ── Remote CSV / XLSX URL ───────────────────────────────────────── + case 'file_url': + if ( empty( $_POST['file_url'] ) ) { + wp_send_json_error( array( 'message' => __( 'No URL provided.', 'visualizer' ) ) ); + } + $url = wp_unslash( $_POST['file_url'] ); + + // Allow local absolute paths in dev (same CSVs used by Classic). + if ( is_string( $url ) && file_exists( $url ) && is_readable( $url ) ) { + $ext = strtolower( pathinfo( $url, PATHINFO_EXTENSION ) ); + if ( 'xlsx' === $ext && class_exists( 'Visualizer_Source_Xlsx' ) ) { + $source = new Visualizer_Source_Xlsx( $url ); + } else { + $source = new Visualizer_Source_Csv( $url ); + } + break; + } + + if ( function_exists( 'wp_http_validate_url' ) ) { + $validated_url = wp_http_validate_url( (string) $url ); + $url = false === $validated_url ? false : (string) $validated_url; + } else { + $url = esc_url_raw( (string) $url ); + } + if ( false === $url ) { + wp_send_json_error( array( 'message' => __( 'Invalid URL. Please check the URL and try again.', 'visualizer' ) ) ); + } + + $ext = strtolower( pathinfo( parse_url( $url, PHP_URL_PATH ), PATHINFO_EXTENSION ) ); + if ( 'xlsx' === $ext || ( 'csv' !== $ext && self::_url_is_xlsx( $url ) ) ) { + $source = new Visualizer_Source_Xlsx_Remote( $url ); + } else { + $source = new Visualizer_Source_Csv_Remote( $url ); + } + + // Optionally store schedule + if ( ! empty( $_POST['schedule'] ) ) { + update_post_meta( $chart_id, 'visualizer-chart-url', $url ); + update_post_meta( $chart_id, 'visualizer-chart-schedule', intval( $_POST['schedule'] ) ); + apply_filters( 'visualizer_pro_chart_schedule', $chart_id, $url, $_POST['schedule'] ); + } + break; + + // ── JSON URL ───────────────────────────────────────────────────── + case 'json_url': + if ( empty( $_POST['json_url'] ) ) { + wp_send_json_error( array( 'message' => __( 'No URL provided.', 'visualizer' ) ) ); + } + $params = array( + 'url' => esc_url_raw( wp_unslash( $_POST['json_url'] ) ), + 'root' => isset( $_POST['json_root'] ) ? sanitize_text_field( wp_unslash( $_POST['json_root'] ) ) : '', + 'paging' => isset( $_POST['json_paging'] ) ? sanitize_text_field( wp_unslash( $_POST['json_paging'] ) ) : '', + 'method' => ( isset( $_POST['json_method'] ) && $_POST['json_method'] === 'POST' ) ? 'POST' : 'GET', + ); + if ( ! empty( $_POST['json_auth'] ) ) { + $params['auth'] = sanitize_text_field( wp_unslash( $_POST['json_auth'] ) ); + } elseif ( ! empty( $_POST['json_username'] ) ) { + $params['username'] = sanitize_text_field( wp_unslash( $_POST['json_username'] ) ); + $params['password'] = sanitize_text_field( wp_unslash( isset( $_POST['json_password'] ) ? $_POST['json_password'] : '' ) ); + } + if ( ! empty( $_POST['json_headers'] ) ) { + $params['headers'] = sanitize_textarea_field( wp_unslash( $_POST['json_headers'] ) ); + } + $source = new Visualizer_Source_Json( $params ); + + // Store config for sync + update_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_URL, $params['url'] ); + update_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_ROOT, $params['root'] ); + if ( ! empty( $_POST['json_schedule'] ) ) { + update_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, intval( $_POST['json_schedule'] ) ); + } + break; + + // ── Database query ──────────────────────────────────────────────── + case 'db_query': + if ( empty( $_POST['db_query'] ) ) { + wp_send_json_error( array( 'message' => __( 'No query provided.', 'visualizer' ) ) ); + } + $query = wp_unslash( $_POST['db_query'] ); + $params = array(); + if ( ! empty( $_POST['db_host'] ) ) { + $params = array( + 'host' => sanitize_text_field( wp_unslash( $_POST['db_host'] ) ), + 'port' => intval( isset( $_POST['db_port'] ) ? $_POST['db_port'] : 3306 ), + 'name' => sanitize_text_field( wp_unslash( isset( $_POST['db_name'] ) ? $_POST['db_name'] : '' ) ), + 'username' => sanitize_text_field( wp_unslash( isset( $_POST['db_username'] ) ? $_POST['db_username'] : '' ) ), + 'password' => sanitize_text_field( wp_unslash( isset( $_POST['db_password'] ) ? $_POST['db_password'] : '' ) ), + 'type' => sanitize_key( isset( $_POST['db_type'] ) ? $_POST['db_type'] : 'mysql' ), + ); + } + $source = new Visualizer_Source_Query( $query, $chart_id, $params ); + update_post_meta( $chart_id, 'visualizer-db-query', $query ); + break; + + default: + wp_send_json_error( array( 'message' => __( 'Unknown source type.', 'visualizer' ) ) ); + } + + if ( ! $source->fetch() ) { + foreach ( $tmp_files as $f ) { + @unlink( $f ); + } + wp_send_json_error( + array( + 'message' => __( 'Could not parse data. Check format and try again.', 'visualizer' ), + ) + ); + } + + foreach ( $tmp_files as $f ) { + @unlink( $f ); + } + + $series = $source->getSeries(); + if ( empty( $series ) ) { + wp_send_json_error( array( 'message' => __( 'No columns found. Check that row 1 has headers and row 2 has types (string/number/date).', 'visualizer' ) ) ); + } + + $this->_persist( $chart_id, $source ); + + wp_send_json_success( + array( + 'series' => $series, + 'data' => $source->getRawData( false ), + ) + ); + } + + // ------------------------------------------------------------------------- + // AJAX: generate chart (async — queues AI job, returns workflow_id) + // ------------------------------------------------------------------------- + + /** + * AJAX: start async chart generation. + */ + public function generateChart(): void { + $this->_verify_create_nonce(); + + $chart_id = intval( isset( $_POST['chart_id'] ) ? $_POST['chart_id'] : 0 ); + if ( ! $chart_id || ! get_post( $chart_id ) ) { + wp_send_json_error( array( 'message' => __( 'Chart not found.', 'visualizer' ) ) ); + } + + $prompt = isset( $_POST['prompt'] ) ? sanitize_textarea_field( wp_unslash( $_POST['prompt'] ) ) : ''; + $series = isset( $_POST['series'] ) ? wp_unslash( $_POST['series'] ) : ''; + $data = isset( $_POST['data'] ) ? wp_unslash( $_POST['data'] ) : ''; + $existing_code = isset( $_POST['existing_code'] ) ? wp_unslash( $_POST['existing_code'] ) : ''; + $ref_image = isset( $_POST['ref_image'] ) ? wp_unslash( $_POST['ref_image'] ) : ''; + $ref_image_mime = isset( $_POST['ref_image_mime'] ) ? sanitize_text_field( wp_unslash( $_POST['ref_image_mime'] ) ) : ''; + + if ( empty( $series ) || empty( $data ) ) { + wp_send_json_error( array( 'message' => __( 'No data available. Load data first.', 'visualizer' ) ) ); + } + + $agents_url = VISUALIZER_AGENTS_URL; + $workflow_slug = $this->_get_workflow_slug(); + + $request_body = array( + 'prompt' => $prompt, + 'series' => $series, + 'data' => $data, + ); + if ( ! empty( $existing_code ) ) { + $request_body['existing_code'] = $existing_code; + } + if ( ! empty( $ref_image ) ) { + $request_body['ref_image'] = $ref_image; + $request_body['ref_image_mime'] = ! empty( $ref_image_mime ) ? $ref_image_mime : 'image/jpeg'; + } + + $headers = $this->_get_agents_headers( true ); + + $response = wp_remote_post( + trailingslashit( $agents_url ) . 'api/workflows/' . rawurlencode( $workflow_slug ) . '/start', + array( + 'timeout' => 15, + 'headers' => $headers, + 'body' => wp_json_encode( $request_body ), + ) + ); + + if ( is_wp_error( $response ) ) { + wp_send_json_error( array( 'message' => $response->get_error_message() ) ); + } + + $status = wp_remote_retrieve_response_code( $response ); + $response_body = json_decode( wp_remote_retrieve_body( $response ), true ); + + if ( $status !== 200 && $status !== 201 && $status !== 202 ) { + $msg = ( is_array( $response_body ) && isset( $response_body['error'] ) ) ? $response_body['error'] : __( 'Generation request failed.', 'visualizer' ); + wp_send_json_error( array( 'message' => $msg ) ); + } + + $workflow_id = ''; + if ( is_array( $response_body ) ) { + if ( isset( $response_body['workflowId'] ) ) { + $workflow_id = $response_body['workflowId']; + } elseif ( isset( $response_body['workflow_id'] ) ) { + $workflow_id = $response_body['workflow_id']; + } elseif ( isset( $response_body['data']['workflowId'] ) ) { + $workflow_id = $response_body['data']['workflowId']; + } + } + + wp_send_json_success( + array( + 'workflow_id' => $workflow_id, + ) + ); + } + + // ------------------------------------------------------------------------- + // AJAX: poll generation status + // ------------------------------------------------------------------------- + + /** + * AJAX: poll generation status. + */ + public function chartStatus(): void { + $this->_verify_create_nonce(); + + $workflow_id = isset( $_POST['workflow_id'] ) ? sanitize_text_field( wp_unslash( $_POST['workflow_id'] ) ) : ''; + if ( empty( $workflow_id ) ) { + wp_send_json_error( array( 'message' => __( 'Missing workflow ID.', 'visualizer' ) ) ); + } + + $agents_url = VISUALIZER_AGENTS_URL; + $workflow_slug = $this->_get_workflow_slug(); + $headers = $this->_get_agents_headers(); + + $response = wp_remote_get( + trailingslashit( $agents_url ) . 'api/workflows/' . rawurlencode( $workflow_slug ) . '/' . rawurlencode( $workflow_id ), + array( + 'timeout' => 15, + 'headers' => $headers, + ) + ); + + if ( is_wp_error( $response ) ) { + wp_send_json_error( array( 'message' => $response->get_error_message() ) ); + } + + $body = json_decode( wp_remote_retrieve_body( $response ), true ); + if ( ! is_array( $body ) ) { + wp_send_json_error( array( 'message' => __( 'Invalid response from AI service.', 'visualizer' ) ) ); + } + + wp_send_json_success( $body ); + } + + // ------------------------------------------------------------------------- + // AJAX: save chart + // ------------------------------------------------------------------------- + + /** + * AJAX: save chart with D3 code and publish. + */ + public function saveChart(): void { + $this->_verify_create_nonce(); + + $chart_id = intval( isset( $_POST['chart_id'] ) ? $_POST['chart_id'] : 0 ); + $code = isset( $_POST['code'] ) ? wp_unslash( $_POST['code'] ) : ''; + $title = sanitize_text_field( wp_unslash( isset( $_POST['title'] ) ? $_POST['title'] : __( 'AI Chart', 'visualizer' ) ) ); + + if ( ! $chart_id || ! get_post( $chart_id ) ) { + wp_send_json_error( array( 'message' => __( 'Chart not found.', 'visualizer' ) ) ); + } + if ( empty( $code ) ) { + wp_send_json_error( array( 'message' => __( 'No chart code found. Generate a chart first.', 'visualizer' ) ) ); + } + + update_post_meta( $chart_id, self::CF_D3_CODE, $code ); + update_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_LIBRARY, 'd3' ); + $settings = get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true ); + if ( ! is_array( $settings ) ) { + $settings = array(); + } + $settings['backend-title'] = $title; + update_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, $settings ); + wp_update_post( + array( + 'ID' => $chart_id, + 'post_status' => 'publish', + 'post_title' => $title, + ) + ); + + wp_send_json_success( + array( + 'id' => $chart_id, + 'shortcode' => '[visualizer id="' . $chart_id . '"]', + ) + ); + } +} diff --git a/classes/Visualizer/Module/Admin.php b/classes/Visualizer/Module/Admin.php index 4175a4486..22ea34cff 100644 --- a/classes/Visualizer/Module/Admin.php +++ b/classes/Visualizer/Module/Admin.php @@ -669,6 +669,7 @@ public function enqueueLibraryScripts( $suffix ) { wp_enqueue_script( 'visualizer-customization', $this->get_user_customization_js(), array(), null, true ); + $has_d3 = false; $query = $this->getQuery(); while ( $query->have_posts() ) { $chart = $query->next_post(); @@ -683,6 +684,96 @@ public function enqueueLibraryScripts( $suffix ) { Visualizer_Plugin::VERSION, true ); + if ( 'd3' === $library ) { + $has_d3 = true; + } + } + + if ( $has_d3 ) { + $d3_renderer_asset = VISUALIZER_ABSPATH . '/classes/Visualizer/D3Renderer/build/index.asset.php'; + if ( file_exists( $d3_renderer_asset ) && ! wp_script_is( 'visualizer-d3-renderer', 'registered' ) ) { + /** + * Ignore missing build asset in source checkout. + * + * @phpstan-ignore-next-line + */ + $d3_asset = include $d3_renderer_asset; + wp_register_script( + 'visualizer-d3-renderer', + VISUALIZER_ABSURL . 'classes/Visualizer/D3Renderer/build/index.js', + array_merge( $d3_asset['dependencies'], array( 'jquery' ) ), + $d3_asset['version'], + true + ); + wp_enqueue_script( 'visualizer-d3-renderer' ); + } + } + + $chart_builder_asset = VISUALIZER_ABSPATH . '/classes/Visualizer/ChartBuilder/build/index.asset.php'; + if ( file_exists( $chart_builder_asset ) ) { + /** + * Ignore missing build asset in source checkout. + * + * @phpstan-ignore-next-line + */ + $asset = include $chart_builder_asset; + $chart_builder_deps = $asset['dependencies']; + if ( ! wp_script_is( 'visualizer-handsontable', 'registered' ) && defined( 'Visualizer_Pro_ABSURL' ) && defined( 'VISUALIZER_PRO_VERSION' ) ) { + wp_register_script( + 'visualizer-handsontable', + Visualizer_Pro_ABSURL . 'vendor/handsontable/dist/handsontable.full.min.js', + array(), + VISUALIZER_PRO_VERSION, + true + ); + } + if ( ! wp_style_is( 'visualizer-handsontable', 'registered' ) && defined( 'Visualizer_Pro_ABSURL' ) && defined( 'VISUALIZER_PRO_VERSION' ) ) { + wp_register_style( + 'visualizer-handsontable', + Visualizer_Pro_ABSURL . 'vendor/handsontable/dist/handsontable.full.min.css', + array(), + VISUALIZER_PRO_VERSION + ); + } + if ( wp_script_is( 'visualizer-handsontable', 'registered' ) ) { + wp_enqueue_script( 'visualizer-handsontable' ); + $chart_builder_deps = array_unique( array_merge( $chart_builder_deps, array( 'visualizer-handsontable' ) ) ); + } + if ( wp_style_is( 'visualizer-handsontable', 'registered' ) ) { + wp_enqueue_style( 'visualizer-handsontable' ); + } + wp_enqueue_script( + 'visualizer-chart-builder', + VISUALIZER_ABSURL . 'classes/Visualizer/ChartBuilder/build/index.js', + $chart_builder_deps, + $asset['version'], + true + ); + wp_enqueue_style( + 'visualizer-chart-builder', + VISUALIZER_ABSURL . 'classes/Visualizer/ChartBuilder/build/style-index.css', + array(), + $asset['version'] + ); + $chart_builder_css = VISUALIZER_ABSPATH . '/classes/Visualizer/ChartBuilder/build/index.css'; + if ( file_exists( $chart_builder_css ) ) { + wp_enqueue_style( + 'visualizer-chart-builder-runtime', + VISUALIZER_ABSURL . 'classes/Visualizer/ChartBuilder/build/index.css', + array( 'visualizer-chart-builder' ), + $asset['version'] + ); + } + wp_localize_script( + 'visualizer-chart-builder', + 'vizAIBuilder', + array( + 'ajaxUrl' => admin_url( 'admin-ajax.php' ), + 'nonce' => wp_create_nonce( 'visualizer-ai-builder' ), + 'isPro' => Visualizer_Module::is_pro(), + 'upgradeUrl' => tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'aiBuilderUpgrade', 'dataSource' ), + ) + ); } do_action( 'themeisle_internal_page', VISUALIZER_DIRNAME, 'library' ); @@ -1053,12 +1144,16 @@ public function renderLibraryPage() { // add chart to the array $charts[ $id ] = array( 'id' => $chart->ID, + 'title' => $chart->post_title, 'type' => $type, 'series' => $series, 'settings' => $settings, 'data' => $data, 'library' => $library, ); + if ( 'd3' === $library ) { + $charts[ $id ]['code'] = get_post_meta( $chart->ID, Visualizer_Module_AIBuilder::CF_D3_CODE, true ); + } } // enqueue charts array $ajaxurl = admin_url( 'admin-ajax.php' ); diff --git a/classes/Visualizer/Module/Frontend.php b/classes/Visualizer/Module/Frontend.php index 1905165e6..d8888d821 100644 --- a/classes/Visualizer/Module/Frontend.php +++ b/classes/Visualizer/Module/Frontend.php @@ -433,7 +433,7 @@ public function renderChart( $atts ) { } // add chart to the array - $this->_charts[ $id ] = array( + $chart_entry = array( 'type' => $type, 'series' => $series, 'settings' => $settings, @@ -441,6 +441,13 @@ public function renderChart( $atts ) { 'library' => $library, ); + // For D3 charts, include the stored code so the renderer can execute it. + if ( 'd3' === $library ) { + $chart_entry['code'] = get_post_meta( $chart->ID, Visualizer_Module_AIBuilder::CF_D3_CODE, true ); + } + + $this->_charts[ $id ] = $chart_entry; + $actions_div = ''; $actions_visible = apply_filters( 'visualizer_pro_add_actions', isset( $settings['actions'] ) ? $settings['actions'] : array(), $atts['id'] ); if ( ! empty( $actions_visible ) ) { @@ -491,6 +498,27 @@ public function renderChart( $atts ) { wp_enqueue_script( "visualizer-render-$library" ); } + // For D3 charts, also enqueue the dedicated renderer bundle. + if ( 'd3' === $library ) { + $d3_renderer_asset = VISUALIZER_ABSPATH . '/classes/Visualizer/D3Renderer/build/index.asset.php'; + if ( file_exists( $d3_renderer_asset ) && ! wp_script_is( 'visualizer-d3-renderer', 'registered' ) ) { + /** + * Ignore missing build asset in source checkout. + * + * @phpstan-ignore-next-line + */ + $d3_asset = include $d3_renderer_asset; + wp_register_script( + 'visualizer-d3-renderer', + VISUALIZER_ABSURL . 'classes/Visualizer/D3Renderer/build/index.js', + array_merge( $d3_asset['dependencies'], array( 'jquery' ) ), + $d3_asset['version'], + true + ); + wp_enqueue_script( 'visualizer-d3-renderer' ); + } + } + if ( wp_script_is( "visualizer-render-$_charts_type" ) && 0 === $count ) { wp_localize_script( "visualizer-render-$_charts_type", diff --git a/classes/Visualizer/Render/Library.php b/classes/Visualizer/Render/Library.php index ccc57460f..6d07c3c03 100644 --- a/classes/Visualizer/Render/Library.php +++ b/classes/Visualizer/Render/Library.php @@ -47,13 +47,21 @@ protected function _toHTML() { echo '

'; echo '

'; esc_html_e( 'Visualizer Library', 'visualizer' ); - echo ' ', esc_html__( 'Add New', 'visualizer' ), ''; + echo '
'; + echo '', esc_html__( 'Add New', 'visualizer' ), ''; + echo ''; + echo ''; + echo '
'; if ( Visualizer_Module::is_pro() ) { - echo ' ', esc_html__( 'License Settings', 'visualizer' ), ''; + echo ' ', esc_html__( 'License Settings', 'visualizer' ), ''; } echo '

'; $this->_renderMessages(); $this->_renderLibrary(); + echo '
'; echo '
'; } @@ -337,7 +345,18 @@ private function _renderLibrary() { echo '
'; echo '
'; echo '
'; - echo '
', esc_html__( 'No charts found', 'visualizer' ), '

', esc_html__( 'Add New', 'visualizer' ), '

'; + echo '
'; + echo esc_html__( 'No charts found', 'visualizer' ); + echo '

'; + echo '
'; + echo '', esc_html__( 'Add New', 'visualizer' ), ''; + echo ''; + echo ''; + echo '
'; + echo '

'; echo '
'; echo ''; do_action( 'visualizer_chart_languages', $chart_id ); echo '
(' . $chart_id . '): ' . $chart_status['date'] . '
'; diff --git a/classes/Visualizer/Source/Csv.php b/classes/Visualizer/Source/Csv.php index 5d4e91873..1a39e5fcb 100644 --- a/classes/Visualizer/Source/Csv.php +++ b/classes/Visualizer/Source/Csv.php @@ -77,6 +77,11 @@ private function _fetchSeries( &$handle ) { $types = fgetcsv( $handle, 0, VISUALIZER_CSV_DELIMITER, VISUALIZER_CSV_ENCLOSURE ); } + if ( ! is_array( $labels ) || ! is_array( $types ) ) { + $this->_error = esc_html__( 'File should have a heading row (1st row) and a data type row (2nd row). Please try again.', 'visualizer' ); + return false; + } + $labels = array_filter( $labels ); $types = array_filter( $types ); diff --git a/classes/Visualizer/Source/Xlsx.php b/classes/Visualizer/Source/Xlsx.php index fa08daba9..f295209c4 100644 --- a/classes/Visualizer/Source/Xlsx.php +++ b/classes/Visualizer/Source/Xlsx.php @@ -49,12 +49,6 @@ public function fetch() { return false; } - // Ensure the OpenSpout autoloader is available. - $vendor_file = VISUALIZER_ABSPATH . 'vendor/autoload.php'; - if ( is_readable( $vendor_file ) ) { - include_once $vendor_file; - } - if ( ! class_exists( 'OpenSpout\Reader\Common\Creator\ReaderEntityFactory' ) ) { $this->_error = esc_html__( 'The OpenSpout library is required to import XLSX files but could not be found. Please contact support.', 'visualizer' ); return false; diff --git a/css/library.css b/css/library.css index 20d700167..589f2270c 100644 --- a/css/library.css +++ b/css/library.css @@ -919,3 +919,89 @@ span.viz-view-toggle-group { #visualizer-library.view-list .items--upsell { margin-top: 12px; } + +.viz-add-new-group { + display: inline-flex; + align-items: center; + position: relative; +} + +.viz-add-new-group .add-new-h2 { + margin-right: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.viz-add-new-toggle { + display: inline-flex; + align-items: center; + justify-content: center; + width: 28px; + height: 30px; + margin-left: 0; + border: 1px solid #2271b1; + border-left: 0; + border-radius: 0 3px 3px 0; + background: #f6f7f7; + color: #2271b1; + cursor: pointer; + position: relative; + top: -3px; +} + +.viz-add-new-toggle .dashicons { + font-size: 16px; + line-height: 1; + display: flex; + justify-content: center; + align-items: center; +} + +.viz-add-new-toggle .dashicon { + display: flex; + justify-content: center; + align-items: center; +} + +.viz-add-new-toggle:hover, +.viz-add-new-toggle:focus { + background: #2271b1; + color: #fff; + outline: none; +} + +.viz-add-new-menu { + position: absolute; + top: 100%; + left: 0; + margin-top: 2px; + min-width: 190px; + background: #fff; + border: 1px solid #dcdcde; + border-radius: 6px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); + padding: 6px 0; + display: none; + z-index: 100001; +} + +.viz-add-new-group.is-open .viz-add-new-menu { + display: block; +} + +.viz-add-new-item { + width: 100%; + text-align: left; + padding: 8px 12px; + background: none; + border: none; + cursor: pointer; + font-size: 13px; + color: #1d2327; +} + +.viz-add-new-item:hover, +.viz-add-new-item:focus { + background: #f6f7f7; + outline: none; +} diff --git a/index.php b/index.php index 1468a5371..d44adcca9 100644 --- a/index.php +++ b/index.php @@ -97,6 +97,7 @@ function visualizer_launch() { define( 'VISUALIZER_DEMO_URL', 'https://demo.themeisle.com/visualizer/#' ); define( 'VISUALIZER_CODE_SNIPPETS_URL', 'https://docs.themeisle.com/category/726-visualizer' ); define( 'VISUALIZER_SUBSCRIBE_API', 'https://api.themeisle.com/tracking/subscribe' ); + define( 'VISUALIZER_AGENTS_URL', 'https://ai.themeisle.com' ); // to redirect all themeisle_log_event to error log. define( 'VISUALIZER_LOCAL_DEBUG', false ); @@ -197,6 +198,9 @@ function () { // Set setup wizard module. $plugin->setModule( Visualizer_Module_Wizard::NAME ); + // AI Chart Builder module (AJAX endpoints for the React wizard). + $plugin->setModule( Visualizer_Module_AIBuilder::NAME ); + $vendor_file = VISUALIZER_ABSPATH . '/vendor/autoload.php'; if ( is_readable( $vendor_file ) ) { include_once $vendor_file; diff --git a/js/library.js b/js/library.js index 046ed7b53..ca7a15bcc 100644 --- a/js/library.js +++ b/js/library.js @@ -141,7 +141,7 @@ function createPopupProBlocker( $ , e ) { } } ); - $('.add-new-chart').click(function () { + function openClassicBuilder() { var wnd = window, view = new vmv.Chart({action: vu.create}); vu.create = vu.create.replace(/[\?&]lang=[^&]+/, '').replace(/[\?&]parent_chart_id=[^&]+/, ''); @@ -161,7 +161,69 @@ function createPopupProBlocker( $ , e ) { wnd.location.href = vu.base.replace(/type=[a-zA-Z]*/, '').replace(/vaction/, ''); }; view.open(); + } + + function closeAddNewMenus() { + $('.viz-add-new-group').removeClass('is-open'); + $('.viz-add-new-toggle').attr('aria-expanded', 'false'); + $('.viz-add-new-menu').attr('aria-hidden', 'true'); + } + + $(document).on('click', function() { + closeAddNewMenus(); + }); + + $(document).on('click', '.viz-add-new-toggle', function(event) { + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation(); + var $group = $(this).closest('.viz-add-new-group'); + var isOpen = $group.hasClass('is-open'); + closeAddNewMenus(); + if ( ! isOpen ) { + $group.addClass('is-open'); + $(this).attr('aria-expanded', 'true'); + $group.find('.viz-add-new-menu').attr('aria-hidden', 'false'); + } + return false; + }); + $(document).on('click', '.viz-add-new-item', function(event) { + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation(); + var builder = $(this).data('viz-builder'); + closeAddNewMenus(); + + if ( builder === 'ai' ) { + if ( typeof window.vizOpenAIBuilderNew === 'function' ) { + window.vizOpenAIBuilderNew(); + return; + } + if ( typeof window.vizOpenChartChooser === 'function' ) { + var classicCallback = function() { + openClassicBuilder(); + }; + window.vizOpenChartChooser( classicCallback ); + return; + } + } + + openClassicBuilder(); + }); + + $('.add-new-chart').click(function () { + // Hook for the React chart builder chooser modal. + // If the React app is loaded it sets window.vizOpenChartChooser and handles routing. + // It will call the classicCallback if the user picks the Classic Builder. + if (typeof window.vizOpenChartChooser === 'function') { + var classicCallback = function() { + openClassicBuilder(); + }; + window.vizOpenChartChooser(classicCallback); + return false; + } + openClassicBuilder(); return false; }); @@ -171,6 +233,12 @@ function createPopupProBlocker( $ , e ) { return; } + // D3/AI charts open in the AI Builder instead of the classic modal. + if ( $(this).data('library') === 'd3' && typeof window.vizOpenAIBuilderEdit === 'function' ) { + window.vizOpenAIBuilderEdit( $(this).attr('data-chart') ); + return false; + } + var wnd = window; var view = new vmv.Chart( { action: vu.edit.indexOf('&chart') != -1 ? vu.edit : vu.edit + '&chart=' + $(this).attr('data-chart') diff --git a/package-lock.json b/package-lock.json index 2b40acef5..fd175637e 100755 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,18 @@ "version": "3.11.15", "license": "GPL-2.0+", "dependencies": { + "@chakra-ui/react": "^3.34.0", + "@codemirror/lang-javascript": "^6.2.4", + "@emotion/react": "^11.14.0", + "@handsontable/react": "^13.0.0", + "@uiw/react-codemirror": "^4.23.6", + "d3": "^7.9.0", "deep-filter": "^1.0.2", + "handsontable": "^13.0.0", "is-plain-object": "^2.0.4", "merge": "^1.2.1", "react-google-charts": "^3.0.8", + "topojson-client": "^3.1.0", "uuid": "^8.3.2" }, "devDependencies": { @@ -56,11 +64,87 @@ "node": ">=6.0.0" } }, + "node_modules/@ark-ui/react": { + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/@ark-ui/react/-/react-5.34.1.tgz", + "integrity": "sha512-RJlXCvsHzbK9LVxUVtaSD5pyF1PL8IUR1rHHkf0H0Sa397l6kOFE4EH7MCSj3pDumj2NsmKDVeVgfkfG0KCuEw==", + "license": "MIT", + "dependencies": { + "@internationalized/date": "3.11.0", + "@zag-js/accordion": "1.35.3", + "@zag-js/anatomy": "1.35.3", + "@zag-js/angle-slider": "1.35.3", + "@zag-js/async-list": "1.35.3", + "@zag-js/auto-resize": "1.35.3", + "@zag-js/avatar": "1.35.3", + "@zag-js/carousel": "1.35.3", + "@zag-js/cascade-select": "1.35.3", + "@zag-js/checkbox": "1.35.3", + "@zag-js/clipboard": "1.35.3", + "@zag-js/collapsible": "1.35.3", + "@zag-js/collection": "1.35.3", + "@zag-js/color-picker": "1.35.3", + "@zag-js/color-utils": "1.35.3", + "@zag-js/combobox": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/date-picker": "1.35.3", + "@zag-js/date-utils": "1.35.3", + "@zag-js/dialog": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/drawer": "1.35.3", + "@zag-js/editable": "1.35.3", + "@zag-js/file-upload": "1.35.3", + "@zag-js/file-utils": "1.35.3", + "@zag-js/floating-panel": "1.35.3", + "@zag-js/focus-trap": "1.35.3", + "@zag-js/highlight-word": "1.35.3", + "@zag-js/hover-card": "1.35.3", + "@zag-js/i18n-utils": "1.35.3", + "@zag-js/image-cropper": "1.35.3", + "@zag-js/json-tree-utils": "1.35.3", + "@zag-js/listbox": "1.35.3", + "@zag-js/marquee": "1.35.3", + "@zag-js/menu": "1.35.3", + "@zag-js/navigation-menu": "1.35.3", + "@zag-js/number-input": "1.35.3", + "@zag-js/pagination": "1.35.3", + "@zag-js/password-input": "1.35.3", + "@zag-js/pin-input": "1.35.3", + "@zag-js/popover": "1.35.3", + "@zag-js/presence": "1.35.3", + "@zag-js/progress": "1.35.3", + "@zag-js/qr-code": "1.35.3", + "@zag-js/radio-group": "1.35.3", + "@zag-js/rating-group": "1.35.3", + "@zag-js/react": "1.35.3", + "@zag-js/scroll-area": "1.35.3", + "@zag-js/select": "1.35.3", + "@zag-js/signature-pad": "1.35.3", + "@zag-js/slider": "1.35.3", + "@zag-js/splitter": "1.35.3", + "@zag-js/steps": "1.35.3", + "@zag-js/switch": "1.35.3", + "@zag-js/tabs": "1.35.3", + "@zag-js/tags-input": "1.35.3", + "@zag-js/timer": "1.35.3", + "@zag-js/toast": "1.35.3", + "@zag-js/toggle": "1.35.3", + "@zag-js/toggle-group": "1.35.3", + "@zag-js/tooltip": "1.35.3", + "@zag-js/tour": "1.35.3", + "@zag-js/tree-view": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, "dependencies": { "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" @@ -73,7 +157,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -85,7 +168,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -99,7 +181,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -107,14 +188,12 @@ "node_modules/@babel/code-frame/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/code-frame/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -123,7 +202,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -455,7 +533,6 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, "dependencies": { "@babel/types": "^7.22.15" }, @@ -577,7 +654,6 @@ "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -586,7 +662,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -632,7 +707,6 @@ "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -646,7 +720,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -658,7 +731,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -672,7 +744,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -680,14 +751,12 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -696,7 +765,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2118,7 +2186,6 @@ "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2188,7 +2255,6 @@ "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -2204,6 +2270,134 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@chakra-ui/react": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-3.34.0.tgz", + "integrity": "sha512-VLhpVwv5IVxhwajO10KnS1VQT4hDqQMQP/A796Ya+uVu8AdoSX+5HHyTLTkYIeXIDMe0xLqJfov04OBKbBchJA==", + "license": "MIT", + "dependencies": { + "@ark-ui/react": "^5.34.1", + "@emotion/is-prop-valid": "^1.4.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@pandacss/is-valid-prop": "^1.4.2", + "csstype": "^3.2.3" + }, + "peerDependencies": { + "@emotion/react": ">=11", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.1", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.1.tgz", + "integrity": "sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz", + "integrity": "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.6.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.5.tgz", + "integrity": "sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==", + "license": "MIT", + "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" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.2.tgz", + "integrity": "sha512-jEPmz2nGGDxhRTg3lTpzmIyGKxz3Gp3SJES4b0nAuE5SWQoKdT5GoQ69cwMmFd+wvFUhYirtDTr0/DRHpQAyWg==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.5.tgz", + "integrity": "sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.35.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.6.0.tgz", + "integrity": "sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.37.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz", + "integrity": "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/theme-one-dark": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", + "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.40.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.40.0.tgz", + "integrity": "sha512-WA0zdU7xfF10+5I3HhUUq3kqOx3KjqmtQ9lqZjfK7jtYk4G72YW9rezcSywpaUMCWOMlq+6E0pO1IWg1TNIhtg==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.6.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, "node_modules/@csstools/selector-specificity": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", @@ -2229,6 +2423,156 @@ "node": ">=10.0.0" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, "node_modules/@es-joy/jsdoccomment": { "version": "0.41.0", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz", @@ -2412,6 +2756,41 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@handsontable/react": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@handsontable/react/-/react-13.1.0.tgz", + "integrity": "sha512-dl5r1VHw2A8UTIprigfIc/DaXXrKovpMcn8s9GDHpdpqBPwOCDsp5ETdqiSeZ2y+TiNydUeJhb/z+N2T+rsP+g==", + "deprecated": "Handsontable for React is now available as @handsontable/react-wrapper.", + "license": "SEE LICENSE IN LICENSE.txt", + "peerDependencies": { + "handsontable": ">=13.0.0" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -2515,6 +2894,24 @@ "node": ">=18" } }, + "node_modules/@internationalized/date": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.11.0.tgz", + "integrity": "sha512-BOx5huLAWhicM9/ZFs84CzP+V3gBW6vlpM02yzsdYC7TGlZJX1OJiEEHcSayF00Z+3jLlm4w79amvSt6RqKN3Q==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/number": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.5.tgz", + "integrity": "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -3261,6 +3658,47 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "node_modules/@lezer/common": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz", + "integrity": "sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==", + "license": "MIT" + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", + "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.8.tgz", + "integrity": "sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "license": "MIT" + }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -4357,6 +4795,12 @@ "@octokit/openapi-types": "^24.2.0" } }, + "node_modules/@pandacss/is-valid-prop": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@pandacss/is-valid-prop/-/is-valid-prop-1.9.0.tgz", + "integrity": "sha512-AZvpXWGyjbHc8TC+YVloQ31Z2c4j2xMvYj6UfVxuZdB5w4c9+4N8wy5R7I/XswNh8e4cfUlkvsEGDXjhJRgypw==", + "license": "MIT" + }, "node_modules/@php-wasm/cli-util": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@php-wasm/cli-util/-/cli-util-3.1.2.tgz", @@ -5621,19 +6065,20 @@ } }, "node_modules/@playwright/test": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.42.1.tgz", - "integrity": "sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==", + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", + "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { - "playwright": "1.42.1" + "playwright": "1.58.2" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { @@ -6779,6 +7224,21 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@swc/helpers": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.19.tgz", + "integrity": "sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@swc/helpers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -6974,10 +7434,11 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.21", @@ -7138,10 +7599,14 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "14.14.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.43.tgz", - "integrity": "sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ==", - "dev": true + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } }, "node_modules/@types/node-forge": { "version": "1.3.11", @@ -7161,8 +7626,16 @@ "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/pikaday": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@types/pikaday/-/pikaday-1.7.4.tgz", + "integrity": "sha512-0KsHVyw5pTG829nqG4IRu7m+BFQlFEBdbE/1i3S5182HeKUKv1uEW0gyEmkJVp5i4IV+9pyh23O83+KpRkSQbw==", + "license": "MIT", + "dependencies": { + "moment": ">=2.14.0" + } }, "node_modules/@types/qs": { "version": "6.9.12", @@ -7716,6 +8189,59 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@uiw/codemirror-extensions-basic-setup": { + "version": "4.25.8", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.8.tgz", + "integrity": "sha512-9Rr+liiBmK4xzZHszL+twNRJApthqmITBwDP3emNTtTrkBFN4gHlqfp+nodKmoVt1+bUH1qQCtyqt+7dbDTHiw==", + "license": "MIT", + "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" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "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" + } + }, + "node_modules/@uiw/react-codemirror": { + "version": "4.25.8", + "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.25.8.tgz", + "integrity": "sha512-A0aLOuJZm2yJ+U9GlMFwxwFciztjd5LhcAG4SMqFxdD58wH+sCQXuY4UU5J2hqgS390qAlShtUgREvJPUonbuQ==", + "license": "MIT", + "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.25.8", + "codemirror": "^6.0.0" + }, + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "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": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -8400,18 +8926,6 @@ } } }, - "node_modules/@wordpress/env/node_modules/@types/node": { - "version": "25.3.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.2.tgz", - "integrity": "sha512-RpV6r/ij22zRRdyBPcxDeKAzH43phWVKEjL2iksqo1Vz3CuBUrgmPpPhALKiRfU7OMCmeeO9vECBMsV0hMTG8Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "undici-types": "~7.18.0" - } - }, "node_modules/@wordpress/env/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -10186,6 +10700,930 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "node_modules/@zag-js/accordion": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/accordion/-/accordion-1.35.3.tgz", + "integrity": "sha512-wmw6yo5Zr6ShiKGTc5ICEOJCurWAOSGubIpGISiHi3cZ4tlxKF/vpATIUT3eq8xzdB56YK57yKCujs/WmwqqoA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/anatomy": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/anatomy/-/anatomy-1.35.3.tgz", + "integrity": "sha512-oqU9iLNNylrtJMBX5Xu4DsxnPNvtZLiobryv2oNtsDI1mi1Fca/XHghQC9K5aYT0qNsmHj1M3W5WAWTaOtPLkQ==", + "license": "MIT" + }, + "node_modules/@zag-js/angle-slider": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/angle-slider/-/angle-slider-1.35.3.tgz", + "integrity": "sha512-HXRlmsbNEJSBT53fq9XQKL/vwZWwJC3nprskI7s4f/jy8a4uXPTlv7N7zuBYjew+ScTMzZah6fLWzUztBehmSg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/rect-utils": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/aria-hidden": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/aria-hidden/-/aria-hidden-1.35.3.tgz", + "integrity": "sha512-dk5POebn10WneQfLrEgbTzwolaXWpCSHL6F3jCTinW9IbOx7BXghzJD21iU5Iun+y9CorqJPW3p7LplYNUMO5Q==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.35.3" + } + }, + "node_modules/@zag-js/async-list": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/async-list/-/async-list-1.35.3.tgz", + "integrity": "sha512-SXX3wGzLK/maKS1PJ3XfLIGWbu0022f/OhcFsT1PbiHnoFZTH7h2fBhirrCBfy2TYFQ6r5uxgjkhPUNkuaeYnA==", + "license": "MIT", + "dependencies": { + "@zag-js/core": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/auto-resize": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/auto-resize/-/auto-resize-1.35.3.tgz", + "integrity": "sha512-ufG8HSqzLd9h5rnos8aumj8iORlRskeR/gbpJu1NHrnHBWIrpuXm6KJJR2oZhTFY1BUMMk8eYIBA2QkVuiJzWA==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.35.3" + } + }, + "node_modules/@zag-js/avatar": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/avatar/-/avatar-1.35.3.tgz", + "integrity": "sha512-lbQ2Q4Va8AAScKULOHw2tCQez+0JRYGHSMFq6i+dJmeT3dlSgRanm69ra6K2po6hM9E4v6pRe+xOVE+9QMDnuA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/carousel": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/carousel/-/carousel-1.35.3.tgz", + "integrity": "sha512-F+b8HzUeZfB+xUkAkLG4r0Ubui8pj7pSgZhi26ZiWgsM7tsd7cD+xRMXkvPEITN5Fd5QCe3KlVBuE00w5byjmg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/scroll-snap": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/cascade-select": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/cascade-select/-/cascade-select-1.35.3.tgz", + "integrity": "sha512-Nifdx77hEuAdXqr1wpZSPjLXqygRhq/WvnPjGhCeSqFPpy62uT4JZ3avyjUZ4I0UhvIpkleUcXtFwQ3cSMh4ww==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/collection": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/rect-utils": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/checkbox": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/checkbox/-/checkbox-1.35.3.tgz", + "integrity": "sha512-8XBt/Wg2zSQWqV2ZFqZBQUjYRkOYHA2O3IEi0VVYtds3S1n7Pu/HqkZT5qDw+E/SY2+X9Uyx4hO7h2XrlsiZQQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/clipboard": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/clipboard/-/clipboard-1.35.3.tgz", + "integrity": "sha512-obTwynBpp6c17fLHe5tg//FQ497QsyCEry+K3bTdlrivWW200wvfHxZ6RKVbKwDAwhH+ye0bI1xkYAId8j7sdA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/collapsible": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/collapsible/-/collapsible-1.35.3.tgz", + "integrity": "sha512-IweG8JOBCerJwLO6QzTZGEMlsYUmQfQSeD0jniFguMM8vcunvGVSrM+AaL8pDbmXd+snXokaGyJpGO3vzMW6Fw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/collection": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/collection/-/collection-1.35.3.tgz", + "integrity": "sha512-BYoWJ4b7ma2PgiuQbRSnP603f2DlK6se5JtViUHTamZScLLLWnWHuQ6zFa1KS5kiIkbb7CFM6/bJ3WNYLch8Ig==", + "license": "MIT", + "dependencies": { + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/color-picker": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/color-picker/-/color-picker-1.35.3.tgz", + "integrity": "sha512-i9roSgtqeA1b4Q+jWqnxjXB//BQXMP5m1FQ4YcZVq/0yT14A53JIknchuqrh3wC3yPsJMXFqCoKg+NET2+OVig==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/color-utils": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/color-utils": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/color-utils/-/color-utils-1.35.3.tgz", + "integrity": "sha512-vxkEVgz4YdSbdaPvjiRI1VsJAdwzu/dUNvzqOaiVcPDrHr/FFgmUbv0SOFjnfSb2QWGI8EDEMn02RW9ym+BzGw==", + "license": "MIT", + "dependencies": { + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/combobox": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/combobox/-/combobox-1.35.3.tgz", + "integrity": "sha512-s1qmttTGJTMjlDakL+uvWSEggpafKr1vhOeZCh8j+N4eFt9bLAwaffjuh/1JzWBvzovw7WoMVkizdTXPlN8oYg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/aria-hidden": "1.35.3", + "@zag-js/collection": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/core": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/core/-/core-1.35.3.tgz", + "integrity": "sha512-fGAHyqOYSEFmo52t7wI4dvbFfLyJmUlyf7wknsiUlzUHlrn3yv5PAZYZ2TibpOD1hwXIp4AoCjbiIPPZBxirZw==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/date-picker": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/date-picker/-/date-picker-1.35.3.tgz", + "integrity": "sha512-4G10h6pzzLbd84SE2CKtqi6Z9wEBhSyx4GRSxxy3tsf5wAxnz4anRFat9CGwn2YVUYcUJpD+umYgBMPt6zGDnA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/date-utils": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/live-region": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + }, + "peerDependencies": { + "@internationalized/date": ">=3.0.0" + } + }, + "node_modules/@zag-js/date-utils": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/date-utils/-/date-utils-1.35.3.tgz", + "integrity": "sha512-1co0FPpZ6nO5dN8sZtECkMYaf+3E5zu0KSIJZpZiXb4TgsZMDyHu7K7IsiKFHk9qmhuF6AdPpNxBju91pSXMFg==", + "license": "MIT", + "peerDependencies": { + "@internationalized/date": ">=3.0.0" + } + }, + "node_modules/@zag-js/dialog": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/dialog/-/dialog-1.35.3.tgz", + "integrity": "sha512-byosV+aBHH5LoFKnjEgC7WdqJid7bP9UhgWLSC7+IXbxrif9Czg1YVp6ZlQM6Nx6uD1vnty4touI3P7D7CTKcw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/aria-hidden": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-trap": "1.35.3", + "@zag-js/remove-scroll": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/dismissable": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/dismissable/-/dismissable-1.35.3.tgz", + "integrity": "sha512-XPk+lqmsZp2Z1yMb5K1yj/e7Sobv4D7zK66B1GS97lk9Xzz8vuSgsimcLy0p7RXQl3KL6H5L69inSuQa2exybQ==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.35.3", + "@zag-js/interact-outside": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/dom-query": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-1.35.3.tgz", + "integrity": "sha512-1RbFZoT4CjlHN9TUNse1++ZVOyKo45ktucTIT349o6HMsoWWKmTJDPvFkMBbmu/qY6XXn4dT+LJEp4bL3DR+Qw==", + "license": "MIT", + "dependencies": { + "@zag-js/types": "1.35.3" + } + }, + "node_modules/@zag-js/drawer": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/drawer/-/drawer-1.35.3.tgz", + "integrity": "sha512-DN5bwa7bDCDaUSbNzFxMc2U/WmbLcXvPSQjyOpKI6CC3VbW2kKaOnjJ5qQG+W5YBO0FpmJBtaxRV7lke4sZH2w==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/aria-hidden": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-trap": "1.35.3", + "@zag-js/remove-scroll": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/editable": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/editable/-/editable-1.35.3.tgz", + "integrity": "sha512-HcjeacS61vQXfNT9IalZj/+oS45yW5bIDO2NjJWV7zNe5AG29NCceUnvBhy+hrUKPnKcjfDocdW5rCL+Lvs/CQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/interact-outside": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/file-upload": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/file-upload/-/file-upload-1.35.3.tgz", + "integrity": "sha512-oIYwnDct4ERo2mfmcxsBIJnlmpzjrzYx82SQsXWD3NGKx3cgdh2lwBX+ebItaLH1jkgzBa3z0TWxc6rfvcUXbw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/file-utils": "1.35.3", + "@zag-js/i18n-utils": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/file-utils": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/file-utils/-/file-utils-1.35.3.tgz", + "integrity": "sha512-Tb05RCzx4swc156hd4jLiO7z+Gxg/HQ+JCds03jgTbrFJAz2D56YaMeI7gSDc1m4Xre3nyqQpSo9AeX5nzbE/w==", + "license": "MIT", + "dependencies": { + "@zag-js/i18n-utils": "1.35.3" + } + }, + "node_modules/@zag-js/floating-panel": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/floating-panel/-/floating-panel-1.35.3.tgz", + "integrity": "sha512-nTZypcS0X46Oo1kpCQTnP5UlzjhypOAj3B4dq2z/3bAOC0TntYTnFkj8PbEJtExk7364xfMyxfgZOiv7Aqq01w==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/rect-utils": "1.35.3", + "@zag-js/store": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/focus-trap": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/focus-trap/-/focus-trap-1.35.3.tgz", + "integrity": "sha512-evErLlGFdDVCI8xipNS5k0rAvO+KFRA9g273bbfWAL1+mT54mcB/XHa85nC3QpPgMNrSh+6LUNq9fapyOGoyYg==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.35.3" + } + }, + "node_modules/@zag-js/focus-visible": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-1.35.3.tgz", + "integrity": "sha512-g4F8PRGIoFoKBrHiQ1HQh5AjCS7brFRXHvpbDNb9+T11FGlF5Turb+6OVRoNV8MmiuqMltO2I28l36YsGc//uQ==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.35.3" + } + }, + "node_modules/@zag-js/highlight-word": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/highlight-word/-/highlight-word-1.35.3.tgz", + "integrity": "sha512-K+mvEBbf3SUFjQeMeJQYb3cjri3x6sPaPhcKWayalelSLB/StWEGqcpmz+a6uUYrCUAK5kEi3Hn0YLGfn0GOig==", + "license": "MIT" + }, + "node_modules/@zag-js/hover-card": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/hover-card/-/hover-card-1.35.3.tgz", + "integrity": "sha512-xVoKOtvrnzhYzciZ1csgiV76IQ4DRtx1lsJeFSrfg5MH0kYWeC/pcmm3yCd2+Qh/45J7DbSXeZneqxpyiF5Vvw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/i18n-utils": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/i18n-utils/-/i18n-utils-1.35.3.tgz", + "integrity": "sha512-k7UcNxbnC2jvGwCoHYAkFD3ZaRSMQNVHfuy8TujZQ+ci3IJovwgWLveZoRfFbXHkTLfhmbpE2tFXBdpwOVZutg==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.35.3" + } + }, + "node_modules/@zag-js/image-cropper": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/image-cropper/-/image-cropper-1.35.3.tgz", + "integrity": "sha512-1PH6bg8JAQESHzNqjka2TJ0QGNBGBAO6rb7AZ+9CaCCLw0pIzbUJhqPMkwd9GhdWGKGP+e7wFitnjcT4W5Js8g==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/interact-outside": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/interact-outside/-/interact-outside-1.35.3.tgz", + "integrity": "sha512-tOcuo/IztzpU7UKXtjVrLZtXzzcbhP4n2WynKwDRkTkq3mRCp61xXJp1csIBycI3JHm/CMeAEcPdRIioxIT/Zw==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/json-tree-utils": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/json-tree-utils/-/json-tree-utils-1.35.3.tgz", + "integrity": "sha512-nOv2dPJf+1mxsobYiSlYt96hR1MK7iHKG1iDLoO5wLggS6GQA3ix1BerHJK0zdehoEZ71R45el5ghCG1HB9VzQ==", + "license": "MIT" + }, + "node_modules/@zag-js/listbox": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/listbox/-/listbox-1.35.3.tgz", + "integrity": "sha512-FE6FOuBr6aWtOb8U8oDvAvcUzD6JKLXAe8WngiLFG+b2yyW4nlaz2AcKRG1bjjB066UMxMo9/+2p4D0Kf5Id1Q==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/collection": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/live-region": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/live-region/-/live-region-1.35.3.tgz", + "integrity": "sha512-64rWcfggYpyr2Fn4pdrB/lljMgm3quwn9is+vdDN85Vv3WShKWoz08T4njidm0hwcIbzas0bRqQYWDLLsAoSJQ==", + "license": "MIT" + }, + "node_modules/@zag-js/marquee": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/marquee/-/marquee-1.35.3.tgz", + "integrity": "sha512-bKZVpmAJWPDORP7WOWnS+65W5ZQBQmRs8zvV33ZfCpFbkXjhRiqKSzIj223/VOc2NEDjyWagz2vioAxrFYVzww==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/menu": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/menu/-/menu-1.35.3.tgz", + "integrity": "sha512-KyY0EZXkIU57Mjt+Lg+pupiePk3LcnQcB3Gl05Vva61bNjBjdKV71qwCQru/OxPZEwYgPo46L7TDIb56kfK/VQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/rect-utils": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/navigation-menu": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/navigation-menu/-/navigation-menu-1.35.3.tgz", + "integrity": "sha512-8cCHx0X/KjEpr2BaMOxJS5LiA6fs/CNqVTF/sTTgZAv7Dm+MH0yNuKm4kpPvcLaVeBpVE09bnyCHrNKzZes+Fw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/number-input": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/number-input/-/number-input-1.35.3.tgz", + "integrity": "sha512-uqawVybAcLcefVEHMVONuAA5kDSDPP5TsROr5PnAyFlhM1iD85+r3KAfCueoDX5w2X4ibbu9o2tdV6zTFKD/nQ==", + "license": "MIT", + "dependencies": { + "@internationalized/number": "3.6.5", + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/pagination": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/pagination/-/pagination-1.35.3.tgz", + "integrity": "sha512-fKm4s5KAd12RiCI/EDmmGKjPQ+i2qS/UsJPdMe65yb/4mY5OibwV2zyHcVeFsOD4gBZpnU6kYlDAGSttmLWLlQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/password-input": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/password-input/-/password-input-1.35.3.tgz", + "integrity": "sha512-etd0gm6ELAm3y+cFhPU+TYm8khm9cL5Mg5m2DcZxu1Mqpj7JY0LsXZ8SFOdCZgTIHuMEhKBiYfnuyMAd4CJztA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/pin-input": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/pin-input/-/pin-input-1.35.3.tgz", + "integrity": "sha512-ZFt+WIHMdVlSg29BrQLFq5ijabiUO3tXMhoKhjjzTSe/tLqfNeu3UxFB6y/FYpn8+Cvn6xwvhu3lgnORYmI0zQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/popover": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/popover/-/popover-1.35.3.tgz", + "integrity": "sha512-+MIEENPsbKPxzoNuDI/C5d5ZN9uxnfZ+MBDc5C5XSgjjg9FcvMXClNq7IFM1aZi24peRXg9cMNf//lApVRT37w==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/aria-hidden": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-trap": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/remove-scroll": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/popper": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/popper/-/popper-1.35.3.tgz", + "integrity": "sha512-gpB7Xn9WtlfrUsIVbSgNQGDwgNOL/cSGt0Id3wEQKArmqVC704EWtPvXzOMMybBEdm8YW2hQrXuo+o66abI1Sg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.5", + "@zag-js/dom-query": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/presence": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/presence/-/presence-1.35.3.tgz", + "integrity": "sha512-ev5E7+U9IZAGvEaflpdVLHaZl8ZaQMhGB3ypd0yKhPwXeM51obV8w3+5HjzTqHPl8TKuoHWL31YaiUBd5EuS6w==", + "license": "MIT", + "dependencies": { + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3" + } + }, + "node_modules/@zag-js/progress": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/progress/-/progress-1.35.3.tgz", + "integrity": "sha512-u0GxQN1AfXMAgzYOUMxKQA12DyuAP0svh2S//KvOorTSv7d5hAa8nZXi2cEv5abYsyfKJ6/bc1Z56byzW1jVZw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/qr-code": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/qr-code/-/qr-code-1.35.3.tgz", + "integrity": "sha512-t0Ehwogr49vTNtWyNdQU2tYex7uJyfAn7N/5LgD7FXw8aa+RBMWZWlqjCUvHqJ929tVMrn+LIrQnZCcwNunalA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3", + "proxy-memoize": "3.0.1", + "uqr": "0.1.2" + } + }, + "node_modules/@zag-js/radio-group": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/radio-group/-/radio-group-1.35.3.tgz", + "integrity": "sha512-kOzocjqWk3dXuRfyfsHwfw63Z99NHbc7rvVUutSsfXANXi+DFYZHuqdPUwMt+29LfaL15XTOfuGV+yUXDCgQHQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/rating-group": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/rating-group/-/rating-group-1.35.3.tgz", + "integrity": "sha512-BmhJZdbaTnd3nFWMY+nR+HF952UhWXfaXXxiBWptSLMBfAYImQTWBMrLgTHCSnVfmFATj4Gb7xQe79FQU8T5fA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/react": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/react/-/react-1.35.3.tgz", + "integrity": "sha512-x2PxYUCQ6OgOpUdmSkG5tbL9JWVqYRh42r4V2UeAdMh0MRwjAJtxjvAy50DZ8Sfia5o4UGdZMXJyDY2O7Pdhyw==", + "license": "MIT", + "dependencies": { + "@zag-js/core": "1.35.3", + "@zag-js/store": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@zag-js/rect-utils": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/rect-utils/-/rect-utils-1.35.3.tgz", + "integrity": "sha512-mt/oD3RXdyaX6ZPSd8BO13vvPBJ7QpVWieubE3O0WM3OPhU7ykDMRp/tR7cYMQrzUm04GlY9pbkmSSw2uABxlA==", + "license": "MIT" + }, + "node_modules/@zag-js/remove-scroll": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/remove-scroll/-/remove-scroll-1.35.3.tgz", + "integrity": "sha512-e59z9SbEpPiw0qwNQa2cB5/h30ZCLREaHsCw1TKTANFhwg7v85k9Lq1H/G/49li1CAjmiaOU9BNGlDvbzpNETQ==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.35.3" + } + }, + "node_modules/@zag-js/scroll-area": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/scroll-area/-/scroll-area-1.35.3.tgz", + "integrity": "sha512-IQwdUws/AckRIHK1z/wHdHurnOeGd8h8Dmspfh3VT7NkwTnxeJ4SW9di9smuD+d25eXkJRuX5zGEDHAyx2IaPQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/scroll-snap": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/scroll-snap/-/scroll-snap-1.35.3.tgz", + "integrity": "sha512-NVa2yRm2DQnF6hTV9k7Xz7l8YCZBagZTiqSwNvWKUulKD1csjt2fpBxvUt2cK+1iQnLOey2ydhs7MMsAnXPbJA==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.35.3" + } + }, + "node_modules/@zag-js/select": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/select/-/select-1.35.3.tgz", + "integrity": "sha512-ztszGHWvlbBDE0YT5LYPH+sMd6VH1ct5pH/M9VSzIUO6C5PARkW0NwSVQ1rCQJMj4sfvSE1gC1/r7urRzqEcUQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/collection": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/signature-pad": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/signature-pad/-/signature-pad-1.35.3.tgz", + "integrity": "sha512-jvtxxzAQ8fre11zWUh6HflG4Ycr5z83Wba4pONRJbUE/vNgkJQ7yJgfyUl1QTlkn8Arfg2Zwoxu9GIq80HLZWg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3", + "perfect-freehand": "^1.2.3" + } + }, + "node_modules/@zag-js/slider": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/slider/-/slider-1.35.3.tgz", + "integrity": "sha512-Th142JO4Fqla5AWhGrTW6CQicwvTw87PdVpur/WotQ7brlZIww5HipzEMh5eQJSWfwpKD4PI2bYK9V/ZE/mpXA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/splitter": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/splitter/-/splitter-1.35.3.tgz", + "integrity": "sha512-IsIbRwzjr5amGANEDsZDSToaSn8wHUWvS2l0XHmf3BiiguVApaZgQTlfqthVQC9hBHMOaGIXIW1CFUOrQYkvUQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/steps": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/steps/-/steps-1.35.3.tgz", + "integrity": "sha512-TYIrqV+v9/ULhvrTRBtQFFvJQPPTWOmjFXxlIxDwozek5R4dCIyeUYt1/ChJEc2mNETocbfDVSTxRO1dwCFpwQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/store": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/store/-/store-1.35.3.tgz", + "integrity": "sha512-7kEV4T/20DU36UIfVMzuDlLhWSSEy/vabmpiB700tcdD9BBBODTiSg3ZeljW17dQbvE545vZOFEjVf/cQ5LVGA==", + "license": "MIT", + "dependencies": { + "proxy-compare": "3.0.1" + } + }, + "node_modules/@zag-js/switch": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/switch/-/switch-1.35.3.tgz", + "integrity": "sha512-EP/2cJ46sd+6C5x5+89jn/9NOpM05CRESYB4RMhOnTe/WFtcS4IpiYtVHFhikdXkvJoibm67O2EHep2Pm/Xj4w==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/tabs": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/tabs/-/tabs-1.35.3.tgz", + "integrity": "sha512-lZKlDmxE25miCikj9QZCCnL02SVV2K14KZy5bn7+XDgrWlfSNTpNTj8r5E3zGlSgio5pkTGou57ASqS7WaPDWg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/tags-input": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/tags-input/-/tags-input-1.35.3.tgz", + "integrity": "sha512-HqyoQ3DZFhByOGnDShFfxi6u0bIf7aSVTlwmAvcL+b2ZhyU6/wIMGc4WJE7BMx1NYWM/jNLHedvGExAI8R0kXQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/auto-resize": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/interact-outside": "1.35.3", + "@zag-js/live-region": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/timer": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/timer/-/timer-1.35.3.tgz", + "integrity": "sha512-edmgitbRgsq+msxvVB4wc17Q5d5k63zMWaLJnWjUdDGAgEtM6/HNxwGb3riv46S2U3RgYxaaHTNZ/M7EE5mvYw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/toast": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/toast/-/toast-1.35.3.tgz", + "integrity": "sha512-whlR791GHdnMD21nNPsl2Dbql8+qu1wBZl75QzwYrjR8FlKjp8bhr3gXKzQEddcBXe9GPEFGvUs4iCyXsuTbpg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/toggle": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/toggle/-/toggle-1.35.3.tgz", + "integrity": "sha512-aFfHKuR4sKzglhkmWLA+0RTNPs9dfeqwtc96qljawGYfAYWJXkEPYK9dFfVa+arZ7L84xBi24QSLiTg7LGSFLw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/toggle-group": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/toggle-group/-/toggle-group-1.35.3.tgz", + "integrity": "sha512-Gn6JHzkQ4tlttjZcE0ZjIdxYkFeVp9VHrcMVizjJTkGZRmQ+kPZ5G/wOsZhIrvLX3Dw6Y0NkuBcP+jDHz/o3TA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/tooltip": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/tooltip/-/tooltip-1.35.3.tgz", + "integrity": "sha512-/pImDGYl79MfLdvEphj3rSvNdj2tLW4GwGEncgdLM/GKwQiEUjfi/9EJOfLYP23M4lOOnoW7orehJ9xeaXOAkA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/tour": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/tour/-/tour-1.35.3.tgz", + "integrity": "sha512-DI2aCXmZaE9KcPZDs9itc2BO7ixLApJ/yVRfM69pXwVOrucdSeDDNPFkfbhj5XwB+9VjjZEkqWFHKntRIyPl5g==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-trap": "1.35.3", + "@zag-js/interact-outside": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/tree-view": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/tree-view/-/tree-view-1.35.3.tgz", + "integrity": "sha512-DbHaLxSNa1goE3o3IsXxEdzp8P5dvmkk1rVWgNUUIhpA+44idEjSSNXJkHPl18Mk5blqSMVjK1EX91oqai01Vw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/collection": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "node_modules/@zag-js/types": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/types/-/types-1.35.3.tgz", + "integrity": "sha512-Fnm3AMs1lfb55hlkip/eJeWHOjFB3gSi1JkZlkkdltG2l7y/zsHkumPSe6jIKy+DRRIFKRCyXVTatbPN27bO3w==", + "license": "MIT", + "dependencies": { + "csstype": "3.2.3" + } + }, + "node_modules/@zag-js/utils": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/utils/-/utils-1.35.3.tgz", + "integrity": "sha512-LHcC+9y6TFhDsIz9I3koYxONl2JFfx5yQDzc6ZEQO2cqzXedRcN0R9IPqNGCX7JuhGt14ctDkVCm1JWGP2J6Wg==", + "license": "MIT" + }, "node_modules/@zip.js/zip.js": { "version": "2.7.57", "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.57.tgz", @@ -11022,6 +12460,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.9", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.9.tgz", @@ -11260,6 +12713,15 @@ "node": "*" } }, + "node_modules/bignumber.js": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-8.1.1.tgz", + "integrity": "sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -11628,7 +13090,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -11688,9 +13149,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001597", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", - "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", + "version": "1.0.30001781", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001781.tgz", + "integrity": "sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==", "dev": true, "funding": [ { @@ -11902,6 +13363,16 @@ "node": ">=8" } }, + "node_modules/chevrotain": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-6.5.0.tgz", + "integrity": "sha512-BwqQ/AgmKJ8jcMEjaSnfMybnKMgGTrtDKowfTP3pX4jwVy0kNjRsT/AP6h+wC3+3NC+X8X15VWBnTCQlX+wQFg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "regexp-to-ast": "0.4.0" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -12295,6 +13766,21 @@ "node": ">= 0.12.0" } }, + "node_modules/codemirror": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", + "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", + "license": "MIT", + "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" + } + }, "node_modules/coffee-script": { "version": "1.12.7", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", @@ -12885,7 +14371,6 @@ "version": "3.36.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==", - "dev": true, "hasInstallScript": true, "funding": { "type": "opencollective", @@ -12926,7 +14411,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -12972,6 +14456,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" + }, "node_modules/cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", @@ -13312,6 +14802,12 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, "node_modules/cwd": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", @@ -13325,6 +14821,428 @@ "node": ">=0.8" } }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -13729,6 +15647,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -13948,6 +15875,12 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/dompurify": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.9.tgz", + "integrity": "sha512-i6mvVmWN4xo9LrhCOZrDgSs9noW6nOahbrmzjRbPF36YPyj5Ue5lgok0MHDWkG7xzpWFO2OYttXdzM7rJxHvNA==", + "license": "(MPL-2.0 OR Apache-2.0)" + }, "node_modules/domutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", @@ -14249,7 +16182,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -14447,7 +16379,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -16110,6 +18041,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, "node_modules/find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", @@ -16411,7 +18348,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -17167,6 +19103,23 @@ "uglify-js": "^3.1.4" } }, + "node_modules/handsontable": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/handsontable/-/handsontable-13.1.0.tgz", + "integrity": "sha512-KqJtS3rJeOWsFWCffnDlM8fcLMTqmW+Vbc7OCVM4X7dYDpfefgFerjNLIxLfT9xohcQoUOS1jcvXwV8dwSppVQ==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@types/pikaday": "1.7.4", + "core-js": "^3.31.1", + "dompurify": "^2.1.1", + "moment": "2.29.4", + "numbro": "2.1.2", + "pikaday": "1.8.2" + }, + "optionalDependencies": { + "hyperformula": "^2.4.0" + } + }, "node_modules/hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -17262,7 +19215,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -17286,6 +19238,21 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -17594,6 +19561,17 @@ "node": ">=8.12.0" } }, + "node_modules/hyperformula": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hyperformula/-/hyperformula-2.7.1.tgz", + "integrity": "sha512-mpVF5zOyNpksZzgTaCQyRAzdC/X43+taz5x1n7zNbs/PUUv0AuLmsy2yfihCr+vihUzN/pk+gXBbOfNpXKOpgA==", + "license": "GPL-3.0-only", + "optional": true, + "dependencies": { + "chevrotain": "^6.5.0", + "tiny-emitter": "^2.1.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -17675,7 +19653,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -17691,7 +19668,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -17787,6 +19763,15 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/interpret": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", @@ -17933,8 +19918,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "node_modules/is-async-function": { "version": "2.0.0", @@ -18045,7 +20029,6 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -19937,8 +21920,7 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -20405,8 +22387,7 @@ "node_modules/lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "node_modules/linkify-it": { "version": "3.0.3", @@ -21479,6 +23460,15 @@ "node": ">=0.10.0" } }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -24862,6 +26852,18 @@ "node": ">=0.10.0" } }, + "node_modules/numbro": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/numbro/-/numbro-2.1.2.tgz", + "integrity": "sha512-7w833BxZmKGLE9HI0aREtNVRVH6WTYUUlWf4qgA5gKNhPQ4F/MRZ14sc0v8eoLORprk9ZTVwYaLwj8N3Zgxwiw==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^8.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/nwsapi": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", @@ -25888,7 +27890,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -25938,7 +27939,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -26062,8 +28062,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-root": { "version": "0.1.1", @@ -26121,7 +28120,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -26132,6 +28130,12 @@ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, + "node_modules/perfect-freehand": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.3.tgz", + "integrity": "sha512-bHZSfqDHGNlPpgH2yxXgPHlQSPpEbo+qg7li0M78J9vNAi2yjwLeA4x79BEQhX44lEWpCLSFCeRZwpw0niiXPA==", + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -26159,6 +28163,12 @@ "node": ">=0.10.0" } }, + "node_modules/pikaday": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/pikaday/-/pikaday-1.8.2.tgz", + "integrity": "sha512-TNtsE+34BIax3WtkB/qqu5uepV1McKYEgvL3kWzU7aqPCpMEN6rBF3AOwu4WCwAealWlBGobXny/9kJb49C1ew==", + "license": "(0BSD OR MIT)" + }, "node_modules/pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", @@ -26309,33 +28319,35 @@ } }, "node_modules/playwright": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.42.1.tgz", - "integrity": "sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==", + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.42.1" + "playwright-core": "1.58.2" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.42.1.tgz", - "integrity": "sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==", + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", "dev": true, + "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/plur": { @@ -27191,12 +29203,27 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/proxy-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-3.0.1.tgz", + "integrity": "sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==", + "license": "MIT" + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, + "node_modules/proxy-memoize": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/proxy-memoize/-/proxy-memoize-3.0.1.tgz", + "integrity": "sha512-VDdG/VYtOgdGkWJx7y0o7p+zArSf2383Isci8C+BP3YXgMYDoPd3cCBjw0JdWb6YBb9sFiOPbAADDVTPJnh+9g==", + "license": "MIT", + "dependencies": { + "proxy-compare": "^3.0.0" + } + }, "node_modules/ps-list": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", @@ -27449,9 +29476,10 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -27460,16 +29488,17 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "peer": true, "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-google-charts": { @@ -27790,8 +29819,7 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -27802,6 +29830,13 @@ "@babel/runtime": "^7.8.4" } }, + "node_modules/regexp-to-ast": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz", + "integrity": "sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw==", + "license": "MIT", + "optional": true + }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -28028,7 +30063,6 @@ "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, "dependencies": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -28172,6 +30206,12 @@ "node": ">=10.0.0" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, "node_modules/run-con": { "version": "1.2.12", "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.2.12.tgz", @@ -28231,6 +30271,12 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", @@ -28312,8 +30358,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { "version": "1.71.1", @@ -28393,9 +30438,10 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "peer": true, "dependencies": { "loose-envify": "^1.1.0" @@ -29996,6 +32042,12 @@ ], "license": "MIT" }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "license": "MIT" + }, "node_modules/style-search": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", @@ -30236,6 +32288,12 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -30809,6 +32867,13 @@ "node": ">=0.10.0" } }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "license": "MIT", + "optional": true + }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -30863,7 +32928,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "engines": { "node": ">=4" } @@ -30890,6 +32954,26 @@ "node": ">=0.6" } }, + "node_modules/topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "license": "ISC", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, + "node_modules/topojson-client/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -31185,10 +33269,11 @@ } }, "node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", "dev": true, + "license": "Apache-2.0", "peer": true, "bin": { "tsc": "bin/tsc", @@ -31269,9 +33354,7 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/unherit": { "version": "1.1.3", @@ -31527,6 +33610,12 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, + "node_modules/uqr": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", + "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==", + "license": "MIT" + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -31704,6 +33793,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -32582,7 +34677,6 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, "engines": { "node": ">= 6" } @@ -32667,11 +34761,82 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "@ark-ui/react": { + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/@ark-ui/react/-/react-5.34.1.tgz", + "integrity": "sha512-RJlXCvsHzbK9LVxUVtaSD5pyF1PL8IUR1rHHkf0H0Sa397l6kOFE4EH7MCSj3pDumj2NsmKDVeVgfkfG0KCuEw==", + "requires": { + "@internationalized/date": "3.11.0", + "@zag-js/accordion": "1.35.3", + "@zag-js/anatomy": "1.35.3", + "@zag-js/angle-slider": "1.35.3", + "@zag-js/async-list": "1.35.3", + "@zag-js/auto-resize": "1.35.3", + "@zag-js/avatar": "1.35.3", + "@zag-js/carousel": "1.35.3", + "@zag-js/cascade-select": "1.35.3", + "@zag-js/checkbox": "1.35.3", + "@zag-js/clipboard": "1.35.3", + "@zag-js/collapsible": "1.35.3", + "@zag-js/collection": "1.35.3", + "@zag-js/color-picker": "1.35.3", + "@zag-js/color-utils": "1.35.3", + "@zag-js/combobox": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/date-picker": "1.35.3", + "@zag-js/date-utils": "1.35.3", + "@zag-js/dialog": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/drawer": "1.35.3", + "@zag-js/editable": "1.35.3", + "@zag-js/file-upload": "1.35.3", + "@zag-js/file-utils": "1.35.3", + "@zag-js/floating-panel": "1.35.3", + "@zag-js/focus-trap": "1.35.3", + "@zag-js/highlight-word": "1.35.3", + "@zag-js/hover-card": "1.35.3", + "@zag-js/i18n-utils": "1.35.3", + "@zag-js/image-cropper": "1.35.3", + "@zag-js/json-tree-utils": "1.35.3", + "@zag-js/listbox": "1.35.3", + "@zag-js/marquee": "1.35.3", + "@zag-js/menu": "1.35.3", + "@zag-js/navigation-menu": "1.35.3", + "@zag-js/number-input": "1.35.3", + "@zag-js/pagination": "1.35.3", + "@zag-js/password-input": "1.35.3", + "@zag-js/pin-input": "1.35.3", + "@zag-js/popover": "1.35.3", + "@zag-js/presence": "1.35.3", + "@zag-js/progress": "1.35.3", + "@zag-js/qr-code": "1.35.3", + "@zag-js/radio-group": "1.35.3", + "@zag-js/rating-group": "1.35.3", + "@zag-js/react": "1.35.3", + "@zag-js/scroll-area": "1.35.3", + "@zag-js/select": "1.35.3", + "@zag-js/signature-pad": "1.35.3", + "@zag-js/slider": "1.35.3", + "@zag-js/splitter": "1.35.3", + "@zag-js/steps": "1.35.3", + "@zag-js/switch": "1.35.3", + "@zag-js/tabs": "1.35.3", + "@zag-js/tags-input": "1.35.3", + "@zag-js/timer": "1.35.3", + "@zag-js/toast": "1.35.3", + "@zag-js/toggle": "1.35.3", + "@zag-js/toggle-group": "1.35.3", + "@zag-js/tooltip": "1.35.3", + "@zag-js/tour": "1.35.3", + "@zag-js/tree-view": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, "@babel/code-frame": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, "requires": { "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" @@ -32681,7 +34846,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -32690,7 +34854,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -32701,7 +34864,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -32709,20 +34871,17 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -32978,7 +35137,6 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, "requires": { "@babel/types": "^7.22.15" } @@ -33063,14 +35221,12 @@ "@babel/helper-string-parser": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==" }, "@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" }, "@babel/helper-validator-option": { "version": "7.23.5", @@ -33104,7 +35260,6 @@ "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -33115,7 +35270,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -33124,7 +35278,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -33135,7 +35288,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -33143,20 +35295,17 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -34108,7 +36257,6 @@ "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", - "dev": true, "requires": { "regenerator-runtime": "^0.14.0" } @@ -34163,7 +36311,6 @@ "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dev": true, "requires": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -34176,6 +36323,119 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@chakra-ui/react": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-3.34.0.tgz", + "integrity": "sha512-VLhpVwv5IVxhwajO10KnS1VQT4hDqQMQP/A796Ya+uVu8AdoSX+5HHyTLTkYIeXIDMe0xLqJfov04OBKbBchJA==", + "requires": { + "@ark-ui/react": "^5.34.1", + "@emotion/is-prop-valid": "^1.4.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@pandacss/is-valid-prop": "^1.4.2", + "csstype": "^3.2.3" + } + }, + "@codemirror/autocomplete": { + "version": "6.20.1", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.1.tgz", + "integrity": "sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A==", + "requires": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "@codemirror/commands": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz", + "integrity": "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==", + "requires": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.6.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "@codemirror/lang-javascript": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.5.tgz", + "integrity": "sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==", + "requires": { + "@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" + } + }, + "@codemirror/language": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.2.tgz", + "integrity": "sha512-jEPmz2nGGDxhRTg3lTpzmIyGKxz3Gp3SJES4b0nAuE5SWQoKdT5GoQ69cwMmFd+wvFUhYirtDTr0/DRHpQAyWg==", + "requires": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "@codemirror/lint": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.5.tgz", + "integrity": "sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==", + "requires": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.35.0", + "crelt": "^1.0.5" + } + }, + "@codemirror/search": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.6.0.tgz", + "integrity": "sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==", + "requires": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.37.0", + "crelt": "^1.0.5" + } + }, + "@codemirror/state": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz", + "integrity": "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==", + "requires": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "@codemirror/theme-one-dark": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", + "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", + "requires": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "@codemirror/view": { + "version": "6.40.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.40.0.tgz", + "integrity": "sha512-WA0zdU7xfF10+5I3HhUUq3kqOx3KjqmtQ9lqZjfK7jtYk4G72YW9rezcSywpaUMCWOMlq+6E0pO1IWg1TNIhtg==", + "requires": { + "@codemirror/state": "^6.6.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, "@csstools/selector-specificity": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", @@ -34189,6 +36449,124 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + } + } + }, + "@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "requires": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" + }, + "@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "requires": { + "@emotion/memoize": "^0.9.0" + } + }, + "@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + }, + "@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "requires": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" + }, + "@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==" + }, + "@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" + }, "@es-joy/jsdoccomment": { "version": "0.41.0", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz", @@ -34314,6 +36692,34 @@ "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true }, + "@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "requires": { + "@floating-ui/utils": "^0.2.11" + } + }, + "@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "requires": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==" + }, + "@handsontable/react": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@handsontable/react/-/react-13.1.0.tgz", + "integrity": "sha512-dl5r1VHw2A8UTIprigfIc/DaXXrKovpMcn8s9GDHpdpqBPwOCDsp5ETdqiSeZ2y+TiNydUeJhb/z+N2T+rsP+g==", + "requires": {} + }, "@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -34390,6 +36796,22 @@ "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "dev": true }, + "@internationalized/date": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.11.0.tgz", + "integrity": "sha512-BOx5huLAWhicM9/ZFs84CzP+V3gBW6vlpM02yzsdYC7TGlZJX1OJiEEHcSayF00Z+3jLlm4w79amvSt6RqKN3Q==", + "requires": { + "@swc/helpers": "^0.5.0" + } + }, + "@internationalized/number": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.5.tgz", + "integrity": "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==", + "requires": { + "@swc/helpers": "^0.5.0" + } + }, "@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -34948,6 +37370,42 @@ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", "dev": true }, + "@lezer/common": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz", + "integrity": "sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==" + }, + "@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "requires": { + "@lezer/common": "^1.3.0" + } + }, + "@lezer/javascript": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", + "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", + "requires": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "@lezer/lr": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.8.tgz", + "integrity": "sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==", + "requires": { + "@lezer/common": "^1.0.0" + } + }, + "@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==" + }, "@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -35852,6 +38310,11 @@ "integrity": "sha512-S8u2cJzklBC0FgTwWVLaM8tMrDuDMVE4xiTK4EYXM9GntyvrdbSoxqDQa+Fh57CCNApyIpyeqPhhFEmHPfrXgw==", "dev": true }, + "@pandacss/is-valid-prop": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@pandacss/is-valid-prop/-/is-valid-prop-1.9.0.tgz", + "integrity": "sha512-AZvpXWGyjbHc8TC+YVloQ31Z2c4j2xMvYj6UfVxuZdB5w4c9+4N8wy5R7I/XswNh8e4cfUlkvsEGDXjhJRgypw==" + }, "@php-wasm/cli-util": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@php-wasm/cli-util/-/cli-util-3.1.2.tgz", @@ -36667,13 +39130,13 @@ "dev": true }, "@playwright/test": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.42.1.tgz", - "integrity": "sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==", + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", + "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", "dev": true, "peer": true, "requires": { - "playwright": "1.42.1" + "playwright": "1.58.2" } }, "@pmmmwh/react-refresh-webpack-plugin": { @@ -37428,6 +39891,21 @@ "@svgr/plugin-svgo": "8.1.0" } }, + "@swc/helpers": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.19.tgz", + "integrity": "sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==", + "requires": { + "tslib": "^2.8.0" + }, + "dependencies": { + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + } + } + }, "@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -37610,9 +40088,9 @@ } }, "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, "@types/express": { @@ -37770,10 +40248,13 @@ "dev": true }, "@types/node": { - "version": "14.14.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.43.tgz", - "integrity": "sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ==", - "dev": true + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "dev": true, + "requires": { + "undici-types": "~7.18.0" + } }, "@types/node-forge": { "version": "1.3.11", @@ -37793,8 +40274,15 @@ "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/pikaday": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@types/pikaday/-/pikaday-1.7.4.tgz", + "integrity": "sha512-0KsHVyw5pTG829nqG4IRu7m+BFQlFEBdbE/1i3S5182HeKUKv1uEW0gyEmkJVp5i4IV+9pyh23O83+KpRkSQbw==", + "requires": { + "moment": ">=2.14.0" + } }, "@types/qs": { "version": "6.9.12", @@ -38204,6 +40692,33 @@ } } }, + "@uiw/codemirror-extensions-basic-setup": { + "version": "4.25.8", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.8.tgz", + "integrity": "sha512-9Rr+liiBmK4xzZHszL+twNRJApthqmITBwDP3emNTtTrkBFN4gHlqfp+nodKmoVt1+bUH1qQCtyqt+7dbDTHiw==", + "requires": { + "@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" + } + }, + "@uiw/react-codemirror": { + "version": "4.25.8", + "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.25.8.tgz", + "integrity": "sha512-A0aLOuJZm2yJ+U9GlMFwxwFciztjd5LhcAG4SMqFxdD58wH+sCQXuY4UU5J2hqgS390qAlShtUgREvJPUonbuQ==", + "requires": { + "@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.25.8", + "codemirror": "^6.0.0" + } + }, "@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -38657,17 +41172,6 @@ "dev": true, "requires": {} }, - "@types/node": { - "version": "25.3.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.2.tgz", - "integrity": "sha512-RpV6r/ij22zRRdyBPcxDeKAzH43phWVKEjL2iksqo1Vz3CuBUrgmPpPhALKiRfU7OMCmeeO9vECBMsV0hMTG8Q==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "undici-types": "~7.18.0" - } - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -39908,6 +42412,847 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "@zag-js/accordion": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/accordion/-/accordion-1.35.3.tgz", + "integrity": "sha512-wmw6yo5Zr6ShiKGTc5ICEOJCurWAOSGubIpGISiHi3cZ4tlxKF/vpATIUT3eq8xzdB56YK57yKCujs/WmwqqoA==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/anatomy": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/anatomy/-/anatomy-1.35.3.tgz", + "integrity": "sha512-oqU9iLNNylrtJMBX5Xu4DsxnPNvtZLiobryv2oNtsDI1mi1Fca/XHghQC9K5aYT0qNsmHj1M3W5WAWTaOtPLkQ==" + }, + "@zag-js/angle-slider": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/angle-slider/-/angle-slider-1.35.3.tgz", + "integrity": "sha512-HXRlmsbNEJSBT53fq9XQKL/vwZWwJC3nprskI7s4f/jy8a4uXPTlv7N7zuBYjew+ScTMzZah6fLWzUztBehmSg==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/rect-utils": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/aria-hidden": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/aria-hidden/-/aria-hidden-1.35.3.tgz", + "integrity": "sha512-dk5POebn10WneQfLrEgbTzwolaXWpCSHL6F3jCTinW9IbOx7BXghzJD21iU5Iun+y9CorqJPW3p7LplYNUMO5Q==", + "requires": { + "@zag-js/dom-query": "1.35.3" + } + }, + "@zag-js/async-list": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/async-list/-/async-list-1.35.3.tgz", + "integrity": "sha512-SXX3wGzLK/maKS1PJ3XfLIGWbu0022f/OhcFsT1PbiHnoFZTH7h2fBhirrCBfy2TYFQ6r5uxgjkhPUNkuaeYnA==", + "requires": { + "@zag-js/core": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/auto-resize": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/auto-resize/-/auto-resize-1.35.3.tgz", + "integrity": "sha512-ufG8HSqzLd9h5rnos8aumj8iORlRskeR/gbpJu1NHrnHBWIrpuXm6KJJR2oZhTFY1BUMMk8eYIBA2QkVuiJzWA==", + "requires": { + "@zag-js/dom-query": "1.35.3" + } + }, + "@zag-js/avatar": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/avatar/-/avatar-1.35.3.tgz", + "integrity": "sha512-lbQ2Q4Va8AAScKULOHw2tCQez+0JRYGHSMFq6i+dJmeT3dlSgRanm69ra6K2po6hM9E4v6pRe+xOVE+9QMDnuA==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/carousel": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/carousel/-/carousel-1.35.3.tgz", + "integrity": "sha512-F+b8HzUeZfB+xUkAkLG4r0Ubui8pj7pSgZhi26ZiWgsM7tsd7cD+xRMXkvPEITN5Fd5QCe3KlVBuE00w5byjmg==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/scroll-snap": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/cascade-select": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/cascade-select/-/cascade-select-1.35.3.tgz", + "integrity": "sha512-Nifdx77hEuAdXqr1wpZSPjLXqygRhq/WvnPjGhCeSqFPpy62uT4JZ3avyjUZ4I0UhvIpkleUcXtFwQ3cSMh4ww==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/collection": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/rect-utils": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/checkbox": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/checkbox/-/checkbox-1.35.3.tgz", + "integrity": "sha512-8XBt/Wg2zSQWqV2ZFqZBQUjYRkOYHA2O3IEi0VVYtds3S1n7Pu/HqkZT5qDw+E/SY2+X9Uyx4hO7h2XrlsiZQQ==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/clipboard": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/clipboard/-/clipboard-1.35.3.tgz", + "integrity": "sha512-obTwynBpp6c17fLHe5tg//FQ497QsyCEry+K3bTdlrivWW200wvfHxZ6RKVbKwDAwhH+ye0bI1xkYAId8j7sdA==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/collapsible": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/collapsible/-/collapsible-1.35.3.tgz", + "integrity": "sha512-IweG8JOBCerJwLO6QzTZGEMlsYUmQfQSeD0jniFguMM8vcunvGVSrM+AaL8pDbmXd+snXokaGyJpGO3vzMW6Fw==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/collection": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/collection/-/collection-1.35.3.tgz", + "integrity": "sha512-BYoWJ4b7ma2PgiuQbRSnP603f2DlK6se5JtViUHTamZScLLLWnWHuQ6zFa1KS5kiIkbb7CFM6/bJ3WNYLch8Ig==", + "requires": { + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/color-picker": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/color-picker/-/color-picker-1.35.3.tgz", + "integrity": "sha512-i9roSgtqeA1b4Q+jWqnxjXB//BQXMP5m1FQ4YcZVq/0yT14A53JIknchuqrh3wC3yPsJMXFqCoKg+NET2+OVig==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/color-utils": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/color-utils": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/color-utils/-/color-utils-1.35.3.tgz", + "integrity": "sha512-vxkEVgz4YdSbdaPvjiRI1VsJAdwzu/dUNvzqOaiVcPDrHr/FFgmUbv0SOFjnfSb2QWGI8EDEMn02RW9ym+BzGw==", + "requires": { + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/combobox": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/combobox/-/combobox-1.35.3.tgz", + "integrity": "sha512-s1qmttTGJTMjlDakL+uvWSEggpafKr1vhOeZCh8j+N4eFt9bLAwaffjuh/1JzWBvzovw7WoMVkizdTXPlN8oYg==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/aria-hidden": "1.35.3", + "@zag-js/collection": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/core": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/core/-/core-1.35.3.tgz", + "integrity": "sha512-fGAHyqOYSEFmo52t7wI4dvbFfLyJmUlyf7wknsiUlzUHlrn3yv5PAZYZ2TibpOD1hwXIp4AoCjbiIPPZBxirZw==", + "requires": { + "@zag-js/dom-query": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/date-picker": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/date-picker/-/date-picker-1.35.3.tgz", + "integrity": "sha512-4G10h6pzzLbd84SE2CKtqi6Z9wEBhSyx4GRSxxy3tsf5wAxnz4anRFat9CGwn2YVUYcUJpD+umYgBMPt6zGDnA==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/date-utils": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/live-region": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/date-utils": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/date-utils/-/date-utils-1.35.3.tgz", + "integrity": "sha512-1co0FPpZ6nO5dN8sZtECkMYaf+3E5zu0KSIJZpZiXb4TgsZMDyHu7K7IsiKFHk9qmhuF6AdPpNxBju91pSXMFg==", + "requires": {} + }, + "@zag-js/dialog": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/dialog/-/dialog-1.35.3.tgz", + "integrity": "sha512-byosV+aBHH5LoFKnjEgC7WdqJid7bP9UhgWLSC7+IXbxrif9Czg1YVp6ZlQM6Nx6uD1vnty4touI3P7D7CTKcw==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/aria-hidden": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-trap": "1.35.3", + "@zag-js/remove-scroll": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/dismissable": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/dismissable/-/dismissable-1.35.3.tgz", + "integrity": "sha512-XPk+lqmsZp2Z1yMb5K1yj/e7Sobv4D7zK66B1GS97lk9Xzz8vuSgsimcLy0p7RXQl3KL6H5L69inSuQa2exybQ==", + "requires": { + "@zag-js/dom-query": "1.35.3", + "@zag-js/interact-outside": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/dom-query": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-1.35.3.tgz", + "integrity": "sha512-1RbFZoT4CjlHN9TUNse1++ZVOyKo45ktucTIT349o6HMsoWWKmTJDPvFkMBbmu/qY6XXn4dT+LJEp4bL3DR+Qw==", + "requires": { + "@zag-js/types": "1.35.3" + } + }, + "@zag-js/drawer": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/drawer/-/drawer-1.35.3.tgz", + "integrity": "sha512-DN5bwa7bDCDaUSbNzFxMc2U/WmbLcXvPSQjyOpKI6CC3VbW2kKaOnjJ5qQG+W5YBO0FpmJBtaxRV7lke4sZH2w==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/aria-hidden": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-trap": "1.35.3", + "@zag-js/remove-scroll": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/editable": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/editable/-/editable-1.35.3.tgz", + "integrity": "sha512-HcjeacS61vQXfNT9IalZj/+oS45yW5bIDO2NjJWV7zNe5AG29NCceUnvBhy+hrUKPnKcjfDocdW5rCL+Lvs/CQ==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/interact-outside": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/file-upload": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/file-upload/-/file-upload-1.35.3.tgz", + "integrity": "sha512-oIYwnDct4ERo2mfmcxsBIJnlmpzjrzYx82SQsXWD3NGKx3cgdh2lwBX+ebItaLH1jkgzBa3z0TWxc6rfvcUXbw==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/file-utils": "1.35.3", + "@zag-js/i18n-utils": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/file-utils": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/file-utils/-/file-utils-1.35.3.tgz", + "integrity": "sha512-Tb05RCzx4swc156hd4jLiO7z+Gxg/HQ+JCds03jgTbrFJAz2D56YaMeI7gSDc1m4Xre3nyqQpSo9AeX5nzbE/w==", + "requires": { + "@zag-js/i18n-utils": "1.35.3" + } + }, + "@zag-js/floating-panel": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/floating-panel/-/floating-panel-1.35.3.tgz", + "integrity": "sha512-nTZypcS0X46Oo1kpCQTnP5UlzjhypOAj3B4dq2z/3bAOC0TntYTnFkj8PbEJtExk7364xfMyxfgZOiv7Aqq01w==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/rect-utils": "1.35.3", + "@zag-js/store": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/focus-trap": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/focus-trap/-/focus-trap-1.35.3.tgz", + "integrity": "sha512-evErLlGFdDVCI8xipNS5k0rAvO+KFRA9g273bbfWAL1+mT54mcB/XHa85nC3QpPgMNrSh+6LUNq9fapyOGoyYg==", + "requires": { + "@zag-js/dom-query": "1.35.3" + } + }, + "@zag-js/focus-visible": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-1.35.3.tgz", + "integrity": "sha512-g4F8PRGIoFoKBrHiQ1HQh5AjCS7brFRXHvpbDNb9+T11FGlF5Turb+6OVRoNV8MmiuqMltO2I28l36YsGc//uQ==", + "requires": { + "@zag-js/dom-query": "1.35.3" + } + }, + "@zag-js/highlight-word": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/highlight-word/-/highlight-word-1.35.3.tgz", + "integrity": "sha512-K+mvEBbf3SUFjQeMeJQYb3cjri3x6sPaPhcKWayalelSLB/StWEGqcpmz+a6uUYrCUAK5kEi3Hn0YLGfn0GOig==" + }, + "@zag-js/hover-card": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/hover-card/-/hover-card-1.35.3.tgz", + "integrity": "sha512-xVoKOtvrnzhYzciZ1csgiV76IQ4DRtx1lsJeFSrfg5MH0kYWeC/pcmm3yCd2+Qh/45J7DbSXeZneqxpyiF5Vvw==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/i18n-utils": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/i18n-utils/-/i18n-utils-1.35.3.tgz", + "integrity": "sha512-k7UcNxbnC2jvGwCoHYAkFD3ZaRSMQNVHfuy8TujZQ+ci3IJovwgWLveZoRfFbXHkTLfhmbpE2tFXBdpwOVZutg==", + "requires": { + "@zag-js/dom-query": "1.35.3" + } + }, + "@zag-js/image-cropper": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/image-cropper/-/image-cropper-1.35.3.tgz", + "integrity": "sha512-1PH6bg8JAQESHzNqjka2TJ0QGNBGBAO6rb7AZ+9CaCCLw0pIzbUJhqPMkwd9GhdWGKGP+e7wFitnjcT4W5Js8g==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/interact-outside": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/interact-outside/-/interact-outside-1.35.3.tgz", + "integrity": "sha512-tOcuo/IztzpU7UKXtjVrLZtXzzcbhP4n2WynKwDRkTkq3mRCp61xXJp1csIBycI3JHm/CMeAEcPdRIioxIT/Zw==", + "requires": { + "@zag-js/dom-query": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/json-tree-utils": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/json-tree-utils/-/json-tree-utils-1.35.3.tgz", + "integrity": "sha512-nOv2dPJf+1mxsobYiSlYt96hR1MK7iHKG1iDLoO5wLggS6GQA3ix1BerHJK0zdehoEZ71R45el5ghCG1HB9VzQ==" + }, + "@zag-js/listbox": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/listbox/-/listbox-1.35.3.tgz", + "integrity": "sha512-FE6FOuBr6aWtOb8U8oDvAvcUzD6JKLXAe8WngiLFG+b2yyW4nlaz2AcKRG1bjjB066UMxMo9/+2p4D0Kf5Id1Q==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/collection": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/live-region": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/live-region/-/live-region-1.35.3.tgz", + "integrity": "sha512-64rWcfggYpyr2Fn4pdrB/lljMgm3quwn9is+vdDN85Vv3WShKWoz08T4njidm0hwcIbzas0bRqQYWDLLsAoSJQ==" + }, + "@zag-js/marquee": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/marquee/-/marquee-1.35.3.tgz", + "integrity": "sha512-bKZVpmAJWPDORP7WOWnS+65W5ZQBQmRs8zvV33ZfCpFbkXjhRiqKSzIj223/VOc2NEDjyWagz2vioAxrFYVzww==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/menu": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/menu/-/menu-1.35.3.tgz", + "integrity": "sha512-KyY0EZXkIU57Mjt+Lg+pupiePk3LcnQcB3Gl05Vva61bNjBjdKV71qwCQru/OxPZEwYgPo46L7TDIb56kfK/VQ==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/rect-utils": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/navigation-menu": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/navigation-menu/-/navigation-menu-1.35.3.tgz", + "integrity": "sha512-8cCHx0X/KjEpr2BaMOxJS5LiA6fs/CNqVTF/sTTgZAv7Dm+MH0yNuKm4kpPvcLaVeBpVE09bnyCHrNKzZes+Fw==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/number-input": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/number-input/-/number-input-1.35.3.tgz", + "integrity": "sha512-uqawVybAcLcefVEHMVONuAA5kDSDPP5TsROr5PnAyFlhM1iD85+r3KAfCueoDX5w2X4ibbu9o2tdV6zTFKD/nQ==", + "requires": { + "@internationalized/number": "3.6.5", + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/pagination": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/pagination/-/pagination-1.35.3.tgz", + "integrity": "sha512-fKm4s5KAd12RiCI/EDmmGKjPQ+i2qS/UsJPdMe65yb/4mY5OibwV2zyHcVeFsOD4gBZpnU6kYlDAGSttmLWLlQ==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/password-input": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/password-input/-/password-input-1.35.3.tgz", + "integrity": "sha512-etd0gm6ELAm3y+cFhPU+TYm8khm9cL5Mg5m2DcZxu1Mqpj7JY0LsXZ8SFOdCZgTIHuMEhKBiYfnuyMAd4CJztA==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/pin-input": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/pin-input/-/pin-input-1.35.3.tgz", + "integrity": "sha512-ZFt+WIHMdVlSg29BrQLFq5ijabiUO3tXMhoKhjjzTSe/tLqfNeu3UxFB6y/FYpn8+Cvn6xwvhu3lgnORYmI0zQ==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/popover": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/popover/-/popover-1.35.3.tgz", + "integrity": "sha512-+MIEENPsbKPxzoNuDI/C5d5ZN9uxnfZ+MBDc5C5XSgjjg9FcvMXClNq7IFM1aZi24peRXg9cMNf//lApVRT37w==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/aria-hidden": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-trap": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/remove-scroll": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/popper": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/popper/-/popper-1.35.3.tgz", + "integrity": "sha512-gpB7Xn9WtlfrUsIVbSgNQGDwgNOL/cSGt0Id3wEQKArmqVC704EWtPvXzOMMybBEdm8YW2hQrXuo+o66abI1Sg==", + "requires": { + "@floating-ui/dom": "^1.7.5", + "@zag-js/dom-query": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/presence": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/presence/-/presence-1.35.3.tgz", + "integrity": "sha512-ev5E7+U9IZAGvEaflpdVLHaZl8ZaQMhGB3ypd0yKhPwXeM51obV8w3+5HjzTqHPl8TKuoHWL31YaiUBd5EuS6w==", + "requires": { + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3" + } + }, + "@zag-js/progress": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/progress/-/progress-1.35.3.tgz", + "integrity": "sha512-u0GxQN1AfXMAgzYOUMxKQA12DyuAP0svh2S//KvOorTSv7d5hAa8nZXi2cEv5abYsyfKJ6/bc1Z56byzW1jVZw==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/qr-code": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/qr-code/-/qr-code-1.35.3.tgz", + "integrity": "sha512-t0Ehwogr49vTNtWyNdQU2tYex7uJyfAn7N/5LgD7FXw8aa+RBMWZWlqjCUvHqJ929tVMrn+LIrQnZCcwNunalA==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3", + "proxy-memoize": "3.0.1", + "uqr": "0.1.2" + } + }, + "@zag-js/radio-group": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/radio-group/-/radio-group-1.35.3.tgz", + "integrity": "sha512-kOzocjqWk3dXuRfyfsHwfw63Z99NHbc7rvVUutSsfXANXi+DFYZHuqdPUwMt+29LfaL15XTOfuGV+yUXDCgQHQ==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/rating-group": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/rating-group/-/rating-group-1.35.3.tgz", + "integrity": "sha512-BmhJZdbaTnd3nFWMY+nR+HF952UhWXfaXXxiBWptSLMBfAYImQTWBMrLgTHCSnVfmFATj4Gb7xQe79FQU8T5fA==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/react": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/react/-/react-1.35.3.tgz", + "integrity": "sha512-x2PxYUCQ6OgOpUdmSkG5tbL9JWVqYRh42r4V2UeAdMh0MRwjAJtxjvAy50DZ8Sfia5o4UGdZMXJyDY2O7Pdhyw==", + "requires": { + "@zag-js/core": "1.35.3", + "@zag-js/store": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/rect-utils": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/rect-utils/-/rect-utils-1.35.3.tgz", + "integrity": "sha512-mt/oD3RXdyaX6ZPSd8BO13vvPBJ7QpVWieubE3O0WM3OPhU7ykDMRp/tR7cYMQrzUm04GlY9pbkmSSw2uABxlA==" + }, + "@zag-js/remove-scroll": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/remove-scroll/-/remove-scroll-1.35.3.tgz", + "integrity": "sha512-e59z9SbEpPiw0qwNQa2cB5/h30ZCLREaHsCw1TKTANFhwg7v85k9Lq1H/G/49li1CAjmiaOU9BNGlDvbzpNETQ==", + "requires": { + "@zag-js/dom-query": "1.35.3" + } + }, + "@zag-js/scroll-area": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/scroll-area/-/scroll-area-1.35.3.tgz", + "integrity": "sha512-IQwdUws/AckRIHK1z/wHdHurnOeGd8h8Dmspfh3VT7NkwTnxeJ4SW9di9smuD+d25eXkJRuX5zGEDHAyx2IaPQ==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/scroll-snap": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/scroll-snap/-/scroll-snap-1.35.3.tgz", + "integrity": "sha512-NVa2yRm2DQnF6hTV9k7Xz7l8YCZBagZTiqSwNvWKUulKD1csjt2fpBxvUt2cK+1iQnLOey2ydhs7MMsAnXPbJA==", + "requires": { + "@zag-js/dom-query": "1.35.3" + } + }, + "@zag-js/select": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/select/-/select-1.35.3.tgz", + "integrity": "sha512-ztszGHWvlbBDE0YT5LYPH+sMd6VH1ct5pH/M9VSzIUO6C5PARkW0NwSVQ1rCQJMj4sfvSE1gC1/r7urRzqEcUQ==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/collection": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/signature-pad": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/signature-pad/-/signature-pad-1.35.3.tgz", + "integrity": "sha512-jvtxxzAQ8fre11zWUh6HflG4Ycr5z83Wba4pONRJbUE/vNgkJQ7yJgfyUl1QTlkn8Arfg2Zwoxu9GIq80HLZWg==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3", + "perfect-freehand": "^1.2.3" + } + }, + "@zag-js/slider": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/slider/-/slider-1.35.3.tgz", + "integrity": "sha512-Th142JO4Fqla5AWhGrTW6CQicwvTw87PdVpur/WotQ7brlZIww5HipzEMh5eQJSWfwpKD4PI2bYK9V/ZE/mpXA==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/splitter": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/splitter/-/splitter-1.35.3.tgz", + "integrity": "sha512-IsIbRwzjr5amGANEDsZDSToaSn8wHUWvS2l0XHmf3BiiguVApaZgQTlfqthVQC9hBHMOaGIXIW1CFUOrQYkvUQ==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/steps": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/steps/-/steps-1.35.3.tgz", + "integrity": "sha512-TYIrqV+v9/ULhvrTRBtQFFvJQPPTWOmjFXxlIxDwozek5R4dCIyeUYt1/ChJEc2mNETocbfDVSTxRO1dwCFpwQ==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/store": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/store/-/store-1.35.3.tgz", + "integrity": "sha512-7kEV4T/20DU36UIfVMzuDlLhWSSEy/vabmpiB700tcdD9BBBODTiSg3ZeljW17dQbvE545vZOFEjVf/cQ5LVGA==", + "requires": { + "proxy-compare": "3.0.1" + } + }, + "@zag-js/switch": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/switch/-/switch-1.35.3.tgz", + "integrity": "sha512-EP/2cJ46sd+6C5x5+89jn/9NOpM05CRESYB4RMhOnTe/WFtcS4IpiYtVHFhikdXkvJoibm67O2EHep2Pm/Xj4w==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/tabs": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/tabs/-/tabs-1.35.3.tgz", + "integrity": "sha512-lZKlDmxE25miCikj9QZCCnL02SVV2K14KZy5bn7+XDgrWlfSNTpNTj8r5E3zGlSgio5pkTGou57ASqS7WaPDWg==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/tags-input": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/tags-input/-/tags-input-1.35.3.tgz", + "integrity": "sha512-HqyoQ3DZFhByOGnDShFfxi6u0bIf7aSVTlwmAvcL+b2ZhyU6/wIMGc4WJE7BMx1NYWM/jNLHedvGExAI8R0kXQ==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/auto-resize": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/interact-outside": "1.35.3", + "@zag-js/live-region": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/timer": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/timer/-/timer-1.35.3.tgz", + "integrity": "sha512-edmgitbRgsq+msxvVB4wc17Q5d5k63zMWaLJnWjUdDGAgEtM6/HNxwGb3riv46S2U3RgYxaaHTNZ/M7EE5mvYw==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/toast": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/toast/-/toast-1.35.3.tgz", + "integrity": "sha512-whlR791GHdnMD21nNPsl2Dbql8+qu1wBZl75QzwYrjR8FlKjp8bhr3gXKzQEddcBXe9GPEFGvUs4iCyXsuTbpg==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/toggle": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/toggle/-/toggle-1.35.3.tgz", + "integrity": "sha512-aFfHKuR4sKzglhkmWLA+0RTNPs9dfeqwtc96qljawGYfAYWJXkEPYK9dFfVa+arZ7L84xBi24QSLiTg7LGSFLw==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/toggle-group": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/toggle-group/-/toggle-group-1.35.3.tgz", + "integrity": "sha512-Gn6JHzkQ4tlttjZcE0ZjIdxYkFeVp9VHrcMVizjJTkGZRmQ+kPZ5G/wOsZhIrvLX3Dw6Y0NkuBcP+jDHz/o3TA==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/tooltip": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/tooltip/-/tooltip-1.35.3.tgz", + "integrity": "sha512-/pImDGYl79MfLdvEphj3rSvNdj2tLW4GwGEncgdLM/GKwQiEUjfi/9EJOfLYP23M4lOOnoW7orehJ9xeaXOAkA==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-visible": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/tour": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/tour/-/tour-1.35.3.tgz", + "integrity": "sha512-DI2aCXmZaE9KcPZDs9itc2BO7ixLApJ/yVRfM69pXwVOrucdSeDDNPFkfbhj5XwB+9VjjZEkqWFHKntRIyPl5g==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dismissable": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/focus-trap": "1.35.3", + "@zag-js/interact-outside": "1.35.3", + "@zag-js/popper": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/tree-view": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/tree-view/-/tree-view-1.35.3.tgz", + "integrity": "sha512-DbHaLxSNa1goE3o3IsXxEdzp8P5dvmkk1rVWgNUUIhpA+44idEjSSNXJkHPl18Mk5blqSMVjK1EX91oqai01Vw==", + "requires": { + "@zag-js/anatomy": "1.35.3", + "@zag-js/collection": "1.35.3", + "@zag-js/core": "1.35.3", + "@zag-js/dom-query": "1.35.3", + "@zag-js/types": "1.35.3", + "@zag-js/utils": "1.35.3" + } + }, + "@zag-js/types": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/types/-/types-1.35.3.tgz", + "integrity": "sha512-Fnm3AMs1lfb55hlkip/eJeWHOjFB3gSi1JkZlkkdltG2l7y/zsHkumPSe6jIKy+DRRIFKRCyXVTatbPN27bO3w==", + "requires": { + "csstype": "3.2.3" + } + }, + "@zag-js/utils": { + "version": "1.35.3", + "resolved": "https://registry.npmjs.org/@zag-js/utils/-/utils-1.35.3.tgz", + "integrity": "sha512-LHcC+9y6TFhDsIz9I3koYxONl2JFfx5yQDzc6ZEQO2cqzXedRcN0R9IPqNGCX7JuhGt14ctDkVCm1JWGP2J6Wg==" + }, "@zip.js/zip.js": { "version": "2.7.57", "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.57.tgz", @@ -40529,6 +43874,16 @@ "@types/babel__traverse": "^7.0.6" } }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, "babel-plugin-polyfill-corejs2": { "version": "0.4.9", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.9.tgz", @@ -40706,6 +44061,11 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "bignumber.js": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-8.1.1.tgz", + "integrity": "sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -40972,8 +44332,7 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camel-case": { "version": "4.1.2", @@ -41023,9 +44382,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001597", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", - "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", + "version": "1.0.30001781", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001781.tgz", + "integrity": "sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==", "dev": true }, "capital-case": { @@ -41183,6 +44542,15 @@ } } }, + "chevrotain": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-6.5.0.tgz", + "integrity": "sha512-BwqQ/AgmKJ8jcMEjaSnfMybnKMgGTrtDKowfTP3pX4jwVy0kNjRsT/AP6h+wC3+3NC+X8X15VWBnTCQlX+wQFg==", + "optional": true, + "requires": { + "regexp-to-ast": "0.4.0" + } + }, "chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -41472,6 +44840,20 @@ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true }, + "codemirror": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", + "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", + "requires": { + "@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" + } + }, "coffee-script": { "version": "1.12.7", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", @@ -41936,8 +45318,7 @@ "core-js": { "version": "3.36.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", - "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==", - "dev": true + "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==" }, "core-js-compat": { "version": "3.36.0", @@ -41964,7 +45345,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -41994,6 +45374,11 @@ "prompts": "^2.0.1" } }, + "crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" + }, "cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", @@ -42239,6 +45624,11 @@ } } }, + "csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" + }, "cwd": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", @@ -42249,6 +45639,284 @@ "fs-exists-sync": "^0.1.0" } }, + "d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "requires": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + } + }, + "d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "requires": { + "internmap": "1 - 2" + } + }, + "d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" + }, + "d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + } + }, + "d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "requires": { + "d3-path": "1 - 3" + } + }, + "d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" + }, + "d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "requires": { + "d3-array": "^3.2.0" + } + }, + "d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "requires": { + "delaunator": "5" + } + }, + "d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" + }, + "d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + } + }, + "d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "requires": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" + }, + "d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "requires": { + "d3-dsv": "1 - 3" + } + }, + "d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==" + }, + "d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "requires": { + "d3-array": "2.5.0 - 3" + } + }, + "d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==" + }, + "d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "requires": { + "d3-color": "1 - 3" + } + }, + "d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==" + }, + "d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" + }, + "d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" + }, + "d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" + }, + "d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "requires": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + } + }, + "d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "requires": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + } + }, + "d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + }, + "d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "requires": { + "d3-path": "^3.1.0" + } + }, + "d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "requires": { + "d3-array": "2 - 3" + } + }, + "d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "requires": { + "d3-time": "1 - 3" + } + }, + "d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" + }, + "d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "requires": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + } + }, "damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -42538,6 +46206,14 @@ } } }, + "delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "requires": { + "robust-predicates": "^3.0.2" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -42691,6 +46367,11 @@ "domelementtype": "^2.3.0" } }, + "dompurify": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.9.tgz", + "integrity": "sha512-i6mvVmWN4xo9LrhCOZrDgSs9noW6nOahbrmzjRbPF36YPyj5Ue5lgok0MHDWkG7xzpWFO2OYttXdzM7rJxHvNA==" + }, "domutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", @@ -42924,7 +46605,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -43089,8 +46769,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { "version": "2.1.0", @@ -44287,6 +47966,11 @@ } } }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", @@ -44491,8 +48175,7 @@ "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "function.prototype.name": { "version": "1.1.6", @@ -45044,6 +48727,20 @@ "wordwrap": "^1.0.0" } }, + "handsontable": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/handsontable/-/handsontable-13.1.0.tgz", + "integrity": "sha512-KqJtS3rJeOWsFWCffnDlM8fcLMTqmW+Vbc7OCVM4X7dYDpfefgFerjNLIxLfT9xohcQoUOS1jcvXwV8dwSppVQ==", + "requires": { + "@types/pikaday": "1.7.4", + "core-js": "^3.31.1", + "dompurify": "^2.1.1", + "hyperformula": "^2.4.0", + "moment": "2.29.4", + "numbro": "2.1.2", + "pikaday": "1.8.2" + } + }, "hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -45105,7 +48802,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "requires": { "function-bind": "^1.1.2" } @@ -45128,6 +48824,21 @@ } } }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, "homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -45345,6 +49056,16 @@ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true }, + "hyperformula": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hyperformula/-/hyperformula-2.7.1.tgz", + "integrity": "sha512-mpVF5zOyNpksZzgTaCQyRAzdC/X43+taz5x1n7zNbs/PUUv0AuLmsy2yfihCr+vihUzN/pk+gXBbOfNpXKOpgA==", + "optional": true, + "requires": { + "chevrotain": "^6.5.0", + "tiny-emitter": "^2.1.0" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -45398,7 +49119,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -45407,8 +49127,7 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" } } }, @@ -45482,6 +49201,11 @@ "side-channel": "^1.0.4" } }, + "internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" + }, "interpret": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", @@ -45594,8 +49318,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-async-function": { "version": "2.0.0", @@ -45659,7 +49382,6 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, "requires": { "hasown": "^2.0.0" } @@ -47015,8 +50737,7 @@ "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema-traverse": { "version": "0.4.1", @@ -47392,8 +51113,7 @@ "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "linkify-it": { "version": "3.0.3", @@ -48245,6 +51965,11 @@ "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, "mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -50684,6 +54409,14 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "numbro": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/numbro/-/numbro-2.1.2.tgz", + "integrity": "sha512-7w833BxZmKGLE9HI0aREtNVRVH6WTYUUlWf4qgA5gKNhPQ4F/MRZ14sc0v8eoLORprk9ZTVwYaLwj8N3Zgxwiw==", + "requires": { + "bignumber.js": "^8.0.1" + } + }, "nwsapi": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", @@ -51463,7 +55196,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "requires": { "callsites": "^3.0.0" } @@ -51503,7 +55235,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -51604,8 +55335,7 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-root": { "version": "0.1.1", @@ -51649,8 +55379,7 @@ "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pend": { "version": "1.2.0", @@ -51658,6 +55387,11 @@ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, + "perfect-freehand": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.3.tgz", + "integrity": "sha512-bHZSfqDHGNlPpgH2yxXgPHlQSPpEbo+qg7li0M78J9vNAi2yjwLeA4x79BEQhX44lEWpCLSFCeRZwpw0niiXPA==" + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -51676,6 +55410,11 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, + "pikaday": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/pikaday/-/pikaday-1.8.2.tgz", + "integrity": "sha512-TNtsE+34BIax3WtkB/qqu5uepV1McKYEgvL3kWzU7aqPCpMEN6rBF3AOwu4WCwAealWlBGobXny/9kJb49C1ew==" + }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", @@ -51788,19 +55527,19 @@ } }, "playwright": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.42.1.tgz", - "integrity": "sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==", + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", "dev": true, "requires": { "fsevents": "2.3.2", - "playwright-core": "1.42.1" + "playwright-core": "1.58.2" } }, "playwright-core": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.42.1.tgz", - "integrity": "sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==", + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", "dev": true }, "plur": { @@ -52352,12 +56091,25 @@ } } }, + "proxy-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-3.0.1.tgz", + "integrity": "sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==" + }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, + "proxy-memoize": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/proxy-memoize/-/proxy-memoize-3.0.1.tgz", + "integrity": "sha512-VDdG/VYtOgdGkWJx7y0o7p+zArSf2383Isci8C+BP3YXgMYDoPd3cCBjw0JdWb6YBb9sFiOPbAADDVTPJnh+9g==", + "requires": { + "proxy-compare": "^3.0.0" + } + }, "ps-list": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", @@ -52526,21 +56278,21 @@ } }, "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "requires": { "loose-envify": "^1.1.0" } }, "react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "peer": true, "requires": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" } }, "react-google-charts": { @@ -52790,8 +56542,7 @@ "regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "regenerator-transform": { "version": "0.15.2", @@ -52802,6 +56553,12 @@ "@babel/runtime": "^7.8.4" } }, + "regexp-to-ast": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.4.0.tgz", + "integrity": "sha512-4qf/7IsIKfSNHQXSwial1IFmfM1Cc/whNBQqRwe0V2stPe7KmN1U0tWQiIx6JiirgSrisjE0eECdNf7Tav1Ntw==", + "optional": true + }, "regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -52976,7 +56733,6 @@ "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -53080,6 +56836,11 @@ "integrity": "sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==", "dev": true }, + "robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, "run-con": { "version": "1.2.12", "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.2.12.tgz", @@ -53115,6 +56876,11 @@ "queue-microtask": "^1.2.2" } }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, "safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", @@ -53165,8 +56931,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { "version": "1.71.1", @@ -53205,9 +56970,9 @@ } }, "scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "peer": true, "requires": { "loose-envify": "^1.1.0" @@ -54433,6 +58198,11 @@ "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", "dev": true }, + "style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==" + }, "style-search": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", @@ -54619,6 +58389,11 @@ "postcss-value-parser": "^4.2.0" } }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -55056,6 +58831,12 @@ "integrity": "sha1-Sncotqwo2w4Aj1FAQ/1VW9VXO0Y=", "dev": true }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "optional": true + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -55102,8 +58883,7 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" }, "to-regex-range": { "version": "5.0.1", @@ -55120,6 +58900,21 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, + "topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "requires": { + "commander": "2" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, "totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -55336,9 +59131,9 @@ } }, "typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", + "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", "dev": true, "peer": true }, @@ -55397,9 +59192,7 @@ "version": "7.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "unherit": { "version": "1.1.3", @@ -55587,6 +59380,11 @@ } } }, + "uqr": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", + "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==" + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -55716,6 +59514,11 @@ "unist-util-stringify-position": "^2.0.0" } }, + "w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" + }, "w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -56356,8 +60159,7 @@ "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { "version": "16.2.0", diff --git a/package.json b/package.json index 1f9a04367..5452b02fd 100755 --- a/package.json +++ b/package.json @@ -29,7 +29,11 @@ "test:e2e:playwright": "wp-scripts test-playwright --config tests/e2e/playwright.config.js", "test:e2e:playwright:debug": "wp-scripts test-playwright --config tests/e2e/playwright.config.js --ui", "gutenberg:build": "wp-scripts build --webpack-src-dir=classes/Visualizer/Gutenberg/src --output-path=classes/Visualizer/Gutenberg/build", - "gutenberg:dev": "wp-scripts start --webpack-src-dir=classes/Visualizer/Gutenberg/src --output-path=classes/Visualizer/Gutenberg/build" + "gutenberg:dev": "wp-scripts start --webpack-src-dir=classes/Visualizer/Gutenberg/src --output-path=classes/Visualizer/Gutenberg/build", + "chartbuilder:build": "wp-scripts build --config classes/Visualizer/ChartBuilder/webpack.config.js --webpack-src-dir=classes/Visualizer/ChartBuilder/src --output-path=classes/Visualizer/ChartBuilder/build", + "chartbuilder:dev": "wp-scripts start --config classes/Visualizer/ChartBuilder/webpack.config.js --webpack-src-dir=classes/Visualizer/ChartBuilder/src --output-path=classes/Visualizer/ChartBuilder/build", + "d3renderer:build": "wp-scripts build --webpack-src-dir=classes/Visualizer/D3Renderer/src --output-path=classes/Visualizer/D3Renderer/build", + "d3renderer:dev": "wp-scripts start --webpack-src-dir=classes/Visualizer/D3Renderer/src --output-path=classes/Visualizer/D3Renderer/build" }, "pot": { "reportmsgidbugsto": "https://github.com/Codeinwp/visualizer/issues", @@ -37,10 +41,17 @@ "lasttranslator": "Themeisle Translate Team " }, "dependencies": { + "@chakra-ui/react": "^3.34.0", + "@codemirror/lang-javascript": "^6.2.4", + "@emotion/react": "^11.14.0", + "@handsontable/react": "^13.0.0", + "@uiw/react-codemirror": "^4.23.6", + "d3": "^7.9.0", "deep-filter": "^1.0.2", "is-plain-object": "^2.0.4", "merge": "^1.2.1", "react-google-charts": "^3.0.8", + "topojson-client": "^3.1.0", "uuid": "^8.3.2" }, "devDependencies": { diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index c84cee970..d300949c1 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -384,6 +384,12 @@ parameters: count: 2 path: classes/Visualizer/Module.php + - + message: '#^Constant VISUALIZER_AGENTS_URL not found\.$#' + identifier: constant.notFound + count: 2 + path: classes/Visualizer/Module/AIBuilder.php + - message: '#^Constructor of class Visualizer_Module_AMP has an unused parameter \$plugin\.$#' identifier: constructor.unusedParameter @@ -1164,7 +1170,6 @@ parameters: count: 1 path: classes/Visualizer/Module/Chart.php - - message: '#^Method Visualizer_Module_Chart\:\:handlePermissions\(\) has no return type specified\.$#' identifier: missingType.return @@ -5023,6 +5028,48 @@ parameters: count: 1 path: classes/Visualizer/Source/Query/Params.php + - + message: '#^Path in include_once\(\) "/Users/hardeep/Development/sites/particles/wp\-content/plugins/visualizervendor/autoload\.php" is not a file or it does not exist\.$#' + identifier: includeOnce.fileNotFound + count: 1 + path: classes/Visualizer/Source/Xlsx.php + + - + message: '#^Call to function is_array\(\) with array will always evaluate to true\.$#' + identifier: function.alreadyNarrowedType + count: 1 + path: classes/Visualizer/Source/Xlsx/Remote.php + + - + message: '#^Method Visualizer_Source_Xlsx_Remote\:\:repopulateData\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: classes/Visualizer/Source/Xlsx/Remote.php + + - + message: '#^Method Visualizer_Source_Xlsx_Remote\:\:repopulateData\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: classes/Visualizer/Source/Xlsx/Remote.php + + - + message: '#^Method Visualizer_Source_Xlsx_Remote\:\:repopulateSeries\(\) has parameter \$series with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: classes/Visualizer/Source/Xlsx/Remote.php + + - + message: '#^Method Visualizer_Source_Xlsx_Remote\:\:repopulateSeries\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: classes/Visualizer/Source/Xlsx/Remote.php + + - + message: '#^Negated boolean expression is always true\.$#' + identifier: booleanNot.alwaysTrue + count: 2 + path: classes/Visualizer/Source/Xlsx/Remote.php + - message: '#^Function visualizer_launch\(\) has no return type specified\.$#' identifier: missingType.return @@ -5100,25 +5147,3 @@ parameters: identifier: argument.type count: 1 path: index.php - - - - message: '#^Path in include_once\(\)#' - identifier: includeOnce.fileNotFound - count: 1 - path: classes/Visualizer/Source/Xlsx.php - - - - identifier: missingType.iterableValue - count: 4 - path: classes/Visualizer/Source/Xlsx/Remote.php - - - - identifier: booleanNot.alwaysTrue - count: 2 - path: classes/Visualizer/Source/Xlsx/Remote.php - - - - message: '#^Call to function is_array\(\) with array will always evaluate to true\.$#' - identifier: function.alreadyNarrowedType - count: 1 - path: classes/Visualizer/Source/Xlsx/Remote.php diff --git a/phpstan.neon b/phpstan.neon index 2e6cd64ba..021d02592 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -14,6 +14,8 @@ parameters: - %currentWorkingDirectory%/vendor/codeinwp/themeisle-sdk excludePaths: - classes/Visualizer/Gutenberg/build (?) + - classes/Visualizer/GutenChartBuilder/build (?) + - classes/Visualizer/GutenD3Renderer/build (?) includes: - %currentWorkingDirectory%/vendor/szepeviktor/phpstan-wordpress/extension.neon - %currentWorkingDirectory%/phpstan-baseline.neon diff --git a/tests/e2e/specs/admin.spec.js b/tests/e2e/specs/admin.spec.js index 766b357c2..867fa74ac 100644 --- a/tests/e2e/specs/admin.spec.js +++ b/tests/e2e/specs/admin.spec.js @@ -137,6 +137,8 @@ test.describe( 'Chart Library', () => { test( 'cancel second step of chart creation', async ( { admin, page } ) => { await admin.visitAdminPage( 'admin.php?page=visualizer&vaction=addnew' ); await page.waitForURL( '**/admin.php?page=visualizer&vaction=addnew' ); + await expect( page.getByRole('button', { name: 'Classic Builder Step-by-step' }) ).toBeVisible({ timeout: 5000 }); + await page.getByRole('button', { name: 'Classic Builder Step-by-step' }).click(); await page.waitForSelector('h1:text("Visualizer")'); await selectChartAdmin( page.frameLocator('iframe'), CHART_JS_LABELS.table ); @@ -156,6 +158,8 @@ test.describe( 'Chart Library', () => { test( 'chart filtering', async ( { admin, page } ) => { await admin.visitAdminPage( 'admin.php?page=visualizer&vaction=addnew' ); await page.waitForURL( '**/admin.php?page=visualizer&vaction=addnew' ); + await expect( page.getByRole('button', { name: 'Classic Builder Step-by-step' }) ).toBeVisible({ timeout: 5000 }); + await page.getByRole('button', { name: 'Classic Builder Step-by-step' }).click(); await page.waitForSelector('h1:text("Visualizer")'); await page.frameLocator('iframe').locator('label').filter({ hasText: 'Pie/Donut' }).click(); @@ -170,6 +174,8 @@ test.describe( 'Chart Library', () => { test( 'check info panel', async ( { admin, page } ) => { await admin.visitAdminPage( 'admin.php?page=visualizer&vaction=addnew' ); await page.waitForURL( '**/admin.php?page=visualizer&vaction=addnew' ); + await expect( page.getByRole('button', { name: 'Classic Builder Step-by-step' }) ).toBeVisible({ timeout: 5000 }); + await page.getByRole('button', { name: 'Classic Builder Step-by-step' }).click(); await page.waitForSelector('h1:text("Visualizer")'); await selectChartAdmin( page.frameLocator('iframe'), CHART_JS_LABELS.pie ); @@ -228,6 +234,8 @@ test.describe( 'Support', () => { test('check Chart selection', async ( { page, admin } ) => { await admin.visitAdminPage( 'admin.php?page=visualizer' ); await page.getByRole('heading', { name: 'Visualizer Library Add New' }).getByRole('link').click(); + await expect( page.getByRole('button', { name: 'Classic Builder Step-by-step' }) ).toBeVisible({ timeout: 5000 }); + await page.getByRole('button', { name: 'Classic Builder Step-by-step' }).click(); await expect(page.frameLocator('iframe').getByText('Select Library for charts')).toBeVisible(); await expect(page.frameLocator('iframe').getByRole('combobox')).toBeVisible(); await expect(page.frameLocator('iframe').locator('#chart-select')).toContainText('Select Library for charts'); diff --git a/tests/e2e/specs/ai-builder.spec.js b/tests/e2e/specs/ai-builder.spec.js new file mode 100644 index 000000000..576d9a069 --- /dev/null +++ b/tests/e2e/specs/ai-builder.spec.js @@ -0,0 +1,48 @@ +/** + * WordPress dependencies + */ +const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); + +/** + * Internal dependencies + */ +const { waitForLibraryToLoad } = require( '../utils/common' ); + +test.describe( 'AI Chart Builder chooser', () => { + test.beforeEach( async ( { admin, page } ) => { + await admin.visitAdminPage( 'admin.php?page=visualizer' ); + await waitForLibraryToLoad( page ); + } ); + + test( 'opens chooser modal from Add New', async ( { page } ) => { + await page.locator( '.add-new-chart' ).first().click(); + + const chooser = page.locator( '.viz-chooser-overlay' ); + await expect( chooser ).toBeVisible(); + await expect( page.locator( '#viz-chooser-title' ) ).toHaveText( 'Create a New Chart' ); + await expect( page.locator( '.viz-chooser-option--ai' ) ).toBeVisible(); + await expect( page.locator( '.viz-chooser-option' ).filter( { hasText: 'Classic Builder' } ) ).toBeVisible(); + } ); + + test( 'closes chooser modal via close button', async ( { page } ) => { + await page.locator( '.add-new-chart' ).first().click(); + await expect( page.locator( '.viz-chooser-overlay' ) ).toBeVisible(); + + await page.locator( '.viz-chooser-close' ).click(); + await expect( page.locator( '.viz-chooser-overlay' ) ).toHaveCount( 0 ); + } ); + + test( 'opens AI builder from chooser and shows key sections', async ( { page } ) => { + await page.locator( '.add-new-chart' ).first().click(); + await expect( page.locator( '.viz-chooser-overlay' ) ).toBeVisible(); + + await page.locator( '.viz-chooser-option--ai' ).click(); + await expect( page.locator( '.viz-ai-builder-modal' ) ).toBeVisible(); + await expect( page.locator( '.viz-ai-builder-header' ) ).toContainText( 'Visualizer' ); + await expect( page.getByText( 'Data source' ) ).toBeVisible(); + await expect( page.getByText('Describe your chart', { exact: true }) ).toBeVisible(); + + await page.locator( '.viz-ai-builder-close' ).click(); + await expect( page.locator( '.viz-ai-builder-modal' ) ).toHaveCount( 0 ); + } ); +} ); diff --git a/tests/e2e/specs/chart-sources.spec.js b/tests/e2e/specs/chart-sources.spec.js index 3238dfb27..abbe7b58c 100644 --- a/tests/e2e/specs/chart-sources.spec.js +++ b/tests/e2e/specs/chart-sources.spec.js @@ -18,6 +18,8 @@ test.describe( 'Data Free Sources', () => { test( 'manual import', async ( { admin, page } ) => { await admin.visitAdminPage( 'admin.php?page=visualizer&vaction=addnew' ); await page.waitForURL( '**/admin.php?page=visualizer&vaction=addnew' ); + await expect( page.getByRole('button', { name: 'Classic Builder Step-by-step' }) ).toBeVisible({ timeout: 5000 }); + await page.getByRole('button', { name: 'Classic Builder Step-by-step' }).click(); await page.waitForSelector('h1:text("Visualizer")'); await selectChartAdmin( page.frameLocator('iframe'), CHART_JS_LABELS.table ); diff --git a/tests/e2e/specs/upsell.spec.js b/tests/e2e/specs/upsell.spec.js index b79b91139..62ae7abd0 100644 --- a/tests/e2e/specs/upsell.spec.js +++ b/tests/e2e/specs/upsell.spec.js @@ -18,6 +18,8 @@ test.describe( 'Upsell', () => { test( 'chart selection on admin', async ( { admin, page } ) => { await admin.visitAdminPage( 'admin.php?page=visualizer&vaction=addnew' ); await page.waitForURL( '**/admin.php?page=visualizer&vaction=addnew' ); + await expect( page.getByRole('button', { name: 'Classic Builder Step-by-step' }) ).toBeVisible({ timeout: 5000 }); + await page.getByRole('button', { name: 'Classic Builder Step-by-step' }).click(); await page.waitForSelector('h1:text("Visualizer")'); expect( await page.frameLocator('iframe').locator('.pro-upsell').count() ).toBe( 11 ); @@ -34,6 +36,8 @@ test.describe( 'Upsell', () => { test( 'chart settings on admin', async ( { admin, page } ) => { await admin.visitAdminPage( 'admin.php?page=visualizer&vaction=addnew' ); await page.waitForURL( '**/admin.php?page=visualizer&vaction=addnew' ); + await expect( page.getByRole('button', { name: 'Classic Builder Step-by-step' }) ).toBeVisible({ timeout: 5000 }); + await page.getByRole('button', { name: 'Classic Builder Step-by-step' }).click(); await page.waitForSelector('h1:text("Visualizer")'); await selectChartAdmin( page.frameLocator('iframe'), CHART_JS_LABELS.pie ); diff --git a/tests/e2e/utils/common.js b/tests/e2e/utils/common.js index 79299c425..980504625 100644 --- a/tests/e2e/utils/common.js +++ b/tests/e2e/utils/common.js @@ -48,7 +48,11 @@ export async function createChartWithAdmin( admin, page, chart_label = CHART_JS_ await admin.visitAdminPage( 'admin.php?page=visualizer&vaction=addnew' ); await page.waitForURL( '**/admin.php?page=visualizer&vaction=addnew' ); - await page.waitForSelector('h1:text("Visualizer")', { timeout: 5000 }); + + await expect( page.getByRole('button', { name: 'Classic Builder Step-by-step' }) ).toBeVisible({ timeout: 5000 }); + await page.getByRole('button', { name: 'Classic Builder Step-by-step' }).click(); + + await page.waitForSelector('h1:text("Visualizer")', { timeout: 10000 }); await selectChartAdmin( page.frameLocator('iframe'), chart_label );