@olddevs/ui 4.5.1 → 4.6.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.
Files changed (209) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/editor/RichTextEditor.d.ts +2 -2
  3. package/dist/editor/RichTextEditor.d.ts.map +1 -1
  4. package/dist/editor/RichTextEditor.js +3 -0
  5. package/dist/editor/RichTextEditor.js.map +1 -1
  6. package/dist/editor/core/blockTypes.d.ts +2 -8
  7. package/dist/editor/core/blockTypes.d.ts.map +1 -1
  8. package/dist/editor/core/blockTypes.js +11 -54
  9. package/dist/editor/core/blockTypes.js.map +1 -1
  10. package/dist/editor/core/containers.d.ts.map +1 -1
  11. package/dist/editor/core/containers.js +1 -0
  12. package/dist/editor/core/containers.js.map +1 -1
  13. package/dist/editor/core/customMarkdown.js +1 -1
  14. package/dist/editor/core/customMarkdown.js.map +1 -1
  15. package/dist/editor/core/customTool.d.ts +6 -6
  16. package/dist/editor/core/customTool.d.ts.map +1 -1
  17. package/dist/editor/core/customToolEngine.d.ts +2 -2
  18. package/dist/editor/core/extensions.d.ts +7 -2
  19. package/dist/editor/core/extensions.d.ts.map +1 -1
  20. package/dist/editor/core/extensions.js +96 -64
  21. package/dist/editor/core/extensions.js.map +1 -1
  22. package/dist/editor/core/fieldNotice.d.ts +1 -1
  23. package/dist/editor/core/insertItems.d.ts +5 -28
  24. package/dist/editor/core/insertItems.d.ts.map +1 -1
  25. package/dist/editor/core/insertItems.js +3 -94
  26. package/dist/editor/core/insertItems.js.map +1 -1
  27. package/dist/editor/core/insertMenuTool.d.ts +13 -0
  28. package/dist/editor/core/insertMenuTool.d.ts.map +1 -0
  29. package/dist/editor/core/insertMenuTool.js +20 -0
  30. package/dist/editor/core/insertMenuTool.js.map +1 -0
  31. package/dist/editor/core/schema.d.ts +20 -5
  32. package/dist/editor/core/schema.d.ts.map +1 -1
  33. package/dist/editor/core/schema.js +18 -3
  34. package/dist/editor/core/schema.js.map +1 -1
  35. package/dist/editor/core/shortcuts.d.ts +56 -5
  36. package/dist/editor/core/shortcuts.d.ts.map +1 -1
  37. package/dist/editor/core/shortcuts.js +91 -156
  38. package/dist/editor/core/shortcuts.js.map +1 -1
  39. package/dist/editor/core/skeleton.d.ts +1 -1
  40. package/dist/editor/core/skeleton.d.ts.map +1 -1
  41. package/dist/editor/core/skeleton.js +1 -0
  42. package/dist/editor/core/skeleton.js.map +1 -1
  43. package/dist/editor/core/toolButtons.d.ts +3 -3
  44. package/dist/editor/core/toolDefinition.d.ts +3 -3
  45. package/dist/editor/core/toolDescriptor.d.ts +49 -30
  46. package/dist/editor/core/toolDescriptor.d.ts.map +1 -1
  47. package/dist/editor/core/toolDescriptor.js +2 -5
  48. package/dist/editor/core/toolDescriptor.js.map +1 -1
  49. package/dist/editor/core/toolLoader.d.ts +1 -1
  50. package/dist/editor/core/toolLoader.d.ts.map +1 -1
  51. package/dist/editor/core/toolOptions.d.ts +19 -2
  52. package/dist/editor/core/toolOptions.d.ts.map +1 -1
  53. package/dist/editor/core/toolOptions.js.map +1 -1
  54. package/dist/editor/core/tools.d.ts +10 -2
  55. package/dist/editor/core/tools.d.ts.map +1 -1
  56. package/dist/editor/core/tools.js +1 -0
  57. package/dist/editor/core/tools.js.map +1 -1
  58. package/dist/editor/features/builtins.d.ts +6 -8
  59. package/dist/editor/features/builtins.d.ts.map +1 -1
  60. package/dist/editor/features/builtins.js +48 -21
  61. package/dist/editor/features/builtins.js.map +1 -1
  62. package/dist/editor/features/code/codeBlockTool.d.ts +5 -6
  63. package/dist/editor/features/code/codeBlockTool.d.ts.map +1 -1
  64. package/dist/editor/features/code/codeBlockTool.js +10 -1
  65. package/dist/editor/features/code/codeBlockTool.js.map +1 -1
  66. package/dist/editor/features/color/colorTools.d.ts +14 -0
  67. package/dist/editor/features/color/colorTools.d.ts.map +1 -0
  68. package/dist/editor/features/color/colorTools.js +39 -0
  69. package/dist/editor/features/color/colorTools.js.map +1 -0
  70. package/dist/editor/features/details/details.d.ts +68 -0
  71. package/dist/editor/features/details/details.d.ts.map +1 -0
  72. package/dist/editor/features/details/details.js +237 -0
  73. package/dist/editor/features/details/details.js.map +1 -0
  74. package/dist/editor/features/details/detailsMarkdown.d.ts +17 -0
  75. package/dist/editor/features/details/detailsMarkdown.d.ts.map +1 -0
  76. package/dist/editor/features/details/detailsMarkdown.js +84 -0
  77. package/dist/editor/features/details/detailsMarkdown.js.map +1 -0
  78. package/dist/editor/features/details/detailsTool.d.ts +16 -0
  79. package/dist/editor/features/details/detailsTool.d.ts.map +1 -0
  80. package/dist/editor/features/details/detailsTool.js +39 -0
  81. package/dist/editor/features/details/detailsTool.js.map +1 -0
  82. package/dist/editor/features/emoji/emojiTool.d.ts +1 -1
  83. package/dist/editor/features/heading/headingTool.d.ts +18 -0
  84. package/dist/editor/features/heading/headingTool.d.ts.map +1 -0
  85. package/dist/editor/features/heading/headingTool.js +59 -0
  86. package/dist/editor/features/heading/headingTool.js.map +1 -0
  87. package/dist/editor/features/history/historyTool.d.ts +15 -0
  88. package/dist/editor/features/history/historyTool.d.ts.map +1 -0
  89. package/dist/editor/features/history/historyTool.js +28 -0
  90. package/dist/editor/features/history/historyTool.js.map +1 -0
  91. package/dist/editor/features/image/imageTool.d.ts +19 -0
  92. package/dist/editor/features/image/imageTool.d.ts.map +1 -0
  93. package/dist/editor/features/image/imageTool.js +28 -0
  94. package/dist/editor/features/image/imageTool.js.map +1 -0
  95. package/dist/editor/features/layout/layoutTool.d.ts +11 -0
  96. package/dist/editor/features/layout/layoutTool.d.ts.map +1 -0
  97. package/dist/editor/features/layout/layoutTool.js +20 -0
  98. package/dist/editor/features/layout/layoutTool.js.map +1 -0
  99. package/dist/editor/features/lists/listTools.d.ts +15 -0
  100. package/dist/editor/features/lists/listTools.d.ts.map +1 -0
  101. package/dist/editor/features/lists/listTools.js +78 -0
  102. package/dist/editor/features/lists/listTools.js.map +1 -0
  103. package/dist/editor/features/marks/markTools.d.ts +16 -0
  104. package/dist/editor/features/marks/markTools.d.ts.map +1 -0
  105. package/dist/editor/features/marks/markTools.js +43 -0
  106. package/dist/editor/features/marks/markTools.js.map +1 -0
  107. package/dist/editor/features/search/searchTool.d.ts +1 -1
  108. package/dist/editor/features/table/tableTool.d.ts +3 -3
  109. package/dist/editor/features/wrapper/wrapperTool.d.ts +11 -0
  110. package/dist/editor/features/wrapper/wrapperTool.d.ts.map +1 -0
  111. package/dist/editor/features/wrapper/wrapperTool.js +32 -0
  112. package/dist/editor/features/wrapper/wrapperTool.js.map +1 -0
  113. package/dist/editor/index.d.ts +1 -1
  114. package/dist/editor/index.d.ts.map +1 -1
  115. package/dist/editor/index.js.map +1 -1
  116. package/dist/editor/schema-entry.d.ts +1 -1
  117. package/dist/editor/styles/prose.d.ts.map +1 -1
  118. package/dist/editor/styles/prose.js +26 -0
  119. package/dist/editor/styles/prose.js.map +1 -1
  120. package/dist/editor/ui/EditorToolbar.d.ts.map +1 -1
  121. package/dist/editor/ui/EditorToolbar.js +5 -38
  122. package/dist/editor/ui/EditorToolbar.js.map +1 -1
  123. package/dist/editor/ui/SelectionBubble.d.ts.map +1 -1
  124. package/dist/editor/ui/SelectionBubble.js +1 -1
  125. package/dist/editor/ui/SelectionBubble.js.map +1 -1
  126. package/dist/editor/ui/ToolButtonView.d.ts.map +1 -1
  127. package/dist/editor/ui/ToolButtonView.js +1 -1
  128. package/dist/editor/ui/ToolButtonView.js.map +1 -1
  129. package/dist/i18n/defaults.d.ts.map +1 -1
  130. package/dist/i18n/defaults.js +3 -0
  131. package/dist/i18n/defaults.js.map +1 -1
  132. package/dist/i18n/messages.d.ts +16 -1
  133. package/dist/i18n/messages.d.ts.map +1 -1
  134. package/dist/icons.d.ts +8 -1
  135. package/dist/icons.d.ts.map +1 -1
  136. package/dist/icons.js +1 -1
  137. package/dist/icons.js.map +1 -1
  138. package/dist/locales/ru.d.ts.map +1 -1
  139. package/dist/locales/ru.js +3 -0
  140. package/dist/locales/ru.js.map +1 -1
  141. package/docs/api/editor-extension.en.md +56 -56
  142. package/docs/api/editor-extension.md +55 -55
  143. package/docs/api/messages.en.md +4 -1
  144. package/docs/api/messages.md +3 -0
  145. package/docs/api/migration-notes.en.md +3 -3
  146. package/docs/api/migration-notes.md +2 -2
  147. package/docs/components/content/rich-text-view.en.md +18 -12
  148. package/docs/components/content/rich-text-view.md +17 -11
  149. package/docs/components/inputs/rich-text-editor.en.md +140 -87
  150. package/docs/components/inputs/rich-text-editor.md +139 -86
  151. package/docs/conventions.en.md +2 -2
  152. package/docs/conventions.md +1 -1
  153. package/docs/getting-started.en.md +9 -9
  154. package/docs/getting-started.md +8 -8
  155. package/docs/glossary.en.md +80 -52
  156. package/docs/glossary.md +79 -51
  157. package/docs/icons.en.md +4 -1
  158. package/docs/icons.md +3 -0
  159. package/package.json +2 -1
  160. package/src/editor/RichTextEditor.tsx +9 -6
  161. package/src/editor/core/atomText.ts +2 -2
  162. package/src/editor/core/blockTypes.ts +19 -83
  163. package/src/editor/core/containers.ts +4 -2
  164. package/src/editor/core/customMarkdown.ts +2 -2
  165. package/src/editor/core/customTool.ts +6 -6
  166. package/src/editor/core/customToolEngine.ts +9 -9
  167. package/src/editor/core/extensions.ts +165 -110
  168. package/src/editor/core/fieldNotice.ts +1 -1
  169. package/src/editor/core/handle.ts +2 -2
  170. package/src/editor/core/insertItems.ts +12 -158
  171. package/src/editor/core/insertMenuTool.ts +32 -0
  172. package/src/editor/core/jsonDocument.ts +1 -1
  173. package/src/editor/core/schema.ts +42 -7
  174. package/src/editor/core/shortcuts.ts +116 -177
  175. package/src/editor/core/skeleton.ts +4 -3
  176. package/src/editor/core/toolButtons.ts +3 -3
  177. package/src/editor/core/toolDefinition.ts +4 -4
  178. package/src/editor/core/toolDescriptor.ts +65 -52
  179. package/src/editor/core/toolLoader.ts +3 -3
  180. package/src/editor/core/toolOptions.ts +21 -2
  181. package/src/editor/core/tools.ts +10 -1
  182. package/src/editor/core/viewIsland.ts +1 -1
  183. package/src/editor/features/builtins.ts +76 -41
  184. package/src/editor/features/code/codeBlockTool.ts +16 -8
  185. package/src/editor/features/color/colorTools.ts +68 -0
  186. package/src/editor/features/details/details.ts +389 -0
  187. package/src/editor/features/details/detailsMarkdown.ts +158 -0
  188. package/src/editor/features/details/detailsTool.ts +69 -0
  189. package/src/editor/features/emoji/emojiTool.tsx +1 -1
  190. package/src/editor/features/heading/headingTool.ts +96 -0
  191. package/src/editor/features/history/historyTool.ts +42 -0
  192. package/src/editor/features/image/imageTool.ts +49 -0
  193. package/src/editor/features/layout/layoutTool.ts +40 -0
  194. package/src/editor/features/lists/listTools.ts +112 -0
  195. package/src/editor/features/marks/markTools.ts +78 -0
  196. package/src/editor/features/search/searchTool.ts +1 -1
  197. package/src/editor/features/table/tableTool.ts +3 -3
  198. package/src/editor/features/toc/tocTool.ts +1 -1
  199. package/src/editor/features/wrapper/wrapperTool.ts +52 -0
  200. package/src/editor/index.ts +1 -0
  201. package/src/editor/schema-entry.ts +1 -1
  202. package/src/editor/styles/prose.ts +49 -0
  203. package/src/editor/ui/EditorToolbar.tsx +7 -50
  204. package/src/editor/ui/SelectionBubble.tsx +2 -5
  205. package/src/editor/ui/ToolButtonView.tsx +2 -1
  206. package/src/i18n/defaults.ts +3 -0
  207. package/src/i18n/messages.ts +14 -1
  208. package/src/icons.ts +7 -0
  209. package/src/locales/ru.ts +3 -0
