@olddevs/ui 4.4.0 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/editor/RichTextEditor.d.ts +11 -4
- package/dist/editor/RichTextEditor.d.ts.map +1 -1
- package/dist/editor/RichTextEditor.js +90 -60
- package/dist/editor/RichTextEditor.js.map +1 -1
- package/dist/editor/RichTextView.d.ts +2 -1
- package/dist/editor/RichTextView.d.ts.map +1 -1
- package/dist/editor/RichTextView.js.map +1 -1
- package/dist/editor/core/containers.d.ts +2 -6
- package/dist/editor/core/containers.d.ts.map +1 -1
- package/dist/editor/core/containers.js +2 -1
- package/dist/editor/core/containers.js.map +1 -1
- package/dist/editor/core/customTool.d.ts +8 -2
- package/dist/editor/core/customTool.d.ts.map +1 -1
- package/dist/editor/core/customTool.js.map +1 -1
- package/dist/editor/core/customToolEngine.d.ts +9 -1
- package/dist/editor/core/customToolEngine.d.ts.map +1 -1
- package/dist/editor/core/customToolEngine.js +12 -0
- package/dist/editor/core/customToolEngine.js.map +1 -1
- package/dist/editor/core/extensions.d.ts.map +1 -1
- package/dist/editor/core/extensions.js +1 -1
- package/dist/editor/core/extensions.js.map +1 -1
- package/dist/editor/core/handle.d.ts +18 -1
- package/dist/editor/core/handle.d.ts.map +1 -1
- package/dist/editor/core/handle.js +2 -1
- package/dist/editor/core/handle.js.map +1 -1
- package/dist/editor/core/handleWatchers.d.ts +30 -0
- package/dist/editor/core/handleWatchers.d.ts.map +1 -1
- package/dist/editor/core/handleWatchers.js +15 -0
- package/dist/editor/core/handleWatchers.js.map +1 -1
- package/dist/editor/core/nodeNames.d.ts +7 -0
- package/dist/editor/core/nodeNames.d.ts.map +1 -0
- package/dist/editor/core/nodeNames.js +2 -0
- package/dist/editor/core/nodeNames.js.map +1 -0
- package/dist/editor/core/schema.d.ts.map +1 -1
- package/dist/editor/core/schema.js +4 -2
- package/dist/editor/core/schema.js.map +1 -1
- package/dist/editor/core/toolCommands.d.ts +78 -0
- package/dist/editor/core/toolCommands.d.ts.map +1 -0
- package/dist/editor/core/toolCommands.js +2 -0
- package/dist/editor/core/toolCommands.js.map +1 -0
- package/dist/editor/core/toolDefinition.d.ts +139 -0
- package/dist/editor/core/toolDefinition.d.ts.map +1 -0
- package/dist/editor/core/toolDefinition.js +28 -0
- package/dist/editor/core/toolDefinition.js.map +1 -0
- package/dist/editor/core/toolDescriptor.d.ts +71 -2
- package/dist/editor/core/toolDescriptor.d.ts.map +1 -1
- package/dist/editor/core/toolDescriptor.js +6 -2
- package/dist/editor/core/toolDescriptor.js.map +1 -1
- package/dist/editor/core/toolOptions.d.ts +157 -0
- package/dist/editor/core/toolOptions.d.ts.map +1 -0
- package/dist/editor/core/toolOptions.js +21 -0
- package/dist/editor/core/toolOptions.js.map +1 -0
- package/dist/editor/core/toolState.d.ts +46 -0
- package/dist/editor/core/toolState.d.ts.map +1 -0
- package/dist/editor/core/toolState.js +2 -0
- package/dist/editor/core/toolState.js.map +1 -0
- package/dist/editor/core/tools.d.ts +3 -1
- package/dist/editor/core/tools.d.ts.map +1 -1
- package/dist/editor/core/tools.js.map +1 -1
- package/dist/editor/core/viewIsland.d.ts.map +1 -1
- package/dist/editor/core/viewIsland.js +2 -1
- package/dist/editor/core/viewIsland.js.map +1 -1
- package/dist/editor/features/builtins.d.ts +9 -4
- package/dist/editor/features/builtins.d.ts.map +1 -1
- package/dist/editor/features/builtins.js +36 -7
- package/dist/editor/features/builtins.js.map +1 -1
- package/dist/editor/features/search/SearchPanel.d.ts.map +1 -1
- package/dist/editor/features/search/SearchPanel.js +26 -12
- package/dist/editor/features/search/SearchPanel.js.map +1 -1
- package/dist/editor/features/search/revealMatch.d.ts +16 -0
- package/dist/editor/features/search/revealMatch.d.ts.map +1 -1
- package/dist/editor/features/search/revealMatch.js +22 -0
- package/dist/editor/features/search/revealMatch.js.map +1 -1
- package/dist/editor/features/search/searchPlugin.d.ts +8 -3
- package/dist/editor/features/search/searchPlugin.d.ts.map +1 -1
- package/dist/editor/features/search/searchPlugin.js +17 -6
- package/dist/editor/features/search/searchPlugin.js.map +1 -1
- package/dist/editor/features/search/searchSnapshot.d.ts +14 -0
- package/dist/editor/features/search/searchSnapshot.d.ts.map +1 -0
- package/dist/editor/features/search/searchSnapshot.js +17 -0
- package/dist/editor/features/search/searchSnapshot.js.map +1 -0
- package/dist/editor/features/search/searchTool.d.ts +3 -0
- package/dist/editor/features/search/searchTool.d.ts.map +1 -1
- package/dist/editor/features/search/searchTool.js +30 -1
- package/dist/editor/features/search/searchTool.js.map +1 -1
- package/dist/editor/features/toc/RichTextToc.d.ts +29 -1
- package/dist/editor/features/toc/RichTextToc.d.ts.map +1 -1
- package/dist/editor/features/toc/RichTextToc.js +55 -10
- package/dist/editor/features/toc/RichTextToc.js.map +1 -1
- package/dist/editor/features/toc/documentHeadings.d.ts +30 -0
- package/dist/editor/features/toc/documentHeadings.d.ts.map +1 -0
- package/dist/editor/features/toc/documentHeadings.js +20 -0
- package/dist/editor/features/toc/documentHeadings.js.map +1 -0
- package/dist/editor/features/toc/headings.d.ts +6 -2
- package/dist/editor/features/toc/headings.d.ts.map +1 -1
- package/dist/editor/features/toc/headings.js +4 -2
- package/dist/editor/features/toc/headings.js.map +1 -1
- package/dist/editor/features/toc/tocSnapshot.d.ts +10 -0
- package/dist/editor/features/toc/tocSnapshot.d.ts.map +1 -0
- package/dist/editor/features/toc/tocSnapshot.js +8 -0
- package/dist/editor/features/toc/tocSnapshot.js.map +1 -0
- package/dist/editor/features/toc/tocTool.d.ts +6 -0
- package/dist/editor/features/toc/tocTool.d.ts.map +1 -0
- package/dist/editor/features/toc/tocTool.js +21 -0
- package/dist/editor/features/toc/tocTool.js.map +1 -0
- package/dist/editor/hooks/useRichTextToolState.d.ts +43 -0
- package/dist/editor/hooks/useRichTextToolState.d.ts.map +1 -0
- package/dist/editor/hooks/useRichTextToolState.js +77 -0
- package/dist/editor/hooks/useRichTextToolState.js.map +1 -0
- package/dist/editor/index.d.ts +8 -0
- package/dist/editor/index.d.ts.map +1 -1
- package/dist/editor/index.js +3 -0
- package/dist/editor/index.js.map +1 -1
- package/docs/api/editor-extension.en.md +223 -23
- package/docs/api/editor-extension.md +224 -22
- package/docs/api/migration-notes.en.md +36 -1
- package/docs/api/migration-notes.md +35 -0
- package/docs/components/content/rich-text-toc.en.md +13 -11
- package/docs/components/content/rich-text-toc.md +12 -10
- package/docs/components/index.en.md +2 -2
- package/docs/components/index.md +1 -1
- package/docs/components/inputs/rich-text-editor.en.md +227 -11
- package/docs/components/inputs/rich-text-editor.md +228 -10
- package/docs/getting-started.en.md +7 -7
- package/docs/getting-started.md +6 -6
- package/docs/glossary.en.md +52 -48
- package/docs/glossary.md +51 -47
- package/package.json +1 -1
- package/src/editor/RichTextEditor.tsx +94 -39
- package/src/editor/RichTextView.tsx +2 -1
- package/src/editor/core/containers.ts +8 -6
- package/src/editor/core/customTool.ts +8 -2
- package/src/editor/core/customToolEngine.ts +20 -1
- package/src/editor/core/extensions.ts +2 -1
- package/src/editor/core/handle.ts +25 -1
- package/src/editor/core/handleWatchers.ts +45 -0
- package/src/editor/core/nodeNames.ts +7 -0
- package/src/editor/core/schema.ts +5 -2
- package/src/editor/core/toolCommands.ts +85 -0
- package/src/editor/core/toolDefinition.ts +208 -0
- package/src/editor/core/toolDescriptor.ts +94 -3
- package/src/editor/core/toolOptions.ts +211 -0
- package/src/editor/core/toolState.ts +56 -0
- package/src/editor/core/tools.ts +3 -1
- package/src/editor/core/viewIsland.ts +5 -4
- package/src/editor/features/builtins.ts +72 -13
- package/src/editor/features/search/SearchPanel.tsx +38 -14
- package/src/editor/features/search/revealMatch.ts +45 -0
- package/src/editor/features/search/searchPlugin.ts +40 -11
- package/src/editor/features/search/searchSnapshot.ts +29 -0
- package/src/editor/features/search/searchTool.ts +51 -1
- package/src/editor/features/toc/RichTextToc.tsx +108 -10
- package/src/editor/features/toc/documentHeadings.ts +59 -0
- package/src/editor/features/toc/headings.ts +10 -3
- package/src/editor/features/toc/tocSnapshot.ts +24 -0
- package/src/editor/features/toc/tocTool.ts +41 -0
- package/src/editor/hooks/useRichTextToolState.ts +153 -0
- package/src/editor/index.ts +19 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { RichTextTools, SearchToolOptions } from "./toolOptions.js";
|
|
2
|
+
/**
|
|
3
|
+
* Команды Инструмента `search`. Каждая возвращает `boolean`: выполнена или нет
|
|
4
|
+
* (HTML-режим, нет совпадений, поле нельзя править). Команды ведут себя как
|
|
5
|
+
* панель «Поиск и замена»: тот же запрос, те же флажки, та же подсветка.
|
|
6
|
+
* Запрос и флажки живут в движке, поэтому `setQuery`, `next` и `replace` работают
|
|
7
|
+
* и без открытой панели — на них можно собрать свой интерфейс поиска.
|
|
8
|
+
*/
|
|
9
|
+
export interface SearchToolCommands {
|
|
10
|
+
/**
|
|
11
|
+
* Открыть панель — то же, что кнопка «Поиск» и `Mod+F`. `query` сразу ставит
|
|
12
|
+
* запрос в поле и в подсветку документа; без него запросом становится текст,
|
|
13
|
+
* выделенный в одном Блоке. `replace` ставит фокус в поле замены. Флажки на
|
|
14
|
+
* открытой панели не меняются, на закрытой панель стартует с Опций Инструмента.
|
|
15
|
+
* `false` — в HTML-режиме (Документа на экране нет).
|
|
16
|
+
*/
|
|
17
|
+
open(options?: {
|
|
18
|
+
replace?: boolean;
|
|
19
|
+
query?: string;
|
|
20
|
+
}): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Закрыть панель и убрать подсветку. Фокус и каретка остаются где были:
|
|
23
|
+
* в отличие от Escape в панели, команда в Документ их не переводит. Панель,
|
|
24
|
+
* уже закрытая, — не ошибка: подсветка всё равно убирается.
|
|
25
|
+
*/
|
|
26
|
+
close(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Задать запрос. Не названные в `flags` флажки (и флажки со значением
|
|
29
|
+
* `undefined`) берутся из открытой панели, а если её нет — из Опций
|
|
30
|
+
* Инструмента. Открытая панель показывает новый запрос
|
|
31
|
+
* и флажки. Непустой запрос прокручивает к первому совпадению после каретки,
|
|
32
|
+
* как `next` (прокрутка приходит чуть позже). `true` — запрос применён, даже
|
|
33
|
+
* если совпадений нет (их число — Состояние Инструмента); `false` — в
|
|
34
|
+
* HTML-режиме.
|
|
35
|
+
*/
|
|
36
|
+
setQuery(query: string, flags?: Partial<SearchToolOptions>): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Следующее совпадение по кругу, выделяет его и прокручивает к нему ближайшую
|
|
39
|
+
* прокручиваемую область поля или окно — как панель, даже когда фокус вне
|
|
40
|
+
* Документа; фокус при этом не забирается. Прокрутка приходит чуть позже
|
|
41
|
+
* вызова (микрозадачей и кадром): её код грузится при первом вызове. `false` —
|
|
42
|
+
* совпадений нет.
|
|
43
|
+
*/
|
|
44
|
+
next(): boolean;
|
|
45
|
+
/** Предыдущее совпадение по кругу; выделяет и прокручивает, как `next`. `false` — совпадений нет. */
|
|
46
|
+
previous(): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Заменить текущее совпадение: одна правка, одна отмена. Текущим становится
|
|
49
|
+
* следующее. `false` — совпадений нет или поле нельзя править.
|
|
50
|
+
*/
|
|
51
|
+
replace(text: string): boolean;
|
|
52
|
+
/** Заменить все совпадения: одна правка, одна отмена. Условия — как у `replace`. */
|
|
53
|
+
replaceAll(text: string): boolean;
|
|
54
|
+
}
|
|
55
|
+
/** Команды Инструмента `toc`. */
|
|
56
|
+
export interface TocToolCommands {
|
|
57
|
+
/**
|
|
58
|
+
* Перейти к заголовку списка Оглавления — как клик по пункту. Индекс считается
|
|
59
|
+
* в том же списке, что и пункты: с учётом `levels`, с нуля, пустые заголовки
|
|
60
|
+
* пропускаются. В правке каретка встаёт в конец заголовка, в `readOnly` фокус
|
|
61
|
+
* получает сам заголовок; прокрутка ставит его под липкую шапку (`offsetVar`) и
|
|
62
|
+
* Панель, подсветка заголовка гаснет.
|
|
63
|
+
*
|
|
64
|
+
* `false` — нет заголовка с таким индексом, либо Оглавление ещё не готово: его
|
|
65
|
+
* UI грузится отдельным куском после создания движка, и в HTML-режиме его нет.
|
|
66
|
+
* Заголовков меньше двух — не причина отказа: полоса не рисуется, но список
|
|
67
|
+
* есть, и переход работает.
|
|
68
|
+
*/
|
|
69
|
+
jumpTo(index: number): boolean;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Команды Инструмента по имени из карты `RichTextTools`. Имя вне карты — `unknown`:
|
|
73
|
+
* типизация добровольна, Инструмент работает и без неё.
|
|
74
|
+
*/
|
|
75
|
+
export type ToolCommandsOf<Name extends string> = Name extends keyof RichTextTools ? RichTextTools[Name] extends {
|
|
76
|
+
commands: infer Commands;
|
|
77
|
+
} ? Commands : unknown : unknown;
|
|
78
|
+
//# sourceMappingURL=toolCommands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolCommands.d.ts","sourceRoot":"","sources":["../../../src/editor/core/toolCommands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAQzE;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IAC/D;;;;OAIG;IACH,KAAK,IAAI,OAAO,CAAC;IACjB;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC;IACrE;;;;;;OAMG;IACH,IAAI,IAAI,OAAO,CAAC;IAChB,qGAAqG;IACrG,QAAQ,IAAI,OAAO,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,oFAAoF;IACpF,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACnC;AAED,iCAAiC;AACjC,MAAM,WAAW,eAAe;IAC9B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAChC;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,IAAI,SAAS,MAAM,IAAI,IAAI,SAAS,MAAM,aAAa,GAC9E,aAAa,CAAC,IAAI,CAAC,SAAS;IAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;CAAE,GACtD,QAAQ,GACR,OAAO,GACT,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolCommands.js","sourceRoot":"","sources":["../../../src/editor/core/toolCommands.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { Editor } from "@tiptap/core";
|
|
2
|
+
import type { CustomTool, PrefixedName, ToolEntry } from "./customTool.js";
|
|
3
|
+
/**
|
|
4
|
+
* Тело описания своего Инструмента: форма `CustomTool` без имени. Имя задаёт
|
|
5
|
+
* определение, поэтому оно не может разойтись с тем, под каким определение лежит
|
|
6
|
+
* в `tools`.
|
|
7
|
+
*/
|
|
8
|
+
export type CustomToolBody = Omit<CustomTool, "name">;
|
|
9
|
+
/**
|
|
10
|
+
* Что получают `state` и `commands` определения: живой движок и Опции этого
|
|
11
|
+
* Редактора — умолчания `defaults`, слитые с `tool(definition, options)`.
|
|
12
|
+
*/
|
|
13
|
+
export interface ToolDefinitionContext<Options extends object = object> {
|
|
14
|
+
/** Живой движок: функцию зовут, только когда он создан и не уничтожен. */
|
|
15
|
+
editor: Editor;
|
|
16
|
+
/** Опции этого Редактора. Читать, а не менять: объект общий для `create`, `state` и `commands`. */
|
|
17
|
+
options: Options;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Что автор передаёт `defineTool()`: поля определения без служебной метки.
|
|
21
|
+
*/
|
|
22
|
+
export interface ToolDefinitionInput<Name extends PrefixedName = PrefixedName, Options extends object = object, State = unknown, Commands extends object = object> {
|
|
23
|
+
/** Имя с Префиксом потребителя, уникальное в `tools`. */
|
|
24
|
+
name: Name;
|
|
25
|
+
/** Умолчания Опций: полный набор полей. Из них выводится тип Опций. */
|
|
26
|
+
defaults: Options;
|
|
27
|
+
/** Тело описания Инструмента от Опций этого Редактора. */
|
|
28
|
+
create(options: Options): CustomToolBody;
|
|
29
|
+
/**
|
|
30
|
+
* Состояние Инструмента, если оно есть. Экран перерисовывается, только когда
|
|
31
|
+
* снимок сменился, и экономия работает для простых данных: примитивов, массивов
|
|
32
|
+
* и простых объектов, их кит сравнивает по значению. `Date`, `Map`, `Set` и
|
|
33
|
+
* экземпляры классов сравниваются по ссылке: новый экземпляр — новый снимок. Если
|
|
34
|
+
* функция создаёт такое значение заново на каждый вызов, экран перерисуется на
|
|
35
|
+
* каждой транзакции (а в худшем случае React уйдёт в цикл): отдавайте простые
|
|
36
|
+
* данные (`date.toISOString()`, массив из `Map`) или одну и ту же ссылку, пока
|
|
37
|
+
* данные не изменились.
|
|
38
|
+
*/
|
|
39
|
+
state?(context: ToolDefinitionContext<Options>): State;
|
|
40
|
+
/** Команды Инструмента, если они есть. */
|
|
41
|
+
commands?(context: ToolDefinitionContext<Options>): Commands;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Определение своего Инструмента: то, что возвращает `defineTool()`. Элемент
|
|
45
|
+
* `tools` — его можно положить туда как есть (с `defaults`) или настроить через
|
|
46
|
+
* `tool(definition, options)`. Поля читает кит, экрану они не нужны.
|
|
47
|
+
*/
|
|
48
|
+
export interface ToolDefinition<Name extends PrefixedName = PrefixedName, Options extends object = object, State = unknown, Commands extends object = object> extends ToolDefinitionInput<Name, Options, State, Commands> {
|
|
49
|
+
/** Метка определения: по ней `tools` отличает его от обычного `CustomTool`. */
|
|
50
|
+
readonly defined: true;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Определить свой Инструмент с Опциями, Состоянием и Командами. Экран настраивает
|
|
54
|
+
* его тем же `tool()`, что и встроенный, а читает тем же `useRichTextToolState`
|
|
55
|
+
* и `handle.tool()`:
|
|
56
|
+
*
|
|
57
|
+
* ```ts
|
|
58
|
+
* export const mention = defineTool({
|
|
59
|
+
* name: "acme_mention",
|
|
60
|
+
* defaults: { labels: { insert: "Mention" }, limit: 5 },
|
|
61
|
+
* create: (options) => ({
|
|
62
|
+
* engine: () => import("./mentionEngine.js").then((module) => module.engine),
|
|
63
|
+
* blocks: { acme_mention: { kind: "inline" } },
|
|
64
|
+
* insertItems: [{ section: "insert", label: options.labels.insert, icon: AtIcon, run }],
|
|
65
|
+
* }),
|
|
66
|
+
* state: ({ editor }) => ({ mentions: countMentions(editor) }),
|
|
67
|
+
* commands: ({ editor, options }) => ({ insert: (name: string) => … }),
|
|
68
|
+
* });
|
|
69
|
+
*
|
|
70
|
+
* <RichTextEditor tools={[mention]} /> // умолчания
|
|
71
|
+
* <RichTextEditor tools={[tool(mention, { labels: { insert: "Отметить" } })]} /> // настройка
|
|
72
|
+
* ```
|
|
73
|
+
*
|
|
74
|
+
* - `defaults` — полный набор Опций; тип Опций выводится из него, второй раз его
|
|
75
|
+
* объявлять не нужно.
|
|
76
|
+
* - `create(options)` отдаёт тело описания — ту же форму, что `CustomTool`, без
|
|
77
|
+
* имени: Часть для движка, правила Схемы, UI-записи. Зовётся один раз на запись
|
|
78
|
+
* `tools` (определение само или объект, что вернул `tool(definition, options)`):
|
|
79
|
+
* кит запоминает результат, и Остров, замкнутый над Опциями, один и тот же на
|
|
80
|
+
* каждом рендере. Запись, созданная заново на каждом рендере экрана
|
|
81
|
+
* (`tools={[tool(mention, …)]}` в теле компонента), для кита новая — выносите
|
|
82
|
+
* `tools` из рендера. Загрузчик Части для движка стоит держать константой
|
|
83
|
+
* модуля: кэш загрузчика живёт на самой функции, а новая функция на каждый
|
|
84
|
+
* вызов `create` загружала бы Часть заново для каждой записи.
|
|
85
|
+
* - `state({ editor, options })` — Состояние для `useRichTextToolState(ref, name)`.
|
|
86
|
+
* Зовётся при каждой транзакции и при каждом чтении хука, поэтому должна быть
|
|
87
|
+
* быстрой и без побочных эффектов; вернуть — данные без DOM-узлов. Простые данные
|
|
88
|
+
* (примитивы, массивы, простые объекты) сравниваются по значению, всё прочее
|
|
89
|
+
* (`Date`, `Map`, `Set`, экземпляры классов) — по ссылке. Нет — у Инструмента нет
|
|
90
|
+
* Состояния, и хук отдаёт `null`.
|
|
91
|
+
* - `commands({ editor, options })` — Команды для `handle.tool(name)`. Зовётся при
|
|
92
|
+
* каждом обращении к Хэндлу: только обёртки над движком, без подписок. Команда
|
|
93
|
+
* возвращает `boolean`, как у встроенных. Нет — `handle.tool(name)` отдаёт `null`.
|
|
94
|
+
*
|
|
95
|
+
* Слияние Опций: вложенные простые объекты сливаются с умолчаниями, массивы и
|
|
96
|
+
* функции заменяются целиком, как `configure` у Tiptap. Опции читаются один раз,
|
|
97
|
+
* при создании движка; чтобы сменить их, пересоздайте Редактор через `key`.
|
|
98
|
+
* Проверять значения Опций должен автор: кит этого не делает.
|
|
99
|
+
*
|
|
100
|
+
* Все правила своего Инструмента действуют (ADR-0058): имя с Префиксом
|
|
101
|
+
* потребителя, имя уникально в `tools` — и две записи одного определения, с
|
|
102
|
+
* `tool()` и без, тоже ошибка набора. Типизация `useRichTextToolState` и
|
|
103
|
+
* `handle.tool()` — через карту `RichTextTools`: автор дописывает Инструмент в неё
|
|
104
|
+
* через `declare module "@olddevs/ui/editor"`; без этого они отдают `unknown`.
|
|
105
|
+
*
|
|
106
|
+
* Серверно-безопасна: модуль без Tiptap и React. Определение содержит функции, как
|
|
107
|
+
* и `CustomTool`, поэтому набор с ним собирается в серверном модуле и отдаётся
|
|
108
|
+
* клиентскому компоненту только вместе с модулем, а не как проп через границу RSC.
|
|
109
|
+
*/
|
|
110
|
+
export declare function defineTool<Name extends PrefixedName, Options extends object, State = unknown, Commands extends object = object>(definition: ToolDefinitionInput<Name, Options, State, Commands>): ToolDefinition<Name, Options, State, Commands>;
|
|
111
|
+
/** Определение, собранное под одни Опции: слитые Опции и `CustomTool` с телом из `create`. */
|
|
112
|
+
interface ResolvedDefinition {
|
|
113
|
+
options: object;
|
|
114
|
+
tool: CustomTool;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Определение в обычное описание: Опции этого Редактора (умолчания, слитые с
|
|
118
|
+
* `given` — опциями `tool()`) и `CustomTool` с телом из `create`. Дальше
|
|
119
|
+
* Инструмент идёт тем же путём, что и описанный объектом.
|
|
120
|
+
*
|
|
121
|
+
* РЕЗУЛЬТАТ ЗАПОМИНАЕТСЯ по паре «определение + объект Опций записи `tool()`»
|
|
122
|
+
* (записи без `tool()` — по одному определению). `create` — функция автора, и
|
|
123
|
+
* Остров, замкнутый над Опциями, она создаёт заново на каждый вызов; а
|
|
124
|
+
* `richTextSchema`, `islandsFor`, `sanitizeRichText` и сборка набора читают
|
|
125
|
+
* определение каждый на своём рендере. Без запоминания клиентский родитель, что
|
|
126
|
+
* перерисовывает `RichTextView` с теми же `tools`, получал бы новый тип
|
|
127
|
+
* компонента на каждый рендер, а React размонтировал бы Остров. Одна запись
|
|
128
|
+
* `tools` — один `CustomTool`, пока жива запись.
|
|
129
|
+
*/
|
|
130
|
+
export declare function resolveDefinition(definition: ToolDefinition, given?: object): ResolvedDefinition;
|
|
131
|
+
/**
|
|
132
|
+
* Описание своего Инструмента из элемента `tools`: обычный объект как есть,
|
|
133
|
+
* определение — собранное по умолчаниям или Опциям `tool()`. Имя кита и
|
|
134
|
+
* Настроенный встроенный Инструмент — `undefined`: Схемы и Острова у них нет.
|
|
135
|
+
* Для сервера: `richTextSchema` и `islandsFor` читают правила только отсюда.
|
|
136
|
+
*/
|
|
137
|
+
export declare function customToolOf(entry: ToolEntry): CustomTool | undefined;
|
|
138
|
+
export {};
|
|
139
|
+
//# sourceMappingURL=toolDefinition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolDefinition.d.ts","sourceRoot":"","sources":["../../../src/editor/core/toolDefinition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAoB3E;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAEtD;;;GAGG;AACH,MAAM,WAAW,qBAAqB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM;IACpE,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,mGAAmG;IACnG,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAClC,IAAI,SAAS,YAAY,GAAG,YAAY,EACxC,OAAO,SAAS,MAAM,GAAG,MAAM,EAC/B,KAAK,GAAG,OAAO,EACf,QAAQ,SAAS,MAAM,GAAG,MAAM;IAEhC,yDAAyD;IACzD,IAAI,EAAE,IAAI,CAAC;IACX,uEAAuE;IACvE,QAAQ,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAAC;IACzC;;;;;;;;;OASG;IACH,KAAK,CAAC,CAAC,OAAO,EAAE,qBAAqB,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;IACvD,0CAA0C;IAC1C,QAAQ,CAAC,CAAC,OAAO,EAAE,qBAAqB,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;CAC9D;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc,CAC7B,IAAI,SAAS,YAAY,GAAG,YAAY,EACxC,OAAO,SAAS,MAAM,GAAG,MAAM,EAC/B,KAAK,GAAG,OAAO,EACf,QAAQ,SAAS,MAAM,GAAG,MAAM,CAChC,SAAQ,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;IAC3D,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,wBAAgB,UAAU,CACxB,IAAI,SAAS,YAAY,EACzB,OAAO,SAAS,MAAM,EACtB,KAAK,GAAG,OAAO,EACf,QAAQ,SAAS,MAAM,GAAG,MAAM,EAEhC,UAAU,EAAE,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,GAC9D,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAEhD;AAED,8FAA8F;AAC9F,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;CAClB;AAWD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAWhG;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAMrE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { isConfiguredTool, mergeOptions } from "./toolOptions.js";
|
|
2
|
+
export function defineTool(definition) {
|
|
3
|
+
return { ...definition, defined: true };
|
|
4
|
+
}
|
|
5
|
+
const NO_OPTIONS = {};
|
|
6
|
+
const resolved = new WeakMap();
|
|
7
|
+
export function resolveDefinition(definition, given) {
|
|
8
|
+
const key = given ?? NO_OPTIONS;
|
|
9
|
+
let byOptions = resolved.get(definition);
|
|
10
|
+
if (!byOptions)
|
|
11
|
+
resolved.set(definition, (byOptions = new WeakMap()));
|
|
12
|
+
let result = byOptions.get(key);
|
|
13
|
+
if (!result) {
|
|
14
|
+
const options = mergeOptions(definition.defaults, given ?? {});
|
|
15
|
+
result = { options, tool: { ...definition.create(options), name: definition.name } };
|
|
16
|
+
byOptions.set(key, result);
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
export function customToolOf(entry) {
|
|
21
|
+
if (typeof entry !== "object" || entry === null)
|
|
22
|
+
return undefined;
|
|
23
|
+
if (isConfiguredTool(entry)) {
|
|
24
|
+
return entry.definition && resolveDefinition(entry.definition, entry.options).tool;
|
|
25
|
+
}
|
|
26
|
+
return "defined" in entry ? resolveDefinition(entry).tool : entry;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=toolDefinition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolDefinition.js","sourceRoot":"","sources":["../../../src/editor/core/toolDefinition.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA4IlE,MAAM,UAAU,UAAU,CAMxB,UAA+D;IAE/D,OAAO,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC1C,CAAC;AASD,MAAM,UAAU,GAAW,EAAE,CAAC;AAM9B,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAuD,CAAC;AAgBpF,MAAM,UAAU,iBAAiB,CAAC,UAA0B,EAAE,KAAc;IAC1E,MAAM,GAAG,GAAG,KAAK,IAAI,UAAU,CAAC;IAChC,IAAI,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS;QAAE,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,SAAS,GAAG,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;IACtE,IAAI,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC/D,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;QACrF,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAQD,MAAM,UAAU,YAAY,CAAC,KAAgB;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAClE,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,UAAU,IAAI,iBAAiB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;IACrF,CAAC;IACD,OAAO,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AACpE,CAAC"}
|
|
@@ -7,6 +7,7 @@ import type { TextCardRangeAt, CustomTextCardRender, CustomTool, CustomTrigger,
|
|
|
7
7
|
import type { EditorExtensionOptions } from "./extensions.js";
|
|
8
8
|
import type { InsertItem } from "./insertItems.js";
|
|
9
9
|
import type { ShortcutCommand, ShortcutGroup } from "./shortcuts.js";
|
|
10
|
+
import type { ConfigurableToolName, RichTextTools } from "./toolOptions.js";
|
|
10
11
|
import type { ToolLoader } from "./toolLoader.js";
|
|
11
12
|
import type { Tool } from "./tools.js";
|
|
12
13
|
/**
|
|
@@ -47,8 +48,9 @@ export interface ToolDescriptor {
|
|
|
47
48
|
* Часть для движка: расширения Tiptap Инструмента — Node, Mark, Extension,
|
|
48
49
|
* плагины ProseMirror. Функция от контекста — привилегия кита: встроенным
|
|
49
50
|
* нужны мосты `RichTextEditor` (поповер ссылки, Меню вставки, `Alt+F10`).
|
|
51
|
+
* Второй аргумент — Опции этого Редактора (`options`), если они есть.
|
|
50
52
|
*/
|
|
51
|
-
engine?: (context: ToolEngineContext) => Extensions;
|
|
53
|
+
engine?: (context: ToolEngineContext, options?: object) => Extensions;
|
|
52
54
|
/**
|
|
53
55
|
* Загрузчик Части для движка (`toolLoader.ts`): движок создаётся после
|
|
54
56
|
* загрузчиков всех описаний списка, и `engine` читает отданное `loaded`.
|
|
@@ -63,6 +65,24 @@ export interface ToolDescriptor {
|
|
|
63
65
|
skeleton?: () => Extensions;
|
|
64
66
|
/** Признаки Блока по имени узла; кит переносит их в spec узла. Нет — обычный Блок. */
|
|
65
67
|
blocks?: Readonly<Record<string, BlockTraits>>;
|
|
68
|
+
/**
|
|
69
|
+
* Умолчания Опций встроенного Инструмента: полный набор полей, из которого
|
|
70
|
+
* `tool()` меняет нужные. Нет — у Инструмента нет Опций. Поле — надформа:
|
|
71
|
+
* публичные Опции своего Инструмента задаёт `defineTool` (`defaults`).
|
|
72
|
+
*/
|
|
73
|
+
defaults?: object;
|
|
74
|
+
/**
|
|
75
|
+
* Проверки значений Опций по имени поля — по одной на каждое поле `defaults`.
|
|
76
|
+
* Значение, не прошедшее проверку, заменяется умолчанием (`expandTools`):
|
|
77
|
+
* потребитель на JS обходит типы карты `RichTextTools`.
|
|
78
|
+
*/
|
|
79
|
+
checks?: Readonly<Record<string, (value: unknown) => boolean>>;
|
|
80
|
+
/**
|
|
81
|
+
* Опции этого Редактора: умолчания, слитые с `tool()`. Ставит `expandTools`
|
|
82
|
+
* при сборке набора, поэтому описание в реестре — общее на все Редакторы, а
|
|
83
|
+
* это поле — своё в списке каждого. Читаются один раз, вместе с набором.
|
|
84
|
+
*/
|
|
85
|
+
options?: object;
|
|
66
86
|
/**
|
|
67
87
|
* Кнопки Панели (фиксированной и плавающей — набор один), флагом — и Меню
|
|
68
88
|
* выделения. Место встроенной кнопки на Панели — привилегия кита: её
|
|
@@ -100,6 +120,44 @@ export interface ToolDescriptor {
|
|
|
100
120
|
* (`shortcuts.ts`): у записи сочетание — её поле, а у Метки из движка — нет.
|
|
101
121
|
*/
|
|
102
122
|
shortcuts?: readonly ShortcutCommand[];
|
|
123
|
+
/**
|
|
124
|
+
* Команды Инструмента: то, что `handle.tool(name)` отдаёт экрану. Зовётся при
|
|
125
|
+
* каждом обращении к Хэндлу и обязана быть дешёвой: только обёртки над движком
|
|
126
|
+
* и мостом, без подписок и состояния. Нет — у Инструмента нет Команд, и
|
|
127
|
+
* `handle.tool(name)` отдаёт `null`.
|
|
128
|
+
*/
|
|
129
|
+
commands?: (context: ToolCommandsContext) => object;
|
|
130
|
+
/**
|
|
131
|
+
* Состояние Инструмента: снимок для `useRichTextToolState(ref, name)`. Хук
|
|
132
|
+
* зовёт её на каждую транзакцию и каждое чтение, поэтому она быстрая и без
|
|
133
|
+
* побочных эффектов. Есть только у своего Инструмента (`defineTool`): снимки
|
|
134
|
+
* встроенных хук держит у себя (`SNAPSHOTS`), чтобы Поиск и Оглавление не
|
|
135
|
+
* тянули их код в стартовый кусок Редактора. Нет — Состояния у Инструмента нет.
|
|
136
|
+
*/
|
|
137
|
+
state?: (editor: Editor) => unknown;
|
|
138
|
+
}
|
|
139
|
+
/** Что функция Команд получает от `RichTextEditor`. */
|
|
140
|
+
export interface ToolCommandsContext {
|
|
141
|
+
/** Живой движок: функцию зовут, только когда он создан и не уничтожен. */
|
|
142
|
+
editor: Editor;
|
|
143
|
+
/** Мост к тому, что держит сам `RichTextEditor`: панели и ленивый UI. */
|
|
144
|
+
bridge: ToolBridge;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Что Команды встроенных берут у `RichTextEditor`: панель Поиска и ядро
|
|
148
|
+
* Оглавления живут в его React-дереве, а не в движке. Все методы возвращают
|
|
149
|
+
* `false`, когда сделать нельзя (HTML-режим, UI ещё не загружен). Привилегия
|
|
150
|
+
* кита: свой Инструмент моста не получает.
|
|
151
|
+
*/
|
|
152
|
+
export interface ToolBridge {
|
|
153
|
+
/** Открыть панель Поиска; `query` — сразу в поле, без него — выделенный текст. */
|
|
154
|
+
openSearch: (replace: boolean, query?: string) => boolean;
|
|
155
|
+
/** Закрыть панель Поиска и убрать подсветку, не трогая фокус. */
|
|
156
|
+
closeSearch: () => boolean;
|
|
157
|
+
/** Открыт ли HTML-режим: Документа на экране нет, искать и заменять в нём нельзя. */
|
|
158
|
+
sourceOpen: () => boolean;
|
|
159
|
+
/** Перейти к заголовку Оглавления с индексом списка. */
|
|
160
|
+
jumpToc: (index: number) => boolean;
|
|
103
161
|
}
|
|
104
162
|
/** Символ-триггер Инструмента в списке описаний: публичная запись и имя владельца для сообщений. */
|
|
105
163
|
export type TriggerRecord = CustomTrigger & {
|
|
@@ -254,6 +312,12 @@ export interface TextCardRecord {
|
|
|
254
312
|
* Инструменты есть только в списке описаний.
|
|
255
313
|
*/
|
|
256
314
|
export interface ToolList extends ReadonlySet<Tool> {
|
|
315
|
+
/**
|
|
316
|
+
* Ошибка сборки набора, найденная до движка: две записи `tool()` с одним
|
|
317
|
+
* именем. Редактор показывает её тем же путём, что ошибки своих Инструментов
|
|
318
|
+
* (`customToolsError`): строкой поля и `console.error` в разработке.
|
|
319
|
+
*/
|
|
320
|
+
readonly error?: string;
|
|
257
321
|
/**
|
|
258
322
|
* Описания включённых Инструментов: встроенные в порядке кита (у не
|
|
259
323
|
* переехавших — заглушки `legacy`), за ними свои в порядке `tools`.
|
|
@@ -264,7 +328,12 @@ export interface ToolList extends ReadonlySet<Tool> {
|
|
|
264
328
|
* Набор из имён кита и списка описаний — единственный способ его собрать:
|
|
265
329
|
* развернуть `tools` (`expandTools`) или сузить готовый (Скелет).
|
|
266
330
|
*/
|
|
267
|
-
export declare function toolList(names: Iterable<Tool>, descriptors: readonly ToolDescriptor[]): ToolList;
|
|
331
|
+
export declare function toolList(names: Iterable<Tool>, descriptors: readonly ToolDescriptor[], error?: string): ToolList;
|
|
332
|
+
/**
|
|
333
|
+
* Опции встроенного Инструмента этого Редактора: умолчания кита, слитые с
|
|
334
|
+
* `tool()`. Инструмента нет в наборе или у него нет Опций — `undefined`.
|
|
335
|
+
*/
|
|
336
|
+
export declare function toolOptions<Name extends ConfigurableToolName>(tools: ToolList, name: Name): RichTextTools[Name]["options"] | undefined;
|
|
268
337
|
/** Описания переехавших Инструментов набора — в порядке списка. */
|
|
269
338
|
export declare function describedTools(tools: ToolList): readonly ToolDescriptor[];
|
|
270
339
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolDescriptor.d.ts","sourceRoot":"","sources":["../../../src/editor/core/toolDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,UAAU,EACV,aAAa,EACb,YAAY,EACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,IAAI,EAAE,IAAI,GAAG,YAAY,CAAC;IAC1B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,IAAI,CAAC;IAEd
|
|
1
|
+
{"version":3,"file":"toolDescriptor.d.ts","sourceRoot":"","sources":["../../../src/editor/core/toolDescriptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
export function toolLabel(label, context) {
|
|
2
2
|
return typeof label === "string" ? label : label(context);
|
|
3
3
|
}
|
|
4
|
-
export function toolList(names, descriptors) {
|
|
5
|
-
return Object.assign(new Set(names), { descriptors });
|
|
4
|
+
export function toolList(names, descriptors, error) {
|
|
5
|
+
return Object.assign(new Set(names), { descriptors, ...(error !== undefined && { error }) });
|
|
6
|
+
}
|
|
7
|
+
export function toolOptions(tools, name) {
|
|
8
|
+
const descriptor = tools.descriptors.find((candidate) => candidate.name === name);
|
|
9
|
+
return descriptor?.options;
|
|
6
10
|
}
|
|
7
11
|
export function describedTools(tools) {
|
|
8
12
|
return tools.descriptors.filter((descriptor) => !descriptor.legacy);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolDescriptor.js","sourceRoot":"","sources":["../../../src/editor/core/toolDescriptor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"toolDescriptor.js","sourceRoot":"","sources":["../../../src/editor/core/toolDescriptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { PrefixedName } from "./customTool.js";
|
|
2
|
+
import type { ToolDefinition } from "./toolDefinition.js";
|
|
3
|
+
import type { SearchToolState, TocToolState } from "./toolState.js";
|
|
4
|
+
import type { SearchToolCommands, TocToolCommands } from "./toolCommands.js";
|
|
5
|
+
import type { Tool as ToolName } from "./tools.js";
|
|
6
|
+
/**
|
|
7
|
+
* Уровень заголовка в опциях Оглавления: 1 — `h1` … 4 — `h4`. Выше четвёртого
|
|
8
|
+
* Схема кита заголовков не знает.
|
|
9
|
+
*/
|
|
10
|
+
export type TocLevel = 1 | 2 | 3 | 4;
|
|
11
|
+
/**
|
|
12
|
+
* Опции Инструмента `search` (все значения — со стартовыми умолчаниями кита).
|
|
13
|
+
* Это стартовые флажки поиска вообще, а не только панели: запрос, который
|
|
14
|
+
* задаёт Команда `setQuery`, берёт не названные в ней флажки отсюда, пока
|
|
15
|
+
* поиск не закрыт (`close()`, Escape в панели).
|
|
16
|
+
*/
|
|
17
|
+
export interface SearchToolOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Панель открывается с включённым флажком «Регистр». Флажок остаётся
|
|
20
|
+
* переключаемым; кит не запоминает его между открытиями. По умолчанию `false`.
|
|
21
|
+
*/
|
|
22
|
+
matchCase: boolean;
|
|
23
|
+
/** Панель открывается с включённым флажком «Слово целиком». По умолчанию `false`. */
|
|
24
|
+
wholeWord: boolean;
|
|
25
|
+
/** Панель открывается с включённым переключателем «Регулярное выражение». По умолчанию `false`. */
|
|
26
|
+
regex: boolean;
|
|
27
|
+
}
|
|
28
|
+
/** Опции Инструмента `toc` (ADR-0068). */
|
|
29
|
+
export interface TocToolOptions {
|
|
30
|
+
/**
|
|
31
|
+
* Имя CSS-переменной с высотой липкой шапки экрана (ADR-0016): переход к
|
|
32
|
+
* заголовку ставит его под шапку, а подсветка считает раздел текущим от её
|
|
33
|
+
* нижнего края. Значение — имя переменной целиком, с двумя дефисами:
|
|
34
|
+
* `--header-h`. Липкую Панель Редактора это не двигает: она по-прежнему
|
|
35
|
+
* стоит под `--topbar-h`. По умолчанию `--topbar-h`.
|
|
36
|
+
*/
|
|
37
|
+
offsetVar: string;
|
|
38
|
+
/**
|
|
39
|
+
* Уровни заголовков, которые попадают в Оглавление: подмножество 1–4. Заголовка
|
|
40
|
+
* другого уровня нет ни в полосе, ни в списке, и отступ пунктов считается
|
|
41
|
+
* от самого крупного из оставшихся. По умолчанию все четыре.
|
|
42
|
+
*/
|
|
43
|
+
levels: readonly TocLevel[];
|
|
44
|
+
/**
|
|
45
|
+
* Ширина списка — длина CSS или пиксели. Постоянная, а не по самому длинному
|
|
46
|
+
* заголовку. По умолчанию 240.
|
|
47
|
+
*/
|
|
48
|
+
listWidth: number | string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Типы Инструментов Редактора по имени: что экран задаёт при настройке (`options`),
|
|
52
|
+
* что читает (`state`) и что вызывает (`commands`). Расширяемый интерфейс, как
|
|
53
|
+
* `Storage` и `Commands` у Tiptap: кит объявляет в нём `search` и `toc`, а
|
|
54
|
+
* потребитель дописывает свои Инструменты через declaration merging:
|
|
55
|
+
*
|
|
56
|
+
* ```ts
|
|
57
|
+
* declare module "@olddevs/ui/editor" {
|
|
58
|
+
* interface RichTextTools {
|
|
59
|
+
* acme_note: {
|
|
60
|
+
* options: { tone: "info" | "warning" };
|
|
61
|
+
* state: { count: number };
|
|
62
|
+
* commands: { clear(): boolean };
|
|
63
|
+
* };
|
|
64
|
+
* }
|
|
65
|
+
* }
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* Из карты выводятся типы `useRichTextToolState`, `handle.tool()` и Опции `tool()`
|
|
69
|
+
* встроенного; Опции своего Инструмента `tool()` берёт из `defaults` его определения.
|
|
70
|
+
* Инструмент, не дописанный в карту, работает: типизация добровольна.
|
|
71
|
+
*/
|
|
72
|
+
export interface RichTextTools {
|
|
73
|
+
search: {
|
|
74
|
+
options: SearchToolOptions;
|
|
75
|
+
state: SearchToolState;
|
|
76
|
+
commands: SearchToolCommands;
|
|
77
|
+
};
|
|
78
|
+
toc: {
|
|
79
|
+
options: TocToolOptions;
|
|
80
|
+
state: TocToolState;
|
|
81
|
+
commands: TocToolCommands;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Имена встроенных Инструментов, у которых есть опции: ключи карты, совпадающие
|
|
86
|
+
* с именами кита. Свой Инструмент, дописанный в карту, сюда не попадает —
|
|
87
|
+
* настраивается по определению, а не по имени.
|
|
88
|
+
*/
|
|
89
|
+
export type ConfigurableToolName = keyof RichTextTools & ToolName;
|
|
90
|
+
/** Опции Инструмента из карты; нет карты или `options` — `never`. */
|
|
91
|
+
type OptionsOf<Name extends ConfigurableToolName> = RichTextTools[Name] extends {
|
|
92
|
+
options: infer Options;
|
|
93
|
+
} ? Options : never;
|
|
94
|
+
/**
|
|
95
|
+
* Опции, которые экран передаёт `tool()`: каждое поле необязательно, остальное
|
|
96
|
+
* берётся из умолчаний. Вложенные объекты вкладываются так же, а массивы и
|
|
97
|
+
* функции — значение целиком (правило слияния, `mergeOptions`).
|
|
98
|
+
*/
|
|
99
|
+
export type ToolOptionsInput<Options> = {
|
|
100
|
+
[Key in keyof Options]?: Options[Key] extends readonly unknown[] | ((...args: never[]) => unknown) ? Options[Key] : Options[Key] extends object ? ToolOptionsInput<Options[Key]> : Options[Key];
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Настроенный Инструмент: запись для `tools`, которую возвращает `tool()`.
|
|
104
|
+
* Непрозрачная — поля читает только кит. У встроенного это имя и опции, а не
|
|
105
|
+
* описание: описания встроенных наружу не выходят (ADR-0058, п. 10.3). У своего
|
|
106
|
+
* Инструмента добавляется определение, которое `tool()` настраивает.
|
|
107
|
+
*/
|
|
108
|
+
export interface ConfiguredTool<Name extends string = ToolName> {
|
|
109
|
+
/** Метка записи: по ней `tools` отличает Настроенный Инструмент от своего. */
|
|
110
|
+
readonly configured: true;
|
|
111
|
+
readonly name: Name;
|
|
112
|
+
readonly options: Readonly<Record<string, unknown>>;
|
|
113
|
+
/** Определение своего Инструмента (`defineTool`); у встроенного его нет. */
|
|
114
|
+
readonly definition?: ToolDefinition;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Слить Опции: вложенные простые объекты сливаются, массивы, функции и всё
|
|
118
|
+
* остальное заменяются целиком — как `configure` у Tiptap. Значение `undefined`
|
|
119
|
+
* не в счёт: остаётся то, что было. Новый объект, исходные не меняются (вложенный
|
|
120
|
+
* объект, которого нет в `given`, остаётся тем же).
|
|
121
|
+
*/
|
|
122
|
+
export declare function mergeOptions(base: object, given: object): object;
|
|
123
|
+
/**
|
|
124
|
+
* Настроить Инструмент прямо в `tools`: встроенный — по имени, свой — по
|
|
125
|
+
* определению (`defineTool`).
|
|
126
|
+
*
|
|
127
|
+
* ```tsx
|
|
128
|
+
* <RichTextEditor
|
|
129
|
+
* tools={[
|
|
130
|
+
* ...RICH_TEXT_PRESETS.full,
|
|
131
|
+
* tool("toc", { offsetVar: "--header-h", levels: [2, 3] }),
|
|
132
|
+
* tool(mention, { labels: { insert: "Отметить коллегу" } }),
|
|
133
|
+
* ]}
|
|
134
|
+
* />
|
|
135
|
+
* ```
|
|
136
|
+
*
|
|
137
|
+
* Запись включает Инструмент и без имени в `tools`; если в `tools` есть и голое
|
|
138
|
+
* имя (из пресета), побеждает Настроенный Инструмент. Две записи `tool()` с
|
|
139
|
+
* одним встроенным именем — ошибка набора, как и две записи одного своего
|
|
140
|
+
* Инструмента. Место на поверхности не меняется: у встроенного оно
|
|
141
|
+
* определяется порядком кита, у своего — порядком `tools`. Передавать нужно
|
|
142
|
+
* только те опции, которые меняются, остальные берутся из умолчаний; вложенные
|
|
143
|
+
* объекты сливаются, массивы и функции заменяются целиком.
|
|
144
|
+
*
|
|
145
|
+
* Опции читаются один раз, вместе с набором, при создании движка. Чтобы сменить
|
|
146
|
+
* их на лету, пересоздайте Редактор через `key`. Неверное значение встроенной
|
|
147
|
+
* опции (из JS без типов) заменяется умолчанием, в разработке — один
|
|
148
|
+
* `console.error`; опции своего Инструмента проверяет его автор.
|
|
149
|
+
*
|
|
150
|
+
* Встроенный — только Инструмент с опциями: `search` и `toc`. Серверно-безопасна.
|
|
151
|
+
*/
|
|
152
|
+
export declare function tool<Name extends ConfigurableToolName>(name: Name, options?: ToolOptionsInput<OptionsOf<Name>>): ConfiguredTool<Name>;
|
|
153
|
+
export declare function tool<Name extends PrefixedName, Options extends object>(definition: ToolDefinition<Name, Options, unknown, object>, options?: ToolOptionsInput<Options>): ConfiguredTool<Name>;
|
|
154
|
+
/** Запись `tools` — Настроенный Инструмент. `null` и строки — нет. */
|
|
155
|
+
export declare function isConfiguredTool(entry: unknown): entry is ConfiguredTool<string>;
|
|
156
|
+
export {};
|
|
157
|
+
//# sourceMappingURL=toolOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolOptions.d.ts","sourceRoot":"","sources":["../../../src/editor/core/toolOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AAUnD;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAErC;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,qFAAqF;IACrF,SAAS,EAAE,OAAO,CAAC;IACnB,mGAAmG;IACnG,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B;;;;;;OAMG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC5B;;;OAGG;IACH,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE;QACN,OAAO,EAAE,iBAAiB,CAAC;QAC3B,KAAK,EAAE,eAAe,CAAC;QACvB,QAAQ,EAAE,kBAAkB,CAAC;KAC9B,CAAC;IACF,GAAG,EAAE;QACH,OAAO,EAAE,cAAc,CAAC;QACxB,KAAK,EAAE,YAAY,CAAC;QACpB,QAAQ,EAAE,eAAe,CAAC;KAC3B,CAAC;CACH;AAED;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,aAAa,GAAG,QAAQ,CAAC;AAElE,qEAAqE;AACrE,KAAK,SAAS,CAAC,IAAI,SAAS,oBAAoB,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS;IAC9E,OAAO,EAAE,MAAM,OAAO,CAAC;CACxB,GACG,OAAO,GACP,KAAK,CAAC;AAEV;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,CAAC,OAAO,IAAI;KACrC,GAAG,IAAI,MAAM,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,SAAS,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,GAC9F,OAAO,CAAC,GAAG,CAAC,GACZ,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,GACzB,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAC9B,OAAO,CAAC,GAAG,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,cAAc,CAAC,IAAI,SAAS,MAAM,GAAG,QAAQ;IAC5D,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC;CACtC;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAWhE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,IAAI,CAAC,IAAI,SAAS,oBAAoB,EACpD,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAC1C,cAAc,CAAC,IAAI,CAAC,CAAC;AACxB,wBAAgB,IAAI,CAAC,IAAI,SAAS,YAAY,EAAE,OAAO,SAAS,MAAM,EACpE,UAAU,EAAE,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAC1D,OAAO,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAClC,cAAc,CAAC,IAAI,CAAC,CAAC;AAUxB,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAAC,MAAM,CAAC,CAMhF"}
|