UNPKG

mathlive

Version:

A web component for math input

317 lines (316 loc) 11 kB
/* 0.108.2 */ import type { Selector } from './commands'; import type { ParseMode, Style } from './core-types'; import type { OriginValidator } from './options'; /** * @category Virtual Keyboard */ export type AlphabeticKeyboardLayout = 'auto' | 'qwerty' | 'azerty' | 'qwertz' | 'dvorak' | 'colemak'; /** * @category Virtual Keyboard */ export interface VirtualKeyboardKeycap { /** * The HTML markup displayed for the keycap */ label: string; tooltip: string; /** * Command to perform when the keycap is pressed */ command: string | Selector | string[] | [string, any] | [string, any, any] | [string, any, any, any]; /** * LaTeX fragment to insert when the keycap is pressed * (ignored if command is specified) */ insert: string; /** * Label of the key as a LaTeX expression, also the LaTeX * inserted if no `command` or `insert` property is specified. */ latex: string; /** * Key to insert when keycap is pressed * (ignored if `command`, `insert` or `latex` is specified) */ key: string; /** * CSS classes to apply to the keycap. * * - `tex`: use the TeX font for its label. * Using the tex class is not necessary if using the `latex` property to * define the label. * - `shift`: a shift key * - `small`: display the label in a smaller size * - `action`: an “action” keycap (for arrows, return, etc…) * - `separator w5`: a half-width blank used as a separator. Other widths * include `w15` (1.5 width), `w20` (double width) and `w50` (five-wide, * used for the space bar). * - `bottom`, `left`, `right`: alignment of the label * */ class: string; /** Width of the keycap, as a multiple of the standard keycap width */ width: 0.5 | 1.0 | 1.5 | 2.0 | 5.0; /** * Markup displayed with the key label (for example to explain what the * symbol of the key is) */ aside: string; /** * A set of keycap variants displayed on a long press * * ```js * variants: [ * '\\alpha', // Same label as value inserted * { latex: '\\beta', label: 'beta' } * ] * * ``` */ variants: string | (string | Partial<VirtualKeyboardKeycap>)[]; /** * Variant of the keycap when the shift key is pressed */ shift: string | Partial<VirtualKeyboardKeycap>; /** Name of the layer to shift to when the key is pressed */ layer: string; /** Open variants panel without long press and does not close automatically */ stickyVariantPanel: boolean; } /** * @category Virtual Keyboard */ export type VirtualKeyboardLayoutCore = { /** A human readable string displayed in the layout switcher toolbar */ label?: string; labelClass?: string; /** A human readable tooltip associated with the label */ tooltip?: string; /** A unique string identifying the layout */ id?: string; /** If false, keycaps that have a shifted variant will be displayed as if they don't */ displayShiftedKeycaps?: boolean; /** If false, do not include the edit toolbar in the layout */ displayEditToolbar?: boolean; }; /** * @category Virtual Keyboard */ export type VirtualKeyboardLayout = VirtualKeyboardLayoutCore & (/** The set of layers for this layout */ { layers: (string | VirtualKeyboardLayer)[]; } /** As a shortcut, if a single layer, the rows of that layer */ | { rows: (string | Partial<VirtualKeyboardKeycap>)[][]; } | { markup: string; }); /** * @category Virtual Keyboard */ export type NormalizedVirtualKeyboardLayout = VirtualKeyboardLayoutCore & { layers: NormalizedVirtualKeyboardLayer[]; }; /** * @category Virtual Keyboard */ export interface VirtualKeyboardLayer { /** The rows of keycaps in this layer */ rows?: (Partial<VirtualKeyboardKeycap> | string)[][]; markup?: string; /** The CSS stylesheet associated with this layer */ style?: string; /** A CSS class name to customize the appearance of the background of the layer */ backdrop?: string; /** A CSS class name to customize the appearance of the container the layer */ container?: string; /** A unique string identifying the layer */ id?: string; } /** * @category Virtual Keyboard */ export interface NormalizedVirtualKeyboardLayer { rows?: Partial<VirtualKeyboardKeycap>[][]; markup?: string; style?: string; backdrop?: string; container?: string; id?: string; } /** * @category Virtual Keyboard */ export type EditToolbarOptions = 'none' | 'default'; /** * @category Virtual Keyboard */ export type VirtualKeyboardName = 'default' | 'compact' | 'minimalist' | 'numeric-only' | 'numeric' | 'symbols' | 'alphabetic' | 'greek'; /** * @category Virtual Keyboard */ export interface VirtualKeyboardOptions { /** * A layout is made up of one or more layers (think of the main layer * and the shift layer on a hardware keyboard). * * A layout has a name and styling information. * * In addition, a layout can be represented as a standard name which * includes `"numeric"`, `"functions"`, `"symbols"`, `"alphabetic"` * and `"greek". * * **See* {@link mathfield/guides/virtual-keyboards | Guide: Virtual Keyboards} * * */ get layouts(): readonly (VirtualKeyboardName | VirtualKeyboardLayout)[]; set layouts(value: VirtualKeyboardName | VirtualKeyboardLayout | (VirtualKeyboardName | VirtualKeyboardLayout)[] | readonly (VirtualKeyboardName | VirtualKeyboardLayout)[]); /** * This property is the "expanded" version of the `layouts` property. * It is normalized to include all the default values for the properties * of the layout and layers. */ readonly normalizedLayouts: (VirtualKeyboardLayoutCore & { layers: NormalizedVirtualKeyboardLayer[]; })[]; /** * Some keycaps can be customized: * `[left]`, `[right]`, `[up]`, `[down]`, `[return]`, `[action]`, * `[space]`, `[tab]`, `[backspace]`, `[shift]`, * `[undo]`, `[redo]`, `[foreground-color]`, `[background-color]`, * `[hide-keyboard]`, * `[.]`, `[,]`, * `[0]`, `[1]`, `[2]`, `[3]`, `[4]`, * `[5]`, `[6]`, `[7]`, `[8]`, `[9]`, * `[+]`, `[-]`, `[*]`, `[/]`, `[^]`, `[_]`, `[=]`, `[.]`, * `[(]`, `[)]`, */ getKeycap(keycap: string): Partial<VirtualKeyboardKeycap> | undefined; setKeycap(keycap: string, value: Partial<VirtualKeyboardKeycap>): void; /** * Configuration of the action toolbar, displayed on the right-hand side. * * Use `"none"` to disable the right hand side toolbar of the * virtual keyboard. */ set editToolbar(value: EditToolbarOptions); /** Layout of the alphabetic layers: AZERTY, QWERTY, etc... */ set alphabeticLayout(value: AlphabeticKeyboardLayout); /** * Element the virtual keyboard element gets appended to. * * When using [full screen elements](https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API) * that contain mathfield, set this property to the full screen element to * ensure the virtual keyboard will be visible. * * **Default**: `document.body` */ set container(value: null | HTMLElement); /** * Specify the `targetOrigin` parameter for [postMessage](https://developer.mozilla.org/en/docs/Web/API/Window/postMessage) * to send control messages from parent to child frame to remote control of * mathfield component. * * **Default**: `globalThis.origin` */ targetOrigin: string; /** * Specify behavior how origin of message from [postMessage](https://developer.mozilla.org/en/docs/Web/API/Window/postMessage) * should be validated. * * **Default**: `"none"` */ originValidator: OriginValidator; } /** @internal */ export interface MathfieldProxy { value: string; readonly selectionIsCollapsed: boolean; readonly canUndo: boolean; readonly canRedo: boolean; readonly mode: ParseMode; readonly style: Style; } /** * This interface is implemented by: * - `VirtualKeyboard`: when the browsing context is a top-level document * - `VirtualKeyboardProxy`: when the browsing context is an iframe * * @category Virtual Keyboard */ export interface VirtualKeyboardInterface extends VirtualKeyboardOptions { show(options?: { animate: boolean; }): void; hide(options?: { animate: boolean; }): void; visible: boolean; readonly isShifted: boolean; readonly boundingRect: DOMRect; executeCommand(command: string | [string, ...any[]]): boolean; /** The content or selection of the mathfield has changed and the toolbar * may need to be updated accordingly */ updateToolbar(mf: MathfieldProxy): void; update(mf: MathfieldProxy): void; connect(): void; disconnect(): void; } /** * @category Editing Commands */ export interface VirtualKeyboardCommands { switchKeyboardLayer: (mathfield: undefined, layer: string) => boolean; toggleVirtualKeyboard: () => boolean; hideVirtualKeyboard: () => boolean; showVirtualKeyboard: () => boolean; } /** * @category Virtual Keyboard */ export type VirtualKeyboardMessageAction = 'connect' | 'disconnect' | 'proxy-created' | 'execute-command' | 'show' | 'hide' | 'update-setting' | 'update-toolbar' | 'synchronize-proxy' | 'geometry-changed' | 'update-state' | 'focus' | 'blur'; /** * @category Virtual Keyboard */ export type VirtualKeyboardMessage = { type: 'mathlive#virtual-keyboard-message'; action: 'execute-command'; command: Selector | [Selector, ...any[]]; } | { type: 'mathlive#virtual-keyboard-message'; action: 'geometry-changed'; boundingRect: DOMRect; } | { type: 'mathlive#virtual-keyboard-message'; action: 'synchronize-proxy'; boundingRect: DOMRect; alphabeticLayout?: AlphabeticKeyboardLayout; layers: Record<string, string | Partial<VirtualKeyboardLayer>>; layouts: readonly (string | VirtualKeyboardLayout)[]; editToolbar?: EditToolbarOptions; setKeycap: { keycap: string; value: Partial<VirtualKeyboardKeycap>; }; isShifted: boolean; } | { type: 'mathlive#virtual-keyboard-message'; action: 'update-setting'; alphabeticLayout?: AlphabeticKeyboardLayout; layers: Record<string, string | Partial<VirtualKeyboardLayer>>; layouts: readonly (VirtualKeyboardName | VirtualKeyboardLayout)[]; editToolbar?: EditToolbarOptions; setKeycap: { keycap: string; value: Partial<VirtualKeyboardKeycap>; }; } | { type: 'mathlive#virtual-keyboard-message'; action: 'show' | 'hide'; animate?: boolean; } | { type: 'mathlive#virtual-keyboard-message'; action: 'connect' | 'disconnect' | 'proxy-created' | 'focus' | 'blur' | 'update-state' | 'update-toolbar'; };