@@ -16,14 +16,7 @@ import { Toolbar } from "../../components/actions/Toolbar.js";
16
16
  import { Tooltip, TooltipProvider } from "../../components/overlays/Tooltip.js";
17
17
  import type { UiMessages } from "../../i18n/messages.js";
18
18
  import { useMessages } from "../../i18n/useMessages.js";
19
- import {
20
- ImageIcon,
21
- RedoIcon,
22
- SearchIcon,
23
- SourceIcon,
24
- UndoIcon,
25
- type IconProps,
26
- } from "../../icons.js";
19
+ import { SearchIcon, SourceIcon, type IconProps } from "../../icons.js";
27
20
  import { buttonClasses } from "../../lib/button.js";
28
21
  import { cn } from "../../lib/cn.js";
29
22
  import { TOUCH_HIDDEN_CLASS } from "../../lib/touch.js";
@@ -44,7 +37,7 @@ import { ShortcutsButton } from "./ShortcutsButton.js";
44
37
  import { SEARCH_KEYS } from "../features/search/searchTool.js";
45
38
  import { ariaShortcut, findShortcutKeys, isApple, shortcutLabel } from "../core/shortcuts.js";
46
39
  import { tableChunk } from "../features/table/tableTool.js";
47
- import { describedTools, type KitToolButton, type ToolList } from "../core/toolDescriptor.js";
40
+ import { type KitToolButton, type ToolList } from "../core/toolDescriptor.js";
48
41
  import { ToolButtonView, useToolLabel } from "./ToolButtonView.js";
