diff --git a/packages/super-editor/src/core/parts/adapters/notes-part-descriptor.ts b/packages/super-editor/src/core/parts/adapters/notes-part-descriptor.ts new file mode 100644 index 0000000000..321bcb013c --- /dev/null +++ b/packages/super-editor/src/core/parts/adapters/notes-part-descriptor.ts @@ -0,0 +1,445 @@ +/** + * Part descriptors for `word/footnotes.xml` and `word/endnotes.xml`. + * + * Follows the same architectural pattern as numbering-part-descriptor.ts: + * canonical data is OOXML JSON in the parts store. `converter.footnotes` + * and `converter.endnotes` are derived caches rebuilt in `afterCommit`. + * + * Both footnotes and endnotes share the same OOXML structure (w:footnotes / + * w:endnotes containing w:footnote / w:endnote children), so a single + * factory creates both descriptors. + */ + +import type { Editor } from '../../Editor.js'; +import type { PartDescriptor, PartId } from '../types.js'; +import { clearPartCacheStale } from '../cache-staleness.js'; + +// --------------------------------------------------------------------------- +// Part IDs +// --------------------------------------------------------------------------- + +export const FOOTNOTES_PART_ID = 'word/footnotes.xml' as PartId; +export const ENDNOTES_PART_ID = 'word/endnotes.xml' as PartId; + +// --------------------------------------------------------------------------- +// OOXML Constants +// --------------------------------------------------------------------------- + +/** Config for footnotes vs endnotes — element names and namespace URIs. */ +interface NotePartConfig { + partId: PartId; + rootElementName: string; + childElementName: string; + converterKey: 'footnotes' | 'endnotes'; +} + +const FOOTNOTES_CONFIG: NotePartConfig = { + partId: FOOTNOTES_PART_ID, + rootElementName: 'w:footnotes', + childElementName: 'w:footnote', + converterKey: 'footnotes', +}; + +const ENDNOTES_CONFIG: NotePartConfig = { + partId: ENDNOTES_PART_ID, + rootElementName: 'w:endnotes', + childElementName: 'w:endnote', + converterKey: 'endnotes', +}; + +/** + * Minimal OOXML namespace attributes for footnotes/endnotes parts. + * Matches the namespaces Word emits for these part types. + */ +const NOTES_XMLNS: Record = { + 'xmlns:wpc': 'http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas', + 'xmlns:mc': 'http://schemas.openxmlformats.org/markup-compatibility/2006', + 'xmlns:o': 'urn:schemas-microsoft-com:office:office', + 'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships', + 'xmlns:m': 'http://schemas.openxmlformats.org/officeDocument/2006/math', + 'xmlns:v': 'urn:schemas-microsoft-com:vml', + 'xmlns:wp14': 'http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing', + 'xmlns:wp': 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing', + 'xmlns:w10': 'urn:schemas-microsoft-com:office:word', + 'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main', + 'xmlns:w14': 'http://schemas.microsoft.com/office/word/2010/wordml', + 'xmlns:wpg': 'http://schemas.microsoft.com/office/word/2010/wordprocessingGroup', + 'xmlns:wpi': 'http://schemas.microsoft.com/office/word/2010/wordprocessingInk', + 'xmlns:wne': 'http://schemas.microsoft.com/office/word/2006/wordml', + 'xmlns:wps': 'http://schemas.microsoft.com/office/word/2010/wordprocessingShape', +}; + +// --------------------------------------------------------------------------- +// Converter shape (minimal interface to avoid importing SuperConverter) +// --------------------------------------------------------------------------- + +export interface NoteEntry { + id: string; + type?: string | null; + content: unknown[]; + originalXml?: unknown; +} + +interface ConverterForNotes { + footnotes?: NoteEntry[]; + endnotes?: NoteEntry[]; + reimportNotePart?: (partId: string) => NoteEntry[]; +} + +function getConverter(editor: Editor): ConverterForNotes | undefined { + return (editor as unknown as { converter?: ConverterForNotes }).converter; +} + +// --------------------------------------------------------------------------- +// OOXML Tree Helpers +// --------------------------------------------------------------------------- + +interface OoxmlElement { + type?: string; + name?: string; + attributes?: Record; + elements?: OoxmlElement[]; +} + +interface OoxmlDocument { + declaration?: unknown; + elements?: OoxmlElement[]; +} + +/** Get the root element (e.g., ) from the part document. */ +function getRootElement(part: unknown): OoxmlElement | undefined { + return (part as OoxmlDocument)?.elements?.[0]; +} + +/** Get the child note elements (e.g., children). */ +export function getNoteElements(part: unknown, childElementName: string): OoxmlElement[] { + const root = getRootElement(part); + if (!root?.elements) return []; + return root.elements.filter((el) => el.name === childElementName); +} + +// --------------------------------------------------------------------------- +// OOXML Mutation Helpers (used by footnote-wrappers via mutatePart) +// --------------------------------------------------------------------------- + +/** + * Convert plain text lines into minimal OOXML paragraph elements. + * + * Used during insert/update to write text content directly into the + * canonical OOXML part. The result is valid w:p elements that can be + * re-imported by the standard footnote importer. + */ +export function textToNoteOoxmlParagraphs(text: string): OoxmlElement[] { + return text.split(/\r?\n/).map((line) => ({ + type: 'element', + name: 'w:p', + elements: + line.length > 0 + ? [ + { + type: 'element', + name: 'w:r', + elements: [ + { + type: 'element', + name: 'w:t', + attributes: { 'xml:space': 'preserve' }, + elements: [{ type: 'text', text: line } as OoxmlElement], + }, + ], + }, + ] + : [], + })); +} + +/** + * Insert a footnote/endnote reference marker run as the first run of the + * first paragraph. Word expects this marker in note content. + */ +function ensureFootnoteRefRun(paragraphs: OoxmlElement[], childElementName: string): void { + if (paragraphs.length === 0) return; + + const refName = childElementName === 'w:footnote' ? 'w:footnoteRef' : 'w:endnoteRef'; + const styleName = childElementName === 'w:footnote' ? 'FootnoteReference' : 'EndnoteReference'; + const firstParagraph = paragraphs[0]; + if (!firstParagraph.elements) firstParagraph.elements = []; + + const refRun: OoxmlElement = { + type: 'element', + name: 'w:r', + elements: [ + { + type: 'element', + name: 'w:rPr', + elements: [ + { type: 'element', name: 'w:rStyle', attributes: { 'w:val': styleName } }, + { type: 'element', name: 'w:vertAlign', attributes: { 'w:val': 'superscript' } }, + ], + }, + { type: 'element', name: refName, elements: [] }, + ], + }; + + // Insert after w:pPr if present, otherwise at index 0 + const pPrIndex = firstParagraph.elements.findIndex((el) => el?.name === 'w:pPr'); + firstParagraph.elements.splice(pPrIndex >= 0 ? pPrIndex + 1 : 0, 0, refRun); +} + +/** + * Add a new note element to the OOXML part. + * + * Called inside a `mutatePart` callback. Mutates the part in place. + * Returns the created OOXML element. + */ +export function addNoteElement(part: unknown, config: NotePartConfig, noteId: string, text: string): OoxmlElement { + const root = getRootElement(part); + if (!root) throw new Error(`addNoteElement: missing root element in ${config.partId}`); + if (!root.elements) root.elements = []; + + // Collision guard: fail fast instead of silently corrupting the part + const duplicate = root.elements.find( + (el) => el.name === config.childElementName && el.attributes?.['w:id'] === noteId, + ); + if (duplicate) { + throw new Error(`addNoteElement: note id "${noteId}" already exists in ${config.partId}`); + } + + const paragraphs = textToNoteOoxmlParagraphs(text); + ensureFootnoteRefRun(paragraphs, config.childElementName); + + const noteElement: OoxmlElement = { + type: 'element', + name: config.childElementName, + attributes: { 'w:id': noteId }, + elements: paragraphs, + }; + + root.elements.push(noteElement); + return noteElement; +} + +/** + * Update the content of an existing note element in the OOXML part. + * + * Called inside a `mutatePart` callback. Mutates the part in place. + * Returns true if the element was found and updated. + */ +export function updateNoteElement(part: unknown, config: NotePartConfig, noteId: string, text: string): boolean { + const notes = getNoteElements(part, config.childElementName); + const target = notes.find((el) => el.attributes?.['w:id'] === noteId); + if (!target) return false; + + const paragraphs = textToNoteOoxmlParagraphs(text); + ensureFootnoteRefRun(paragraphs, config.childElementName); + target.elements = paragraphs; + return true; +} + +/** + * Remove a note element from the OOXML part. + * + * Called inside a `mutatePart` callback. Mutates the part in place. + * Returns true if the element was found and removed. + */ +export function removeNoteElement(part: unknown, config: NotePartConfig, noteId: string): boolean { + const root = getRootElement(part); + if (!root?.elements) return false; + + const index = root.elements.findIndex( + (el) => el.name === config.childElementName && el.attributes?.['w:id'] === noteId, + ); + if (index < 0) return false; + + root.elements.splice(index, 1); + return true; +} + +// --------------------------------------------------------------------------- +// Derived Cache Rebuild +// --------------------------------------------------------------------------- + +/** + * Rebuild `converter.footnotes` or `converter.endnotes` from the canonical + * OOXML part. Delegates to `converter.reimportNotePart()` when available + * (full re-import with converter pipeline). Falls back to a lightweight + * structural extraction for environments where the full pipeline is not ready. + */ +function rebuildDerivedCache(editor: Editor, config: NotePartConfig, part: unknown): void { + const converter = getConverter(editor); + if (!converter) return; + + if (typeof converter.reimportNotePart === 'function') { + try { + converter[config.converterKey] = converter.reimportNotePart(config.partId); + return; + } catch (err) { + console.warn(`[parts] reimportNotePart failed for ${config.partId}, using fallback:`, err); + } + } + + // Fallback: structural extraction without full PM conversion. + // Produces entries with empty content — sufficient for cache consistency + // until the next full re-import (e.g., on document reload). + const notes = getNoteElements(part, config.childElementName); + const entries: NoteEntry[] = notes.map((el) => ({ + id: String(el.attributes?.['w:id'] ?? ''), + type: el.attributes?.['w:type'] ?? null, + content: [], + originalXml: structuredClone(el), + })); + + converter[config.converterKey] = entries; +} + +// --------------------------------------------------------------------------- +// Initial OOXML Structure +// --------------------------------------------------------------------------- + +/** + * Create the initial OOXML structure for a notes part. + * + * Includes boilerplate separator notes that Word requires in every notes + * part. Uses Word-compatible special IDs: + * - separator: w:id="-1" + * - continuationSeparator: w:id="0" + * + * Real user-created notes start at id=1, so there is no collision. + * This matches the convention used by Microsoft Word and by the project's + * own roundtrip test fixtures (footnotes-roundtrip.test.js). + * + * Used by: + * - The descriptor's `ensurePart` hook (part-registry path) + * - `bootstrapNotesPart` (direct convertedXml seeding for bundled environments) + */ +function createInitialNotesPart(config: NotePartConfig): unknown { + return { + declaration: { + attributes: { version: '1.0', encoding: 'UTF-8', standalone: 'yes' }, + }, + elements: [ + { + type: 'element', + name: config.rootElementName, + attributes: { ...NOTES_XMLNS }, + elements: [ + // Separator note (id=-1) — Word requires this + { + type: 'element', + name: config.childElementName, + attributes: { 'w:type': 'separator', 'w:id': '-1' }, + elements: [ + { + type: 'element', + name: 'w:p', + elements: [ + { + type: 'element', + name: 'w:r', + elements: [{ type: 'element', name: 'w:separator', elements: [] }], + }, + ], + }, + ], + }, + // Continuation separator note (id=0) — Word requires this + { + type: 'element', + name: config.childElementName, + attributes: { 'w:type': 'continuationSeparator', 'w:id': '0' }, + elements: [ + { + type: 'element', + name: 'w:p', + elements: [ + { + type: 'element', + name: 'w:r', + elements: [{ type: 'element', name: 'w:continuationSeparator', elements: [] }], + }, + ], + }, + ], + }, + ], + }, + ], + }; +} + +// --------------------------------------------------------------------------- +// Descriptor Factory +// --------------------------------------------------------------------------- + +function createNotePartDescriptor(config: NotePartConfig): PartDescriptor { + return { + id: config.partId, + + ensurePart() { + return createInitialNotesPart(config); + }, + + normalizePart(part: unknown) { + const root = getRootElement(part); + if (!root?.elements) return; + + // Sort: separator types first (by id), then regular notes (by id). + // This matches Word's canonical ordering. + root.elements.sort((a, b) => { + const aType = a.attributes?.['w:type']; + const bType = b.attributes?.['w:type']; + const aIsSpecial = aType === 'separator' || aType === 'continuationSeparator'; + const bIsSpecial = bType === 'separator' || bType === 'continuationSeparator'; + + if (aIsSpecial !== bIsSpecial) return aIsSpecial ? -1 : 1; + + const aId = Number(a.attributes?.['w:id'] ?? 0); + const bId = Number(b.attributes?.['w:id'] ?? 0); + return aId - bId; + }); + }, + + afterCommit({ editor, part, source }) { + rebuildDerivedCache(editor, config, part); + clearPartCacheStale(editor, config.partId); + + editor.emit('notes-part-changed', { partId: config.partId, source }); + }, + }; +} + +// --------------------------------------------------------------------------- +// Exported Descriptors +// --------------------------------------------------------------------------- + +export const footnotesPartDescriptor: PartDescriptor = createNotePartDescriptor(FOOTNOTES_CONFIG); +export const endnotesPartDescriptor: PartDescriptor = createNotePartDescriptor(ENDNOTES_CONFIG); + +// --------------------------------------------------------------------------- +// Config Helpers (re-exported for footnote-wrappers) +// --------------------------------------------------------------------------- + +export function getNotesConfig(type: 'footnote' | 'endnote'): NotePartConfig { + return type === 'endnote' ? ENDNOTES_CONFIG : FOOTNOTES_CONFIG; +} + +/** + * Ensure the notes OOXML part exists in `convertedXml`. + * + * Directly seeds the converter's store when the part is missing, so the + * subsequent `mutatePart` call finds it without relying on the descriptor + * registry's `ensurePart` hook. This is a safety net for bundled environments + * (e.g., bun build) where module duplication can cause the registry lookup + * to miss the registered descriptor. + * + * No-op when the part already exists. + */ +export function bootstrapNotesPart(editor: Editor, type: 'footnote' | 'endnote'): void { + const converter = (editor as unknown as { converter?: { convertedXml?: Record } }).converter; + if (!converter?.convertedXml) return; + + const config = getNotesConfig(type); + if (converter.convertedXml[config.partId] !== undefined) return; + + converter.convertedXml[config.partId] = createInitialNotesPart(config); +} diff --git a/packages/super-editor/src/core/parts/init-parts-runtime.ts b/packages/super-editor/src/core/parts/init-parts-runtime.ts index db4e5ce3e7..e0f20c6f2f 100644 --- a/packages/super-editor/src/core/parts/init-parts-runtime.ts +++ b/packages/super-editor/src/core/parts/init-parts-runtime.ts @@ -13,6 +13,7 @@ import { settingsPartDescriptor } from './adapters/settings-part-descriptor.js'; import { relsPartDescriptor } from './adapters/rels-part-descriptor.js'; import { numberingPartDescriptor } from './adapters/numbering-part-descriptor.js'; import { contentTypesPartDescriptor } from './adapters/content-types-part-descriptor.js'; +import { footnotesPartDescriptor, endnotesPartDescriptor } from './adapters/notes-part-descriptor.js'; import { registerStaticInvalidationHandlers } from './invalidation/invalidation-handlers.js'; import { initRevision, trackRevisions } from '../../document-api-adapters/plan-engine/revision-tracker.js'; @@ -22,6 +23,8 @@ export function initPartsRuntime(editor: Editor): void { registerPartDescriptor(relsPartDescriptor); registerPartDescriptor(numberingPartDescriptor); registerPartDescriptor(contentTypesPartDescriptor); + registerPartDescriptor(footnotesPartDescriptor); + registerPartDescriptor(endnotesPartDescriptor); registerStaticInvalidationHandlers(); initRevision(editor); trackRevisions(editor); diff --git a/packages/super-editor/src/core/parts/invalidation/invalidation-handlers.ts b/packages/super-editor/src/core/parts/invalidation/invalidation-handlers.ts index 2f18ef758c..55509b0d35 100644 --- a/packages/super-editor/src/core/parts/invalidation/invalidation-handlers.ts +++ b/packages/super-editor/src/core/parts/invalidation/invalidation-handlers.ts @@ -64,6 +64,26 @@ function handleHeaderFooterInvalidation(editor: Editor, _event: PartChangedEvent } } +// --------------------------------------------------------------------------- +// word/footnotes.xml and word/endnotes.xml +// --------------------------------------------------------------------------- + +/** + * Dispatch a `forceUpdatePagination` transaction after a notes part mutation. + * + * Footnote/endnote body changes affect page flow (the note area expands or + * shrinks), so the layout engine must re-paginate. + */ +function handleNotesInvalidation(editor: Editor, _event: PartChangedEvent): void { + try { + const tr = editor.state.tr; + tr.setMeta('forceUpdatePagination', true); + editor.view?.dispatch?.(tr); + } catch { + // View may not be ready + } +} + // --------------------------------------------------------------------------- // Registration // --------------------------------------------------------------------------- @@ -72,6 +92,8 @@ function handleHeaderFooterInvalidation(editor: Editor, _event: PartChangedEvent export function registerStaticInvalidationHandlers(): void { registerInvalidationHandler('word/numbering.xml', handleNumberingInvalidation); registerInvalidationHandler('word/_rels/document.xml.rels', handleRelationshipsInvalidation); + registerInvalidationHandler('word/footnotes.xml', handleNotesInvalidation); + registerInvalidationHandler('word/endnotes.xml', handleNotesInvalidation); } /** diff --git a/packages/super-editor/src/core/parts/mutation/compound-mutation.ts b/packages/super-editor/src/core/parts/mutation/compound-mutation.ts index 67c336c88f..925120f04d 100644 --- a/packages/super-editor/src/core/parts/mutation/compound-mutation.ts +++ b/packages/super-editor/src/core/parts/mutation/compound-mutation.ts @@ -21,6 +21,9 @@ interface ConverterForSnapshot { convertedXml?: Record; numbering?: unknown; translatedNumbering?: unknown; + footnotes?: unknown; + endnotes?: unknown; + footnoteProperties?: unknown; documentModified?: boolean; documentGuid?: string | null; } @@ -37,6 +40,9 @@ interface CompoundSnapshot { partEntries: Map; numbering: unknown; translatedNumbering: unknown; + footnotes: unknown; + endnotes: unknown; + footnoteProperties: unknown; revision: string; documentModified: boolean; documentGuid: string | null; @@ -69,6 +75,9 @@ function takeSnapshot(editor: Editor, partIds: Set): CompoundSnapshot { partEntries, numbering: converter?.numbering ? clonePart(converter.numbering) : undefined, translatedNumbering: converter?.translatedNumbering ? clonePart(converter.translatedNumbering) : undefined, + footnotes: converter?.footnotes ? clonePart(converter.footnotes) : undefined, + endnotes: converter?.endnotes ? clonePart(converter.endnotes) : undefined, + footnoteProperties: converter?.footnoteProperties ? clonePart(converter.footnoteProperties) : undefined, revision: getRevision(editor), documentModified: converter?.documentModified ?? false, documentGuid: converter?.documentGuid ?? null, @@ -95,6 +104,9 @@ function restoreFromSnapshot(editor: Editor, snapshot: CompoundSnapshot): void { if (snapshot.numbering !== undefined) converter.numbering = snapshot.numbering; if (snapshot.translatedNumbering !== undefined) converter.translatedNumbering = snapshot.translatedNumbering; + if (snapshot.footnotes !== undefined) converter.footnotes = snapshot.footnotes; + if (snapshot.endnotes !== undefined) converter.endnotes = snapshot.endnotes; + if (snapshot.footnoteProperties !== undefined) converter.footnoteProperties = snapshot.footnoteProperties; converter.documentModified = snapshot.documentModified; converter.documentGuid = snapshot.documentGuid; restoreRevision(editor, snapshot.revision); diff --git a/packages/super-editor/src/core/presentation-editor/PresentationEditor.ts b/packages/super-editor/src/core/presentation-editor/PresentationEditor.ts index 0be5054e38..a7fcec25c1 100644 --- a/packages/super-editor/src/core/presentation-editor/PresentationEditor.ts +++ b/packages/super-editor/src/core/presentation-editor/PresentationEditor.ts @@ -2776,6 +2776,20 @@ export class PresentationEditor extends EventEmitter { handler: handleStylesDefaultsChanged as (...args: unknown[]) => void, }); + // Listen for footnote/endnote part mutations (e.g., insert via document API). + // These modify the OOXML part and derived cache but don't change the PM document, + // so the normal 'update' event won't trigger a layout refresh. + const handleNotesPartChanged = () => { + this.#pendingDocChange = true; + this.#selectionSync.onLayoutStart(); + this.#scheduleRerender(); + }; + this.#editor.on('notes-part-changed', handleNotesPartChanged); + this.#editorListeners.push({ + event: 'notes-part-changed', + handler: handleNotesPartChanged as (...args: unknown[]) => void, + }); + const handleCollaborationReady = (payload: unknown) => { this.emit('collaborationReady', payload); // Setup remote cursor rendering after collaboration is ready diff --git a/packages/super-editor/src/core/presentation-editor/layout/FootnotesBuilder.ts b/packages/super-editor/src/core/presentation-editor/layout/FootnotesBuilder.ts index f20a804eef..35790466a0 100644 --- a/packages/super-editor/src/core/presentation-editor/layout/FootnotesBuilder.ts +++ b/packages/super-editor/src/core/presentation-editor/layout/FootnotesBuilder.ts @@ -22,6 +22,7 @@ import type { FlowBlock } from '@superdoc/contracts'; import { toFlowBlocks, type ConverterContext } from '@superdoc/pm-adapter'; import type { FootnoteReference, FootnotesLayoutInput } from '../types.js'; +import { findNoteEntryById } from '../../../document-api-adapters/helpers/note-entry-lookup.js'; // Re-export types for consumers export type { FootnoteReference, FootnotesLayoutInput }; @@ -107,7 +108,7 @@ export function buildFootnotesInput( const blocksById = new Map(); idsInUse.forEach((id) => { - const entry = importedFootnotes.find((f) => String(f?.id) === id); + const entry = findNoteEntryById(importedFootnotes, id); const content = entry?.content; if (!Array.isArray(content) || content.length === 0) return; diff --git a/packages/super-editor/src/core/presentation-editor/tests/FootnotesBuilder.test.ts b/packages/super-editor/src/core/presentation-editor/tests/FootnotesBuilder.test.ts index 51b6ea7b27..a70261b062 100644 --- a/packages/super-editor/src/core/presentation-editor/tests/FootnotesBuilder.test.ts +++ b/packages/super-editor/src/core/presentation-editor/tests/FootnotesBuilder.test.ts @@ -283,6 +283,24 @@ describe('buildFootnotesInput', () => { expect(result?.blocksById.size).toBe(1); }); + it('renders the real note body when a special entry shares the same id', () => { + // Simulates the ID-collision scenario: continuationSeparator at id=1 (empty + // content) alongside a real note also at id=1 (with text). The builder + // must pick the regular note. + const editorState = createMockEditorState([{ id: '1', pos: 10 }]); + const converter = { + footnotes: [ + { id: '1', type: 'continuationSeparator', content: [] }, + { id: '1', type: null, content: [{ type: 'paragraph', content: [{ type: 'text', text: 'Real note' }] }] }, + ], + } as ConverterLike; + + const result = buildFootnotesInput(editorState, converter, undefined, undefined); + + expect(result).not.toBeNull(); + expect(result?.blocksById.has('1')).toBe(true); + }); + it('handles footnote ref with null id', () => { const editorState = { doc: { diff --git a/packages/super-editor/src/core/super-converter/SuperConverter.js b/packages/super-editor/src/core/super-converter/SuperConverter.js index 7fb990ffbc..27edc83f72 100644 --- a/packages/super-editor/src/core/super-converter/SuperConverter.js +++ b/packages/super-editor/src/core/super-converter/SuperConverter.js @@ -20,6 +20,7 @@ import { prepareCommentsXmlFilesForExport, } from './v2/exporter/commentsExporter.js'; import { prepareFootnotesXmlForExport } from './v2/exporter/footnotesExporter.js'; +import { importFootnoteData, importEndnoteData } from './v2/importer/documentFootnotesImporter.js'; import { DocxHelpers } from './docx-helpers/index.js'; import { mergeRelationshipElements } from './relationship-helpers.js'; import { COMMENT_RELATIONSHIP_TYPES } from './constants.js'; @@ -1094,6 +1095,7 @@ class SuperConverter { this.numbering = result.numbering; this.comments = result.comments; this.footnotes = result.footnotes; + this.endnotes = result.endnotes ?? []; this.linkedStyles = result.linkedStyles; this.translatedLinkedStyles = result.translatedLinkedStyles; this.translatedNumbering = result.translatedNumbering; @@ -1551,6 +1553,28 @@ class SuperConverter { return { type: 'doc', content: [...schema] }; } + /** + * Re-import a notes part (footnotes.xml or endnotes.xml) from OOXML JSON + * to the derived NoteEntry[] cache. + * + * Used by the notes-part-descriptor afterCommit hook to rebuild + * `converter.footnotes` / `converter.endnotes` after a mutation. + * + * @param {string} partId - OOXML zip path ('word/footnotes.xml' or 'word/endnotes.xml') + * @returns {Array<{id: string, type?: string|null, content: any[], originalXml?: any}>} + */ + reimportNotePart(partId) { + if (!this.convertedXml?.[partId]) return []; + + const importFn = partId === 'word/endnotes.xml' ? importEndnoteData : importFootnoteData; + return importFn({ + docx: this.convertedXml, + editor: {}, + converter: this, + numbering: this.numbering, + }); + } + /** * Creates a default empty header for the specified variant. * diff --git a/packages/super-editor/src/core/super-converter/v2/importer/documentFootnotesImporter.js b/packages/super-editor/src/core/super-converter/v2/importer/documentFootnotesImporter.js index f31b81f601..75b7f2e94f 100644 --- a/packages/super-editor/src/core/super-converter/v2/importer/documentFootnotesImporter.js +++ b/packages/super-editor/src/core/super-converter/v2/importer/documentFootnotesImporter.js @@ -31,33 +31,45 @@ const stripFootnoteMarkerNodes = (nodes) => { }; /** - * Parse footnotes.xml into SuperDoc-ready footnote entries. + * Parse a notes part (footnotes.xml or endnotes.xml) into SuperDoc-ready note entries. * - * These will be available on converter.footnotes and are used by PresentationEditor - * to build a footnotes panel. + * Shared implementation for both footnotes and endnotes. The only structural + * difference between the two OOXML parts is the element names + * (w:footnote vs w:endnote), which are parameterized via `childElementName`. * * @param {Object} params - * @param {ParsedDocx} params.docx The parsed docx object - * @param {NodeListHandler} [params.nodeListHandler] Optional node list handler (defaults to docxImporter default) + * @param {Object} params.partXml The parsed OOXML JSON for the notes part + * @param {string} params.childElementName 'w:footnote' or 'w:endnote' + * @param {string} params.filename Filename for import context (e.g. 'footnotes.xml') + * @param {ParsedDocx} params.docx The full parsed docx package + * @param {NodeListHandler} [params.nodeListHandler] Optional node list handler * @param {SuperConverter} params.converter The super converter instance - * @param {Editor} params.editor The editor instance - * @param {Object} [params.numbering] Numbering definitions (optional) - * @returns {Array<{id: string, content: any[]}>} + * @param {Editor} params.editor The editor instance + * @param {Object} [params.numbering] Numbering definitions (optional) + * @returns {Array<{id: string, type?: string|null, content: any[], originalXml?: any}>} */ -export function importFootnoteData({ docx, editor, converter, nodeListHandler, numbering } = {}) { +function importNoteEntries({ + partXml, + childElementName, + filename, + docx, + editor, + converter, + nodeListHandler, + numbering, +}) { const handler = nodeListHandler || defaultNodeListHandler(); - const footnotes = docx?.['word/footnotes.xml']; - if (!footnotes?.elements?.length) return []; + if (!partXml?.elements?.length) return []; - const root = footnotes.elements[0]; + const root = partXml.elements[0]; const elements = Array.isArray(root?.elements) ? root.elements : []; - const footnoteElements = elements.filter((el) => el?.name === 'w:footnote'); - if (footnoteElements.length === 0) return []; + const noteElements = elements.filter((el) => el?.name === childElementName); + if (noteElements.length === 0) return []; const results = []; const lists = {}; const inlineDocumentFonts = []; - footnoteElements.forEach((el) => { + noteElements.forEach((el) => { const idRaw = el?.attributes?.['w:id']; if (idRaw === undefined || idRaw === null) return; const id = String(idRaw); @@ -93,7 +105,7 @@ export function importFootnoteData({ docx, editor, converter, nodeListHandler, n numbering, lists, inlineDocumentFonts, - filename: 'footnotes.xml', + filename, path: [el], }); @@ -108,3 +120,52 @@ export function importFootnoteData({ docx, editor, converter, nodeListHandler, n return results; } + +/** + * Parse footnotes.xml into SuperDoc-ready footnote entries. + * + * These will be available on converter.footnotes and are used by PresentationEditor + * to build a footnotes panel. + * + * @param {Object} params + * @param {ParsedDocx} params.docx The parsed docx object + * @param {NodeListHandler} [params.nodeListHandler] Optional node list handler (defaults to docxImporter default) + * @param {SuperConverter} params.converter The super converter instance + * @param {Editor} params.editor The editor instance + * @param {Object} [params.numbering] Numbering definitions (optional) + * @returns {Array<{id: string, content: any[]}>} + */ +export function importFootnoteData({ docx, editor, converter, nodeListHandler, numbering } = {}) { + return importNoteEntries({ + partXml: docx?.['word/footnotes.xml'], + childElementName: 'w:footnote', + filename: 'footnotes.xml', + docx, + editor, + converter, + nodeListHandler, + numbering, + }); +} + +/** + * Parse endnotes.xml into SuperDoc-ready endnote entries. + * + * Identical structure to footnotes but reads from word/endnotes.xml + * and filters for w:endnote elements. + * + * @param {Object} params - Same as importFootnoteData + * @returns {Array<{id: string, content: any[]}>} + */ +export function importEndnoteData({ docx, editor, converter, nodeListHandler, numbering } = {}) { + return importNoteEntries({ + partXml: docx?.['word/endnotes.xml'], + childElementName: 'w:endnote', + filename: 'endnotes.xml', + docx, + editor, + converter, + nodeListHandler, + numbering, + }); +} diff --git a/packages/super-editor/src/core/super-converter/v2/importer/docxImporter.js b/packages/super-editor/src/core/super-converter/v2/importer/docxImporter.js index f6b1687607..7ec8ad698d 100644 --- a/packages/super-editor/src/core/super-converter/v2/importer/docxImporter.js +++ b/packages/super-editor/src/core/super-converter/v2/importer/docxImporter.js @@ -18,7 +18,7 @@ import { autoPageHandlerEntity, autoTotalPageCountEntity } from './autoPageNumbe import { pageReferenceEntity } from './pageReferenceImporter.js'; import { pictNodeHandlerEntity } from './pictNodeImporter.js'; import { importCommentData } from './documentCommentsImporter.js'; -import { importFootnoteData } from './documentFootnotesImporter.js'; +import { importFootnoteData, importEndnoteData } from './documentFootnotesImporter.js'; import { getDefaultStyleDefinition } from '@converter/docx-helpers/index.js'; import { pruneIgnoredNodes } from './ignoredNodes.js'; import { tabNodeEntityHandler } from './tabImporter.js'; @@ -150,6 +150,7 @@ export const createDocumentJson = (docx, converter, editor) => { const numbering = getNumberingDefinitions(docx); const comments = importCommentData({ docx, nodeListHandler, converter, editor }); const footnotes = importFootnoteData({ docx, nodeListHandler, converter, editor, numbering }); + const endnotes = importEndnoteData({ docx, nodeListHandler, converter, editor, numbering }); const translatedLinkedStyles = translateStyleDefinitions(docx); const translatedNumbering = translateNumberingDefinitions(docx); @@ -201,6 +202,7 @@ export const createDocumentJson = (docx, converter, editor) => { ), comments, footnotes, + endnotes, inlineDocumentFonts, linkedStyles: getStyleDefinitions(docx, converter, editor), translatedLinkedStyles, diff --git a/packages/super-editor/src/document-api-adapters/__conformance__/contract-conformance.test.ts b/packages/super-editor/src/document-api-adapters/__conformance__/contract-conformance.test.ts index 8f7caa1c3d..5c2292cf70 100644 --- a/packages/super-editor/src/document-api-adapters/__conformance__/contract-conformance.test.ts +++ b/packages/super-editor/src/document-api-adapters/__conformance__/contract-conformance.test.ts @@ -2813,13 +2813,63 @@ function makeRefEditor( }, }, converter: { - convertedXml: { 'word/document.xml': {} }, - footnotes: { 'fn-1': { content: 'Footnote text' } }, - endnotes: {}, + convertedXml: { + 'word/document.xml': {}, + 'word/footnotes.xml': { + declaration: { attributes: { version: '1.0', encoding: 'UTF-8', standalone: 'yes' } }, + elements: [ + { + type: 'element', + name: 'w:footnotes', + attributes: { 'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main' }, + elements: [ + { + type: 'element', + name: 'w:footnote', + attributes: { 'w:id': 'fn-1' }, + elements: [ + { + type: 'element', + name: 'w:p', + elements: [ + { + type: 'element', + name: 'w:r', + elements: [ + { type: 'element', name: 'w:t', elements: [{ type: 'text', text: 'Footnote text' }] }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + 'word/endnotes.xml': { + declaration: { attributes: { version: '1.0', encoding: 'UTF-8', standalone: 'yes' } }, + elements: [ + { + type: 'element', + name: 'w:endnotes', + attributes: { 'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main' }, + elements: [], + }, + ], + }, + 'word/settings.xml': { + elements: [{ type: 'element', name: 'w:settings', elements: [] }], + }, + }, + footnotes: [{ id: 'fn-1', content: [{ type: 'paragraph', content: [{ type: 'text', text: 'Footnote text' }] }] }], + endnotes: [], ...overrides.converter, }, options: {}, on: () => {}, + safeEmit: vi.fn(() => []), + emit: vi.fn(), } as unknown as Editor; } diff --git a/packages/super-editor/src/document-api-adapters/helpers/footnote-resolver.ts b/packages/super-editor/src/document-api-adapters/helpers/footnote-resolver.ts index 09e6277032..fdf68c139a 100644 --- a/packages/super-editor/src/document-api-adapters/helpers/footnote-resolver.ts +++ b/packages/super-editor/src/document-api-adapters/helpers/footnote-resolver.ts @@ -8,6 +8,7 @@ import type { Editor } from '../../core/Editor.js'; import type { FootnoteAddress, FootnoteDomain, FootnoteInfo, DiscoveryItem } from '@superdoc/document-api'; import { buildDiscoveryItem, buildResolvedHandle } from '@superdoc/document-api'; import { DocumentApiAdapterError } from '../errors.js'; +import { findNoteEntryById } from './note-entry-lookup.js'; // --------------------------------------------------------------------------- // Types @@ -72,7 +73,7 @@ function resolveCollectionContent(collection: FootnoteCollection | undefined, no if (!collection) return ''; if (Array.isArray(collection)) { - const match = collection.find((entry) => String(entry?.id ?? '') === noteId); + const match = findNoteEntryById(collection, noteId); return extractTextFromContent(match?.content); } diff --git a/packages/super-editor/src/document-api-adapters/helpers/note-entry-lookup.test.ts b/packages/super-editor/src/document-api-adapters/helpers/note-entry-lookup.test.ts new file mode 100644 index 0000000000..e99aa43de1 --- /dev/null +++ b/packages/super-editor/src/document-api-adapters/helpers/note-entry-lookup.test.ts @@ -0,0 +1,57 @@ +import { describe, it, expect } from 'vitest'; +import { findNoteEntryById } from './note-entry-lookup.js'; + +describe('findNoteEntryById', () => { + it('returns the matching regular entry', () => { + const entries = [ + { id: '1', type: null, content: ['real content'] }, + { id: '2', type: null, content: ['other'] }, + ]; + expect(findNoteEntryById(entries, '1')?.content).toEqual(['real content']); + }); + + it('returns undefined when no entry matches', () => { + const entries = [{ id: '1', type: null, content: [] }]; + expect(findNoteEntryById(entries, '99')).toBeUndefined(); + }); + + it('returns the regular note when both a special and regular entry share the same id', () => { + const entries = [ + { id: '1', type: 'continuationSeparator', content: [] }, + { id: '1', type: null, content: ['real content'] }, + ]; + const result = findNoteEntryById(entries, '1'); + expect(result?.type).toBeNull(); + expect(result?.content).toEqual(['real content']); + }); + + it('returns the regular note even when it appears before the special entry', () => { + const entries = [ + { id: '1', type: null, content: ['real content'] }, + { id: '1', type: 'separator', content: [] }, + ]; + const result = findNoteEntryById(entries, '1'); + expect(result?.type).toBeNull(); + }); + + it('falls back to the special entry when no regular note exists for the id', () => { + const entries = [ + { id: '-1', type: 'separator', content: [] }, + { id: '0', type: 'continuationSeparator', content: [] }, + ]; + const result = findNoteEntryById(entries, '-1'); + expect(result?.type).toBe('separator'); + }); + + it('handles undefined and null inputs gracefully', () => { + expect(findNoteEntryById(undefined, '1')).toBeUndefined(); + expect(findNoteEntryById(null, '1')).toBeUndefined(); + }); + + it('handles numeric id entries via string coercion', () => { + const entries = [{ id: 5, type: null, content: ['five'] }]; + expect( + findNoteEntryById(entries as { id: string | number; type: null; content: string[] }[], '5')?.content, + ).toEqual(['five']); + }); +}); diff --git a/packages/super-editor/src/document-api-adapters/helpers/note-entry-lookup.ts b/packages/super-editor/src/document-api-adapters/helpers/note-entry-lookup.ts new file mode 100644 index 0000000000..22c0f0840f --- /dev/null +++ b/packages/super-editor/src/document-api-adapters/helpers/note-entry-lookup.ts @@ -0,0 +1,54 @@ +/** + * Shared lookup for note entries by ID. + * + * When a notes part contains both a special entry (separator / + * continuationSeparator) and a regular note with the same numeric ID, + * the regular note takes precedence. This prevents special boilerplate + * entries from masking real user-created content in rendering and in the + * document API (get_footnote). + * + * Used by: + * - `footnote-resolver.ts` (document API reads) + * - `FootnotesBuilder.ts` (layout rendering) + */ + +/** Minimal note-entry shape shared across resolver, builder, and exporter. */ +export interface NoteEntryLike { + id?: unknown; + type?: string | null; + content?: unknown; +} + +/** Types that Word uses for separator boilerplate (not real user content). */ +const SPECIAL_NOTE_TYPES = new Set(['separator', 'continuationSeparator']); + +function isSpecialEntry(entry: NoteEntryLike): boolean { + return SPECIAL_NOTE_TYPES.has(entry.type ?? ''); +} + +/** + * Find a note entry by ID with regular-note priority. + * + * Precedence: + * 1. Exact-id regular note (type is null / undefined / any non-special string) + * 2. Exact-id special note (only if no regular note matched) + * + * Returns `undefined` when no entry matches. + */ +export function findNoteEntryById( + entries: T[] | undefined | null, + noteId: string, +): T | undefined { + if (!Array.isArray(entries)) return undefined; + + let fallback: T | undefined; + + for (const entry of entries) { + if (String(entry.id ?? '') !== noteId) continue; + + if (!isSpecialEntry(entry)) return entry; // exact-id regular note — best match + fallback ??= entry; // exact-id special note — keep as fallback + } + + return fallback; +} diff --git a/packages/super-editor/src/document-api-adapters/plan-engine/footnote-wrappers.test.ts b/packages/super-editor/src/document-api-adapters/plan-engine/footnote-wrappers.test.ts index 2af4eaa7d0..c5c29553f2 100644 --- a/packages/super-editor/src/document-api-adapters/plan-engine/footnote-wrappers.test.ts +++ b/packages/super-editor/src/document-api-adapters/plan-engine/footnote-wrappers.test.ts @@ -1,15 +1,21 @@ import { describe, expect, it, vi, beforeEach } from 'vitest'; import type { Editor } from '../../core/Editor.js'; -vi.mock('./plan-wrappers.js', () => ({ - executeDomainCommand: vi.fn((_editor: Editor, handler: () => boolean) => ({ - steps: [{ effect: handler() ? 'changed' : 'noop' }], - })), -})); +// --------------------------------------------------------------------------- +// Mocks — the new wrappers use mutatePart/compoundMutation instead of +// executeDomainCommand/executeOutOfBandMutation. We mock the parts system. +// --------------------------------------------------------------------------- -vi.mock('./revision-tracker.js', () => ({ - getRevision: vi.fn(() => 'rev-1'), -})); +vi.mock('./revision-tracker.js', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + getRevision: vi.fn(() => 'rev-1'), + checkRevision: vi.fn(), + incrementRevision: vi.fn(), + restoreRevision: vi.fn(), + }; +}); vi.mock('../helpers/adapter-utils.js', () => ({ paginate: vi.fn((items: unknown[], offset = 0, limit?: number) => { @@ -28,20 +34,51 @@ vi.mock('../helpers/index-cache.js', () => ({ clearIndexCache: vi.fn(), })); -vi.mock('../out-of-band-mutation.js', () => ({ - executeOutOfBandMutation: vi.fn( - (_editor: Editor, run: (dryRun: boolean) => unknown, options?: { dryRun?: boolean }) => - run(options?.dryRun ?? false), +// Mock mutatePart to execute the mutation callback directly against the part +vi.mock('../../core/parts/mutation/mutate-part.js', () => ({ + mutatePart: vi.fn( + (request: { mutate?: (ctx: { part: unknown; dryRun: boolean }) => unknown; editor: Editor; partId: string }) => { + const converter = ( + request.editor as unknown as { + converter?: { convertedXml?: Record }; + } + ).converter; + const part = converter?.convertedXml?.[request.partId] ?? {}; + + if (request.mutate) { + request.mutate({ part, dryRun: false }); + } + + if (converter?.convertedXml) { + converter.convertedXml[request.partId] = part; + } + + return { changed: true, changedPaths: [], degraded: false, result: undefined }; + }, ), })); +// Mock compoundMutation to execute immediately +vi.mock('../../core/parts/mutation/compound-mutation.js', () => ({ + compoundMutation: vi.fn((request: { execute: () => boolean }) => { + const success = request.execute(); + return { success }; + }), +})); + +import { checkRevision } from './revision-tracker.js'; import { footnotesInsertWrapper, footnotesGetWrapper, footnotesUpdateWrapper, footnotesRemoveWrapper, + footnotesConfigureWrapper, } from './footnote-wrappers.js'; +// --------------------------------------------------------------------------- +// Test helpers +// --------------------------------------------------------------------------- + function makeDocWithFootnoteRefs(ids: string[] = []) { return { descendants: (cb: (node: unknown, pos: number) => boolean | void) => { @@ -54,8 +91,58 @@ function makeDocWithFootnoteRefs(ids: string[] = []) { }; } -function makeEditor(footnotes: unknown, refs: string[] = [], opts?: { refsAfterDispatch?: string[] }): Editor { - const currentRefs = [...refs]; +/** Minimal footnotes.xml OOXML structure. */ +function makeFootnotesXml(entries: Array<{ id: string; text?: string; type?: string }> = []) { + return { + declaration: { attributes: { version: '1.0', encoding: 'UTF-8', standalone: 'yes' } }, + elements: [ + { + type: 'element', + name: 'w:footnotes', + attributes: { 'xmlns:w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main' }, + elements: entries.map((e) => ({ + type: 'element', + name: 'w:footnote', + attributes: { 'w:id': e.id, ...(e.type ? { 'w:type': e.type } : {}) }, + elements: e.text + ? [ + { + type: 'element', + name: 'w:p', + elements: [ + { + type: 'element', + name: 'w:r', + elements: [ + { + type: 'element', + name: 'w:t', + elements: [{ type: 'text', text: e.text }], + }, + ], + }, + ], + }, + ] + : [], + })), + }, + ], + }; +} + +function makeEditor( + footnoteEntries: Array<{ id: string; text?: string; type?: string }> = [], + refs: string[] = [], + opts?: { refsAfterDispatch?: string[]; omitFootnotesPart?: boolean }, +): Editor { + const footnotesXml = makeFootnotesXml(footnoteEntries); + const footnotes = footnoteEntries.map((e) => ({ + id: e.id, + type: e.type ?? null, + content: e.text ? [{ type: 'paragraph', content: [{ type: 'text', text: e.text }] }] : [], + })); + const tr = { insert: vi.fn(), delete: vi.fn(), @@ -64,7 +151,7 @@ function makeEditor(footnotes: unknown, refs: string[] = [], opts?: { refsAfterD const editor = { state: { - doc: makeDocWithFootnoteRefs(currentRefs), + doc: makeDocWithFootnoteRefs(refs), tr, }, schema: { @@ -74,27 +161,48 @@ function makeEditor(footnotes: unknown, refs: string[] = [], opts?: { refsAfterD }, }, dispatch: vi.fn(() => { - // After dispatch, update editor.state.doc to reflect the post-mutation state if (opts?.refsAfterDispatch !== undefined) { editor.state.doc = makeDocWithFootnoteRefs(opts.refsAfterDispatch) as typeof editor.state.doc; } }), converter: { - convertedXml: { 'word/document.xml': {} }, - footnotes, + convertedXml: { + 'word/document.xml': {}, + ...(opts?.omitFootnotesPart ? {} : { 'word/footnotes.xml': footnotesXml }), + 'word/settings.xml': { + elements: [{ type: 'element', name: 'w:settings', elements: [] }], + }, + }, + footnotes: opts?.omitFootnotesPart ? [] : footnotes, }, options: {}, + safeEmit: vi.fn(() => []), + emit: vi.fn(), } as unknown as Editor; return editor; } +type XmlDoc = { + elements: Array<{ elements: Array<{ name: string; attributes: Record }> }>; +}; + +function getFootnoteElements(editor: Editor): Array<{ name: string; attributes: Record }> { + const converter = (editor as unknown as { converter: { convertedXml: Record } }).converter; + const xml = converter.convertedXml['word/footnotes.xml'] as XmlDoc; + return xml.elements[0].elements.filter((el) => el.name === 'w:footnote'); +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + beforeEach(() => { vi.clearAllMocks(); }); describe('footnote-wrappers', () => { - it('stores inserted footnote content in converter.footnotes as exporter-compatible array entries', () => { + it('inserts a new footnote element into the canonical OOXML part', () => { const editor = makeEditor([], []); const result = footnotesInsertWrapper(editor, { @@ -104,50 +212,34 @@ describe('footnote-wrappers', () => { }); expect(result.success).toBe(true); - const footnotes = (editor as unknown as { converter: { footnotes: Array<{ id: string; content: unknown[] }> } }) - .converter.footnotes; - expect(Array.isArray(footnotes)).toBe(true); - expect(footnotes).toHaveLength(1); - expect(footnotes[0]?.id).toBe('1'); - expect(footnotes[0]?.content).toEqual([ - { type: 'paragraph', content: [{ type: 'text', text: 'Inserted from test' }] }, - ]); + const noteElements = getFootnoteElements(editor); + expect(noteElements).toHaveLength(1); + expect(noteElements[0].attributes['w:id']).toBe('1'); }); - it('normalizes legacy map-based footnote storage and allocates the next numeric id', () => { - const editor = makeEditor({ '5': { content: 'Legacy note' } }, []); + it('allocates a note id that avoids all existing ids', () => { + const editor = makeEditor([], ['7', '3']); const result = footnotesInsertWrapper(editor, { at: { kind: 'text', segments: [{ blockId: 'p1', range: { start: 0, end: 0 } }] }, type: 'footnote', - content: 'New note', + content: 'After existing refs', }); expect(result.success).toBe(true); - const footnotes = (editor as unknown as { converter: { footnotes: Array<{ id: string; content: unknown[] }> } }) - .converter.footnotes; - expect(Array.isArray(footnotes)).toBe(true); - expect(footnotes.map((entry) => entry.id)).toEqual(['5', '6']); + if (result.success) { + // The allocator fills the lowest available gap: 1, 2 are free + expect(result.footnote.noteId).toBe('1'); + } }); - it('reads and updates footnote content when converter.footnotes uses array entries', () => { - const editor = makeEditor( - [ - { - id: '3', - content: [ - { type: 'paragraph', content: [{ type: 'text', text: 'Line A' }] }, - { type: 'paragraph', content: [{ type: 'text', text: 'Line B' }] }, - ], - }, - ], - ['3'], - ); + it('updates footnote content in the canonical OOXML part via mutatePart', () => { + const editor = makeEditor([{ id: '3', text: 'Line A' }], ['3']); const before = footnotesGetWrapper(editor, { target: { kind: 'entity', entityType: 'footnote', noteId: '3' }, }); - expect(before.content).toBe('Line A\nLine B'); + expect(before.content).toBe('Line A'); const update = footnotesUpdateWrapper( editor, @@ -158,57 +250,272 @@ describe('footnote-wrappers', () => { { changeMode: 'direct' }, ); expect(update.success).toBe(true); + }); - const after = footnotesGetWrapper(editor, { - target: { kind: 'entity', entityType: 'footnote', noteId: '3' }, + it('removes the footnote via compoundMutation and cleans OOXML part', () => { + const editor = makeEditor( + [ + { id: '2', text: 'Note 2' }, + { id: '5', text: 'Note 5' }, + ], + ['2', '5'], + { refsAfterDispatch: ['5'] }, + ); + + const result = footnotesRemoveWrapper(editor, { + target: { kind: 'entity', entityType: 'footnote', noteId: '2' }, }); - expect(after.content).toBe('Updated content'); + + expect(result.success).toBe(true); + + // The OOXML part should have note '2' removed + const noteElements = getFootnoteElements(editor); + expect(noteElements).toHaveLength(1); + expect(noteElements[0].attributes['w:id']).toBe('5'); }); - it('allocates a note id higher than existing doc references', () => { - const editor = makeEditor([], ['7', '3']); + it('keeps OOXML note element when other references to the same note still exist', () => { + const editor = makeEditor([{ id: '2', text: 'Note 2' }], ['2', '2'], { refsAfterDispatch: ['2'] }); + + const result = footnotesRemoveWrapper(editor, { + target: { kind: 'entity', entityType: 'footnote', noteId: '2' }, + }); + + expect(result.success).toBe(true); + + // Note should still be in the OOXML part since another reference exists + const noteElements = getFootnoteElements(editor); + expect(noteElements).toHaveLength(1); + expect(noteElements[0].attributes['w:id']).toBe('2'); + }); + + it('bootstraps a missing notes part and assigns unique ids (-1, 0, 1)', () => { + const editor = makeEditor([], [], { omitFootnotesPart: true }); const result = footnotesInsertWrapper(editor, { at: { kind: 'text', segments: [{ blockId: 'p1', range: { start: 0, end: 0 } }] }, type: 'footnote', - content: 'After existing refs', + content: 'First footnote in doc', }); expect(result.success).toBe(true); - const footnotes = (editor as unknown as { converter: { footnotes: Array<{ id: string }> } }).converter.footnotes; - expect(footnotes[0]?.id).toBe('8'); + + // The bootstrapped part should have separator(-1), continuationSeparator(0), + // and the new real note(1) — all with distinct ids. + const noteElements = getFootnoteElements(editor); + const ids = noteElements.map((el) => el.attributes['w:id']); + + expect(ids).toContain('-1'); + expect(ids).toContain('0'); + expect(ids).toContain('1'); + expect(new Set(ids).size).toBe(ids.length); // all unique }); - it('removes note entry from converter when footnote is deleted and no longer referenced', () => { - const entries = [ - { id: '2', content: [{ type: 'paragraph', content: [{ type: 'text', text: 'Note 2' }] }] }, - { id: '5', content: [{ type: 'paragraph', content: [{ type: 'text', text: 'Note 5' }] }] }, - ]; - // Before dispatch: refs include '2' and '5'. After dispatch: only '5' remains. - const editor = makeEditor(entries, ['2', '5'], { refsAfterDispatch: ['5'] }); + it('allocates ids that skip over ids already present in the OOXML part', () => { + // Simulate a part that has separator boilerplate occupying ids -1, 0 + // plus an existing real note at id 1 + const editor = makeEditor( + [ + { id: '-1', type: 'separator' }, + { id: '0', type: 'continuationSeparator' }, + { id: '1', text: 'Existing note' }, + ], + ['1'], + ); - const result = footnotesRemoveWrapper(editor, { - target: { kind: 'entity', entityType: 'footnote', noteId: '2' }, + const result = footnotesInsertWrapper(editor, { + at: { kind: 'text', segments: [{ blockId: 'p1', range: { start: 0, end: 0 } }] }, + type: 'footnote', + content: 'Second footnote', }); expect(result.success).toBe(true); - const footnotes = (editor as unknown as { converter: { footnotes: Array<{ id: string }> } }).converter.footnotes; - expect(footnotes).toHaveLength(1); - expect(footnotes[0]?.id).toBe('5'); + if (result.success) { + expect(result.footnote.noteId).toBe('2'); + } }); - it('keeps note entry when other references to the same note still exist', () => { - const entries = [{ id: '2', content: [{ type: 'paragraph', content: [{ type: 'text', text: 'Note 2' }] }] }]; - // After dispatch: another reference to '2' still exists - const editor = makeEditor(entries, ['2', '2'], { refsAfterDispatch: ['2'] }); + // --------------------------------------------------------------------------- + // Fix 1: expectedRevision must be checked for insert and remove + // --------------------------------------------------------------------------- - const result = footnotesRemoveWrapper(editor, { - target: { kind: 'entity', entityType: 'footnote', noteId: '2' }, - }); + it('insert checks expectedRevision via checkRevision', () => { + const editor = makeEditor([], []); - expect(result.success).toBe(true); - const footnotes = (editor as unknown as { converter: { footnotes: Array<{ id: string }> } }).converter.footnotes; - expect(footnotes).toHaveLength(1); - expect(footnotes[0]?.id).toBe('2'); + footnotesInsertWrapper( + editor, + { + at: { kind: 'text', segments: [{ blockId: 'p1', range: { start: 0, end: 0 } }] }, + type: 'footnote', + content: 'rev-guarded insert', + }, + { expectedRevision: 'rev-42', changeMode: 'direct' }, + ); + + expect(checkRevision).toHaveBeenCalledWith(editor, 'rev-42'); + }); + + it('remove checks expectedRevision via checkRevision', () => { + const editor = makeEditor([{ id: '1', text: 'Note' }], ['1'], { refsAfterDispatch: [] }); + + footnotesRemoveWrapper( + editor, + { target: { kind: 'entity', entityType: 'footnote', noteId: '1' } }, + { expectedRevision: 'rev-99', changeMode: 'direct' }, + ); + + expect(checkRevision).toHaveBeenCalledWith(editor, 'rev-99'); + }); + + // --------------------------------------------------------------------------- + // Fix 2: dryRun insert must not leak bootstrapped notes part + // --------------------------------------------------------------------------- + + it('dryRun insert does not leak a bootstrapped notes part into convertedXml', () => { + const editor = makeEditor([], [], { omitFootnotesPart: true }); + const converter = (editor as unknown as { converter: { convertedXml: Record } }).converter; + + // Precondition: no footnotes part + expect(converter.convertedXml['word/footnotes.xml']).toBeUndefined(); + + footnotesInsertWrapper( + editor, + { + at: { kind: 'text', segments: [{ blockId: 'p1', range: { start: 0, end: 0 } }] }, + type: 'footnote', + content: 'dry run', + }, + { dryRun: true, changeMode: 'direct' }, + ); + + // The part must still be absent after a dry run + expect(converter.convertedXml['word/footnotes.xml']).toBeUndefined(); + }); + + // --------------------------------------------------------------------------- + // Fix 3: configure must sync footnoteProperties.originalXml + // --------------------------------------------------------------------------- + + it('configure updates footnoteProperties.originalXml so export uses the new values', () => { + const editor = makeEditor([], []); + const converter = ( + editor as unknown as { + converter: { + convertedXml: Record; + footnoteProperties: { source: string; originalXml: unknown; numFmt?: string } | null; + }; + } + ).converter; + + // Simulate imported footnoteProperties from settings.xml + converter.footnoteProperties = { + source: 'settings', + numFmt: 'decimal', + originalXml: { + type: 'element', + name: 'w:footnotePr', + elements: [{ type: 'element', name: 'w:numFmt', attributes: { 'w:val': 'decimal' } }], + }, + }; + + footnotesConfigureWrapper( + editor, + { + type: 'footnote', + numbering: { format: 'lowerRoman' }, + }, + { changeMode: 'direct' }, + ); + + // The originalXml should now reflect the updated settings part + const originalXml = converter.footnoteProperties?.originalXml as { + elements?: Array<{ name: string; attributes: Record }>; + }; + expect(originalXml).toBeDefined(); + const numFmtEl = originalXml?.elements?.find((el: { name: string }) => el.name === 'w:numFmt'); + expect(numFmtEl?.attributes['w:val']).toBe('lowerRoman'); + }); + + it('configure with dryRun does not sync footnoteProperties', () => { + const editor = makeEditor([], []); + const converter = ( + editor as unknown as { + converter: { + convertedXml: Record; + footnoteProperties: { source: string; originalXml: unknown; numFmt?: string } | null; + }; + } + ).converter; + + const originalXmlSnapshot = { + type: 'element', + name: 'w:footnotePr', + elements: [{ type: 'element', name: 'w:numFmt', attributes: { 'w:val': 'decimal' } }], + }; + + converter.footnoteProperties = { + source: 'settings', + numFmt: 'decimal', + originalXml: structuredClone(originalXmlSnapshot), + }; + + footnotesConfigureWrapper( + editor, + { + type: 'footnote', + numbering: { format: 'lowerRoman' }, + }, + { dryRun: true, changeMode: 'direct' }, + ); + + // originalXml should remain unchanged after dry run + const originalXml = converter.footnoteProperties?.originalXml as { + elements?: Array<{ name: string; attributes: Record }>; + }; + const numFmtEl = originalXml?.elements?.find((el: { name: string }) => el.name === 'w:numFmt'); + expect(numFmtEl?.attributes['w:val']).toBe('decimal'); + }); + + it('endnote configure does not corrupt the footnote properties cache', () => { + const editor = makeEditor([], []); + const converter = ( + editor as unknown as { + converter: { + convertedXml: Record; + footnoteProperties: { source: string; originalXml: unknown; numFmt?: string } | null; + }; + } + ).converter; + + // Simulate imported footnoteProperties from settings.xml (footnote-specific) + const originalFootnotePr = { + type: 'element', + name: 'w:footnotePr', + elements: [{ type: 'element', name: 'w:numFmt', attributes: { 'w:val': 'lowerRoman' } }], + }; + converter.footnoteProperties = { + source: 'settings', + numFmt: 'lowerRoman', + originalXml: structuredClone(originalFootnotePr), + }; + + // Configure endnotes — must not touch the footnote cache + footnotesConfigureWrapper( + editor, + { + type: 'endnote', + numbering: { format: 'upperLetter' }, + }, + { changeMode: 'direct' }, + ); + + // footnoteProperties must still point at w:footnotePr, not w:endnotePr + const cached = converter.footnoteProperties?.originalXml as { + name?: string; + elements?: Array<{ name: string; attributes: Record }>; + }; + expect(cached?.name).toBe('w:footnotePr'); + const numFmtEl = cached?.elements?.find((el) => el.name === 'w:numFmt'); + expect(numFmtEl?.attributes['w:val']).toBe('lowerRoman'); }); }); diff --git a/packages/super-editor/src/document-api-adapters/plan-engine/footnote-wrappers.ts b/packages/super-editor/src/document-api-adapters/plan-engine/footnote-wrappers.ts index 372a2b2b1b..75cd5ead45 100644 --- a/packages/super-editor/src/document-api-adapters/plan-engine/footnote-wrappers.ts +++ b/packages/super-editor/src/document-api-adapters/plan-engine/footnote-wrappers.ts @@ -1,5 +1,10 @@ /** - * Footnote plan-engine wrappers — bridge footnotes.* operations to the adapter layer. + * Footnote plan-engine wrappers — bridge footnotes.* operations to the parts system. + * + * Mutations flow through `mutatePart` / `compoundMutation` so that + * `convertedXml['word/footnotes.xml']` (or endnotes) is the canonical store. + * `converter.footnotes` / `converter.endnotes` are derived caches rebuilt + * by the notes-part-descriptor's `afterCommit` hook. */ import type { Editor } from '../../core/Editor.js'; @@ -26,12 +31,21 @@ import { buildFootnoteDiscoveryItem, } from '../helpers/footnote-resolver.js'; import { paginate, resolveInlineInsertPosition } from '../helpers/adapter-utils.js'; -import { getRevision } from './revision-tracker.js'; -import { executeDomainCommand } from './plan-wrappers.js'; +import { getRevision, checkRevision } from './revision-tracker.js'; import { rejectTrackedMode } from '../helpers/mutation-helpers.js'; import { clearIndexCache } from '../helpers/index-cache.js'; -import { executeOutOfBandMutation } from '../out-of-band-mutation.js'; import { DocumentApiAdapterError } from '../errors.js'; +import { mutatePart } from '../../core/parts/mutation/mutate-part.js'; +import { compoundMutation } from '../../core/parts/mutation/compound-mutation.js'; +import { + getNotesConfig, + addNoteElement, + updateNoteElement, + removeNoteElement, + bootstrapNotesPart, + getNoteElements, +} from '../../core/parts/adapters/notes-part-descriptor.js'; +import type { NoteEntry } from '../../core/parts/adapters/notes-part-descriptor.js'; // --------------------------------------------------------------------------- // Result helpers @@ -49,100 +63,88 @@ function configSuccess(): FootnoteConfigResult { return { success: true }; } -function configFailure(code: ReceiptFailureCode, message: string): FootnoteConfigResult { - return { success: false, failure: { code, message } }; -} - -function receiptApplied(receipt: ReturnType): boolean { - return receipt.steps[0]?.effect === 'changed'; -} - -type FootnoteEntry = { - id: string; - type?: string | null; - content: unknown[]; - originalXml?: unknown; -}; - -type LegacyNoteMap = Record; +// --------------------------------------------------------------------------- +// Converter shape +// --------------------------------------------------------------------------- interface ConverterNotesStore { - footnotes?: FootnoteEntry[] | LegacyNoteMap; - endnotes?: FootnoteEntry[] | LegacyNoteMap; + footnotes?: NoteEntry[]; + endnotes?: NoteEntry[]; + footnoteProperties?: Record | null; + convertedXml?: Record; } -function isLegacyNoteMap(value: unknown): value is LegacyNoteMap { - return value != null && typeof value === 'object' && !Array.isArray(value); -} - -function textToFootnoteContentNodes(text: string): unknown[] { - const lines = text.split(/\r?\n/); - return lines.map((line) => ({ - type: 'paragraph', - content: line.length > 0 ? [{ type: 'text', text: line }] : [], - })); -} - -function normalizeLegacyNoteMap(map: LegacyNoteMap): FootnoteEntry[] { - return Object.entries(map).map(([id, value]) => ({ - id: String(id), - content: textToFootnoteContentNodes(value?.content ?? ''), - })); -} - -function ensureNoteEntries(converter: ConverterNotesStore, kind: 'footnotes' | 'endnotes'): FootnoteEntry[] { - const current = converter[kind]; - if (Array.isArray(current)) return current; - - if (isLegacyNoteMap(current)) { - const normalized = normalizeLegacyNoteMap(current); - converter[kind] = normalized; - return normalized; +function getConverter(editor: Editor): ConverterNotesStore { + const converter = (editor as unknown as { converter?: ConverterNotesStore }).converter; + if (!converter) { + throw new DocumentApiAdapterError('CAPABILITY_UNAVAILABLE', 'converter not available.'); } - - const initialized: FootnoteEntry[] = []; - converter[kind] = initialized; - return initialized; + return converter; } +// --------------------------------------------------------------------------- +// ID allocation +// --------------------------------------------------------------------------- + function toNonNegativeInteger(value: unknown): number | null { const num = Number(value); if (!Number.isInteger(num) || !Number.isFinite(num) || num < 0) return null; return num; } -function allocateNextNoteId(editor: Editor, type: 'footnote' | 'endnote', entries: FootnoteEntry[]): string { - let maxId = 0; +/** + * Collect every non-negative integer ID already in use for a note type. + * + * Reads from three sources so newly bootstrapped parts (whose derived + * cache hasn't been rebuilt yet) are still accounted for: + * 1. PM document references (footnoteReference / endnoteReference nodes) + * 2. The canonical OOXML part (word/footnotes.xml or word/endnotes.xml) + * 3. The derived cache (converter.footnotes / converter.endnotes) + * + * Special note types (separator, continuationSeparator) use negative IDs + * by convention and are excluded by the non-negative filter. + */ +function collectUsedNoteIds(editor: Editor, converter: ConverterNotesStore, type: 'footnote' | 'endnote'): Set { + const used = new Set(); + const config = getNotesConfig(type); + // 1. PM document references for (const ref of findAllFootnotes(editor.state.doc, type)) { const parsed = toNonNegativeInteger(ref.noteId); - if (parsed != null) maxId = Math.max(maxId, parsed); + if (parsed != null) used.add(parsed); } - for (const entry of entries) { - const parsed = toNonNegativeInteger(entry.id); - if (parsed != null) maxId = Math.max(maxId, parsed); + // 2. Canonical OOXML part (survives even when the derived cache is stale) + const ooxmlPart = converter.convertedXml?.[config.partId]; + if (ooxmlPart) { + for (const el of getNoteElements(ooxmlPart, config.childElementName)) { + const parsed = toNonNegativeInteger(el.attributes?.['w:id']); + if (parsed != null) used.add(parsed); + } } - return String(maxId + 1); -} - -function upsertNoteEntry(entries: FootnoteEntry[], noteId: string, content: string): void { - const existing = entries.find((entry) => String(entry.id) === noteId); - if (existing) { - existing.content = textToFootnoteContentNodes(content); - return; + // 3. Derived cache (may contain entries not yet in OOXML after a sync) + const cache = converter[config.converterKey]; + if (Array.isArray(cache)) { + for (const entry of cache) { + const parsed = toNonNegativeInteger(entry.id); + if (parsed != null) used.add(parsed); + } } - entries.push({ - id: noteId, - content: textToFootnoteContentNodes(content), - }); + return used; } -function removeNoteEntry(entries: FootnoteEntry[], noteId: string): void { - const index = entries.findIndex((entry) => String(entry.id) === noteId); - if (index >= 0) entries.splice(index, 1); +/** + * Allocate the next available note ID by scanning all known sources. + */ +function allocateNextNoteId(editor: Editor, converter: ConverterNotesStore, type: 'footnote' | 'endnote'): string { + const used = collectUsedNoteIds(editor, converter, type); + + let candidate = 1; + while (used.has(candidate)) candidate += 1; + + return String(candidate); } // --------------------------------------------------------------------------- @@ -175,21 +177,24 @@ export function footnotesGetWrapper(editor: Editor, input: FootnoteGetInput): Fo // Mutation operations // --------------------------------------------------------------------------- +/** + * Insert a new footnote/endnote. + * + * Uses `compoundMutation` because it touches both: + * 1. The OOXML notes part (add element) + * 2. The PM document (insert footnoteReference/endnoteReference node) + */ export function footnotesInsertWrapper( editor: Editor, input: FootnoteInsertInput, options?: MutationOptions, ): FootnoteMutationResult { rejectTrackedMode('footnotes.insert', options); + checkRevision(editor, options?.expectedRevision); - const converter = (editor as unknown as { converter?: ConverterNotesStore }).converter; - if (!converter) { - throw new DocumentApiAdapterError('CAPABILITY_UNAVAILABLE', 'footnotes.insert: converter not available.'); - } - - const noteStoreKey = input.type === 'endnote' ? 'endnotes' : 'footnotes'; - const noteEntries = ensureNoteEntries(converter, noteStoreKey); - const noteId = allocateNextNoteId(editor, input.type, noteEntries); + const converter = getConverter(editor); + const notesConfig = getNotesConfig(input.type); + const noteId = allocateNextNoteId(editor, converter, input.type); const address: FootnoteAddress = { kind: 'entity', entityType: 'footnote', noteId }; if (options?.dryRun) { @@ -198,7 +203,6 @@ export function footnotesInsertWrapper( const nodeTypeName = input.type === 'endnote' ? 'endnoteReference' : 'footnoteReference'; const nodeType = editor.schema.nodes[nodeTypeName]; - if (!nodeType) { throw new DocumentApiAdapterError( 'CAPABILITY_UNAVAILABLE', @@ -208,30 +212,51 @@ export function footnotesInsertWrapper( const resolved = resolveInlineInsertPosition(editor, input.at, 'footnotes.insert'); - const receipt = executeDomainCommand( + const { success } = compoundMutation({ editor, - () => { + source: `footnotes.insert:${input.type}`, + affectedParts: [notesConfig.partId], + execute: () => { + // Bootstrap the notes part inside the transactional path so the + // compound snapshot correctly records the part as non-existent. + // On rollback the bootstrapped part is removed automatically. + bootstrapNotesPart(editor, input.type); + + // 1. Add note element to the canonical OOXML part + mutatePart({ + editor, + partId: notesConfig.partId, + operation: 'mutate', + source: `footnotes.insert:${input.type}`, + mutate({ part }) { + addNoteElement(part, notesConfig, noteId, input.content); + }, + }); + + // 2. Insert the reference node in the PM document const node = nodeType.create({ id: noteId }); const { tr } = editor.state; tr.insert(resolved.from, node); editor.dispatch(tr); - // Keep converter note content in exporter-compatible array form. - upsertNoteEntry(noteEntries, noteId, input.content); - clearIndexCache(editor); return true; }, - { expectedRevision: options?.expectedRevision }, - ); + }); - if (!receiptApplied(receipt)) { + if (!success) { return footnoteFailure('NO_OP', 'Insert operation produced no change.'); } return footnoteSuccess(address); } +/** + * Update footnote/endnote content. + * + * Uses `mutatePart` directly — only the OOXML notes part is modified. + * The derived cache is rebuilt by the `afterCommit` hook. + */ export function footnotesUpdateWrapper( editor: Editor, input: FootnoteUpdateInput, @@ -242,44 +267,40 @@ export function footnotesUpdateWrapper( const resolved = resolveFootnoteTarget(editor.state.doc, input.target); const address: FootnoteAddress = { kind: 'entity', entityType: 'footnote', noteId: resolved.noteId }; - if (options?.dryRun) { + if (options?.dryRun || input.patch.content === undefined) { return footnoteSuccess(address); } - // Footnote content is stored in the converter's footnote/endnote parts. - // This is an out-of-band mutation since it modifies XML parts, not PM state. - const converter = (editor as unknown as { converter?: ConverterNotesStore }).converter; - if (!converter) { - throw new DocumentApiAdapterError('CAPABILITY_UNAVAILABLE', 'footnotes.update: converter not available.'); - } - const noteStoreKey = resolved.type === 'footnote' ? 'footnotes' : 'endnotes'; - const noteEntries = ensureNoteEntries(converter, noteStoreKey); + const notesConfig = getNotesConfig(resolved.type); - executeOutOfBandMutation( + mutatePart({ editor, - (dryRun) => { - if (input.patch.content === undefined) { - return { changed: false, payload: undefined }; - } - - if (!dryRun) { - upsertNoteEntry(noteEntries, resolved.noteId, input.patch.content); - } - - return { changed: true, payload: undefined }; + partId: notesConfig.partId, + operation: 'mutate', + source: `footnotes.update:${resolved.type}`, + expectedRevision: options?.expectedRevision, + mutate({ part }) { + updateNoteElement(part, notesConfig, resolved.noteId, input.patch.content!); }, - { dryRun: options?.dryRun ?? false, expectedRevision: options?.expectedRevision }, - ); + }); return footnoteSuccess(address); } +/** + * Remove a footnote/endnote. + * + * Uses `compoundMutation` because it touches both: + * 1. The PM document (delete the footnoteReference/endnoteReference node) + * 2. The OOXML notes part (remove element if no more references) + */ export function footnotesRemoveWrapper( editor: Editor, input: FootnoteRemoveInput, options?: MutationOptions, ): FootnoteMutationResult { rejectTrackedMode('footnotes.remove', options); + checkRevision(editor, options?.expectedRevision); const resolved = resolveFootnoteTarget(editor.state.doc, input.target); const address: FootnoteAddress = { kind: 'entity', entityType: 'footnote', noteId: resolved.noteId }; @@ -288,40 +309,58 @@ export function footnotesRemoveWrapper( return footnoteSuccess(address); } - const receipt = executeDomainCommand( + const notesConfig = getNotesConfig(resolved.type); + + const { success } = compoundMutation({ editor, - () => { + source: `footnotes.remove:${resolved.type}`, + affectedParts: [notesConfig.partId], + execute: () => { + // 1. Delete the reference node from the PM document const { tr } = editor.state; const node = tr.doc.nodeAt(resolved.pos); - if (node) { - tr.delete(resolved.pos, resolved.pos + node.nodeSize); - editor.dispatch(tr); - const converter = (editor as unknown as { converter?: ConverterNotesStore }).converter; - if (converter) { - const noteStoreKey = resolved.type === 'footnote' ? 'footnotes' : 'endnotes'; - const noteEntries = ensureNoteEntries(converter, noteStoreKey); - const stillReferenced = findAllFootnotes(editor.state.doc, resolved.type).some( - (f) => f.noteId === resolved.noteId, - ); - if (!stillReferenced) { - removeNoteEntry(noteEntries, resolved.noteId); - } - } - clearIndexCache(editor); - return true; + if (!node) return false; + + tr.delete(resolved.pos, resolved.pos + node.nodeSize); + editor.dispatch(tr); + + // 2. Remove from the OOXML part if no other references remain + const stillReferenced = findAllFootnotes(editor.state.doc, resolved.type).some( + (f) => f.noteId === resolved.noteId, + ); + + if (!stillReferenced) { + mutatePart({ + editor, + partId: notesConfig.partId, + operation: 'mutate', + source: `footnotes.remove:${resolved.type}`, + mutate({ part }) { + removeNoteElement(part, notesConfig, resolved.noteId); + }, + }); } - return false; + + clearIndexCache(editor); + return true; }, - { expectedRevision: options?.expectedRevision }, - ); + }); - if (!receiptApplied(receipt)) { + if (!success) { return footnoteFailure('NO_OP', 'Remove operation produced no change.'); } return footnoteSuccess(address); } +/** + * Configure footnote/endnote numbering and placement. + * + * Document-wide settings are written to `word/settings.xml` through the + * parts system. Section-scoped settings that belong in `sectPr` go through + * the document mutation path (not yet implemented — falls back to converter + * cache for backward compatibility). + */ export function footnotesConfigureWrapper( editor: Editor, input: FootnoteConfigureInput, @@ -329,49 +368,106 @@ export function footnotesConfigureWrapper( ): FootnoteConfigResult { rejectTrackedMode('footnotes.configure', options); - interface FootnotePropertiesStore { - footnoteProperties?: Record | null; - convertedXml?: Record; - } - - const converter = (editor as unknown as { converter?: FootnotePropertiesStore }).converter; - if (!converter) { - throw new DocumentApiAdapterError('CAPABILITY_UNAVAILABLE', 'footnotes.configure: converter not available.'); - } + const prElementName = input.type === 'endnote' ? 'w:endnotePr' : 'w:footnotePr'; - executeOutOfBandMutation( + // Document-wide config: mutate word/settings.xml + mutatePart({ editor, - (dryRun) => { - if (dryRun) return { changed: true, payload: undefined }; - - // Ensure the footnoteProperties object exists - if (!converter.footnoteProperties) { - converter.footnoteProperties = { source: 'settings' }; + partId: 'word/settings.xml', + operation: 'mutate', + source: `footnotes.configure:${input.type}`, + dryRun: options?.dryRun, + expectedRevision: options?.expectedRevision, + mutate({ part }) { + const root = (part as { elements?: Array<{ elements?: unknown[] }> })?.elements?.[0]; + if (!root) return; + if (!root.elements) root.elements = []; + + // Find or create the footnotePr/endnotePr element + interface OoxmlElement { + type?: string; + name?: string; + attributes?: Record; + elements?: OoxmlElement[]; + } + const elements = root.elements as OoxmlElement[]; + let prElement = elements.find((el) => el.name === prElementName); + if (!prElement) { + prElement = { type: 'element', name: prElementName, elements: [] }; + elements.push(prElement); } - const props = converter.footnoteProperties; - - // Apply numbering config fields to converter state (w:footnotePr / w:endnotePr) - if (input.numbering) { - if (input.numbering.format !== undefined) props.numFmt = input.numbering.format; - if (input.numbering.start !== undefined) props.numStart = String(input.numbering.start); - if (input.numbering.restartPolicy !== undefined) { - props.numRestart = RESTART_POLICY_TO_OOXML[input.numbering.restartPolicy] ?? input.numbering.restartPolicy; + if (!prElement.elements) prElement.elements = []; + + if (!input.numbering) return; + + // Apply numbering properties as OOXML child elements + const setOrRemoveChild = (name: string, value: string | undefined) => { + if (value === undefined) return; + const children = prElement!.elements!; + const existing = children.findIndex((el) => el.name === name); + const newEl: OoxmlElement = { type: 'element', name, attributes: { 'w:val': value } }; + if (existing >= 0) { + children[existing] = newEl; + } else { + children.push(newEl); } - if (input.numbering.position !== undefined) props.pos = input.numbering.position; + }; + + setOrRemoveChild('w:numFmt', input.numbering.format); + setOrRemoveChild('w:numStart', input.numbering.start !== undefined ? String(input.numbering.start) : undefined); + if (input.numbering.restartPolicy !== undefined) { + setOrRemoveChild( + 'w:numRestart', + RESTART_POLICY_TO_OOXML[input.numbering.restartPolicy] ?? input.numbering.restartPolicy, + ); } - - // Store the type so the exporter knows which part to update - props.noteType = input.type; - if (input.scope) props.scope = input.scope; - - return { changed: true, payload: undefined }; + setOrRemoveChild('w:pos', input.numbering.position); }, - { dryRun: options?.dryRun ?? false, expectedRevision: options?.expectedRevision }, - ); + }); + + // Keep the derived footnoteProperties cache in sync so the export path + // does not overwrite our changes with the stale originalXml snapshot. + // Only sync for footnotes — converter.footnoteProperties represents + // w:footnotePr only. Endnote config (w:endnotePr) is a separate element + // and must not overwrite the footnote cache. + if (!options?.dryRun && prElementName === 'w:footnotePr') { + syncFootnotePropertiesCache(editor); + } return configSuccess(); } +/** + * Refresh `converter.footnoteProperties.originalXml` from the canonical + * `word/settings.xml` part after a footnote configure mutation. + * + * The export path (`applyFootnotePropertiesToSettings`) reads `originalXml` + * and writes it back to settings.xml, so it must reflect the latest state. + * + * Only called for footnote (not endnote) configure — `converter.footnoteProperties` + * exclusively represents `w:footnotePr`. + */ +function syncFootnotePropertiesCache(editor: Editor): void { + const converter = getConverter(editor) as ConverterNotesStore & { + footnoteProperties?: { source?: string; originalXml?: unknown; [k: string]: unknown } | null; + }; + if (!converter?.footnoteProperties || converter.footnoteProperties.source !== 'settings') return; + + const settingsPart = converter.convertedXml?.['word/settings.xml'] as + | { elements?: Array<{ elements?: Array<{ name?: string }> }> } + | undefined; + const settingsRoot = settingsPart?.elements?.[0]; + const elements = settingsRoot?.elements ?? []; + const prElement = elements.find((el) => el.name === 'w:footnotePr'); + + if (prElement) { + converter.footnoteProperties.originalXml = structuredClone(prElement); + } else { + // The element was removed — clear the cache so export doesn't re-emit it + converter.footnoteProperties = null; + } +} + const RESTART_POLICY_TO_OOXML: Record = { continuous: 'continuous', eachSection: 'eachSect', diff --git a/packages/super-editor/src/tests/import-export/footnotes-roundtrip.test.js b/packages/super-editor/src/tests/import-export/footnotes-roundtrip.test.js index 6296012dab..8445399ef1 100644 --- a/packages/super-editor/src/tests/import-export/footnotes-roundtrip.test.js +++ b/packages/super-editor/src/tests/import-export/footnotes-roundtrip.test.js @@ -637,6 +637,46 @@ describe('customMarkFollows attribute', () => { }); }); +// ============================================ +// Bootstrap ID uniqueness regression +// ============================================ + +describe('bootstrapped notes part produces unique ids', () => { + it('creates separator=-1, continuationSeparator=0, first real note=1 with no duplicates', async () => { + // Import the bootstrap helper and the OOXML mutation helper + const { bootstrapNotesPart, getNotesConfig, addNoteElement } = await import( + '@core/parts/adapters/notes-part-descriptor.js' + ); + + // Simulate a fresh editor with no footnotes part + const editor = { + converter: { + convertedXml: { + 'word/document.xml': {}, + }, + }, + state: { doc: { descendants: () => {} } }, + }; + + // Bootstrap the part (creates separator boilerplate) + bootstrapNotesPart(editor, 'footnote'); + + // Add a real note (simulates what footnotesInsertWrapper does) + const config = getNotesConfig('footnote'); + const part = editor.converter.convertedXml['word/footnotes.xml']; + addNoteElement(part, config, '1', 'First real footnote'); + + // Extract all w:footnote ids from the OOXML + const root = part.elements[0]; + const noteElements = root.elements.filter((el) => el.name === 'w:footnote'); + const ids = noteElements.map((el) => el.attributes['w:id']); + + // Must be -1, 0, 1 — all unique, no collisions + expect(ids).toEqual(expect.arrayContaining(['-1', '0', '1'])); + expect(new Set(ids).size).toBe(ids.length); + }); +}); + // ============================================ // w:footnotePr Properties Tests // ============================================ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c5c9e97d2..1cadcb7b6d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,7 +17,7 @@ catalogs: version: 9.39.2 '@floating-ui/dom': specifier: ^1.7.0 - version: 1.7.6 + version: 1.7.5 '@hocuspocus/provider': specifier: ^2.13.6 version: 2.15.3 @@ -47,7 +47,7 @@ catalogs: version: 14.6.1 '@types/bun': specifier: ^1.3.8 - version: 1.3.10 + version: 1.3.8 '@types/mdast': specifier: ^4.0.4 version: 4.0.4 @@ -56,7 +56,7 @@ catalogs: version: 22.19.2 '@types/react': specifier: ^19.2.6 - version: 19.2.14 + version: 19.2.11 '@types/react-dom': specifier: ^19.2.3 version: 19.2.3 @@ -68,7 +68,7 @@ catalogs: version: 8.54.0 '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.1.4 + version: 5.1.3 '@vitejs/plugin-vue': specifier: 6.0.2 version: 6.0.2 @@ -134,7 +134,7 @@ catalogs: version: 0.2.117 nodemon: specifier: ^3.1.10 - version: 3.1.14 + version: 3.1.11 pdfjs-dist: specifier: ^5.4.296 version: 5.4.624 @@ -194,7 +194,7 @@ catalogs: version: 1.11.0 prosemirror-view: specifier: ^1.33.8 - version: 1.41.6 + version: 1.41.5 react: specifier: 19.2.4 version: 19.2.4 @@ -344,7 +344,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2)) concurrently: specifier: 'catalog:' version: 9.2.1 @@ -404,10 +404,10 @@ importers: version: 6.2.5(typanion@3.14.0) vite-plugin-node-polyfills: specifier: 'catalog:' - version: 0.25.0(rollup@4.59.0)(vite@7.3.1(@types/node@22.19.2)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 0.25.0(rollup@4.57.1)(vite@7.3.1(@types/node@22.19.2)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)) vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) optionalDependencies: canvas: specifier: 3.2.1 @@ -442,7 +442,7 @@ importers: version: link:../../packages/super-editor '@types/bun': specifier: 'catalog:' - version: 1.3.10 + version: 1.3.8 '@types/node': specifier: 'catalog:' version: 22.19.2 @@ -486,7 +486,7 @@ importers: version: 14.0.3 mintlify: specifier: ^4.2.331 - version: 4.2.331(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/node@25.3.5)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(typescript@5.9.3) + version: 4.2.331(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/node@22.19.8)(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(typescript@5.9.3) remark-mdx: specifier: ^3.1.1 version: 3.1.1 @@ -517,7 +517,7 @@ importers: version: link:../../packages/super-editor '@types/bun': specifier: 'catalog:' - version: 1.3.10 + version: 1.3.8 '@types/node': specifier: 'catalog:' version: 22.19.2 @@ -587,13 +587,13 @@ importers: version: 1.4.4 prosemirror-view: specifier: 'catalog:' - version: 1.41.6 + version: 1.41.5 superdoc: specifier: 'workspace:' version: link:../superdoc tsup: specifier: 'catalog:' - version: 8.5.1(@microsoft/api-extractor@7.56.1(@types/node@22.19.2))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.56.1(@types/node@22.19.2))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: 'catalog:' version: 5.9.3 @@ -624,7 +624,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/coverage-v8': specifier: 'catalog:' - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2)) concurrently: specifier: 'catalog:' version: 9.2.1 @@ -636,19 +636,19 @@ importers: version: 9.1.2(eslint@9.39.2(jiti@2.6.1)) nodemon: specifier: 'catalog:' - version: 3.1.14 + version: 3.1.11 prettier: specifier: ^3.5.3 version: 3.8.1 tsup: specifier: 'catalog:' - version: 8.5.1(@microsoft/api-extractor@7.56.1(@types/node@22.19.2))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.56.1(@types/node@22.19.2))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) packages/document-api: {} @@ -659,19 +659,19 @@ importers: version: 6.9.1 '@testing-library/react': specifier: 'catalog:' - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@testing-library/user-event': specifier: 'catalog:' version: 14.6.1(@testing-library/dom@10.4.1) '@types/react': specifier: 'catalog:' - version: 19.2.14 + version: 19.2.11 '@types/react-dom': specifier: 'catalog:' - version: 19.2.3(@types/react@19.2.14) + version: 19.2.3(@types/react@19.2.11) '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.1.4(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.3(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) eslint-plugin-react: specifier: 'catalog:' version: 7.37.5(eslint@9.39.2(jiti@2.6.1)) @@ -695,13 +695,13 @@ importers: version: 5.9.3 vite: specifier: npm:rolldown-vite@7.3.1 - version: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + version: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: 'catalog:' - version: 4.5.4(@types/node@25.3.5)(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.59.0)(typescript@5.9.3) + version: 4.5.4(@types/node@22.19.8)(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.57.1)(typescript@5.9.3) vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.8)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) packages/esign/demo: dependencies: @@ -726,19 +726,19 @@ importers: devDependencies: '@types/react': specifier: 'catalog:' - version: 19.2.14 + version: 19.2.11 '@types/react-dom': specifier: 'catalog:' - version: 19.2.3(@types/react@19.2.14) + version: 19.2.3(@types/react@19.2.11) '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.1.4(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.3(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) typescript: specifier: 'catalog:' version: 5.9.3 vite: specifier: npm:rolldown-vite@7.3.1 - version: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + version: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) packages/esign/demo/server: dependencies: @@ -763,7 +763,7 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.8)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) packages/layout-engine/layout-bridge: dependencies: @@ -794,13 +794,13 @@ importers: version: 22.19.2 tsup: specifier: 'catalog:' - version: 8.5.1(@microsoft/api-extractor@7.56.1(@types/node@22.19.2))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(@microsoft/api-extractor@7.56.1(@types/node@22.19.2))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: 'catalog:' version: 5.9.3 vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) packages/layout-engine/layout-engine: dependencies: @@ -861,7 +861,7 @@ importers: devDependencies: vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.8)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) packages/layout-engine/pm-adapter: dependencies: @@ -901,7 +901,7 @@ importers: version: link:../painters/dom vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.8)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) packages/layout-engine/style-engine: dependencies: @@ -917,7 +917,7 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.8)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) packages/layout-engine/tests: dependencies: @@ -953,20 +953,20 @@ importers: dependencies: superdoc: specifier: '>=1.0.0' - version: 1.11.0(@hocuspocus/provider@2.15.3(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(canvas@3.2.1)(pdfjs-dist@5.4.624)(typescript@5.9.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(yjs@13.6.19) + version: 1.11.0(@hocuspocus/provider@2.15.3(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(canvas@3.2.1)(pdfjs-dist@5.4.624)(typescript@5.9.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(yjs@13.6.19) devDependencies: '@testing-library/react': specifier: 'catalog:' - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@types/node': specifier: 'catalog:' version: 22.19.2 '@types/react': specifier: 'catalog:' - version: 19.2.14 + version: 19.2.11 '@types/react-dom': specifier: 'catalog:' - version: 19.2.3(@types/react@19.2.14) + version: 19.2.3(@types/react@19.2.11) '@typescript-eslint/eslint-plugin': specifier: 'catalog:' version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -975,7 +975,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.1.4(rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.3(rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) eslint: specifier: 'catalog:' version: 9.39.2(jiti@2.6.1) @@ -993,13 +993,13 @@ importers: version: 5.9.3 vite: specifier: npm:rolldown-vite@7.3.1 - version: rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + version: rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: 'catalog:' - version: 4.5.4(@types/node@22.19.2)(rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.59.0)(typescript@5.9.3) + version: 4.5.4(@types/node@22.19.2)(rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.57.1)(typescript@5.9.3) vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) packages/sdk: {} @@ -1009,7 +1009,7 @@ importers: devDependencies: '@types/bun': specifier: 'catalog:' - version: 1.3.10 + version: 1.3.8 '@types/node': specifier: 'catalog:' version: 22.19.2 @@ -1104,7 +1104,7 @@ importers: version: 1.11.0 prosemirror-view: specifier: 'catalog:' - version: 1.41.6 + version: 1.41.5 rehype-parse: specifier: 'catalog:' version: 9.0.1 @@ -1137,14 +1137,14 @@ importers: version: 1.6.11 y-prosemirror: specifier: 'catalog:' - version: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19) + version: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19) yjs: specifier: 'catalog:' version: 13.6.19 devDependencies: '@floating-ui/dom': specifier: 'catalog:' - version: 1.7.6 + version: 1.7.5 '@superdoc/common': specifier: workspace:* version: link:../../shared/common @@ -1183,7 +1183,7 @@ importers: version: 4.0.4 '@vitejs/plugin-vue': specifier: 'catalog:' - version: 6.0.2(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + version: 6.0.2(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@vue/test-utils': specifier: 'catalog:' version: 2.4.6 @@ -1195,10 +1195,10 @@ importers: version: 20.4.0 postcss-nested: specifier: 'catalog:' - version: 6.2.0(postcss@8.5.8) + version: 6.2.0(postcss@8.5.6) postcss-nested-import: specifier: 'catalog:' - version: 1.3.0(postcss@8.5.8) + version: 1.3.0(postcss@8.5.6) prosemirror-test-builder: specifier: 'catalog:' version: 1.1.1 @@ -1210,13 +1210,13 @@ importers: version: 5.9.3 vite: specifier: npm:rolldown-vite@7.3.1 - version: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + version: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-node-polyfills: specifier: 'catalog:' - version: 0.25.0(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.59.0) + version: 0.25.0(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.57.1) vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.8)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) y-protocols: specifier: 'catalog:' version: 1.0.7(yjs@13.6.19) @@ -1249,7 +1249,7 @@ importers: version: 3.5.25(typescript@5.9.3) y-prosemirror: specifier: 'catalog:' - version: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19) + version: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19) y-websocket: specifier: 'catalog:' version: 3.0.0(yjs@13.6.19) @@ -1274,7 +1274,7 @@ importers: version: link:../super-editor '@vitejs/plugin-vue': specifier: 'catalog:' - version: 6.0.2(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + version: 6.0.2(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@vue/test-utils': specifier: 'catalog:' version: 2.4.6 @@ -1286,16 +1286,16 @@ importers: version: 3.10.1 nodemon: specifier: 'catalog:' - version: 3.1.14 + version: 3.1.11 pdfjs-dist: specifier: 'catalog:' version: 5.4.624 postcss-nested: specifier: 'catalog:' - version: 6.2.0(postcss@8.5.8) + version: 6.2.0(postcss@8.5.6) postcss-prefixwrap: specifier: 'catalog:' - version: 1.57.2(postcss@8.5.8) + version: 1.57.2(postcss@8.5.6) prosemirror-model: specifier: 'catalog:' version: 1.25.4 @@ -1304,7 +1304,7 @@ importers: version: 1.4.4 rollup-plugin-visualizer: specifier: 'catalog:' - version: 5.14.0(rollup@4.59.0) + version: 5.14.0(rollup@4.57.1) sirv: specifier: 'catalog:' version: 3.0.2 @@ -1313,16 +1313,16 @@ importers: version: 5.9.3 vite: specifier: npm:rolldown-vite@7.3.1 - version: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + version: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: 'catalog:' - version: 4.5.4(@types/node@25.3.5)(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.59.0)(typescript@5.9.3) + version: 4.5.4(@types/node@22.19.8)(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.57.1)(typescript@5.9.3) vite-plugin-node-polyfills: specifier: 'catalog:' - version: 0.25.0(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.59.0) + version: 0.25.0(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.57.1) vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.8)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) ws: specifier: ^8.18.3 version: 8.19.0 @@ -1346,19 +1346,19 @@ importers: version: 6.9.1 '@testing-library/react': specifier: 'catalog:' - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@testing-library/user-event': specifier: 'catalog:' version: 14.6.1(@testing-library/dom@10.4.1) '@types/react': specifier: 'catalog:' - version: 19.2.14 + version: 19.2.11 '@types/react-dom': specifier: 'catalog:' - version: 19.2.3(@types/react@19.2.14) + version: 19.2.3(@types/react@19.2.11) '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.1.4(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.3(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) eslint-plugin-react: specifier: 'catalog:' version: 7.37.5(eslint@9.39.2(jiti@2.6.1)) @@ -1382,13 +1382,13 @@ importers: version: 5.9.3 vite: specifier: npm:rolldown-vite@7.3.1 - version: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + version: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: 'catalog:' - version: 4.5.4(@types/node@25.3.5)(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.59.0)(typescript@5.9.3) + version: 4.5.4(@types/node@22.19.8)(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.57.1)(typescript@5.9.3) vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.8)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) packages/template-builder/demo: dependencies: @@ -1407,25 +1407,25 @@ importers: devDependencies: '@types/react': specifier: 'catalog:' - version: 19.2.14 + version: 19.2.11 '@types/react-dom': specifier: 'catalog:' - version: 19.2.3(@types/react@19.2.14) + version: 19.2.3(@types/react@19.2.11) '@vitejs/plugin-react': specifier: 'catalog:' - version: 5.1.4(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.3(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) typescript: specifier: 'catalog:' version: 5.9.3 vite: specifier: npm:rolldown-vite@7.3.1 - version: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + version: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) packages/word-layout: devDependencies: vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.8)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) shared/common: devDependencies: @@ -1440,7 +1440,7 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) vue: specifier: 3.5.25 version: 3.5.25(typescript@5.9.3) @@ -1465,7 +1465,7 @@ importers: version: 1.58.1 vite: specifier: npm:rolldown-vite@7.3.1 - version: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + version: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) tests/doc-api-stories: dependencies: @@ -1475,7 +1475,7 @@ importers: devDependencies: vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.8)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) tests/visual: dependencies: @@ -1500,7 +1500,7 @@ importers: version: 4.21.0 vite: specifier: npm:rolldown-vite@7.3.1 - version: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + version: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) packages: @@ -2011,12 +2011,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.3': - resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} @@ -2029,12 +2023,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.3': - resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.25.12': resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} @@ -2047,12 +2035,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.3': - resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} @@ -2065,12 +2047,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.3': - resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} @@ -2083,12 +2059,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.3': - resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} @@ -2101,12 +2071,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.3': - resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} @@ -2119,12 +2083,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.3': - resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} @@ -2137,12 +2095,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.3': - resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} @@ -2155,12 +2107,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.3': - resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} @@ -2173,12 +2119,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.3': - resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} @@ -2191,12 +2131,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.3': - resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.25.12': resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} @@ -2209,12 +2143,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.3': - resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} @@ -2227,12 +2155,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.3': - resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} @@ -2245,12 +2167,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.3': - resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} @@ -2263,12 +2179,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.3': - resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} @@ -2281,12 +2191,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.3': - resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} @@ -2299,12 +2203,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.3': - resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/netbsd-arm64@0.25.12': resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} @@ -2317,12 +2215,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.27.3': - resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} @@ -2335,12 +2227,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.3': - resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/openbsd-arm64@0.25.12': resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} @@ -2353,12 +2239,6 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.27.3': - resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} @@ -2371,12 +2251,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.3': - resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openharmony-arm64@0.25.12': resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} @@ -2389,12 +2263,6 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.27.3': - resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} @@ -2407,12 +2275,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.3': - resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} @@ -2425,12 +2287,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.3': - resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} @@ -2443,12 +2299,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.3': - resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} @@ -2461,12 +2311,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.3': - resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2505,20 +2349,20 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@floating-ui/core@1.7.5': - resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + '@floating-ui/core@1.7.4': + resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} - '@floating-ui/dom@1.7.6': - resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + '@floating-ui/dom@1.7.5': + resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} - '@floating-ui/react-dom@2.1.8': - resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + '@floating-ui/react-dom@2.1.7': + resolution: {integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.11': - resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} '@hocuspocus/common@2.15.3': resolution: {integrity: sha512-Rzh1HF0a2o/tf90A3w2XNdXd9Ym3aQzMDfD3lAUONCX9B9QOdqdyiORrj6M25QEaJrEIbXFy8LtAFcL0wRdWzA==} @@ -3572,8 +3416,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.53': resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} - '@rolldown/pluginutils@1.0.0-rc.3': - resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} + '@rolldown/pluginutils@1.0.0-rc.2': + resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} '@rollup/plugin-inject@5.0.5': resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} @@ -3598,251 +3442,126 @@ packages: cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.59.0': - resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm64@4.57.1': resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.59.0': - resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} - cpu: [arm64] - os: [android] - '@rollup/rollup-darwin-arm64@4.57.1': resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.59.0': - resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.57.1': resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} cpu: [x64] os: [darwin] - '@rollup/rollup-darwin-x64@4.59.0': - resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-freebsd-arm64@4.57.1': resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.59.0': - resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} - cpu: [arm64] - os: [freebsd] - '@rollup/rollup-freebsd-x64@4.57.1': resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.59.0': - resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} - cpu: [x64] - os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.57.1': resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.57.1': resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.59.0': - resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.57.1': resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.59.0': - resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.57.1': resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.59.0': - resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} - cpu: [loong64] - os: [linux] - '@rollup/rollup-linux-loong64-musl@4.57.1': resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loong64-musl@4.59.0': - resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} - cpu: [loong64] - os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.57.1': resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} - cpu: [ppc64] - os: [linux] - '@rollup/rollup-linux-ppc64-musl@4.57.1': resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-musl@4.59.0': - resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} - cpu: [ppc64] - os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.57.1': resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.59.0': - resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.57.1': resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.59.0': - resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.57.1': resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.59.0': - resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} - cpu: [s390x] - os: [linux] - '@rollup/rollup-linux-x64-gnu@4.57.1': resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.59.0': - resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.57.1': resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.59.0': - resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} - cpu: [x64] - os: [linux] - '@rollup/rollup-openbsd-x64@4.57.1': resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openbsd-x64@4.59.0': - resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} - cpu: [x64] - os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.57.1': resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-openharmony-arm64@4.59.0': - resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} - cpu: [arm64] - os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.57.1': resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.59.0': - resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.57.1': resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.59.0': - resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-x64-gnu@4.57.1': resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.59.0': - resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.57.1': resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.59.0': - resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} - cpu: [x64] - os: [win32] - '@rushstack/node-core-library@5.19.1': resolution: {integrity: sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA==} peerDependencies: @@ -4330,8 +4049,8 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/bun@1.3.10': - resolution: {integrity: sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ==} + '@types/bun@1.3.8': + resolution: {integrity: sha512-3LvWJ2q5GerAXYxO2mffLTqOzEu5qnhEAlh48Vnu8WQfnmSwbgagjGZV6BoHKJztENYEDn6QmVd949W4uESRJA==} '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -4415,9 +4134,6 @@ packages: '@types/node@22.19.8': resolution: {integrity: sha512-ebO/Yl+EAvVe8DnMfi+iaAyIqYdK0q/q0y0rw82INWEKJOBe6b/P3YWE8NW7oOlF/nXFNrHwhARrN/hdgDkraA==} - '@types/node@25.3.5': - resolution: {integrity: sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==} - '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -4429,8 +4145,8 @@ packages: peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.14': - resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/react@19.2.11': + resolution: {integrity: sha512-tORuanb01iEzWvMGVGv2ZDhYZVeRMrw453DCSAIn/5yvcSVnMoUMTyf33nQJLahYEnv9xqrTNbgz4qY5EfSh0g==} '@types/responselike@1.0.0': resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} @@ -4704,8 +4420,8 @@ packages: resolution: {integrity: sha512-EgyazlL0VejvZqWZ6KL3ig27Yl8RXcwhz1hayuqeAIxaqbsnmSmogL2zKXgGnm9y/A6QkPfZH1BcQoUh1STvtQ==} engines: {node: '>=18'} - '@vitejs/plugin-react@5.1.4': - resolution: {integrity: sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==} + '@vitejs/plugin-react@5.1.3': + resolution: {integrity: sha512-NVUnA6gQCl8jfoYqKqQU5Clv0aPw14KkZYCsX6T9Lfu9slI0LOU10OTwFHS/WmptsMMpshNd/1tuWsHQ2Uk+cg==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -5191,10 +4907,6 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@4.0.4: - resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} - engines: {node: 18 || 20 || >=22} - bare-events@2.8.2: resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} peerDependencies: @@ -5247,7 +4959,6 @@ packages: basic-ftp@5.1.0: resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} engines: {node: '>=10.0.0'} - deprecated: Security vulnerability fixed in 5.2.0, please upgrade bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} @@ -5309,10 +5020,6 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - brace-expansion@5.0.4: - resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} - engines: {node: 18 || 20 || >=22} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -5376,8 +5083,8 @@ packages: builtin-status-codes@3.0.0: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - bun-types@1.3.10: - resolution: {integrity: sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg==} + bun-types@1.3.8: + resolution: {integrity: sha512-fL99nxdOWvV4LqjmC+8Q9kW3M4QTtTR1eePs94v5ctGqU8OeceWrSUaRw3JYb7tU3FkMIAjkueehrHPPPGKi5Q==} bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} @@ -6310,11 +6017,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.27.3: - resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -6864,7 +6566,6 @@ packages: git-raw-commits@4.0.0: resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} engines: {node: '>=16'} - deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. hasBin: true git-up@7.0.0: @@ -8607,10 +8308,6 @@ packages: resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} engines: {node: 20 || >=22} - minimatch@10.2.4: - resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} - engines: {node: 18 || 20 || >=22} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -8630,10 +8327,6 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -8811,8 +8504,8 @@ packages: resolution: {integrity: sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==} engines: {node: '>=10'} - nodemon@3.1.14: - resolution: {integrity: sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==} + nodemon@3.1.11: + resolution: {integrity: sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==} engines: {node: '>=10'} hasBin: true @@ -9521,10 +9214,6 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} - engines: {node: ^10 || ^12 || >=14} - prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} @@ -9618,8 +9307,8 @@ packages: prosemirror-transform@1.11.0: resolution: {integrity: sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==} - prosemirror-view@1.41.6: - resolution: {integrity: sha512-mxpcDG4hNQa/CPtzxjdlir5bJFDlm0/x5nGBbStB2BWX+XOQ9M8ekEG+ojqB5BcVu2Rc80/jssCMZzSstJuSYg==} + prosemirror-view@1.41.5: + resolution: {integrity: sha512-UDQbIPnDrjE8tqUBbPmCOZgtd75htE6W3r0JCmY9bL6W1iemDM37MZEKC49d+tdQ0v/CKx4gjxLoLsfkD2NiZA==} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -10107,11 +9796,6 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rollup@4.59.0: - resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} @@ -10234,11 +9918,6 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} - hasBin: true - send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -11003,9 +10682,6 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici@7.20.0: resolution: {integrity: sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==} engines: {node: '>=20.18.1'} @@ -12520,7 +12196,7 @@ snapshots: '@commitlint/is-ignored@19.8.1': dependencies: '@commitlint/types': 19.8.1 - semver: 7.7.4 + semver: 7.7.3 '@commitlint/lint@19.8.1': dependencies: @@ -12671,234 +12347,156 @@ snapshots: '@esbuild/aix-ppc64@0.27.2': optional: true - '@esbuild/aix-ppc64@0.27.3': - optional: true - '@esbuild/android-arm64@0.25.12': optional: true '@esbuild/android-arm64@0.27.2': optional: true - '@esbuild/android-arm64@0.27.3': - optional: true - '@esbuild/android-arm@0.25.12': optional: true '@esbuild/android-arm@0.27.2': optional: true - '@esbuild/android-arm@0.27.3': - optional: true - '@esbuild/android-x64@0.25.12': optional: true '@esbuild/android-x64@0.27.2': optional: true - '@esbuild/android-x64@0.27.3': - optional: true - '@esbuild/darwin-arm64@0.25.12': optional: true '@esbuild/darwin-arm64@0.27.2': optional: true - '@esbuild/darwin-arm64@0.27.3': - optional: true - '@esbuild/darwin-x64@0.25.12': optional: true '@esbuild/darwin-x64@0.27.2': optional: true - '@esbuild/darwin-x64@0.27.3': - optional: true - '@esbuild/freebsd-arm64@0.25.12': optional: true '@esbuild/freebsd-arm64@0.27.2': optional: true - '@esbuild/freebsd-arm64@0.27.3': - optional: true - '@esbuild/freebsd-x64@0.25.12': optional: true '@esbuild/freebsd-x64@0.27.2': optional: true - '@esbuild/freebsd-x64@0.27.3': - optional: true - '@esbuild/linux-arm64@0.25.12': optional: true '@esbuild/linux-arm64@0.27.2': optional: true - '@esbuild/linux-arm64@0.27.3': - optional: true - '@esbuild/linux-arm@0.25.12': optional: true '@esbuild/linux-arm@0.27.2': optional: true - '@esbuild/linux-arm@0.27.3': - optional: true - '@esbuild/linux-ia32@0.25.12': optional: true '@esbuild/linux-ia32@0.27.2': optional: true - '@esbuild/linux-ia32@0.27.3': - optional: true - '@esbuild/linux-loong64@0.25.12': optional: true '@esbuild/linux-loong64@0.27.2': optional: true - '@esbuild/linux-loong64@0.27.3': - optional: true - '@esbuild/linux-mips64el@0.25.12': optional: true '@esbuild/linux-mips64el@0.27.2': optional: true - '@esbuild/linux-mips64el@0.27.3': - optional: true - '@esbuild/linux-ppc64@0.25.12': optional: true '@esbuild/linux-ppc64@0.27.2': optional: true - '@esbuild/linux-ppc64@0.27.3': - optional: true - '@esbuild/linux-riscv64@0.25.12': optional: true '@esbuild/linux-riscv64@0.27.2': optional: true - '@esbuild/linux-riscv64@0.27.3': - optional: true - '@esbuild/linux-s390x@0.25.12': optional: true '@esbuild/linux-s390x@0.27.2': optional: true - '@esbuild/linux-s390x@0.27.3': - optional: true - '@esbuild/linux-x64@0.25.12': optional: true '@esbuild/linux-x64@0.27.2': optional: true - '@esbuild/linux-x64@0.27.3': - optional: true - '@esbuild/netbsd-arm64@0.25.12': optional: true '@esbuild/netbsd-arm64@0.27.2': optional: true - '@esbuild/netbsd-arm64@0.27.3': - optional: true - '@esbuild/netbsd-x64@0.25.12': optional: true '@esbuild/netbsd-x64@0.27.2': optional: true - '@esbuild/netbsd-x64@0.27.3': - optional: true - '@esbuild/openbsd-arm64@0.25.12': optional: true '@esbuild/openbsd-arm64@0.27.2': optional: true - '@esbuild/openbsd-arm64@0.27.3': - optional: true - '@esbuild/openbsd-x64@0.25.12': optional: true '@esbuild/openbsd-x64@0.27.2': optional: true - '@esbuild/openbsd-x64@0.27.3': - optional: true - '@esbuild/openharmony-arm64@0.25.12': optional: true '@esbuild/openharmony-arm64@0.27.2': optional: true - '@esbuild/openharmony-arm64@0.27.3': - optional: true - '@esbuild/sunos-x64@0.25.12': optional: true '@esbuild/sunos-x64@0.27.2': optional: true - '@esbuild/sunos-x64@0.27.3': - optional: true - '@esbuild/win32-arm64@0.25.12': optional: true '@esbuild/win32-arm64@0.27.2': optional: true - '@esbuild/win32-arm64@0.27.3': - optional: true - '@esbuild/win32-ia32@0.25.12': optional: true '@esbuild/win32-ia32@0.27.2': optional: true - '@esbuild/win32-ia32@0.27.3': - optional: true - '@esbuild/win32-x64@0.25.12': optional: true '@esbuild/win32-x64@0.27.2': optional: true - '@esbuild/win32-x64@0.27.3': - optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': dependencies: eslint: 9.39.2(jiti@2.6.1) @@ -12945,22 +12543,22 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@floating-ui/core@1.7.5': + '@floating-ui/core@1.7.4': dependencies: - '@floating-ui/utils': 0.2.11 + '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.7.6': + '@floating-ui/dom@1.7.5': dependencies: - '@floating-ui/core': 1.7.5 - '@floating-ui/utils': 0.2.11 + '@floating-ui/core': 1.7.4 + '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.8(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': + '@floating-ui/react-dom@2.1.7(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': dependencies: - '@floating-ui/dom': 1.7.6 + '@floating-ui/dom': 1.7.5 react: 19.2.3 react-dom: 19.2.4(react@19.2.3) - '@floating-ui/utils@0.2.11': {} + '@floating-ui/utils@0.2.10': {} '@hocuspocus/common@2.15.3': dependencies: @@ -13180,128 +12778,128 @@ snapshots: '@inquirer/ansi@1.0.2': {} - '@inquirer/checkbox@4.3.2(@types/node@25.3.5)': + '@inquirer/checkbox@4.3.2(@types/node@22.19.8)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.3.5) + '@inquirer/core': 10.3.2(@types/node@22.19.8) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.3.5) + '@inquirer/type': 3.0.10(@types/node@22.19.8) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 - '@inquirer/confirm@5.1.21(@types/node@25.3.5)': + '@inquirer/confirm@5.1.21(@types/node@22.19.8)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.5) - '@inquirer/type': 3.0.10(@types/node@25.3.5) + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 - '@inquirer/core@10.3.2(@types/node@25.3.5)': + '@inquirer/core@10.3.2(@types/node@22.19.8)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.3.5) + '@inquirer/type': 3.0.10(@types/node@22.19.8) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 - '@inquirer/editor@4.2.23(@types/node@25.3.5)': + '@inquirer/editor@4.2.23(@types/node@22.19.8)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.5) - '@inquirer/external-editor': 1.0.3(@types/node@25.3.5) - '@inquirer/type': 3.0.10(@types/node@25.3.5) + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/external-editor': 1.0.3(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 - '@inquirer/expand@4.0.23(@types/node@25.3.5)': + '@inquirer/expand@4.0.23(@types/node@22.19.8)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.5) - '@inquirer/type': 3.0.10(@types/node@25.3.5) + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 - '@inquirer/external-editor@1.0.3(@types/node@25.3.5)': + '@inquirer/external-editor@1.0.3(@types/node@22.19.8)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 '@inquirer/figures@1.0.15': {} - '@inquirer/input@4.3.1(@types/node@25.3.5)': + '@inquirer/input@4.3.1(@types/node@22.19.8)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.5) - '@inquirer/type': 3.0.10(@types/node@25.3.5) + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 - '@inquirer/number@3.0.23(@types/node@25.3.5)': + '@inquirer/number@3.0.23(@types/node@22.19.8)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.5) - '@inquirer/type': 3.0.10(@types/node@25.3.5) + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 - '@inquirer/password@4.0.23(@types/node@25.3.5)': + '@inquirer/password@4.0.23(@types/node@22.19.8)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.3.5) - '@inquirer/type': 3.0.10(@types/node@25.3.5) + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) optionalDependencies: - '@types/node': 25.3.5 - - '@inquirer/prompts@7.9.0(@types/node@25.3.5)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@25.3.5) - '@inquirer/confirm': 5.1.21(@types/node@25.3.5) - '@inquirer/editor': 4.2.23(@types/node@25.3.5) - '@inquirer/expand': 4.0.23(@types/node@25.3.5) - '@inquirer/input': 4.3.1(@types/node@25.3.5) - '@inquirer/number': 3.0.23(@types/node@25.3.5) - '@inquirer/password': 4.0.23(@types/node@25.3.5) - '@inquirer/rawlist': 4.1.11(@types/node@25.3.5) - '@inquirer/search': 3.2.2(@types/node@25.3.5) - '@inquirer/select': 4.4.2(@types/node@25.3.5) + '@types/node': 22.19.8 + + '@inquirer/prompts@7.9.0(@types/node@22.19.8)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@22.19.8) + '@inquirer/confirm': 5.1.21(@types/node@22.19.8) + '@inquirer/editor': 4.2.23(@types/node@22.19.8) + '@inquirer/expand': 4.0.23(@types/node@22.19.8) + '@inquirer/input': 4.3.1(@types/node@22.19.8) + '@inquirer/number': 3.0.23(@types/node@22.19.8) + '@inquirer/password': 4.0.23(@types/node@22.19.8) + '@inquirer/rawlist': 4.1.11(@types/node@22.19.8) + '@inquirer/search': 3.2.2(@types/node@22.19.8) + '@inquirer/select': 4.4.2(@types/node@22.19.8) optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 - '@inquirer/rawlist@4.1.11(@types/node@25.3.5)': + '@inquirer/rawlist@4.1.11(@types/node@22.19.8)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.5) - '@inquirer/type': 3.0.10(@types/node@25.3.5) + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 - '@inquirer/search@3.2.2(@types/node@25.3.5)': + '@inquirer/search@3.2.2(@types/node@22.19.8)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.5) + '@inquirer/core': 10.3.2(@types/node@22.19.8) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.3.5) + '@inquirer/type': 3.0.10(@types/node@22.19.8) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 - '@inquirer/select@4.4.2(@types/node@25.3.5)': + '@inquirer/select@4.4.2(@types/node@22.19.8)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.3.5) + '@inquirer/core': 10.3.2(@types/node@22.19.8) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.3.5) + '@inquirer/type': 3.0.10(@types/node@22.19.8) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 - '@inquirer/type@3.0.10(@types/node@25.3.5)': + '@inquirer/type@3.0.10(@types/node@22.19.8)': optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 '@isaacs/balanced-match@4.0.1': {} @@ -13387,10 +12985,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.3)': + '@mdx-js/react@3.1.1(@types/react@19.2.11)(react@19.2.3)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 19.2.14 + '@types/react': 19.2.11 react: 19.2.3 '@microsoft/api-extractor-model@7.32.2(@types/node@22.19.2)': @@ -13401,11 +12999,11 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor-model@7.32.2(@types/node@25.3.5)': + '@microsoft/api-extractor-model@7.32.2(@types/node@22.19.8)': dependencies: '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.0 - '@rushstack/node-core-library': 5.19.1(@types/node@25.3.5) + '@rushstack/node-core-library': 5.19.1(@types/node@22.19.8) transitivePeerDependencies: - '@types/node' @@ -13428,15 +13026,15 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.56.1(@types/node@25.3.5)': + '@microsoft/api-extractor@7.56.1(@types/node@22.19.8)': dependencies: - '@microsoft/api-extractor-model': 7.32.2(@types/node@25.3.5) + '@microsoft/api-extractor-model': 7.32.2(@types/node@22.19.8) '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.0 - '@rushstack/node-core-library': 5.19.1(@types/node@25.3.5) + '@rushstack/node-core-library': 5.19.1(@types/node@22.19.8) '@rushstack/rig-package': 0.6.0 - '@rushstack/terminal': 0.21.0(@types/node@25.3.5) - '@rushstack/ts-command-line': 5.2.0(@types/node@25.3.5) + '@rushstack/terminal': 0.21.0(@types/node@22.19.8) + '@rushstack/ts-command-line': 5.2.0(@types/node@22.19.8) diff: 8.0.3 lodash: 4.17.23 minimatch: 10.0.3 @@ -13456,23 +13054,23 @@ snapshots: '@microsoft/tsdoc@0.16.0': {} - '@mintlify/cli@4.0.935(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/node@25.3.5)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(typescript@5.9.3)': + '@mintlify/cli@4.0.935(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/node@22.19.8)(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(typescript@5.9.3)': dependencies: - '@inquirer/prompts': 7.9.0(@types/node@25.3.5) - '@mintlify/common': 1.0.713(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) - '@mintlify/link-rot': 3.0.872(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@inquirer/prompts': 7.9.0(@types/node@22.19.8) + '@mintlify/common': 1.0.713(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/link-rot': 3.0.872(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@mintlify/models': 0.0.268 - '@mintlify/prebuild': 1.0.849(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) - '@mintlify/previewing': 4.0.905(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(typescript@5.9.3) - '@mintlify/validation': 0.1.585(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/prebuild': 1.0.849(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/previewing': 4.0.905(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(typescript@5.9.3) + '@mintlify/validation': 0.1.585(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) adm-zip: 0.5.16 chalk: 5.2.0 color: 4.2.3 detect-port: 1.5.1 front-matter: 4.0.2 fs-extra: 11.2.0 - ink: 6.3.0(@types/react@19.2.14)(react@19.2.3) - inquirer: 12.3.0(@types/node@25.3.5) + ink: 6.3.0(@types/react@19.2.11)(react@19.2.3) + inquirer: 12.3.0(@types/node@22.19.8) js-yaml: 4.1.0 mdast-util-mdx-jsx: 3.2.0 react: 19.2.3 @@ -13496,13 +13094,13 @@ snapshots: - typescript - utf-8-validate - '@mintlify/common@1.0.661(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': + '@mintlify/common@1.0.661(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': dependencies: '@asyncapi/parser': 3.4.0 - '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@mintlify/models': 0.0.255 '@mintlify/openapi-parser': 0.0.8 - '@mintlify/validation': 0.1.555(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/validation': 0.1.555(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@sindresorhus/slugify': 2.2.0 '@types/mdast': 4.0.4 acorn: 8.11.2 @@ -13556,14 +13154,14 @@ snapshots: - ts-node - typescript - '@mintlify/common@1.0.713(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': + '@mintlify/common@1.0.713(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': dependencies: '@asyncapi/parser': 3.4.0 '@asyncapi/specs': 6.8.1 - '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@mintlify/models': 0.0.268 '@mintlify/openapi-parser': 0.0.8 - '@mintlify/validation': 0.1.585(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/validation': 0.1.585(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@sindresorhus/slugify': 2.2.0 '@types/mdast': 4.0.4 acorn: 8.11.2 @@ -13617,13 +13215,13 @@ snapshots: - ts-node - typescript - '@mintlify/link-rot@3.0.872(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': + '@mintlify/link-rot@3.0.872(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': dependencies: - '@mintlify/common': 1.0.713(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) - '@mintlify/prebuild': 1.0.849(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) - '@mintlify/previewing': 4.0.905(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(typescript@5.9.3) - '@mintlify/scraping': 4.0.522(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) - '@mintlify/validation': 0.1.585(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/common': 1.0.713(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/prebuild': 1.0.849(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/previewing': 4.0.905(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(typescript@5.9.3) + '@mintlify/scraping': 4.0.522(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/validation': 0.1.585(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) fs-extra: 11.1.0 unist-util-visit: 4.1.2 transitivePeerDependencies: @@ -13643,9 +13241,9 @@ snapshots: - typescript - utf-8-validate - '@mintlify/mdx@3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': + '@mintlify/mdx@3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': dependencies: - '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) '@shikijs/transformers': 3.22.0 '@shikijs/twoslash': 3.22.0(typescript@5.9.3) arktype: 2.1.29 @@ -13654,7 +13252,7 @@ snapshots: mdast-util-gfm: 3.1.0 mdast-util-mdx-jsx: 3.2.0 mdast-util-to-hast: 13.2.1 - next-mdx-remote-client: 1.1.4(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(unified@11.0.5) + next-mdx-remote-client: 1.1.4(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(unified@11.0.5) react: 19.2.3 react-dom: 19.2.4(react@19.2.3) rehype-katex: 7.0.1 @@ -13692,12 +13290,12 @@ snapshots: leven: 4.1.0 yaml: 2.8.2 - '@mintlify/prebuild@1.0.849(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': + '@mintlify/prebuild@1.0.849(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': dependencies: - '@mintlify/common': 1.0.713(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/common': 1.0.713(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@mintlify/openapi-parser': 0.0.8 - '@mintlify/scraping': 4.0.574(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) - '@mintlify/validation': 0.1.585(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/scraping': 4.0.574(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/validation': 0.1.585(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) chalk: 5.3.0 favicons: 7.2.0 front-matter: 4.0.2 @@ -13724,11 +13322,11 @@ snapshots: - typescript - utf-8-validate - '@mintlify/previewing@4.0.905(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(typescript@5.9.3)': + '@mintlify/previewing@4.0.905(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(typescript@5.9.3)': dependencies: - '@mintlify/common': 1.0.713(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) - '@mintlify/prebuild': 1.0.849(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) - '@mintlify/validation': 0.1.585(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/common': 1.0.713(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/prebuild': 1.0.849(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/validation': 0.1.585(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) better-opn: 3.0.2 chalk: 5.2.0 chokidar: 3.5.3 @@ -13736,8 +13334,8 @@ snapshots: front-matter: 4.0.2 fs-extra: 11.1.0 got: 13.0.0 - ink: 6.3.0(@types/react@19.2.14)(react@19.2.3) - ink-spinner: 5.0.0(ink@6.3.0(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + ink: 6.3.0(@types/react@19.2.11)(react@19.2.3) + ink-spinner: 5.0.0(ink@6.3.0(@types/react@19.2.11)(react@19.2.3))(react@19.2.3) is-online: 10.0.0 js-yaml: 4.1.0 openapi-types: 12.1.3 @@ -13762,9 +13360,9 @@ snapshots: - typescript - utf-8-validate - '@mintlify/scraping@4.0.522(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': + '@mintlify/scraping@4.0.522(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': dependencies: - '@mintlify/common': 1.0.661(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/common': 1.0.661(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@mintlify/openapi-parser': 0.0.8 fs-extra: 11.1.1 hast-util-to-mdast: 10.1.0 @@ -13797,9 +13395,9 @@ snapshots: - typescript - utf-8-validate - '@mintlify/scraping@4.0.574(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': + '@mintlify/scraping@4.0.574(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': dependencies: - '@mintlify/common': 1.0.713(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/common': 1.0.713(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@mintlify/openapi-parser': 0.0.8 fs-extra: 11.1.1 hast-util-to-mdast: 10.1.0 @@ -13832,9 +13430,9 @@ snapshots: - typescript - utf-8-validate - '@mintlify/validation@0.1.555(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': + '@mintlify/validation@0.1.555(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': dependencies: - '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@mintlify/models': 0.0.255 arktype: 2.1.27 js-yaml: 4.1.0 @@ -13854,9 +13452,9 @@ snapshots: - supports-color - typescript - '@mintlify/validation@0.1.585(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': + '@mintlify/validation@0.1.585(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': dependencies: - '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + '@mintlify/mdx': 3.0.4(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@mintlify/models': 0.0.268 arktype: 2.1.27 js-yaml: 4.1.0 @@ -14078,7 +13676,7 @@ snapshots: extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.5.0 - semver: 7.7.4 + semver: 7.7.3 tar-fs: 3.1.1 unbzip2-stream: 1.4.3 yargs: 17.7.2 @@ -14090,188 +13688,188 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) react: 19.2.3 react-dom: 19.2.4(react@19.2.3) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.11 + '@types/react-dom': 19.2.3(@types/react@19.2.11) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.3)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.11)(react@19.2.3)': dependencies: react: 19.2.3 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@19.2.3)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.11)(react@19.2.3)': dependencies: react: 19.2.3 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.11)(react@19.2.3) react: 19.2.3 react-dom: 19.2.4(react@19.2.3) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.11 + '@types/react-dom': 19.2.3(@types/react@19.2.11) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.3)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.11)(react@19.2.3)': dependencies: react: 19.2.3 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.11)(react@19.2.3) react: 19.2.3 react-dom: 19.2.4(react@19.2.3) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.11 + '@types/react-dom': 19.2.3(@types/react@19.2.11) - '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.3)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.11)(react@19.2.3)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.3) react: 19.2.3 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.11)(react@19.2.3) aria-hidden: 1.2.6 react: 19.2.3 react-dom: 19.2.4(react@19.2.3) - react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.3) + react-remove-scroll: 2.7.2(@types/react@19.2.11)(react@19.2.3) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': - dependencies: - '@floating-ui/react-dom': 2.1.8(react-dom@19.2.4(react@19.2.3))(react@19.2.3) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@types/react': 19.2.11 + '@types/react-dom': 19.2.3(@types/react@19.2.11) + + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.11)(react@19.2.3) '@radix-ui/rect': 1.1.1 react: 19.2.3 react-dom: 19.2.4(react@19.2.3) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.11 + '@types/react-dom': 19.2.3(@types/react@19.2.11) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.3) react: 19.2.3 react-dom: 19.2.4(react@19.2.3) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.11 + '@types/react-dom': 19.2.3(@types/react@19.2.11) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.3) react: 19.2.3 react-dom: 19.2.4(react@19.2.3) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.11 + '@types/react-dom': 19.2.3(@types/react@19.2.11) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.11)(react@19.2.3) react: 19.2.3 react-dom: 19.2.4(react@19.2.3) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.11 + '@types/react-dom': 19.2.3(@types/react@19.2.11) - '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.3)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.11)(react@19.2.3)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.11)(react@19.2.3) react: 19.2.3 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.3)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.11)(react@19.2.3)': dependencies: react: 19.2.3 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.3)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.11)(react@19.2.3)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.11)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.3) react: 19.2.3 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.3)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.11)(react@19.2.3)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.3) react: 19.2.3 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@19.2.3)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.11)(react@19.2.3)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.11)(react@19.2.3) react: 19.2.3 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.3)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.11)(react@19.2.3)': dependencies: react: 19.2.3 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@19.2.3)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.11)(react@19.2.3)': dependencies: '@radix-ui/rect': 1.1.1 react: 19.2.3 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@19.2.3)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.11)(react@19.2.3)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.11)(react@19.2.3) react: 19.2.3 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 '@radix-ui/rect@1.1.1': {} @@ -14320,174 +13918,99 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.53': {} - '@rolldown/pluginutils@1.0.0-rc.3': {} + '@rolldown/pluginutils@1.0.0-rc.2': {} - '@rollup/plugin-inject@5.0.5(rollup@4.59.0)': + '@rollup/plugin-inject@5.0.5(rollup@4.57.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) estree-walker: 2.0.2 magic-string: 0.30.21 optionalDependencies: - rollup: 4.59.0 + rollup: 4.57.1 - '@rollup/pluginutils@5.3.0(rollup@4.59.0)': + '@rollup/pluginutils@5.3.0(rollup@4.57.1)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.59.0 + rollup: 4.57.1 '@rollup/rollup-android-arm-eabi@4.57.1': optional: true - '@rollup/rollup-android-arm-eabi@4.59.0': - optional: true - '@rollup/rollup-android-arm64@4.57.1': optional: true - '@rollup/rollup-android-arm64@4.59.0': - optional: true - '@rollup/rollup-darwin-arm64@4.57.1': optional: true - '@rollup/rollup-darwin-arm64@4.59.0': - optional: true - '@rollup/rollup-darwin-x64@4.57.1': optional: true - '@rollup/rollup-darwin-x64@4.59.0': - optional: true - '@rollup/rollup-freebsd-arm64@4.57.1': optional: true - '@rollup/rollup-freebsd-arm64@4.59.0': - optional: true - '@rollup/rollup-freebsd-x64@4.57.1': optional: true - '@rollup/rollup-freebsd-x64@4.59.0': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.57.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.59.0': - optional: true - '@rollup/rollup-linux-arm64-musl@4.57.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.59.0': - optional: true - '@rollup/rollup-linux-loong64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.59.0': - optional: true - '@rollup/rollup-linux-loong64-musl@4.57.1': optional: true - '@rollup/rollup-linux-loong64-musl@4.59.0': - optional: true - '@rollup/rollup-linux-ppc64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - optional: true - '@rollup/rollup-linux-ppc64-musl@4.57.1': optional: true - '@rollup/rollup-linux-ppc64-musl@4.59.0': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.59.0': - optional: true - '@rollup/rollup-linux-riscv64-musl@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.59.0': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.57.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.59.0': - optional: true - '@rollup/rollup-linux-x64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.59.0': - optional: true - '@rollup/rollup-linux-x64-musl@4.57.1': optional: true - '@rollup/rollup-linux-x64-musl@4.59.0': - optional: true - '@rollup/rollup-openbsd-x64@4.57.1': optional: true - '@rollup/rollup-openbsd-x64@4.59.0': - optional: true - '@rollup/rollup-openharmony-arm64@4.57.1': optional: true - '@rollup/rollup-openharmony-arm64@4.59.0': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.57.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.59.0': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.57.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.59.0': - optional: true - '@rollup/rollup-win32-x64-gnu@4.57.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.59.0': - optional: true - '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.59.0': - optional: true - '@rushstack/node-core-library@5.19.1(@types/node@22.19.2)': dependencies: ajv: 8.13.0 @@ -14501,7 +14024,7 @@ snapshots: optionalDependencies: '@types/node': 22.19.2 - '@rushstack/node-core-library@5.19.1(@types/node@25.3.5)': + '@rushstack/node-core-library@5.19.1(@types/node@22.19.8)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -14512,15 +14035,15 @@ snapshots: resolve: 1.22.11 semver: 7.5.4 optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 '@rushstack/problem-matcher@0.1.1(@types/node@22.19.2)': optionalDependencies: '@types/node': 22.19.2 - '@rushstack/problem-matcher@0.1.1(@types/node@25.3.5)': + '@rushstack/problem-matcher@0.1.1(@types/node@22.19.8)': optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 '@rushstack/rig-package@0.6.0': dependencies: @@ -14535,13 +14058,13 @@ snapshots: optionalDependencies: '@types/node': 22.19.2 - '@rushstack/terminal@0.21.0(@types/node@25.3.5)': + '@rushstack/terminal@0.21.0(@types/node@22.19.8)': dependencies: - '@rushstack/node-core-library': 5.19.1(@types/node@25.3.5) - '@rushstack/problem-matcher': 0.1.1(@types/node@25.3.5) + '@rushstack/node-core-library': 5.19.1(@types/node@22.19.8) + '@rushstack/problem-matcher': 0.1.1(@types/node@22.19.8) supports-color: 8.1.1 optionalDependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 '@rushstack/ts-command-line@5.2.0(@types/node@22.19.2)': dependencies: @@ -14552,9 +14075,9 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@rushstack/ts-command-line@5.2.0(@types/node@25.3.5)': + '@rushstack/ts-command-line@5.2.0(@types/node@22.19.8)': dependencies: - '@rushstack/terminal': 0.21.0(@types/node@25.3.5) + '@rushstack/terminal': 0.21.0(@types/node@22.19.8) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -15251,15 +14774,15 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 '@testing-library/dom': 10.4.1 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.11 + '@types/react-dom': 19.2.3(@types/react@19.2.11) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: @@ -15301,9 +14824,9 @@ snapshots: dependencies: '@babel/types': 7.29.0 - '@types/bun@1.3.10': + '@types/bun@1.3.8': dependencies: - bun-types: 1.3.10 + bun-types: 1.3.8 '@types/chai@5.2.3': dependencies: @@ -15318,7 +14841,7 @@ snapshots: '@types/cors@2.8.19': dependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 '@types/debug@4.1.12': dependencies: @@ -15328,7 +14851,7 @@ snapshots: '@types/es-aggregate-error@1.0.6': dependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 '@types/estree-jsx@1.0.5': dependencies: @@ -15345,7 +14868,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 25.3.5 + '@types/node': 22.19.8 '@types/hast@2.3.10': dependencies: @@ -15379,7 +14902,7 @@ snapshots: '@types/minimatch@6.0.0': dependencies: - minimatch: 10.2.4 + minimatch: 10.1.2 '@types/ms@2.1.0': {} @@ -15395,25 +14918,21 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@25.3.5': - dependencies: - undici-types: 7.18.2 - '@types/normalize-package-data@2.4.4': {} '@types/parse5@6.0.3': {} - '@types/react-dom@19.2.3(@types/react@19.2.14)': + '@types/react-dom@19.2.3(@types/react@19.2.11)': dependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - '@types/react@19.2.14': + '@types/react@19.2.11': dependencies: csstype: 3.2.3 '@types/responselike@1.0.0': dependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 '@types/supports-color@8.1.3': {} @@ -15433,7 +14952,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 25.3.5 + '@types/node': 22.19.8 optional: true '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': @@ -15503,8 +15022,8 @@ snapshots: '@typescript-eslint/types': 8.54.0 '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3(supports-color@5.5.0) - minimatch: 9.0.9 - semver: 7.7.4 + minimatch: 9.0.5 + semver: 7.7.3 tinyglobby: 0.2.15 ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 @@ -15760,34 +15279,34 @@ snapshots: lodash: 4.17.21 minimatch: 7.4.6 - '@vitejs/plugin-react@5.1.4(rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@5.1.3(rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) - '@rolldown/pluginutils': 1.0.0-rc.3 + '@rolldown/pluginutils': 1.0.0-rc.2 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + vite: rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@5.1.4(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@5.1.3(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) - '@rolldown/pluginutils': 1.0.0-rc.3 + '@rolldown/pluginutils': 1.0.0-rc.2 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + vite: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.2(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.2(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.50 - vite: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + vite: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) vue: 3.5.25(typescript@5.9.3) '@vitejs/plugin-vue@6.0.2(vite@7.3.1(@types/node@22.19.2)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': @@ -15796,7 +15315,7 @@ snapshots: vite: 7.3.1(@types/node@22.19.2)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) vue: 3.5.25(typescript@5.9.3) - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -15811,7 +15330,7 @@ snapshots: std-env: 3.10.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -15831,21 +15350,13 @@ snapshots: optionalDependencies: vite: rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@3.2.4(rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) - - '@vitest/mocker@3.2.4(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + vite: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@3.2.4': dependencies: @@ -15999,7 +15510,7 @@ snapshots: '@vue/compiler-vue2': 2.7.16 '@vue/shared': 3.5.25 alien-signals: 0.4.14 - minimatch: 9.0.9 + minimatch: 9.0.5 muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: @@ -16381,8 +15892,6 @@ snapshots: balanced-match@1.0.2: {} - balanced-match@4.0.4: {} - bare-events@2.8.2: {} bare-fs@4.5.3: @@ -16530,10 +16039,6 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.4: - dependencies: - balanced-match: 4.0.4 - braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -16622,9 +16127,9 @@ snapshots: builtin-status-codes@3.0.0: {} - bun-types@1.3.10: + bun-types@1.3.8: dependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.8 bundle-name@4.1.0: dependencies: @@ -17010,7 +16515,7 @@ snapshots: conventional-commits-filter: 5.0.0 handlebars: 4.7.8 meow: 13.2.0 - semver: 7.7.4 + semver: 7.7.3 conventional-commits-filter@5.0.0: {} @@ -17463,7 +16968,7 @@ snapshots: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.1 - semver: 7.7.4 + semver: 7.7.3 ee-first@1.1.1: {} @@ -17506,7 +17011,7 @@ snapshots: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.19 - '@types/node': 25.3.5 + '@types/node': 22.19.8 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 @@ -17730,35 +17235,6 @@ snapshots: '@esbuild/win32-ia32': 0.27.2 '@esbuild/win32-x64': 0.27.2 - esbuild@0.27.3: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.3 - '@esbuild/android-arm': 0.27.3 - '@esbuild/android-arm64': 0.27.3 - '@esbuild/android-x64': 0.27.3 - '@esbuild/darwin-arm64': 0.27.3 - '@esbuild/darwin-x64': 0.27.3 - '@esbuild/freebsd-arm64': 0.27.3 - '@esbuild/freebsd-x64': 0.27.3 - '@esbuild/linux-arm': 0.27.3 - '@esbuild/linux-arm64': 0.27.3 - '@esbuild/linux-ia32': 0.27.3 - '@esbuild/linux-loong64': 0.27.3 - '@esbuild/linux-mips64el': 0.27.3 - '@esbuild/linux-ppc64': 0.27.3 - '@esbuild/linux-riscv64': 0.27.3 - '@esbuild/linux-s390x': 0.27.3 - '@esbuild/linux-x64': 0.27.3 - '@esbuild/netbsd-arm64': 0.27.3 - '@esbuild/netbsd-x64': 0.27.3 - '@esbuild/openbsd-arm64': 0.27.3 - '@esbuild/openbsd-x64': 0.27.3 - '@esbuild/openharmony-arm64': 0.27.3 - '@esbuild/sunos-x64': 0.27.3 - '@esbuild/win32-arm64': 0.27.3 - '@esbuild/win32-ia32': 0.27.3 - '@esbuild/win32-x64': 0.27.3 - escalade@3.2.0: {} escape-html@1.0.3: {} @@ -19152,13 +18628,13 @@ snapshots: ini@4.1.1: {} - ink-spinner@5.0.0(ink@6.3.0(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): + ink-spinner@5.0.0(ink@6.3.0(@types/react@19.2.11)(react@19.2.3))(react@19.2.3): dependencies: cli-spinners: 2.9.2 - ink: 6.3.0(@types/react@19.2.14)(react@19.2.3) + ink: 6.3.0(@types/react@19.2.11)(react@19.2.3) react: 19.2.3 - ink@6.3.0(@types/react@19.2.14)(react@19.2.3): + ink@6.3.0(@types/react@19.2.11)(react@19.2.3): dependencies: '@alcalzone/ansi-tokenize': 0.2.4 ansi-escapes: 7.3.0 @@ -19185,19 +18661,19 @@ snapshots: ws: 8.19.0 yoga-layout: 3.2.1 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 transitivePeerDependencies: - bufferutil - utf-8-validate inline-style-parser@0.2.7: {} - inquirer@12.3.0(@types/node@25.3.5): + inquirer@12.3.0(@types/node@22.19.8): dependencies: - '@inquirer/core': 10.3.2(@types/node@25.3.5) - '@inquirer/prompts': 7.9.0(@types/node@25.3.5) - '@inquirer/type': 3.0.10(@types/node@25.3.5) - '@types/node': 25.3.5 + '@inquirer/core': 10.3.2(@types/node@22.19.8) + '@inquirer/prompts': 7.9.0(@types/node@22.19.8) + '@inquirer/type': 3.0.10(@types/node@22.19.8) + '@types/node': 22.19.8 ansi-escapes: 4.3.2 mute-stream: 2.0.0 run-async: 3.0.0 @@ -19960,7 +19436,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.4 + semver: 7.7.3 map-cache@0.2.2: {} @@ -20888,10 +20364,6 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.1 - minimatch@10.2.4: - dependencies: - brace-expansion: 5.0.4 - minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -20912,10 +20384,6 @@ snapshots: dependencies: brace-expansion: 2.0.2 - minimatch@9.0.9: - dependencies: - brace-expansion: 2.0.2 - minimist@1.2.8: {} minipass@3.3.6: @@ -20931,9 +20399,9 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 - mintlify@4.2.331(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/node@25.3.5)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(typescript@5.9.3): + mintlify@4.2.331(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/node@22.19.8)(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(typescript@5.9.3): dependencies: - '@mintlify/cli': 4.0.935(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/node@25.3.5)(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(typescript@5.9.3) + '@mintlify/cli': 4.0.935(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.11))(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3))(@types/node@22.19.8)(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(typescript@5.9.3) transitivePeerDependencies: - '@radix-ui/react-popover' - '@types/node' @@ -21029,11 +20497,11 @@ snapshots: netmask@2.0.2: {} - next-mdx-remote-client@1.1.4(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(unified@11.0.5): + next-mdx-remote-client@1.1.4(@types/react@19.2.11)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(unified@11.0.5): dependencies: '@babel/code-frame': 7.29.0 '@mdx-js/mdx': 3.1.1 - '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.3) + '@mdx-js/react': 3.1.1(@types/react@19.2.11)(react@19.2.3) react: 19.2.3 react-dom: 19.2.4(react@19.2.3) remark-mdx-remove-esm: 1.2.2(unified@11.0.5) @@ -21061,7 +20529,7 @@ snapshots: node-abi@3.87.0: dependencies: - semver: 7.7.4 + semver: 7.7.3 node-addon-api@4.3.0: optional: true @@ -21126,14 +20594,14 @@ snapshots: util: 0.12.5 vm-browserify: 1.1.2 - nodemon@3.1.14: + nodemon@3.1.11: dependencies: chokidar: 3.6.0 debug: 4.4.3(supports-color@5.5.0) ignore-by-default: 1.0.1 - minimatch: 10.2.4 + minimatch: 3.1.2 pstree.remy: 1.1.8 - semver: 7.7.4 + semver: 7.7.3 simple-update-notifier: 2.0.0 supports-color: 5.5.0 touch: 3.1.1 @@ -21154,13 +20622,13 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.16.1 - semver: 7.7.4 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.4 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -21659,18 +21127,18 @@ snapshots: optionalDependencies: postcss: 8.5.6 - postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(yaml@2.8.2): + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.2): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.6.1 - postcss: 8.5.8 + postcss: 8.5.6 tsx: 4.21.0 yaml: 2.8.2 - postcss-nested-import@1.3.0(postcss@8.5.8): + postcss-nested-import@1.3.0(postcss@8.5.6): dependencies: - postcss: 8.5.8 + postcss: 8.5.6 resolve: 1.22.11 postcss-nested@6.2.0(postcss@8.5.6): @@ -21678,14 +21146,9 @@ snapshots: postcss: 8.5.6 postcss-selector-parser: 6.1.2 - postcss-nested@6.2.0(postcss@8.5.8): + postcss-prefixwrap@1.57.2(postcss@8.5.6): dependencies: - postcss: 8.5.8 - postcss-selector-parser: 6.1.2 - - postcss-prefixwrap@1.57.2(postcss@8.5.8): - dependencies: - postcss: 8.5.8 + postcss: 8.5.6 postcss-selector-parser@6.1.2: dependencies: @@ -21700,12 +21163,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.8: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - prebuild-install@7.1.3: dependencies: detect-libc: 2.1.2 @@ -21767,20 +21224,20 @@ snapshots: dependencies: prosemirror-state: 1.4.4 prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.6 + prosemirror-view: 1.41.5 prosemirror-gapcursor@1.4.0: dependencies: prosemirror-keymap: 1.2.3 prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-view: 1.41.6 + prosemirror-view: 1.41.5 prosemirror-history@1.5.0: dependencies: prosemirror-state: 1.4.4 prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.6 + prosemirror-view: 1.41.5 rope-sequence: 1.3.4 prosemirror-inputrules@1.5.1: @@ -21811,7 +21268,7 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.6 + prosemirror-view: 1.41.5 prosemirror-tables@1.8.5: dependencies: @@ -21819,7 +21276,7 @@ snapshots: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.6 + prosemirror-view: 1.41.5 prosemirror-test-builder@1.1.1: dependencies: @@ -21831,7 +21288,7 @@ snapshots: dependencies: prosemirror-model: 1.25.4 - prosemirror-view@1.41.6: + prosemirror-view@1.41.5: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 @@ -22012,32 +21469,32 @@ snapshots: react-refresh@0.18.0: {} - react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.3): + react-remove-scroll-bar@2.3.8(@types/react@19.2.11)(react@19.2.3): dependencies: react: 19.2.3 - react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.3) + react-style-singleton: 2.2.3(@types/react@19.2.11)(react@19.2.3) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - react-remove-scroll@2.7.2(@types/react@19.2.14)(react@19.2.3): + react-remove-scroll@2.7.2(@types/react@19.2.11)(react@19.2.3): dependencies: react: 19.2.3 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.14)(react@19.2.3) - react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.3) + react-remove-scroll-bar: 2.3.8(@types/react@19.2.11)(react@19.2.3) + react-style-singleton: 2.2.3(@types/react@19.2.11)(react@19.2.3) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.14)(react@19.2.3) - use-sidecar: 1.1.3(@types/react@19.2.14)(react@19.2.3) + use-callback-ref: 1.3.3(@types/react@19.2.11)(react@19.2.3) + use-sidecar: 1.1.3(@types/react@19.2.11)(react@19.2.3) optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.3): + react-style-singleton@2.2.3(@types/react@19.2.11)(react@19.2.3): dependencies: get-nonce: 1.0.1 react: 19.2.3 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 react@19.2.3: {} @@ -22492,7 +21949,7 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2): + rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@oxc-project/runtime': 0.101.0 fdir: 6.5.0(picomatch@4.0.3) @@ -22502,25 +21959,8 @@ snapshots: rolldown: 1.0.0-beta.53 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.19.2 - esbuild: 0.27.3 - fsevents: 2.3.3 - jiti: 2.6.1 - tsx: 4.21.0 - yaml: 2.8.2 - - rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - '@oxc-project/runtime': 0.101.0 - fdir: 6.5.0(picomatch@4.0.3) - lightningcss: 1.31.1 - picomatch: 4.0.3 - postcss: 8.5.6 - rolldown: 1.0.0-beta.53 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 25.3.5 - esbuild: 0.27.3 + '@types/node': 22.19.8 + esbuild: 0.27.2 fsevents: 2.3.3 jiti: 2.6.1 tsx: 4.21.0 @@ -22553,14 +21993,14 @@ snapshots: globby: 10.0.1 is-plain-object: 3.0.1 - rollup-plugin-visualizer@5.14.0(rollup@4.59.0): + rollup-plugin-visualizer@5.14.0(rollup@4.57.1): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: - rollup: 4.59.0 + rollup: 4.57.1 rollup@4.57.1: dependencies: @@ -22593,37 +22033,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 - rollup@4.59.0: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.59.0 - '@rollup/rollup-android-arm64': 4.59.0 - '@rollup/rollup-darwin-arm64': 4.59.0 - '@rollup/rollup-darwin-x64': 4.59.0 - '@rollup/rollup-freebsd-arm64': 4.59.0 - '@rollup/rollup-freebsd-x64': 4.59.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 - '@rollup/rollup-linux-arm-musleabihf': 4.59.0 - '@rollup/rollup-linux-arm64-gnu': 4.59.0 - '@rollup/rollup-linux-arm64-musl': 4.59.0 - '@rollup/rollup-linux-loong64-gnu': 4.59.0 - '@rollup/rollup-linux-loong64-musl': 4.59.0 - '@rollup/rollup-linux-ppc64-gnu': 4.59.0 - '@rollup/rollup-linux-ppc64-musl': 4.59.0 - '@rollup/rollup-linux-riscv64-gnu': 4.59.0 - '@rollup/rollup-linux-riscv64-musl': 4.59.0 - '@rollup/rollup-linux-s390x-gnu': 4.59.0 - '@rollup/rollup-linux-x64-gnu': 4.59.0 - '@rollup/rollup-linux-x64-musl': 4.59.0 - '@rollup/rollup-openbsd-x64': 4.59.0 - '@rollup/rollup-openharmony-arm64': 4.59.0 - '@rollup/rollup-win32-arm64-msvc': 4.59.0 - '@rollup/rollup-win32-ia32-msvc': 4.59.0 - '@rollup/rollup-win32-x64-gnu': 4.59.0 - '@rollup/rollup-win32-x64-msvc': 4.59.0 - fsevents: 2.3.3 - rope-sequence@1.3.4: {} router@2.2.0: @@ -22771,8 +22180,6 @@ snapshots: semver@7.7.3: {} - semver@7.7.4: {} - send@0.18.0: dependencies: debug: 2.6.9 @@ -22924,7 +22331,7 @@ snapshots: dependencies: color: 4.2.3 detect-libc: 2.1.2 - semver: 7.7.4 + semver: 7.7.3 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5 @@ -22950,7 +22357,7 @@ snapshots: dependencies: '@img/colour': 1.0.0 detect-libc: 2.1.2 - semver: 7.7.4 + semver: 7.7.3 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.5 '@img/sharp-darwin-x64': 0.34.5 @@ -23056,7 +22463,7 @@ snapshots: simple-update-notifier@2.0.0: dependencies: - semver: 7.7.4 + semver: 7.7.3 sirv@3.0.2: dependencies: @@ -23368,7 +22775,7 @@ snapshots: make-asynchronous: 1.0.1 time-span: 5.1.0 - superdoc@1.11.0(@hocuspocus/provider@2.15.3(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(canvas@3.2.1)(pdfjs-dist@5.4.624)(typescript@5.9.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(yjs@13.6.19): + superdoc@1.11.0(@hocuspocus/provider@2.15.3(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(canvas@3.2.1)(pdfjs-dist@5.4.624)(typescript@5.9.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19))(yjs@13.6.19): dependencies: '@hocuspocus/provider': 2.15.3(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19) buffer-crc32: 1.0.0 @@ -23380,7 +22787,7 @@ snapshots: rollup-plugin-copy: 3.5.0 uuid: 9.0.1 vue: 3.5.25(typescript@5.9.3) - y-prosemirror: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19) + y-prosemirror: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19) y-websocket: 3.0.0(yjs@13.6.19) yjs: 13.6.19 transitivePeerDependencies: @@ -23635,7 +23042,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(@microsoft/api-extractor@7.56.1(@types/node@22.19.2))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): + tsup@8.5.1(@microsoft/api-extractor@7.56.1(@types/node@22.19.2))(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): dependencies: bundle-require: 5.1.0(esbuild@0.27.2) cac: 6.7.14 @@ -23646,7 +23053,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(yaml@2.8.2) + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.2) resolve-from: 5.0.0 rollup: 4.57.1 source-map: 0.7.6 @@ -23656,7 +23063,7 @@ snapshots: tree-kill: 1.2.2 optionalDependencies: '@microsoft/api-extractor': 7.56.1(@types/node@22.19.2) - postcss: 8.5.8 + postcss: 8.5.6 typescript: 5.9.3 transitivePeerDependencies: - jiti @@ -23801,8 +23208,6 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.18.2: {} - undici@7.20.0: {} unicode-emoji-modifier-base@1.0.0: {} @@ -24001,20 +23406,20 @@ snapshots: urlpattern-polyfill@10.0.0: {} - use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.3): + use-callback-ref@1.3.3(@types/react@19.2.11)(react@19.2.3): dependencies: react: 19.2.3 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 - use-sidecar@1.1.3(@types/react@19.2.14)(react@19.2.3): + use-sidecar@1.1.3(@types/react@19.2.11)(react@19.2.3): dependencies: detect-node-es: 1.1.0 react: 19.2.3 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.11 utif2@4.1.0: dependencies: @@ -24208,13 +23613,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2): + vite-node@3.2.4(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@5.5.0) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + vite: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - esbuild @@ -24229,31 +23634,10 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2): - dependencies: - cac: 6.7.14 - debug: 4.4.3(supports-color@5.5.0) - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) - transitivePeerDependencies: - - '@types/node' - - esbuild - - jiti - - less - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite-plugin-dts@4.5.4(@types/node@22.19.2)(rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.59.0)(typescript@5.9.3): + vite-plugin-dts@4.5.4(@types/node@22.19.2)(rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.57.1)(typescript@5.9.3): dependencies: '@microsoft/api-extractor': 7.56.1(@types/node@22.19.2) - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) '@volar/typescript': 2.4.28 '@vue/language-core': 2.2.0(typescript@5.9.3) compare-versions: 6.1.1 @@ -24263,16 +23647,16 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + vite: rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@4.5.4(@types/node@25.3.5)(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.59.0)(typescript@5.9.3): + vite-plugin-dts@4.5.4(@types/node@22.19.8)(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.57.1)(typescript@5.9.3): dependencies: - '@microsoft/api-extractor': 7.56.1(@types/node@25.3.5) - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@microsoft/api-extractor': 7.56.1(@types/node@22.19.8) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) '@volar/typescript': 2.4.28 '@vue/language-core': 2.2.0(typescript@5.9.3) compare-versions: 6.1.1 @@ -24282,23 +23666,23 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + vite: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-node-polyfills@0.25.0(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.59.0): + vite-plugin-node-polyfills@0.25.0(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2))(rollup@4.57.1): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.59.0) + '@rollup/plugin-inject': 5.0.5(rollup@4.57.1) node-stdlib-browser: 1.3.1 - vite: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + vite: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - rollup - vite-plugin-node-polyfills@0.25.0(rollup@4.59.0)(vite@7.3.1(@types/node@22.19.2)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-node-polyfills@0.25.0(rollup@4.57.1)(vite@7.3.1(@types/node@22.19.2)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.59.0) + '@rollup/plugin-inject': 5.0.5(rollup@4.57.1) node-stdlib-browser: 1.3.1 vite: 7.3.1(@types/node@22.19.2)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: @@ -24306,11 +23690,11 @@ snapshots: vite@7.3.1(@types/node@22.19.2)(jiti@2.6.1)(lightningcss@1.31.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: - esbuild: 0.27.3 + esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.8 - rollup: 4.59.0 + postcss: 8.5.6 + rollup: 4.57.1 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.19.2 @@ -24364,55 +23748,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.2)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2): - dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - debug: 4.4.3(supports-color@5.5.0) - expect-type: 1.3.0 - magic-string: 0.30.21 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: rolldown-vite@7.3.1(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@22.19.2)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 22.19.2 - happy-dom: 20.4.0 - jsdom: 27.3.0(canvas@3.2.1) - transitivePeerDependencies: - - esbuild - - jiti - - less - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(esbuild@0.27.3)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.8)(esbuild@0.27.2)(happy-dom@20.4.0)(jiti@2.6.1)(jsdom@27.3.0(canvas@3.2.1))(tsx@4.21.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -24430,12 +23770,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: rolldown-vite@7.3.1(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@25.3.5)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + vite: rolldown-vite@7.3.1(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@22.19.8)(esbuild@0.27.2)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 25.3.5 + '@types/node': 22.19.8 happy-dom: 20.4.0 jsdom: 27.3.0(canvas@3.2.1) transitivePeerDependencies: @@ -24650,12 +23990,12 @@ snapshots: xtend@4.0.2: {} - y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19): + y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.19))(yjs@13.6.19): dependencies: lib0: 0.2.117 prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-view: 1.41.6 + prosemirror-view: 1.41.5 y-protocols: 1.0.7(yjs@13.6.19) yjs: 13.6.19