mirror of
https://github.com/zadam/trilium.git
synced 2025-12-04 22:44:25 +01:00
Compare commits
34 Commits
824e28a10a
...
c44bd246ff
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c44bd246ff | ||
|
|
0b28159e8e | ||
|
|
d9e8f8e69b | ||
|
|
fa224e46bc | ||
|
|
06320953e8 | ||
|
|
d676084cb3 | ||
|
|
0cb5941be0 | ||
|
|
f8d84814e0 | ||
|
|
c46cf41842 | ||
|
|
64ab1c4116 | ||
|
|
a6de1041c7 | ||
|
|
c8d34e65ea | ||
|
|
51db729546 | ||
|
|
d2052ad236 | ||
|
|
9c4301467f | ||
|
|
e7355dc0e4 | ||
|
|
4110fec94f | ||
|
|
d5e601eae9 | ||
|
|
4f044c4a57 | ||
|
|
5821c350e1 | ||
|
|
edba8188fe | ||
|
|
1471a72633 | ||
|
|
56834cb88a | ||
|
|
a0f16f9184 | ||
|
|
de80eb4806 | ||
|
|
48a4b81fbe | ||
|
|
e225794f72 | ||
|
|
4eef30f8b5 | ||
|
|
569b09609d | ||
|
|
39838c25c2 | ||
|
|
49e90c08a9 | ||
|
|
e777b06fb8 | ||
|
|
497ec2ac74 | ||
|
|
c5d282d203 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -48,4 +48,4 @@ upload
|
||||
.svelte-kit
|
||||
|
||||
# docs
|
||||
site/
|
||||
site/
|
||||
@ -16,7 +16,7 @@
|
||||
"fs-extra": "11.3.2",
|
||||
"react": "19.2.0",
|
||||
"react-dom": "19.2.0",
|
||||
"typedoc": "0.28.14",
|
||||
"typedoc": "0.28.15",
|
||||
"typedoc-plugin-missing-exports": "4.1.2"
|
||||
}
|
||||
}
|
||||
|
||||
@ -26,7 +26,7 @@ export const RIBBON_TAB_DEFINITIONS: TabConfiguration[] = [
|
||||
&& !(await noteContext?.isReadOnly()),
|
||||
toggleCommand: "toggleRibbonTabClassicEditor",
|
||||
content: FormattingToolbar,
|
||||
activate: true,
|
||||
activate: () => !options.is("editedNotesOpenInRibbon"),
|
||||
stayInDom: true
|
||||
},
|
||||
{
|
||||
@ -50,7 +50,7 @@ export const RIBBON_TAB_DEFINITIONS: TabConfiguration[] = [
|
||||
icon: "bx bx-calendar-edit",
|
||||
content: EditedNotesTab,
|
||||
show: ({ note }) => note?.hasOwnedLabel("dateNote"),
|
||||
activate: ({ note }) => (note?.getPromotedDefinitionAttributes().length === 0 || !options.is("promotedAttributesOpenInRibbon")) && options.is("editedNotesOpenInRibbon")
|
||||
activate: () => options.is("editedNotesOpenInRibbon")
|
||||
},
|
||||
{
|
||||
title: t("book_properties.book_properties"),
|
||||
|
||||
@ -80,7 +80,6 @@ const ALLOWED_OPTIONS = new Set<OptionNames>([
|
||||
"disableTray",
|
||||
"customSearchEngineName",
|
||||
"customSearchEngineUrl",
|
||||
"promotedAttributesOpenInRibbon",
|
||||
"editedNotesOpenInRibbon",
|
||||
"locale",
|
||||
"formattingLocale",
|
||||
|
||||
@ -129,7 +129,6 @@ const defaultOptions: DefaultOption[] = [
|
||||
{ name: "logRetentionDays", value: "90", isSynced: false }, // default 90 days
|
||||
{ name: "customSearchEngineName", value: "DuckDuckGo", isSynced: true },
|
||||
{ name: "customSearchEngineUrl", value: "https://duckduckgo.com/?q={keyword}", isSynced: true },
|
||||
{ name: "promotedAttributesOpenInRibbon", value: "true", isSynced: true },
|
||||
{ name: "editedNotesOpenInRibbon", value: "true", isSynced: true },
|
||||
{ name: "mfaEnabled", value: "false", isSynced: false },
|
||||
{ name: "mfaMethod", value: "totp", isSynced: false },
|
||||
|
||||
@ -39,7 +39,7 @@
|
||||
"typescript": "5.9.3",
|
||||
"vite-plugin-svgo": "~2.0.0",
|
||||
"vitest": "4.0.14",
|
||||
"webdriverio": "9.20.1"
|
||||
"webdriverio": "9.21.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"ckeditor5": "47.2.0"
|
||||
|
||||
@ -40,7 +40,7 @@
|
||||
"typescript": "5.9.3",
|
||||
"vite-plugin-svgo": "~2.0.0",
|
||||
"vitest": "4.0.14",
|
||||
"webdriverio": "9.20.1"
|
||||
"webdriverio": "9.21.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"ckeditor5": "47.2.0"
|
||||
|
||||
@ -42,7 +42,7 @@
|
||||
"typescript": "5.9.3",
|
||||
"vite-plugin-svgo": "~2.0.0",
|
||||
"vitest": "4.0.14",
|
||||
"webdriverio": "9.20.1"
|
||||
"webdriverio": "9.21.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"ckeditor5": "47.2.0"
|
||||
|
||||
@ -43,7 +43,7 @@
|
||||
"typescript": "5.9.3",
|
||||
"vite-plugin-svgo": "~2.0.0",
|
||||
"vitest": "4.0.14",
|
||||
"webdriverio": "9.20.1"
|
||||
"webdriverio": "9.21.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"ckeditor5": "47.2.0"
|
||||
@ -71,6 +71,7 @@
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@ckeditor/ckeditor5-icons": "47.2.0"
|
||||
"@ckeditor/ckeditor5-icons": "47.2.0",
|
||||
"mathlive": "0.108.2"
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,9 @@
|
||||
import ckeditor from './../theme/icons/math.svg?raw';
|
||||
import './augmentation.js';
|
||||
import "../theme/mathform.css";
|
||||
import 'mathlive';
|
||||
import 'mathlive/fonts.css';
|
||||
import 'mathlive/static.css';
|
||||
|
||||
export { default as Math } from './math.js';
|
||||
export { default as MathUI } from './mathui.js';
|
||||
|
||||
@ -56,7 +56,7 @@ export default class MathUI extends Plugin {
|
||||
this._balloon.showStack( 'main' );
|
||||
|
||||
requestAnimationFrame(() => {
|
||||
this.formView?.mathInputView.fieldView.element?.focus();
|
||||
this.formView?.mathLiveInputView.focus();
|
||||
});
|
||||
}
|
||||
|
||||
@ -71,31 +71,38 @@ export default class MathUI extends Plugin {
|
||||
throw new CKEditorError( 'math-command' );
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
|
||||
const mathConfig = editor.config.get( 'math' )!;
|
||||
|
||||
const formView = new MainFormView(
|
||||
editor.locale,
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
mathConfig.engine!,
|
||||
mathConfig.lazyLoad,
|
||||
{
|
||||
engine: mathConfig.engine!,
|
||||
lazyLoad: mathConfig.lazyLoad,
|
||||
previewUid: this._previewUid,
|
||||
previewClassName: mathConfig.previewClassName!,
|
||||
katexRenderOptions: mathConfig.katexRenderOptions!
|
||||
},
|
||||
mathConfig.enablePreview,
|
||||
this._previewUid,
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
mathConfig.previewClassName!,
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
mathConfig.popupClassName!,
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
mathConfig.katexRenderOptions!
|
||||
mathConfig.popupClassName!
|
||||
);
|
||||
|
||||
formView.mathInputView.bind( 'value' ).to( mathCommand, 'value' );
|
||||
formView.mathLiveInputView.bind( 'value' ).to( mathCommand, 'value' );
|
||||
formView.displayButtonView.bind( 'isOn' ).to( mathCommand, 'display' );
|
||||
|
||||
// Form elements should be read-only when corresponding commands are disabled.
|
||||
formView.mathInputView.bind( 'isReadOnly' ).to( mathCommand, 'isEnabled', value => !value );
|
||||
formView.saveButtonView.bind( 'isEnabled' ).to( mathCommand );
|
||||
formView.displayButtonView.bind( 'isEnabled' ).to( mathCommand );
|
||||
formView.mathLiveInputView.bind( 'isReadOnly' ).to( mathCommand, 'isEnabled', value => !value );
|
||||
formView.saveButtonView.bind( 'isEnabled' ).to(
|
||||
mathCommand,
|
||||
'isEnabled',
|
||||
formView.mathLiveInputView,
|
||||
'value',
|
||||
( commandEnabled, equation ) => {
|
||||
const normalizedEquation = ( equation ?? '' ).trim();
|
||||
return commandEnabled && normalizedEquation.length > 0;
|
||||
}
|
||||
);
|
||||
formView.displayButtonView.bind( 'isEnabled' ).to( mathCommand, 'isEnabled' );
|
||||
|
||||
// Listen to submit button click
|
||||
this.listenTo( formView, 'submit', () => {
|
||||
@ -122,18 +129,6 @@ export default class MathUI extends Plugin {
|
||||
}
|
||||
});
|
||||
|
||||
// Allow the textarea to be resizable
|
||||
formView.mathInputView.fieldView.once('render', () => {
|
||||
const textarea = formView.mathInputView.fieldView.element;
|
||||
if (!textarea) return;
|
||||
Object.assign(textarea.style, {
|
||||
resize: 'both',
|
||||
height: '100px',
|
||||
width: '400px',
|
||||
minWidth: '100%',
|
||||
});
|
||||
});
|
||||
|
||||
return formView;
|
||||
}
|
||||
|
||||
@ -162,14 +157,14 @@ export default class MathUI extends Plugin {
|
||||
} );
|
||||
|
||||
if ( this._balloon.visibleView === this.formView ) {
|
||||
this.formView.mathInputView.fieldView.element?.select();
|
||||
this.formView.mathLiveInputView.focus();
|
||||
}
|
||||
|
||||
// Show preview element
|
||||
const previewEl = document.getElementById( this._previewUid );
|
||||
if ( previewEl && this.formView.previewEnabled ) {
|
||||
if ( previewEl && this.formView.mathView ) {
|
||||
// Force refresh preview
|
||||
this.formView.mathView?.updateMath();
|
||||
this.formView.mathView.updateMath();
|
||||
}
|
||||
|
||||
this.formView.equation = mathCommand.value ?? '';
|
||||
|
||||
@ -1,270 +1,219 @@
|
||||
import { ButtonView, createLabeledTextarea, FocusCycler, LabelView, LabeledFieldView, submitHandler, SwitchButtonView, View, ViewCollection, type TextareaView, type FocusableView, Locale, FocusTracker, KeystrokeHandler } from 'ckeditor5';
|
||||
import IconCheck from "@ckeditor/ckeditor5-icons/theme/icons/check.svg?raw";
|
||||
import IconCancel from "@ckeditor/ckeditor5-icons/theme/icons/cancel.svg?raw";
|
||||
import {
|
||||
ButtonView,
|
||||
FocusCycler,
|
||||
LabelView,
|
||||
submitHandler,
|
||||
SwitchButtonView,
|
||||
View,
|
||||
ViewCollection,
|
||||
type FocusableView,
|
||||
Locale,
|
||||
FocusTracker,
|
||||
KeystrokeHandler
|
||||
} from 'ckeditor5';
|
||||
import IconCheck from '@ckeditor/ckeditor5-icons/theme/icons/check.svg?raw';
|
||||
import IconCancel from '@ckeditor/ckeditor5-icons/theme/icons/cancel.svg?raw';
|
||||
import { extractDelimiters, hasDelimiters } from '../utils.js';
|
||||
import MathView from './mathview.js';
|
||||
import MathView, { type MathViewOptions } from './mathview.js';
|
||||
import MathLiveInputView from './mathliveinputview.js';
|
||||
import RawLatexInputView from './rawlatexinputview.js';
|
||||
import '../../theme/mathform.css';
|
||||
import type { KatexOptions } from '../typings-external.js';
|
||||
|
||||
class MathInputView extends LabeledFieldView<TextareaView> {
|
||||
public value: null | string = null;
|
||||
public isReadOnly = false;
|
||||
|
||||
constructor( locale: Locale ) {
|
||||
super( locale, createLabeledTextarea );
|
||||
}
|
||||
}
|
||||
|
||||
export default class MainFormView extends View {
|
||||
public saveButtonView: ButtonView;
|
||||
public mathInputView: MathInputView;
|
||||
public displayButtonView: SwitchButtonView;
|
||||
public cancelButtonView: ButtonView;
|
||||
public previewEnabled: boolean;
|
||||
public previewLabel?: LabelView;
|
||||
public displayButtonView: SwitchButtonView;
|
||||
|
||||
public mathLiveInputView: MathLiveInputView;
|
||||
public rawLatexInputView: RawLatexInputView;
|
||||
public mathView?: MathView;
|
||||
public override locale: Locale = new Locale();
|
||||
public lazyLoad: undefined | ( () => Promise<void> );
|
||||
|
||||
public focusTracker = new FocusTracker();
|
||||
public keystrokes = new KeystrokeHandler();
|
||||
private _focusables = new ViewCollection<FocusableView>();
|
||||
private _focusCycler: FocusCycler;
|
||||
|
||||
constructor(
|
||||
locale: Locale,
|
||||
engine:
|
||||
| 'mathjax'
|
||||
| 'katex'
|
||||
| ( (
|
||||
equation: string,
|
||||
element: HTMLElement,
|
||||
display: boolean,
|
||||
) => void ),
|
||||
lazyLoad: undefined | ( () => Promise<void> ),
|
||||
mathViewOptions: MathViewOptions,
|
||||
previewEnabled = false,
|
||||
previewUid: string,
|
||||
previewClassName: Array<string>,
|
||||
popupClassName: Array<string>,
|
||||
katexRenderOptions: KatexOptions
|
||||
popupClassName: string[] = []
|
||||
) {
|
||||
super( locale );
|
||||
|
||||
const t = locale.t;
|
||||
|
||||
// Submit button
|
||||
this.saveButtonView = this._createButton( t( 'Save' ), IconCheck, 'ck-button-save', null );
|
||||
// --- 1. View Initialization ---
|
||||
|
||||
this.mathLiveInputView = new MathLiveInputView( locale );
|
||||
this.rawLatexInputView = new RawLatexInputView( locale );
|
||||
this.rawLatexInputView.label = t( 'LaTeX' );
|
||||
|
||||
this.saveButtonView = this._createButton( t( 'Save' ), IconCheck, 'ck-button-save' );
|
||||
this.saveButtonView.type = 'submit';
|
||||
|
||||
// Equation input
|
||||
this.mathInputView = this._createMathInput();
|
||||
this.cancelButtonView = this._createButton( t( 'Cancel' ), IconCancel, 'ck-button-cancel' );
|
||||
this.cancelButtonView.delegate( 'execute' ).to( this, 'cancel' );
|
||||
|
||||
// Display button
|
||||
this.displayButtonView = this._createDisplayButton();
|
||||
this.displayButtonView = this._createDisplayButton( t );
|
||||
|
||||
// Cancel button
|
||||
this.cancelButtonView = this._createButton( t( 'Cancel' ), IconCancel, 'ck-button-cancel', 'cancel' );
|
||||
// --- 2. Construct Children & Preview ---
|
||||
|
||||
this.previewEnabled = previewEnabled;
|
||||
const children: View[] = [
|
||||
this.mathLiveInputView,
|
||||
this.rawLatexInputView,
|
||||
this.displayButtonView
|
||||
];
|
||||
|
||||
let children = [];
|
||||
if ( this.previewEnabled ) {
|
||||
// Preview label
|
||||
this.previewLabel = new LabelView( locale );
|
||||
this.previewLabel.text = t( 'Equation preview' );
|
||||
if ( previewEnabled ) {
|
||||
const previewLabel = new LabelView( locale );
|
||||
previewLabel.text = t( 'Equation preview' );
|
||||
|
||||
// Math element
|
||||
this.mathView = new MathView( engine, lazyLoad, locale, previewUid, previewClassName, katexRenderOptions );
|
||||
// Clean instantiation using the options object
|
||||
this.mathView = new MathView( locale, mathViewOptions );
|
||||
|
||||
// Bind display mode: When button flips, preview updates automatically
|
||||
this.mathView.bind( 'display' ).to( this.displayButtonView, 'isOn' );
|
||||
|
||||
children = [
|
||||
this.mathInputView,
|
||||
this.displayButtonView,
|
||||
this.previewLabel,
|
||||
this.mathView
|
||||
];
|
||||
} else {
|
||||
children = [
|
||||
this.mathInputView,
|
||||
this.displayButtonView
|
||||
];
|
||||
children.push( previewLabel, this.mathView );
|
||||
}
|
||||
|
||||
// Add UI elements to template
|
||||
// --- 3. Sync Logic ---
|
||||
this._setupInputSync( previewEnabled );
|
||||
|
||||
// --- 4. Template Setup ---
|
||||
this.setTemplate( {
|
||||
tag: 'form',
|
||||
attributes: {
|
||||
class: [
|
||||
'ck',
|
||||
'ck-math-form',
|
||||
...popupClassName
|
||||
],
|
||||
class: [ 'ck', 'ck-math-form', ...popupClassName ],
|
||||
tabindex: '-1',
|
||||
spellcheck: 'false'
|
||||
},
|
||||
children: [
|
||||
{
|
||||
tag: 'div',
|
||||
attributes: {
|
||||
class: [
|
||||
'ck-math-view'
|
||||
]
|
||||
},
|
||||
children
|
||||
attributes: { class: [ 'ck-math-scroll' ] },
|
||||
children: [ { tag: 'div', attributes: { class: [ 'ck-math-view' ] }, children } ]
|
||||
},
|
||||
this.saveButtonView,
|
||||
this.cancelButtonView
|
||||
{
|
||||
tag: 'div',
|
||||
attributes: { class: [ 'ck-math-button-row' ] },
|
||||
children: [ this.saveButtonView, this.cancelButtonView ]
|
||||
}
|
||||
]
|
||||
} );
|
||||
|
||||
// --- 5. Accessibility ---
|
||||
this._focusCycler = new FocusCycler( {
|
||||
focusables: this._focusables,
|
||||
focusTracker: this.focusTracker,
|
||||
keystrokeHandler: this.keystrokes,
|
||||
actions: { focusPrevious: 'shift + tab', focusNext: 'tab' }
|
||||
} );
|
||||
}
|
||||
|
||||
public override render(): void {
|
||||
super.render();
|
||||
|
||||
// Prevent default form submit event & trigger custom 'submit'
|
||||
submitHandler( {
|
||||
view: this
|
||||
} );
|
||||
submitHandler( { view: this } );
|
||||
|
||||
// Register form elements to focusable elements
|
||||
const childViews = [
|
||||
this.mathInputView,
|
||||
// Register focusables
|
||||
[
|
||||
this.mathLiveInputView,
|
||||
this.rawLatexInputView,
|
||||
this.displayButtonView,
|
||||
this.saveButtonView,
|
||||
this.cancelButtonView
|
||||
];
|
||||
|
||||
childViews.forEach( v => {
|
||||
].forEach( v => {
|
||||
if ( v.element ) {
|
||||
this._focusables.add( v );
|
||||
this.focusTracker.add( v.element );
|
||||
}
|
||||
} );
|
||||
|
||||
// Listen to keypresses inside form element
|
||||
if ( this.element ) {
|
||||
this.keystrokes.listenTo( this.element );
|
||||
}
|
||||
if ( this.element ) this.keystrokes.listenTo( this.element );
|
||||
}
|
||||
|
||||
public get equation(): string {
|
||||
return this.mathLiveInputView.value ?? '';
|
||||
}
|
||||
|
||||
public set equation( equation: string ) {
|
||||
const norm = equation.trim();
|
||||
// Direct updates to the "source of truth"
|
||||
this.mathLiveInputView.value = norm.length ? norm : null;
|
||||
this.rawLatexInputView.value = norm;
|
||||
if ( this.mathView ) this.mathView.value = norm;
|
||||
}
|
||||
|
||||
public focus(): void {
|
||||
this._focusCycler.focusFirst();
|
||||
}
|
||||
|
||||
public get equation(): string {
|
||||
return this.mathInputView.fieldView.element?.value ?? '';
|
||||
}
|
||||
/**
|
||||
* Sets up split handlers for synchronization.
|
||||
*/
|
||||
private _setupInputSync( previewEnabled: boolean ): void {
|
||||
// Handler 1: MathLive -> Raw LaTeX
|
||||
this.mathLiveInputView.on( 'change:value', () => {
|
||||
let eq = ( this.mathLiveInputView.value ?? '' ).trim();
|
||||
|
||||
public set equation( equation: string ) {
|
||||
if ( this.mathInputView.fieldView.element ) {
|
||||
this.mathInputView.fieldView.element.value = equation;
|
||||
}
|
||||
if ( this.previewEnabled && this.mathView ) {
|
||||
this.mathView.value = equation;
|
||||
}
|
||||
}
|
||||
// Delimiter Normalization
|
||||
if ( hasDelimiters( eq ) ) {
|
||||
const params = extractDelimiters( eq );
|
||||
eq = params.equation;
|
||||
this.displayButtonView.isOn = params.display;
|
||||
|
||||
public focusTracker: FocusTracker = new FocusTracker();
|
||||
public keystrokes: KeystrokeHandler = new KeystrokeHandler();
|
||||
private _focusables = new ViewCollection<FocusableView>();
|
||||
private _focusCycler: FocusCycler = new FocusCycler( {
|
||||
focusables: this._focusables,
|
||||
focusTracker: this.focusTracker,
|
||||
keystrokeHandler: this.keystrokes,
|
||||
actions: {
|
||||
focusPrevious: 'shift + tab',
|
||||
focusNext: 'tab'
|
||||
}
|
||||
} );
|
||||
|
||||
private _createMathInput() {
|
||||
const t = this.locale.t;
|
||||
|
||||
// Create equation input
|
||||
const mathInput = new MathInputView( this.locale );
|
||||
const fieldView = mathInput.fieldView;
|
||||
mathInput.infoText = t( 'Insert equation in TeX format.' );
|
||||
|
||||
const onInput = () => {
|
||||
if ( fieldView.element != null ) {
|
||||
let equationInput = fieldView.element.value.trim();
|
||||
|
||||
// If input has delimiters
|
||||
if ( hasDelimiters( equationInput ) ) {
|
||||
// Get equation without delimiters
|
||||
const params = extractDelimiters( equationInput );
|
||||
|
||||
// Remove delimiters from input field
|
||||
fieldView.element.value = params.equation;
|
||||
|
||||
equationInput = params.equation;
|
||||
|
||||
// update display button and preview
|
||||
this.displayButtonView.isOn = params.display;
|
||||
// UX Fix: If we stripped delimiters, update the source
|
||||
// so the visual editor doesn't show them.
|
||||
if ( this.mathLiveInputView.value !== eq ) {
|
||||
this.mathLiveInputView.value = eq;
|
||||
}
|
||||
if ( this.previewEnabled && this.mathView ) {
|
||||
// Update preview view
|
||||
this.mathView.value = equationInput;
|
||||
}
|
||||
|
||||
this.saveButtonView.isEnabled = !!equationInput;
|
||||
}
|
||||
};
|
||||
|
||||
fieldView.on( 'render', onInput );
|
||||
fieldView.on( 'input', onInput );
|
||||
// Sync to Raw LaTeX
|
||||
if ( this.rawLatexInputView.value !== eq ) {
|
||||
this.rawLatexInputView.value = eq;
|
||||
}
|
||||
|
||||
return mathInput;
|
||||
// Sync to Preview
|
||||
if ( previewEnabled && this.mathView && this.mathView.value !== eq ) {
|
||||
this.mathView.value = eq;
|
||||
}
|
||||
} );
|
||||
|
||||
// Handler 2: Raw LaTeX -> MathLive
|
||||
this.rawLatexInputView.on( 'change:value', () => {
|
||||
const eq = ( this.rawLatexInputView.value ?? '' ).trim();
|
||||
const normalized = eq.length ? eq : null;
|
||||
|
||||
// Sync to MathLive
|
||||
if ( this.mathLiveInputView.value !== normalized ) {
|
||||
this.mathLiveInputView.value = normalized;
|
||||
}
|
||||
|
||||
// Sync to Preview
|
||||
if ( previewEnabled && this.mathView && this.mathView.value !== eq ) {
|
||||
this.mathView.value = eq;
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
private _createButton(
|
||||
label: string,
|
||||
icon: string,
|
||||
className: string,
|
||||
eventName: string | null
|
||||
) {
|
||||
const button = new ButtonView( this.locale );
|
||||
|
||||
button.set( {
|
||||
label,
|
||||
icon,
|
||||
tooltip: true
|
||||
} );
|
||||
|
||||
button.extendTemplate( {
|
||||
attributes: {
|
||||
class: className
|
||||
}
|
||||
} );
|
||||
|
||||
if ( eventName ) {
|
||||
button.delegate( 'execute' ).to( this, eventName );
|
||||
}
|
||||
|
||||
return button;
|
||||
private _createButton( label: string, icon: string, className: string ): ButtonView {
|
||||
const btn = new ButtonView( this.locale );
|
||||
btn.set( { label, icon, tooltip: true } );
|
||||
btn.extendTemplate( { attributes: { class: className } } );
|
||||
return btn;
|
||||
}
|
||||
|
||||
private _createDisplayButton() {
|
||||
const t = this.locale.t;
|
||||
private _createDisplayButton( t: ( str: string ) => string ): SwitchButtonView {
|
||||
const btn = new SwitchButtonView( this.locale );
|
||||
btn.set( { label: t( 'Display mode' ), withText: true } );
|
||||
btn.extendTemplate( { attributes: { class: 'ck-button-display-toggle' } } );
|
||||
|
||||
const switchButton = new SwitchButtonView( this.locale );
|
||||
|
||||
switchButton.set( {
|
||||
label: t( 'Display mode' ),
|
||||
withText: true
|
||||
btn.on( 'execute', () => {
|
||||
btn.isOn = !btn.isOn;
|
||||
// mathView updates automatically via bind()
|
||||
} );
|
||||
|
||||
switchButton.extendTemplate( {
|
||||
attributes: {
|
||||
class: 'ck-button-display-toggle'
|
||||
}
|
||||
} );
|
||||
|
||||
switchButton.on( 'execute', () => {
|
||||
// Toggle state
|
||||
switchButton.isOn = !switchButton.isOn;
|
||||
|
||||
if ( this.previewEnabled && this.mathView ) {
|
||||
// Update preview view
|
||||
this.mathView.display = switchButton.isOn;
|
||||
}
|
||||
} );
|
||||
|
||||
return switchButton;
|
||||
return btn;
|
||||
}
|
||||
}
|
||||
|
||||
116
packages/ckeditor5-math/src/ui/mathliveinputview.ts
Normal file
116
packages/ckeditor5-math/src/ui/mathliveinputview.ts
Normal file
@ -0,0 +1,116 @@
|
||||
import { View, type Locale } from 'ckeditor5';
|
||||
import 'mathlive'; // Import side-effects only (registers the <math-field> tag)
|
||||
|
||||
/**
|
||||
* Interface describing the custom <math-field> element.
|
||||
*/
|
||||
interface MathFieldElement extends HTMLElement {
|
||||
value: string;
|
||||
readOnly: boolean;
|
||||
mathVirtualKeyboardPolicy: string;
|
||||
// Interface includes the shortcuts property
|
||||
inlineShortcuts: Record<string, string>;
|
||||
}
|
||||
|
||||
/**
|
||||
* A wrapper for the MathLive <math-field> component.
|
||||
*/
|
||||
export default class MathLiveInputView extends View {
|
||||
/**
|
||||
* The current LaTeX value.
|
||||
* @observable
|
||||
*/
|
||||
public declare value: string | null;
|
||||
|
||||
/**
|
||||
* Read-only state.
|
||||
* @observable
|
||||
*/
|
||||
public declare isReadOnly: boolean;
|
||||
|
||||
/**
|
||||
* Reference to the DOM element.
|
||||
* Typed as MathFieldElement | null for proper TS support.
|
||||
*/
|
||||
public mathfield: MathFieldElement | null = null;
|
||||
|
||||
constructor( locale: Locale ) {
|
||||
super( locale );
|
||||
|
||||
this.set( 'value', null );
|
||||
this.set( 'isReadOnly', false );
|
||||
|
||||
this.setTemplate( {
|
||||
tag: 'div',
|
||||
attributes: {
|
||||
class: [ 'ck', 'ck-mathlive-input' ]
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
public override render(): void {
|
||||
super.render();
|
||||
|
||||
// 1. Create element with the specific type
|
||||
const mathfield = document.createElement( 'math-field' ) as MathFieldElement;
|
||||
|
||||
// 2. Configure Options
|
||||
mathfield.mathVirtualKeyboardPolicy = 'manual';
|
||||
|
||||
//Disable differential D
|
||||
mathfield.addEventListener( 'mount', () => {
|
||||
mathfield.inlineShortcuts = {
|
||||
...mathfield.inlineShortcuts, // Safe to read now
|
||||
dx: 'dx',
|
||||
dy: 'dy',
|
||||
dt: 'dt'
|
||||
};
|
||||
} );
|
||||
|
||||
|
||||
// Disable sounds safely
|
||||
const MathfieldConstructor = customElements.get( 'math-field' );
|
||||
if ( MathfieldConstructor ) {
|
||||
const proto = MathfieldConstructor as any;
|
||||
if ( proto.soundsDirectory !== null ) proto.soundsDirectory = null;
|
||||
if ( proto.plonkSound !== null ) proto.plonkSound = null;
|
||||
}
|
||||
|
||||
// 3. Set Initial State
|
||||
mathfield.value = this.value ?? '';
|
||||
mathfield.readOnly = this.isReadOnly;
|
||||
|
||||
// 4. Bind Events (DOM -> Observable)
|
||||
mathfield.addEventListener( 'input', () => {
|
||||
const val = mathfield.value;
|
||||
this.value = val.length ? val : null;
|
||||
} );
|
||||
|
||||
// 5. Bind Events (Observable -> DOM)
|
||||
this.on( 'change:value', ( _evt, _name, nextValue ) => {
|
||||
if ( mathfield.value !== nextValue ) {
|
||||
mathfield.value = nextValue ?? '';
|
||||
}
|
||||
} );
|
||||
|
||||
this.on( 'change:isReadOnly', ( _evt, _name, nextValue ) => {
|
||||
mathfield.readOnly = nextValue;
|
||||
} );
|
||||
|
||||
// 6. Mount to the wrapper view
|
||||
this.element?.appendChild( mathfield );
|
||||
this.mathfield = mathfield;
|
||||
}
|
||||
|
||||
public focus(): void {
|
||||
this.mathfield?.focus();
|
||||
}
|
||||
|
||||
public override destroy(): void {
|
||||
if ( this.mathfield ) {
|
||||
this.mathfield.remove();
|
||||
this.mathfield = null;
|
||||
}
|
||||
super.destroy();
|
||||
}
|
||||
}
|
||||
@ -2,44 +2,44 @@ import { View, type Locale } from 'ckeditor5';
|
||||
import type { KatexOptions } from '../typings-external.js';
|
||||
import { renderEquation } from '../utils.js';
|
||||
|
||||
/**
|
||||
* Configuration options for the MathView.
|
||||
*/
|
||||
export interface MathViewOptions {
|
||||
engine: 'mathjax' | 'katex' | ( ( equation: string, element: HTMLElement, display: boolean ) => void );
|
||||
lazyLoad: undefined | ( () => Promise<void> );
|
||||
previewUid: string;
|
||||
previewClassName: Array<string>;
|
||||
katexRenderOptions: KatexOptions;
|
||||
}
|
||||
|
||||
export default class MathView extends View {
|
||||
/**
|
||||
* The LaTeX equation value to render.
|
||||
* @observable
|
||||
*/
|
||||
public declare value: string;
|
||||
|
||||
/**
|
||||
* Whether to render in display mode (centered) or inline.
|
||||
* @observable
|
||||
*/
|
||||
public declare display: boolean;
|
||||
public previewUid: string;
|
||||
public previewClassName: Array<string>;
|
||||
public katexRenderOptions: KatexOptions;
|
||||
public engine:
|
||||
| 'mathjax'
|
||||
| 'katex'
|
||||
| ( ( equation: string, element: HTMLElement, display: boolean ) => void );
|
||||
public lazyLoad: undefined | ( () => Promise<void> );
|
||||
|
||||
constructor(
|
||||
engine:
|
||||
| 'mathjax'
|
||||
| 'katex'
|
||||
| ( (
|
||||
equation: string,
|
||||
element: HTMLElement,
|
||||
display: boolean,
|
||||
) => void ),
|
||||
lazyLoad: undefined | ( () => Promise<void> ),
|
||||
locale: Locale,
|
||||
previewUid: string,
|
||||
previewClassName: Array<string>,
|
||||
katexRenderOptions: KatexOptions
|
||||
) {
|
||||
/**
|
||||
* Configuration options passed during initialization.
|
||||
*/
|
||||
private options: MathViewOptions;
|
||||
|
||||
constructor( locale: Locale, options: MathViewOptions ) {
|
||||
super( locale );
|
||||
|
||||
this.engine = engine;
|
||||
this.lazyLoad = lazyLoad;
|
||||
this.previewUid = previewUid;
|
||||
this.katexRenderOptions = katexRenderOptions;
|
||||
this.previewClassName = previewClassName;
|
||||
this.options = options;
|
||||
|
||||
this.set( 'value', '' );
|
||||
this.set( 'display', false );
|
||||
|
||||
// Update rendering when state changes.
|
||||
// Checking isRendered prevents errors during initialization.
|
||||
this.on( 'change', () => {
|
||||
if ( this.isRendered ) {
|
||||
this.updateMath();
|
||||
@ -56,16 +56,20 @@ export default class MathView extends View {
|
||||
|
||||
public updateMath(): void {
|
||||
if ( this.element ) {
|
||||
|
||||
// This prevents the new render from appending to the old one.
|
||||
this.element.textContent = '';
|
||||
|
||||
void renderEquation(
|
||||
this.value,
|
||||
this.element,
|
||||
this.engine,
|
||||
this.lazyLoad,
|
||||
this.options.engine,
|
||||
this.options.lazyLoad,
|
||||
this.display,
|
||||
true,
|
||||
this.previewUid,
|
||||
this.previewClassName,
|
||||
this.katexRenderOptions
|
||||
true, // isPreview
|
||||
this.options.previewUid,
|
||||
this.options.previewClassName,
|
||||
this.options.katexRenderOptions
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
54
packages/ckeditor5-math/src/ui/rawlatexinputview.ts
Normal file
54
packages/ckeditor5-math/src/ui/rawlatexinputview.ts
Normal file
@ -0,0 +1,54 @@
|
||||
import { LabeledFieldView, createLabeledTextarea, type Locale, type TextareaView } from 'ckeditor5';
|
||||
|
||||
/**
|
||||
* A labeled textarea view for direct LaTeX code editing.
|
||||
*/
|
||||
export default class RawLatexInputView extends LabeledFieldView<TextareaView> {
|
||||
/**
|
||||
* The current LaTeX value.
|
||||
* @observable
|
||||
*/
|
||||
public declare value: string;
|
||||
|
||||
/**
|
||||
* Whether the input is in read-only mode.
|
||||
* @observable
|
||||
*/
|
||||
public declare isReadOnly: boolean;
|
||||
|
||||
constructor( locale: Locale ) {
|
||||
super( locale, createLabeledTextarea );
|
||||
|
||||
this.set( 'value', '' );
|
||||
this.set( 'isReadOnly', false );
|
||||
|
||||
const fieldView = this.fieldView;
|
||||
|
||||
// 1. Sync: DOM (Textarea) -> Observable
|
||||
fieldView.on( 'input', () => {
|
||||
// We cast strictly to HTMLTextAreaElement to access '.value' safely
|
||||
const textarea = fieldView.element as HTMLTextAreaElement;
|
||||
if ( textarea ) {
|
||||
this.value = textarea.value;
|
||||
}
|
||||
} );
|
||||
|
||||
// 2. Sync: Observable -> DOM (Textarea)
|
||||
this.on( 'change:value', () => {
|
||||
const textarea = fieldView.element as HTMLTextAreaElement;
|
||||
// Check for difference to avoid cursor jumping
|
||||
if ( textarea && textarea.value !== this.value ) {
|
||||
textarea.value = this.value;
|
||||
}
|
||||
} );
|
||||
|
||||
// 3. Sync: ReadOnly State
|
||||
this.on( 'change:isReadOnly', ( _evt, _name, nextValue ) => {
|
||||
fieldView.isReadOnly = nextValue;
|
||||
} );
|
||||
}
|
||||
|
||||
public override render(): void {
|
||||
super.render();
|
||||
}
|
||||
}
|
||||
@ -168,13 +168,13 @@ describe( 'MathUI', () => {
|
||||
|
||||
command.isEnabled = true;
|
||||
|
||||
expect( formView!.mathInputView.isReadOnly ).to.be.false;
|
||||
expect( formView!.mathLiveInputView.isReadOnly ).to.be.false;
|
||||
expect( formView!.saveButtonView.isEnabled ).to.be.false;
|
||||
expect( formView!.cancelButtonView.isEnabled ).to.be.true;
|
||||
|
||||
command.isEnabled = false;
|
||||
|
||||
expect( formView!.mathInputView.isReadOnly ).to.be.true;
|
||||
expect( formView!.mathLiveInputView.isReadOnly ).to.be.true;
|
||||
expect( formView!.saveButtonView.isEnabled ).to.be.false;
|
||||
expect( formView!.cancelButtonView.isEnabled ).to.be.true;
|
||||
} );
|
||||
@ -407,22 +407,30 @@ describe( 'MathUI', () => {
|
||||
setModelData( editor.model, '<paragraph>f[o]o</paragraph>' );
|
||||
} );
|
||||
|
||||
it( 'should bind mainFormView.mathInputView#value to math command value', () => {
|
||||
it( 'should bind mainFormView.mathLiveInputView#value to math command value', () => {
|
||||
const command = editor.commands.get( 'math' );
|
||||
|
||||
expect( formView!.mathInputView.value ).to.null;
|
||||
expect( formView!.mathLiveInputView.value ).to.be.null;
|
||||
|
||||
command!.value = 'x^2';
|
||||
expect( formView!.mathInputView.value ).to.equal( 'x^2' );
|
||||
expect( formView!.mathLiveInputView.value ).to.equal( 'x^2' );
|
||||
} );
|
||||
|
||||
it( 'should execute math command on mainFormView#submit event', () => {
|
||||
const executeSpy = vi.spyOn( editor, 'execute' );
|
||||
|
||||
formView!.mathInputView.fieldView.element!.value = 'x^2';
|
||||
formView!.mathLiveInputView.value = 'x^2';
|
||||
formView!.fire( 'submit' );
|
||||
|
||||
expect(executeSpy.mock.lastCall?.slice(0, 2)).toMatchObject(['math', 'x^2']);
|
||||
expect( executeSpy.mock.lastCall?.slice( 0, 2 ) ).toMatchObject( [ 'math', 'x^2' ] );
|
||||
} );
|
||||
|
||||
it( 'should sync mathLiveInputView and rawLatexInputView', () => {
|
||||
formView!.mathLiveInputView.value = 'x^2';
|
||||
expect( formView!.rawLatexInputView.value ).to.equal( 'x^2' );
|
||||
|
||||
formView!.rawLatexInputView.value = '\\frac{1}{2}';
|
||||
expect( formView!.mathLiveInputView.value ).to.equal( '\\frac{1}{2}' );
|
||||
} );
|
||||
|
||||
it( 'should hide the balloon on mainFormView#cancel if math command does not have a value', () => {
|
||||
|
||||
@ -1,35 +1,214 @@
|
||||
/**
|
||||
* Math equation editor dialog styles
|
||||
* Supports MathLive input, raw LaTeX textarea, and equation preview
|
||||
*/
|
||||
|
||||
/* ============================================================================
|
||||
Main Dialog Container
|
||||
========================================================================= */
|
||||
|
||||
.ck.ck-math-form {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
flex-direction: row;
|
||||
flex-wrap: nowrap;
|
||||
padding: var(--ck-spacing-standard);
|
||||
|
||||
@media screen and (max-width: 600px) {
|
||||
flex-wrap: wrap;
|
||||
|
||||
& .ck-math-view {
|
||||
flex-basis: 100%;
|
||||
|
||||
& .ck-labeled-view {
|
||||
flex-basis: 100%;
|
||||
}
|
||||
|
||||
& .ck-label {
|
||||
flex-basis: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
& .ck-button {
|
||||
flex-basis: 50%;
|
||||
}
|
||||
}
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: var(--ck-spacing-standard);
|
||||
box-sizing: border-box;
|
||||
max-width: 80vw;
|
||||
max-height: 80vh;
|
||||
height: 100%;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.ck-math-tex.ck-placeholder::before {
|
||||
display: none !important;
|
||||
/* Mobile responsiveness */
|
||||
@media screen and (max-width: 600px) {
|
||||
.ck.ck-math-form {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
}
|
||||
|
||||
.ck.ck-toolbar-container {
|
||||
z-index: calc(var(--ck-z-panel) + 2);
|
||||
/* ============================================================================
|
||||
Content Layout
|
||||
========================================================================= */
|
||||
|
||||
.ck-math-view {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1 1 auto;
|
||||
gap: var(--ck-spacing-standard);
|
||||
min-height: fit-content;
|
||||
min-width: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* LaTeX section heading */
|
||||
.ck-math-view > .ck-labeled-field-view::before {
|
||||
content: "LaTeX";
|
||||
display: block;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
color: var(--ck-color-text, #333);
|
||||
margin-bottom: 4px;
|
||||
padding-left: 2px;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
/* Equation preview section heading */
|
||||
.ck-math-view > math-field::before {
|
||||
content: "Equation preview";
|
||||
display: block;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
color: var(--ck-color-text, #333);
|
||||
margin-bottom: 4px;
|
||||
padding-left: 2px;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
/* Add spacing between preview and action buttons */
|
||||
.ck-math-view > math-field {
|
||||
margin-bottom: var(--ck-spacing-large, 16px);
|
||||
}
|
||||
|
||||
/* Action buttons row (Save/Cancel) */
|
||||
.ck-math-button-row {
|
||||
display: flex;
|
||||
flex-shrink: 0;
|
||||
gap: var(--ck-spacing-standard);
|
||||
margin-top: var(--ck-spacing-standard);
|
||||
width: fit-content;
|
||||
max-width: 100%;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
/* ============================================================================
|
||||
Shared Styles for Input Fields
|
||||
========================================================================= */
|
||||
|
||||
/* Base styling for both MathLive fields and textareas */
|
||||
.ck.ck-math-form math-field,
|
||||
.ck.ck-math-form textarea {
|
||||
box-sizing: border-box;
|
||||
padding: var(--ck-spacing-small);
|
||||
background: var(--ck-color-input-background) !important;
|
||||
color: var(--ck-color-input-text, inherit);
|
||||
font-size: var(--ck-font-size-base);
|
||||
border: none !important;
|
||||
border-radius: var(--ck-border-radius, 6px);
|
||||
outline: 3px solid transparent;
|
||||
outline-offset: 6px;
|
||||
}
|
||||
|
||||
/* MathLive-specific configuration */
|
||||
.ck.ck-math-form math-field {
|
||||
display: block !important;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
overflow-x: auto !important;
|
||||
|
||||
/* MathLive theme customization */
|
||||
--selection-background-color: rgba(33, 150, 243, 0.2);
|
||||
--selection-color: inherit;
|
||||
--contains-highlight-background-color: rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
|
||||
/* ============================================================================
|
||||
MathLive Visual Editor (Top Input)
|
||||
========================================================================= */
|
||||
|
||||
.ck.ck-mathlive-input {
|
||||
display: inline-block;
|
||||
flex: 0 0 auto;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
min-height: fit-content;
|
||||
max-height: 80vh;
|
||||
overflow: auto;
|
||||
padding-bottom: var(--ck-spacing-small);
|
||||
resize: none;
|
||||
}
|
||||
|
||||
/* Configure MathLive shadow DOM layout */
|
||||
.ck.ck-math-form math-field::part(container),
|
||||
.ck.ck-math-form math-field::part(content),
|
||||
.ck.ck-math-form math-field::part(field) {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1 1 auto;
|
||||
height: 100%;
|
||||
align-items: flex-start;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
/* Position MathLive UI controls */
|
||||
.ck.ck-math-form math-field::part(virtual-keyboard-toggle),
|
||||
.ck.ck-math-form math-field::part(menu-toggle) {
|
||||
position: absolute;
|
||||
top: 8px;
|
||||
}
|
||||
|
||||
.ck.ck-math-form math-field::part(virtual-keyboard-toggle) {
|
||||
right: 40px;
|
||||
}
|
||||
|
||||
.ck.ck-math-form math-field::part(menu-toggle) {
|
||||
right: 8px;
|
||||
display: flex !important;
|
||||
visibility: visible !important;
|
||||
}
|
||||
|
||||
/* ============================================================================
|
||||
Raw LaTeX Textarea (Middle Input)
|
||||
========================================================================= */
|
||||
|
||||
.ck-math-view .ck-labeled-field-view {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 0 0 auto;
|
||||
min-width: 100%;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
min-height: 60px;
|
||||
max-height: 65vh;
|
||||
resize: both;
|
||||
overflow: auto;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
/* Hide the default label (we use ::before for custom heading) */
|
||||
.ck-math-view .ck-labeled-field-view .ck-label {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* Textarea wrapper */
|
||||
.ck-math-view .ck-labeled-field-view .ck-labeled-field-view__input-wrapper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1 1 auto;
|
||||
width: 100%;
|
||||
min-height: 100px;
|
||||
height: auto;
|
||||
padding: 0;
|
||||
border: none;
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
/* Raw LaTeX textarea styling */
|
||||
.ck-math-view .ck-labeled-field-view textarea {
|
||||
display: block;
|
||||
flex: 1 1 auto;
|
||||
width: 100% !important;
|
||||
height: 100%;
|
||||
min-height: 140px;
|
||||
resize: none !important;
|
||||
border-radius: 0 !important;
|
||||
box-shadow: none !important;
|
||||
transition: none !important;
|
||||
}
|
||||
|
||||
/* Textarea hover and focus states */
|
||||
.ck-math-view .ck-labeled-field-view textarea:hover,
|
||||
.ck-math-view .ck-labeled-field-view textarea:focus {
|
||||
background: var(--ck-color-input-background) !important;
|
||||
outline: none !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
@ -42,7 +42,7 @@
|
||||
"typescript": "5.9.3",
|
||||
"vite-plugin-svgo": "~2.0.0",
|
||||
"vitest": "4.0.14",
|
||||
"webdriverio": "9.20.1"
|
||||
"webdriverio": "9.21.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"ckeditor5": "47.2.0"
|
||||
|
||||
@ -121,7 +121,6 @@ export interface OptionDefinitions extends KeyboardShortcutsOptions<KeyboardActi
|
||||
downloadImagesAutomatically: boolean;
|
||||
checkForUpdates: boolean;
|
||||
disableTray: boolean;
|
||||
promotedAttributesOpenInRibbon: boolean;
|
||||
editedNotesOpenInRibbon: boolean;
|
||||
codeBlockWordWrap: boolean;
|
||||
textNoteEditorMultilineToolbar: boolean;
|
||||
|
||||
212
pnpm-lock.yaml
generated
212
pnpm-lock.yaml
generated
@ -57,7 +57,7 @@ importers:
|
||||
version: 24.10.1
|
||||
'@vitest/browser-webdriverio':
|
||||
specifier: 4.0.14
|
||||
version: 4.0.14(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.14)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))
|
||||
version: 4.0.14(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.14)(webdriverio@9.21.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))
|
||||
'@vitest/coverage-v8':
|
||||
specifier: 4.0.14
|
||||
version: 4.0.14(@vitest/browser@4.0.14(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.14))(vitest@4.0.14)
|
||||
@ -149,11 +149,11 @@ importers:
|
||||
specifier: 19.2.0
|
||||
version: 19.2.0(react@19.2.0)
|
||||
typedoc:
|
||||
specifier: 0.28.14
|
||||
version: 0.28.14(typescript@5.9.3)
|
||||
specifier: 0.28.15
|
||||
version: 0.28.15(typescript@5.9.3)
|
||||
typedoc-plugin-missing-exports:
|
||||
specifier: 4.1.2
|
||||
version: 4.1.2(typedoc@0.28.14(typescript@5.9.3))
|
||||
version: 4.1.2(typedoc@0.28.15(typescript@5.9.3))
|
||||
|
||||
apps/client:
|
||||
dependencies:
|
||||
@ -933,8 +933,8 @@ importers:
|
||||
specifier: 4.0.14
|
||||
version: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.14)(@vitest/ui@4.0.14)(happy-dom@20.0.11)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||
webdriverio:
|
||||
specifier: 9.20.1
|
||||
version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
specifier: 9.21.0
|
||||
version: 9.21.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
|
||||
packages/ckeditor5-footnotes:
|
||||
devDependencies:
|
||||
@ -993,8 +993,8 @@ importers:
|
||||
specifier: 4.0.14
|
||||
version: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.14)(@vitest/ui@4.0.14)(happy-dom@20.0.11)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||
webdriverio:
|
||||
specifier: 9.20.1
|
||||
version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
specifier: 9.21.0
|
||||
version: 9.21.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
|
||||
packages/ckeditor5-keyboard-marker:
|
||||
devDependencies:
|
||||
@ -1053,14 +1053,17 @@ importers:
|
||||
specifier: 4.0.14
|
||||
version: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.14)(@vitest/ui@4.0.14)(happy-dom@20.0.11)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||
webdriverio:
|
||||
specifier: 9.20.1
|
||||
version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
specifier: 9.21.0
|
||||
version: 9.21.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
|
||||
packages/ckeditor5-math:
|
||||
dependencies:
|
||||
'@ckeditor/ckeditor5-icons':
|
||||
specifier: 47.2.0
|
||||
version: 47.2.0
|
||||
mathlive:
|
||||
specifier: 0.108.2
|
||||
version: 0.108.2
|
||||
devDependencies:
|
||||
'@ckeditor/ckeditor5-dev-build-tools':
|
||||
specifier: 43.1.0
|
||||
@ -1120,8 +1123,8 @@ importers:
|
||||
specifier: 4.0.14
|
||||
version: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.14)(@vitest/ui@4.0.14)(happy-dom@20.0.11)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||
webdriverio:
|
||||
specifier: 9.20.1
|
||||
version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
specifier: 9.21.0
|
||||
version: 9.21.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
|
||||
packages/ckeditor5-mermaid:
|
||||
dependencies:
|
||||
@ -1187,8 +1190,8 @@ importers:
|
||||
specifier: 4.0.14
|
||||
version: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.14)(@vitest/ui@4.0.14)(happy-dom@20.0.11)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||
webdriverio:
|
||||
specifier: 9.20.1
|
||||
version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
specifier: 9.21.0
|
||||
version: 9.21.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
|
||||
packages/codemirror:
|
||||
dependencies:
|
||||
@ -2123,6 +2126,10 @@ packages:
|
||||
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
|
||||
engines: {node: '>=0.1.90'}
|
||||
|
||||
'@cortex-js/compute-engine@0.30.2':
|
||||
resolution: {integrity: sha512-Zx+iisk9WWdbxjm8EYsneIBszvjfUs7BHNwf1jBtSINIgfWGpHrTTq9vW0J59iGCFt6bOFxbmWyxNMRSmksHMA==}
|
||||
engines: {node: '>=21.7.3', npm: '>=10.5.0'}
|
||||
|
||||
'@cspotcode/source-map-support@0.8.1':
|
||||
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
|
||||
engines: {node: '>=12'}
|
||||
@ -3164,8 +3171,8 @@ packages:
|
||||
'@gar/promisify@1.1.3':
|
||||
resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==}
|
||||
|
||||
'@gerrit0/mini-shiki@3.14.0':
|
||||
resolution: {integrity: sha512-c5X8fwPLOtUS8TVdqhynz9iV0GlOtFUT1ppXYzUUlEXe4kbZ/mvMT8wXoT8kCwUka+zsiloq7sD3pZ3+QVTuNQ==}
|
||||
'@gerrit0/mini-shiki@3.17.0':
|
||||
resolution: {integrity: sha512-Bpf6WuFar20ZXL6qU6VpVl4bVQfyyYiX+6O4xrns4nkU3Mr8paeupDbS1HENpcLOYj7pN4Rkd/yCaPA0vQwKww==}
|
||||
|
||||
'@hapi/hoek@9.3.0':
|
||||
resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
|
||||
@ -4701,17 +4708,17 @@ packages:
|
||||
'@selderee/plugin-htmlparser2@0.11.0':
|
||||
resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==}
|
||||
|
||||
'@shikijs/engine-oniguruma@3.14.0':
|
||||
resolution: {integrity: sha512-TNcYTYMbJyy+ZjzWtt0bG5y4YyMIWC2nyePz+CFMWqm+HnZZyy9SWMgo8Z6KBJVIZnx8XUXS8U2afO6Y0g1Oug==}
|
||||
'@shikijs/engine-oniguruma@3.17.0':
|
||||
resolution: {integrity: sha512-flSbHZAiOZDNTrEbULY8DLWavu/TyVu/E7RChpLB4WvKX4iHMfj80C6Hi3TjIWaQtHOW0KC6kzMcuB5TO1hZ8Q==}
|
||||
|
||||
'@shikijs/langs@3.14.0':
|
||||
resolution: {integrity: sha512-DIB2EQY7yPX1/ZH7lMcwrK5pl+ZkP/xoSpUzg9YC8R+evRCCiSQ7yyrvEyBsMnfZq4eBzLzBlugMyTAf13+pzg==}
|
||||
'@shikijs/langs@3.17.0':
|
||||
resolution: {integrity: sha512-icmur2n5Ojb+HAiQu6NEcIIJ8oWDFGGEpiqSCe43539Sabpx7Y829WR3QuUW2zjTM4l6V8Sazgb3rrHO2orEAw==}
|
||||
|
||||
'@shikijs/themes@3.14.0':
|
||||
resolution: {integrity: sha512-fAo/OnfWckNmv4uBoUu6dSlkcBc+SA1xzj5oUSaz5z3KqHtEbUypg/9xxgJARtM6+7RVm0Q6Xnty41xA1ma1IA==}
|
||||
'@shikijs/themes@3.17.0':
|
||||
resolution: {integrity: sha512-/xEizMHLBmMHwtx4JuOkRf3zwhWD2bmG5BRr0IPjpcWpaq4C3mYEuTk/USAEglN0qPrTwEHwKVpSu/y2jhferA==}
|
||||
|
||||
'@shikijs/types@3.14.0':
|
||||
resolution: {integrity: sha512-bQGgC6vrY8U/9ObG1Z/vTro+uclbjjD/uG58RvfxKZVD5p9Yc1ka3tVyEFy7BNJLzxuWyHH5NWynP9zZZS59eQ==}
|
||||
'@shikijs/types@3.17.0':
|
||||
resolution: {integrity: sha512-wjLVfutYWVUnxAjsWEob98xgyaGv0dTEnMZDruU5mRjVN7szcGOfgO+997W2yR6odp+1PtSBNeSITRRTfUzK/g==}
|
||||
|
||||
'@shikijs/vscode-textmate@10.0.2':
|
||||
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
|
||||
@ -5449,9 +5456,6 @@ packages:
|
||||
'@types/node@16.9.1':
|
||||
resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==}
|
||||
|
||||
'@types/node@20.19.24':
|
||||
resolution: {integrity: sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==}
|
||||
|
||||
'@types/node@20.19.25':
|
||||
resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==}
|
||||
|
||||
@ -5852,8 +5856,8 @@ packages:
|
||||
'@vue/shared@3.5.14':
|
||||
resolution: {integrity: sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==}
|
||||
|
||||
'@wdio/config@9.20.1':
|
||||
resolution: {integrity: sha512-npl2J+rjCDJPjVySgWpciOyhWddn6s7n5sepKXLR7x1ADQHl5zUFv1dHD3jx4OQ9l6lrGQSPaofuz+7e9mu+vg==}
|
||||
'@wdio/config@9.21.0':
|
||||
resolution: {integrity: sha512-8TP5/q+Agjc43LET1f0LhLmuEI803O3QtZEbSxOkkvJ7/e1jDWPm4qsL7SjQJlx8xGrW0kwRlPl7+U9Sr0dhCQ==}
|
||||
engines: {node: '>=18.20.0'}
|
||||
|
||||
'@wdio/logger@9.18.0':
|
||||
@ -5871,8 +5875,8 @@ packages:
|
||||
resolution: {integrity: sha512-zMmAtse2UMCSOW76mvK3OejauAdcFGuKopNRH7crI0gwKTZtvV89yXWRziz9cVXpFgfmJCjf9edxKFWdhuF5yw==}
|
||||
engines: {node: '>=18.20.0'}
|
||||
|
||||
'@wdio/utils@9.20.1':
|
||||
resolution: {integrity: sha512-C/Gsy5NAatsGUF1eT9Ks/ErR52/X4YI7MSm7BtwNOw8v2Ko+SiCA5qXts61J0A7QYwOn4gfXfBZZnzSAng6G/w==}
|
||||
'@wdio/utils@9.21.0':
|
||||
resolution: {integrity: sha512-aj8ao2V/e6Sv9gZby2ZIj4dMLjwYVba47Nlr+pOfK8N4VKKU0VRLPzvTlfK1HWaoS6u/GBbVx2pefYRrvd72BQ==}
|
||||
engines: {node: '>=18.20.0'}
|
||||
|
||||
'@webassemblyjs/ast@1.14.1':
|
||||
@ -5933,6 +5937,10 @@ packages:
|
||||
'@xtuc/long@4.2.2':
|
||||
resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
|
||||
|
||||
'@zip.js/zip.js@2.8.11':
|
||||
resolution: {integrity: sha512-0fztsk/0ryJ+2PPr9EyXS5/Co7OK8q3zY/xOoozEWaUsL5x+C0cyZ4YyMuUffOO2Dx/rAdq4JMPqW0VUtm+vzA==}
|
||||
engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=18.0.0'}
|
||||
|
||||
'@zip.js/zip.js@2.8.2':
|
||||
resolution: {integrity: sha512-PI6UdgpSeVoGvzguKHmy2bwOqI3UYkntLZOCpyJSKIi7234c5aJmQYkJB/P4P2YUJkqhbqvu7iM2/0eJZ178nA==}
|
||||
engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'}
|
||||
@ -6889,6 +6897,10 @@ packages:
|
||||
compare-versions@6.1.1:
|
||||
resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==}
|
||||
|
||||
complex-esm@2.1.1-esm1:
|
||||
resolution: {integrity: sha512-IShBEWHILB9s7MnfyevqNGxV0A1cfcSnewL/4uPFiSxkcQL4Mm3FxJ0pXMtCXuWLjYz3lRRyk6OfkeDZcjD6nw==}
|
||||
engines: {node: '>=16.14.2', npm: '>=8.5.0'}
|
||||
|
||||
component-emitter@1.3.1:
|
||||
resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
|
||||
|
||||
@ -8599,9 +8611,9 @@ packages:
|
||||
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
|
||||
deprecated: This package is no longer supported.
|
||||
|
||||
geckodriver@5.0.0:
|
||||
resolution: {integrity: sha512-vn7TtQ3b9VMJtVXsyWtQQl1fyBVFhQy7UvJF96kPuuJ0or5THH496AD3eUyaDD11+EqCxH9t6V+EP9soZQk4YQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
geckodriver@6.1.0:
|
||||
resolution: {integrity: sha512-ZRXLa4ZaYTTgUO4Eefw+RsQCleugU2QLb1ME7qTYxxuRj51yAhfnXaItXNs5/vUzfIaDHuZ+YnSF005hfp07nQ==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
hasBin: true
|
||||
|
||||
generate-function@2.3.1:
|
||||
@ -10205,6 +10217,9 @@ packages:
|
||||
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
mathlive@0.108.2:
|
||||
resolution: {integrity: sha512-GIZkfprGTxrbHckOvwo92ZmOOxdD018BHDzlrEwYUU+pzR5KabhqI1s43lxe/vqXdF5RLiQKgDcuk5jxEjhkYg==}
|
||||
|
||||
mathml-tag-names@2.1.3:
|
||||
resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
|
||||
|
||||
@ -10616,6 +10631,10 @@ packages:
|
||||
resolution: {integrity: sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
modern-tar@0.7.2:
|
||||
resolution: {integrity: sha512-TGG1ZRk1TAQ3neuZwahAHke3rKsSlro+ooMYtjh9sl2gGPVMLMuWiHgwC7im9T5bSM566RSo2Dko56ETgEvZcA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
morphdom@2.7.7:
|
||||
resolution: {integrity: sha512-04GmsiBcalrSCNmzfo+UjU8tt3PhZJKzcOy+r1FlGA7/zri8wre3I1WkYN9PT3sIeIKfW9bpyElA+VzOg2E24g==}
|
||||
|
||||
@ -14043,8 +14062,8 @@ packages:
|
||||
peerDependencies:
|
||||
typedoc: ^0.28.1
|
||||
|
||||
typedoc@0.28.14:
|
||||
resolution: {integrity: sha512-ftJYPvpVfQvFzpkoSfHLkJybdA/geDJ8BGQt/ZnkkhnBYoYW6lBgPQXu6vqLxO4X75dA55hX8Af847H5KXlEFA==}
|
||||
typedoc@0.28.15:
|
||||
resolution: {integrity: sha512-mw2/2vTL7MlT+BVo43lOsufkkd2CJO4zeOSuWQQsiXoV2VuEn7f6IZp2jsUDPmBMABpgR0R5jlcJ2OGEFYmkyg==}
|
||||
engines: {node: '>= 18', pnpm: '>= 10'}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
@ -14525,12 +14544,12 @@ packages:
|
||||
resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
|
||||
engines: {node: '>= 8'}
|
||||
|
||||
webdriver@9.20.1:
|
||||
resolution: {integrity: sha512-QtvYqPai2NOnq7qePPH6kNSwk7+tnmSvnlOnY8dIT/Y24TPdQp44NjF/BUYAWIlqoBlZqHClQFTSVwT2qvO2Tw==}
|
||||
webdriver@9.21.0:
|
||||
resolution: {integrity: sha512-XLOhpU/EFPo4TMk+0fRli4g1WriUujxrfDxGT/QRq0MJsfhSYPF8FdefFdL5gHIrJfSKscaQHGWkbnsHftfqeg==}
|
||||
engines: {node: '>=18.20.0'}
|
||||
|
||||
webdriverio@9.20.1:
|
||||
resolution: {integrity: sha512-QVM/asb5sDESz37ow/BAOA0z2HtUJsuAjPKHdw+Vx92PaQP3EfHwTgxK2T5rgwa0WRNh+c+n/0nEqIvqBl01sA==}
|
||||
webdriverio@9.21.0:
|
||||
resolution: {integrity: sha512-7teaXajOuNdn2UyyKlqMLssJjf0vDEih+Lo+tE/gHOt/P+mB8CinZym4PGtsriZLcyt4xV+Cun3hDmXM+pL26A==}
|
||||
engines: {node: '>=18.20.0'}
|
||||
peerDependencies:
|
||||
puppeteer-core: '>=22.x || <=24.x'
|
||||
@ -15636,6 +15655,8 @@ snapshots:
|
||||
'@ckeditor/ckeditor5-core': 47.2.0
|
||||
'@ckeditor/ckeditor5-upload': 47.2.0
|
||||
ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@ckeditor/ckeditor5-ai@47.2.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
|
||||
dependencies:
|
||||
@ -15782,6 +15803,8 @@ snapshots:
|
||||
'@ckeditor/ckeditor5-core': 47.2.0
|
||||
'@ckeditor/ckeditor5-utils': 47.2.0
|
||||
ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@ckeditor/ckeditor5-code-block@47.2.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)':
|
||||
dependencies:
|
||||
@ -15846,8 +15869,6 @@ snapshots:
|
||||
'@ckeditor/ckeditor5-utils': 47.2.0
|
||||
'@ckeditor/ckeditor5-watchdog': 47.2.0
|
||||
es-toolkit: 1.39.5
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@ckeditor/ckeditor5-dev-build-tools@43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)':
|
||||
dependencies:
|
||||
@ -16093,6 +16114,8 @@ snapshots:
|
||||
'@ckeditor/ckeditor5-core': 47.2.0
|
||||
'@ckeditor/ckeditor5-engine': 47.2.0
|
||||
'@ckeditor/ckeditor5-utils': 47.2.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@ckeditor/ckeditor5-essentials@47.2.0':
|
||||
dependencies:
|
||||
@ -16749,8 +16772,6 @@ snapshots:
|
||||
'@ckeditor/ckeditor5-icons': 47.2.0
|
||||
'@ckeditor/ckeditor5-ui': 47.2.0
|
||||
'@ckeditor/ckeditor5-utils': 47.2.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@ckeditor/ckeditor5-upload@47.2.0':
|
||||
dependencies:
|
||||
@ -16958,6 +16979,11 @@ snapshots:
|
||||
|
||||
'@colors/colors@1.5.0': {}
|
||||
|
||||
'@cortex-js/compute-engine@0.30.2':
|
||||
dependencies:
|
||||
complex-esm: 2.1.1-esm1
|
||||
decimal.js: 10.6.0
|
||||
|
||||
'@cspotcode/source-map-support@0.8.1':
|
||||
dependencies:
|
||||
'@jridgewell/trace-mapping': 0.3.9
|
||||
@ -18056,12 +18082,12 @@ snapshots:
|
||||
|
||||
'@gar/promisify@1.1.3': {}
|
||||
|
||||
'@gerrit0/mini-shiki@3.14.0':
|
||||
'@gerrit0/mini-shiki@3.17.0':
|
||||
dependencies:
|
||||
'@shikijs/engine-oniguruma': 3.14.0
|
||||
'@shikijs/langs': 3.14.0
|
||||
'@shikijs/themes': 3.14.0
|
||||
'@shikijs/types': 3.14.0
|
||||
'@shikijs/engine-oniguruma': 3.17.0
|
||||
'@shikijs/langs': 3.17.0
|
||||
'@shikijs/themes': 3.17.0
|
||||
'@shikijs/types': 3.17.0
|
||||
'@shikijs/vscode-textmate': 10.0.2
|
||||
|
||||
'@hapi/hoek@9.3.0': {}
|
||||
@ -19777,20 +19803,20 @@ snapshots:
|
||||
domhandler: 5.0.3
|
||||
selderee: 0.11.0
|
||||
|
||||
'@shikijs/engine-oniguruma@3.14.0':
|
||||
'@shikijs/engine-oniguruma@3.17.0':
|
||||
dependencies:
|
||||
'@shikijs/types': 3.14.0
|
||||
'@shikijs/types': 3.17.0
|
||||
'@shikijs/vscode-textmate': 10.0.2
|
||||
|
||||
'@shikijs/langs@3.14.0':
|
||||
'@shikijs/langs@3.17.0':
|
||||
dependencies:
|
||||
'@shikijs/types': 3.14.0
|
||||
'@shikijs/types': 3.17.0
|
||||
|
||||
'@shikijs/themes@3.14.0':
|
||||
'@shikijs/themes@3.17.0':
|
||||
dependencies:
|
||||
'@shikijs/types': 3.14.0
|
||||
'@shikijs/types': 3.17.0
|
||||
|
||||
'@shikijs/types@3.14.0':
|
||||
'@shikijs/types@3.17.0':
|
||||
dependencies:
|
||||
'@shikijs/vscode-textmate': 10.0.2
|
||||
'@types/hast': 3.0.4
|
||||
@ -20725,7 +20751,7 @@ snapshots:
|
||||
|
||||
'@types/mute-stream@0.0.4':
|
||||
dependencies:
|
||||
'@types/node': 22.19.1
|
||||
'@types/node': 24.10.1
|
||||
|
||||
'@types/node-forge@1.3.14':
|
||||
dependencies:
|
||||
@ -20733,10 +20759,6 @@ snapshots:
|
||||
|
||||
'@types/node@16.9.1': {}
|
||||
|
||||
'@types/node@20.19.24':
|
||||
dependencies:
|
||||
undici-types: 6.21.0
|
||||
|
||||
'@types/node@20.19.25':
|
||||
dependencies:
|
||||
undici-types: 6.21.0
|
||||
@ -20914,7 +20936,7 @@ snapshots:
|
||||
|
||||
'@types/yauzl@2.10.3':
|
||||
dependencies:
|
||||
'@types/node': 22.18.13
|
||||
'@types/node': 24.10.1
|
||||
optional: true
|
||||
|
||||
'@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
|
||||
@ -21141,11 +21163,11 @@ snapshots:
|
||||
- bufferutil
|
||||
- utf-8-validate
|
||||
|
||||
'@vitest/browser-webdriverio@4.0.14(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.14)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))':
|
||||
'@vitest/browser-webdriverio@4.0.14(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.14)(webdriverio@9.21.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))':
|
||||
dependencies:
|
||||
'@vitest/browser': 4.0.14(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.14)
|
||||
vitest: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.14)(@vitest/ui@4.0.14)(happy-dom@20.0.11)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||
webdriverio: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
webdriverio: 9.21.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
transitivePeerDependencies:
|
||||
- bufferutil
|
||||
- msw
|
||||
@ -21301,11 +21323,11 @@ snapshots:
|
||||
|
||||
'@vue/shared@3.5.14': {}
|
||||
|
||||
'@wdio/config@9.20.1':
|
||||
'@wdio/config@9.21.0':
|
||||
dependencies:
|
||||
'@wdio/logger': 9.18.0
|
||||
'@wdio/types': 9.20.0
|
||||
'@wdio/utils': 9.20.1
|
||||
'@wdio/utils': 9.21.0
|
||||
deepmerge-ts: 7.1.5
|
||||
glob: 10.4.5
|
||||
import-meta-resolve: 4.2.0
|
||||
@ -21325,13 +21347,13 @@ snapshots:
|
||||
|
||||
'@wdio/repl@9.16.2':
|
||||
dependencies:
|
||||
'@types/node': 20.19.24
|
||||
'@types/node': 20.19.25
|
||||
|
||||
'@wdio/types@9.20.0':
|
||||
dependencies:
|
||||
'@types/node': 20.19.24
|
||||
'@types/node': 20.19.25
|
||||
|
||||
'@wdio/utils@9.20.1':
|
||||
'@wdio/utils@9.21.0':
|
||||
dependencies:
|
||||
'@puppeteer/browsers': 2.10.10
|
||||
'@wdio/logger': 9.18.0
|
||||
@ -21339,7 +21361,7 @@ snapshots:
|
||||
decamelize: 6.0.1
|
||||
deepmerge-ts: 7.1.5
|
||||
edgedriver: 6.1.2
|
||||
geckodriver: 5.0.0
|
||||
geckodriver: 6.1.0
|
||||
get-port: 7.1.0
|
||||
import-meta-resolve: 4.2.0
|
||||
locate-app: 2.5.0
|
||||
@ -21435,6 +21457,8 @@ snapshots:
|
||||
|
||||
'@xtuc/long@4.2.2': {}
|
||||
|
||||
'@zip.js/zip.js@2.8.11': {}
|
||||
|
||||
'@zip.js/zip.js@2.8.2': {}
|
||||
|
||||
abab@2.0.6: {}
|
||||
@ -22604,6 +22628,8 @@ snapshots:
|
||||
|
||||
compare-versions@6.1.1: {}
|
||||
|
||||
complex-esm@2.1.1-esm1: {}
|
||||
|
||||
component-emitter@1.3.1: {}
|
||||
|
||||
compress-commons@6.0.2:
|
||||
@ -23390,8 +23416,7 @@ snapshots:
|
||||
|
||||
decimal.js@10.5.0: {}
|
||||
|
||||
decimal.js@10.6.0:
|
||||
optional: true
|
||||
decimal.js@10.6.0: {}
|
||||
|
||||
decko@1.2.0: {}
|
||||
|
||||
@ -24932,18 +24957,15 @@ snapshots:
|
||||
wide-align: 1.1.5
|
||||
optional: true
|
||||
|
||||
geckodriver@5.0.0:
|
||||
geckodriver@6.1.0:
|
||||
dependencies:
|
||||
'@wdio/logger': 9.18.0
|
||||
'@zip.js/zip.js': 2.8.2
|
||||
'@zip.js/zip.js': 2.8.11
|
||||
decamelize: 6.0.1
|
||||
http-proxy-agent: 7.0.2
|
||||
https-proxy-agent: 7.0.6
|
||||
node-fetch: 3.3.2
|
||||
tar-fs: 3.1.1
|
||||
which: 5.0.0
|
||||
modern-tar: 0.7.2
|
||||
transitivePeerDependencies:
|
||||
- bare-buffer
|
||||
- supports-color
|
||||
|
||||
generate-function@2.3.1:
|
||||
@ -26810,6 +26832,10 @@ snapshots:
|
||||
|
||||
math-intrinsics@1.1.0: {}
|
||||
|
||||
mathlive@0.108.2:
|
||||
dependencies:
|
||||
'@cortex-js/compute-engine': 0.30.2
|
||||
|
||||
mathml-tag-names@2.1.3: {}
|
||||
|
||||
mdast-util-find-and-replace@3.0.2:
|
||||
@ -27452,6 +27478,8 @@ snapshots:
|
||||
hasown: 2.0.2
|
||||
isarray: 2.0.5
|
||||
|
||||
modern-tar@0.7.2: {}
|
||||
|
||||
morphdom@2.7.7: {}
|
||||
|
||||
mrmime@2.0.1: {}
|
||||
@ -31446,13 +31474,13 @@ snapshots:
|
||||
|
||||
typedarray@0.0.6: {}
|
||||
|
||||
typedoc-plugin-missing-exports@4.1.2(typedoc@0.28.14(typescript@5.9.3)):
|
||||
typedoc-plugin-missing-exports@4.1.2(typedoc@0.28.15(typescript@5.9.3)):
|
||||
dependencies:
|
||||
typedoc: 0.28.14(typescript@5.9.3)
|
||||
typedoc: 0.28.15(typescript@5.9.3)
|
||||
|
||||
typedoc@0.28.14(typescript@5.9.3):
|
||||
typedoc@0.28.15(typescript@5.9.3):
|
||||
dependencies:
|
||||
'@gerrit0/mini-shiki': 3.14.0
|
||||
'@gerrit0/mini-shiki': 3.17.0
|
||||
lunr: 2.3.9
|
||||
markdown-it: 14.1.0
|
||||
minimatch: 9.0.5
|
||||
@ -31824,7 +31852,7 @@ snapshots:
|
||||
optionalDependencies:
|
||||
'@opentelemetry/api': 1.9.0
|
||||
'@types/node': 24.10.1
|
||||
'@vitest/browser-webdriverio': 4.0.14(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.14)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))
|
||||
'@vitest/browser-webdriverio': 4.0.14(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.14)(webdriverio@9.21.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))
|
||||
'@vitest/ui': 4.0.14(vitest@4.0.14)
|
||||
happy-dom: 20.0.11
|
||||
jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
@ -31914,15 +31942,15 @@ snapshots:
|
||||
|
||||
web-streams-polyfill@3.3.3: {}
|
||||
|
||||
webdriver@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5):
|
||||
webdriver@9.21.0(bufferutil@4.0.9)(utf-8-validate@6.0.5):
|
||||
dependencies:
|
||||
'@types/node': 20.19.24
|
||||
'@types/node': 20.19.25
|
||||
'@types/ws': 8.18.1
|
||||
'@wdio/config': 9.20.1
|
||||
'@wdio/config': 9.21.0
|
||||
'@wdio/logger': 9.18.0
|
||||
'@wdio/protocols': 9.16.2
|
||||
'@wdio/types': 9.20.0
|
||||
'@wdio/utils': 9.20.1
|
||||
'@wdio/utils': 9.21.0
|
||||
deepmerge-ts: 7.1.5
|
||||
https-proxy-agent: 7.0.6
|
||||
undici: 6.21.3
|
||||
@ -31933,16 +31961,16 @@ snapshots:
|
||||
- supports-color
|
||||
- utf-8-validate
|
||||
|
||||
webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5):
|
||||
webdriverio@9.21.0(bufferutil@4.0.9)(utf-8-validate@6.0.5):
|
||||
dependencies:
|
||||
'@types/node': 20.19.24
|
||||
'@types/node': 20.19.25
|
||||
'@types/sinonjs__fake-timers': 8.1.5
|
||||
'@wdio/config': 9.20.1
|
||||
'@wdio/config': 9.21.0
|
||||
'@wdio/logger': 9.18.0
|
||||
'@wdio/protocols': 9.16.2
|
||||
'@wdio/repl': 9.16.2
|
||||
'@wdio/types': 9.20.0
|
||||
'@wdio/utils': 9.20.1
|
||||
'@wdio/utils': 9.21.0
|
||||
archiver: 7.0.1
|
||||
aria-query: 5.3.2
|
||||
cheerio: 1.1.2
|
||||
@ -31959,7 +31987,7 @@ snapshots:
|
||||
rgb2hex: 0.2.5
|
||||
serialize-error: 12.0.0
|
||||
urlpattern-polyfill: 10.1.0
|
||||
webdriver: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
webdriver: 9.21.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
|
||||
transitivePeerDependencies:
|
||||
- bare-buffer
|
||||
- bufferutil
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user