49
42
  import type { Tool } from "../core/tools.js";
50
43
 
@@ -62,7 +55,7 @@ type EditorMessages = UiMessages["editor"];
62
55
  interface Action {
63
56
  kind: "button";
64
57
  tool: Tool;
65
- /** Стабильный ключ: у инструмента `history` кнопок две. */
58
+ /** Стабильный ключ: у одного Инструмента может быть несколько кнопок. */
66
59
  id: string;
67
60
  label: (messages: EditorMessages) => string;
68
61
  icon: ComponentType<IconProps>;
@@ -149,7 +142,7 @@ const slot = (tool: Tool): Slot => ({ kind: "slot", id: tool, tool });
149
142
  * край, — группами целиком: с кнопками «Маркер» и «Цвет» Панель
150
143
  * `full` в колонке 640 px занимает две строки, и группа не делится на сирот.
151
144
  *
152
- * КНОПКИ ОПИСАНИЙ (ADR-0058, п. 5.3). Ссылка и эмодзи стоят на местах, которые
145
+ * КНОПКИ ОПИСАНИЙ (ADR-0058, п. 5.3). Ссылка, картинка и эмодзи стоят на местах, которые
153
146
  * кит отвёл их Инструментам (`slot`). Кнопки описаний без места кита — своя
154
147
  * группа перед «Отменить» и «Повторить», в порядке списка Инструментов.
155
148
  */
@@ -171,44 +164,8 @@ const GROUPS: readonly (readonly Entry[])[] = [
171
164
  widget("more", (tools) => MORE_FORMAT_TOOLS.some((tool) => tools.has(tool))),
172
165
  ],
173
166
  [widget("lists", hasListMenu)],
174
- [
175
- slot("link"),
176
- {
177
- kind: "button",
178
- tool: "image",
179
- id: "image",
180
- label: (m) => m.image,
181
- icon: ImageIcon,
182
- // Как у ссылки: кнопка открывает поповер (`ImagePopover`), а не вставляет
183
- // сама. `aria-pressed` — выделена картинка или каретка в её подписи:
184
- // поповер тогда правит её, а не вставляет новую.
185
- run: (editor) => editor.commands.openImageEditor(),
186
- can: (editor) => editor.can().openImageEditor(),
187
- isActive: (editor) => editor.isActive("image"),
188
- },
189
- widget("table", (tools) => tools.has("table")),
190
- slot("emoji"),
191
- ],
192
- [
193
- {
194
- kind: "button",
195
- tool: "history",
196
- id: "undo",
197
- label: (m) => m.undo,
198
- icon: UndoIcon,
199
- run: (editor) => editor.chain().focus().undo().run(),
200
- can: (editor) => editor.can().undo(),
201
- },
202
- {
203
- kind: "button",
204
- tool: "history",
205
- id: "redo",
206
- label: (m) => m.redo,
207
- icon: RedoIcon,
208
- run: (editor) => editor.chain().focus().redo().run(),
209
- can: (editor) => editor.can().redo(),
210
- },
211
- ],
167
+ [slot("link"), slot("image"), widget("table", (tools) => tools.has("table")), slot("emoji")],
168
+ [slot("history")],
212
169
  ];
213
170
 
214
171
  /** Инструменты, чьим кнопкам кит отвёл место на Панели. */
@@ -225,7 +182,7 @@ type GroupEntry = Action | Widget | ToolEntry;
225
182
  * читается — для него нужен движок.
226
183
  */
227
184
  function toolbarGroups(tools: ToolList, withSource: boolean): GroupEntry[][] {
228
- const described = describedTools(tools);
185
+ const described = tools.descriptors;
229
186
  const toolEntries = (buttons: readonly KitToolButton[] = []) =>
230
187
  buttons.map((button): ToolEntry => ({ kind: "tool", id: button.id, button }));
231
188
  const kitGroups = GROUPS.map((group) =>
@@ -149,11 +149,8 @@ export function SelectionBubble({
149
149
  // «Списки ▾» — сразу за «¶», как на Панели: из «¶» списки ушли.
150
150
  const hasLists = hasListMenu(tools);
151
151
  // Хвост — кнопки описаний с флагом Меню выделения: проекция списка.
152
- const tail = projectRecords<KitToolButton>(
153
- tools,
154
- BUBBLE_TAIL_ORDER,
155
- () => undefined,
156
- (descriptor) => descriptor.buttons?.filter((button) => button.selectionMenu)
152
+ const tail = projectRecords<KitToolButton>(tools, BUBBLE_TAIL_ORDER, (descriptor) =>
153
+ descriptor.buttons?.filter((button) => button.selectionMenu)
157
154
  );
158
155
 
159
156
  // `aria-keyshortcuts` — путь в плашку из Документа; `Toolbar` react-aria
@@ -127,7 +127,8 @@ export function ToolButtonView({
127
127
  }: ToolButtonViewProps) {
128
128
  const apple = isApple();
129
129
  const [open, setOpen] = useState(false);
130
- const keys = button.shortcut;
130
+ // Подпись: своё сочетание кнопки или клавиша из Extensions (`keys` встроенной).
131
+ const keys = button.shortcut ?? button.keys;
131
132
  const tooltip = keys ? (
132
133
  <span className="flex items-center gap-2">
133
134
  {label}
@@ -525,6 +525,9 @@ export const DEFAULT_MESSAGES: UiMessages = {
525
525
  warning: "Warning",
526
526
  danger: "Caution",
527
527
  },
528
+ details: "Collapsible block",
529
+ unwrapDetails: "Remove collapsing",
530
+ detailsToggle: ({ text }) => (text ? `Details: ${text}` : "Details: no title"),
528
531
  emoji: "Emoji",
529
532
  emojiGrid: "Choose an emoji",
530
533
  emojiCategory: {
@@ -950,7 +950,7 @@ export interface UiMessages {
950
950
  */
951
951
  toolsFailed: string;
952
952
  /**
953
- * Кнопка у ошибки поля, когда упал загрузчик Части для движка (сеть,
953
+ * Кнопка у ошибки поля, когда упал загрузчик Extensions (сеть,
954
954
  * устаревший чанк): заново зовёт упавшие загрузчики (ADR-0058, п. 11.6).
955
955
  */
956
956
  retry: string;
@@ -997,6 +997,19 @@ export interface UiMessages {
997
997
  wrapperTone: (vars: { current: string }) => string;
998
998
  wrapperToneNone: string;
999
999
  wrapperToneName: Record<EditorWrapperTone, string>;
1000
+ /**
1001
+ * Сворачиваемый Блок (Details). `details` — пункт Меню вставки и «Добавить ›»
1002
+ * у ручки Блока; `unwrapDetails` — пункт меню ручки: Блок перестаёт
1003
+ * сворачиваться, заголовок становится абзацем, а содержимое остаётся на месте.
1004
+ * `detailsToggle` — имя кнопки раскрытия: движок рисует кнопку без текста,
1005
+ * и без имени скринридер слышал бы «кнопка». Имя называет Блок его
1006
+ * заголовком (`text` — текст summary, пустой у Блока без заголовка), а
1007
+ * раскрыт он или нет, говорит `aria-expanded`. Функцией: заголовок стоит в
1008
+ * середине фразы.
1009
+ */
1010
+ details: string;
1011
+ unwrapDetails: string;
1012
+ detailsToggle: (vars: { text: string }) => string;
1000
1013
  /**
1001
1014
  * Эмодзи. `emoji` — имя кнопки Панели; `emojiGrid` — имя сетки в поповере.
1002
1015
  * `emojiCategory` — названия категорий, `emojiName` — имя каждого эмодзи:
package/src/icons.ts CHANGED
@@ -552,6 +552,13 @@ export {
552
552
  * lucide; не `DeleteIcon` — удаляется не содержимое, а только контейнер.
553
553
  */
554
554
  Ungroup as UnwrapIcon,
555
+ /**
556
+ * Сворачиваемый Блок Редактора (Details): список со стрелками сворачивания.
557
+ * Не `ChevronDownIcon`/`CollapseIcon`: шеврон — шаг и вложенность, `CollapseIcon`
558
+ * — свернуть окно; здесь Блок целиком с заголовком и спрятанным содержимым.
559
+ * Стоит у пункта «Сворачиваемый блок» Меню вставки; снять Блок — `UnwrapIcon`.
560
+ */
561
+ ListCollapse as DetailsIcon,
555
562
 
556
563
  // ── Тема и плотность сетки ─────────────────────────────────────────────
557
564
  Sun as ThemeLightIcon,
package/src/locales/ru.ts CHANGED
@@ -563,6 +563,9 @@ export const messages: UiMessages = {
563
563
  warning: "Внимание",
564
564
  danger: "Осторожно",
565
565
  },
566
+ details: "Сворачиваемый блок",
567
+ unwrapDetails: "Снять сворачивание",
568
+ detailsToggle: ({ text }) => (text ? `Подробности: ${text}` : "Подробности: без заголовка"),
566
569
  emoji: "Эмодзи",
567
570
  emojiGrid: "Выберите эмодзи",
568
571
  emojiCategory: {