@formicoidea/labre-core 0.31.0 → 0.32.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 (483) hide show
  1. package/dist/_pkgs/affine-block-callout/callout-block.d.ts +6 -0
  2. package/dist/_pkgs/affine-block-callout/callout-block.js +25 -3
  3. package/dist/_pkgs/affine-block-callout/callout-keymap.js +59 -19
  4. package/dist/_pkgs/affine-block-callout/commands/callout-to-paragraph.d.ts +20 -0
  5. package/dist/_pkgs/affine-block-callout/commands/callout-to-paragraph.js +60 -0
  6. package/dist/_pkgs/affine-block-callout/commands/split-callout.d.ts +17 -0
  7. package/dist/_pkgs/affine-block-callout/commands/split-callout.js +42 -0
  8. package/dist/_pkgs/affine-block-callout/configs/slash-menu.js +9 -6
  9. package/dist/_pkgs/affine-block-callout/emoji-margin.d.ts +9 -0
  10. package/dist/_pkgs/affine-block-callout/emoji-margin.js +36 -0
  11. package/dist/_pkgs/affine-block-callout/emoji-menu.d.ts +5 -1
  12. package/dist/_pkgs/affine-block-callout/emoji-menu.js +5 -0
  13. package/dist/_pkgs/affine-block-code/code-block.d.ts +14 -0
  14. package/dist/_pkgs/affine-block-code/code-block.js +44 -6
  15. package/dist/_pkgs/affine-block-code/code-toolbar/components/code-toolbar.d.ts +2 -0
  16. package/dist/_pkgs/affine-block-code/code-toolbar/components/code-toolbar.js +23 -14
  17. package/dist/_pkgs/affine-block-code/code-toolbar/components/more-menu.d.ts +16 -0
  18. package/dist/_pkgs/affine-block-code/code-toolbar/components/more-menu.js +93 -0
  19. package/dist/_pkgs/affine-block-code/code-toolbar/config.js +52 -5
  20. package/dist/_pkgs/affine-block-code/effects.d.ts +2 -0
  21. package/dist/_pkgs/affine-block-code/effects.js +2 -0
  22. package/dist/_pkgs/affine-block-code/highlight/affine-code-unit.js +6 -1
  23. package/dist/_pkgs/affine-block-code/index.d.ts +1 -0
  24. package/dist/_pkgs/affine-block-code/index.js +1 -0
  25. package/dist/_pkgs/affine-block-code/line-numbers.d.ts +25 -0
  26. package/dist/_pkgs/affine-block-code/line-numbers.js +27 -0
  27. package/dist/_pkgs/affine-block-code/styles.js +31 -0
  28. package/dist/_pkgs/affine-block-data-view/data-view-block.js +1 -0
  29. package/dist/_pkgs/affine-block-database/components/title/index.js +4 -1
  30. package/dist/_pkgs/affine-block-database/configs/slash-menu.js +28 -1
  31. package/dist/_pkgs/affine-block-database/database-block.js +13 -0
  32. package/dist/_pkgs/affine-block-database/properties/paste-url.d.ts +24 -0
  33. package/dist/_pkgs/affine-block-database/properties/paste-url.js +98 -0
  34. package/dist/_pkgs/affine-block-database/properties/rich-text/cell-renderer.js +9 -19
  35. package/dist/_pkgs/affine-block-database/properties/title/text.js +20 -25
  36. package/dist/_pkgs/affine-block-database/views/index.js +1 -0
  37. package/dist/_pkgs/affine-block-edgeless-text/edgeless-text-block.js +10 -0
  38. package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/config.d.ts +3 -0
  39. package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/config.js +48 -1
  40. package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/font-size.d.ts +17 -0
  41. package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/font-size.js +24 -0
  42. package/dist/_pkgs/affine-block-embed-doc/common/doc-trashed.d.ts +9 -0
  43. package/dist/_pkgs/affine-block-embed-doc/common/doc-trashed.js +10 -0
  44. package/dist/_pkgs/affine-block-embed-doc/embed-linked-doc-block/embed-linked-doc-block.js +8 -4
  45. package/dist/_pkgs/affine-block-embed-doc/embed-synced-doc-block/embed-synced-doc-block.d.ts +4 -0
  46. package/dist/_pkgs/affine-block-embed-doc/embed-synced-doc-block/embed-synced-doc-block.js +22 -3
  47. package/dist/_pkgs/affine-block-frame/frame-manager.d.ts +13 -0
  48. package/dist/_pkgs/affine-block-frame/frame-manager.js +32 -2
  49. package/dist/_pkgs/affine-block-latex/styles.js +6 -1
  50. package/dist/_pkgs/affine-block-note/note-edgeless-block.d.ts +9 -0
  51. package/dist/_pkgs/affine-block-note/note-edgeless-block.js +29 -1
  52. package/dist/_pkgs/affine-block-root/commands/pivot-commands.d.ts +37 -0
  53. package/dist/_pkgs/affine-block-root/commands/pivot-commands.js +168 -0
  54. package/dist/_pkgs/affine-block-root/commands/reading-commands.d.ts +23 -0
  55. package/dist/_pkgs/affine-block-root/commands/reading-commands.js +107 -0
  56. package/dist/_pkgs/affine-block-root/commands/tag-commands.d.ts +47 -0
  57. package/dist/_pkgs/affine-block-root/commands/tag-commands.js +159 -0
  58. package/dist/_pkgs/affine-block-root/configs/toolbar.d.ts +1 -0
  59. package/dist/_pkgs/affine-block-root/edgeless/configs/toolbar/more.js +9 -2
  60. package/dist/_pkgs/affine-block-root/edgeless/configs/toolbar/render-linked-doc.js +1 -1
  61. package/dist/_pkgs/affine-block-root/edgeless/edgeless-keyboard.js +26 -1
  62. package/dist/_pkgs/affine-block-root/edgeless/edgeless-root-block.js +11 -2
  63. package/dist/_pkgs/affine-block-root/edgeless/edgeless-root-service.js +14 -0
  64. package/dist/_pkgs/affine-block-root/edgeless/index.d.ts +1 -0
  65. package/dist/_pkgs/affine-block-root/edgeless/index.js +1 -0
  66. package/dist/_pkgs/affine-block-root/edgeless/reserved-keys.d.ts +21 -0
  67. package/dist/_pkgs/affine-block-root/edgeless/reserved-keys.js +34 -0
  68. package/dist/_pkgs/affine-block-root/edgeless/utils/clone-utils.d.ts +7 -1
  69. package/dist/_pkgs/affine-block-root/edgeless/utils/clone-utils.js +11 -2
  70. package/dist/_pkgs/affine-block-root/index.d.ts +4 -1
  71. package/dist/_pkgs/affine-block-root/index.js +4 -1
  72. package/dist/_pkgs/affine-block-root/keyboard/commands.d.ts +2 -0
  73. package/dist/_pkgs/affine-block-root/keyboard/commands.js +147 -0
  74. package/dist/_pkgs/affine-block-root/view.js +13 -4
  75. package/dist/_pkgs/affine-block-surface/commands/reassociate-connectors.js +0 -1
  76. package/dist/_pkgs/affine-block-surface/effects.js +6 -0
  77. package/dist/_pkgs/affine-block-surface/element-model/index.d.ts +5 -2
  78. package/dist/_pkgs/affine-block-surface/element-model/index.js +4 -2
  79. package/dist/_pkgs/affine-block-surface/extensions/audit.d.ts +107 -0
  80. package/dist/_pkgs/affine-block-surface/extensions/audit.js +472 -0
  81. package/dist/_pkgs/affine-block-surface/extensions/crud-extension.d.ts +14 -0
  82. package/dist/_pkgs/affine-block-surface/extensions/crud-extension.js +27 -0
  83. package/dist/_pkgs/affine-block-surface/extensions/editor-anchored-panel.d.ts +133 -0
  84. package/dist/_pkgs/affine-block-surface/extensions/editor-anchored-panel.js +326 -0
  85. package/dist/_pkgs/affine-block-surface/extensions/index.d.ts +13 -0
  86. package/dist/_pkgs/affine-block-surface/extensions/index.js +13 -0
  87. package/dist/_pkgs/affine-block-surface/extensions/map-quality-widget.d.ts +146 -0
  88. package/dist/_pkgs/affine-block-surface/extensions/map-quality-widget.js +528 -0
  89. package/dist/_pkgs/affine-block-surface/extensions/map-quality.d.ts +109 -0
  90. package/dist/_pkgs/affine-block-surface/extensions/map-quality.js +84 -0
  91. package/dist/_pkgs/affine-block-surface/extensions/reading-toolbar.d.ts +15 -0
  92. package/dist/_pkgs/affine-block-surface/extensions/reading-toolbar.js +158 -0
  93. package/dist/_pkgs/affine-block-surface/extensions/reading-widget.d.ts +145 -0
  94. package/dist/_pkgs/affine-block-surface/extensions/reading-widget.js +590 -0
  95. package/dist/_pkgs/affine-block-surface/extensions/reading.d.ts +494 -0
  96. package/dist/_pkgs/affine-block-surface/extensions/reading.js +767 -0
  97. package/dist/_pkgs/affine-block-surface/extensions/spotlight.d.ts +45 -0
  98. package/dist/_pkgs/affine-block-surface/extensions/spotlight.js +177 -0
  99. package/dist/_pkgs/affine-block-surface/extensions/tags-toolbar.d.ts +10 -0
  100. package/dist/_pkgs/affine-block-surface/extensions/tags-toolbar.js +295 -0
  101. package/dist/_pkgs/affine-block-surface/extensions/validation-toolbar.d.ts +27 -0
  102. package/dist/_pkgs/affine-block-surface/extensions/validation-toolbar.js +361 -0
  103. package/dist/_pkgs/affine-block-surface/extensions/validation.d.ts +1340 -0
  104. package/dist/_pkgs/affine-block-surface/extensions/validation.js +3009 -0
  105. package/dist/_pkgs/affine-block-surface/extensions/violation-detail-widget.d.ts +286 -0
  106. package/dist/_pkgs/affine-block-surface/extensions/violation-detail-widget.js +907 -0
  107. package/dist/_pkgs/affine-block-surface/extensions/violation-timeline.d.ts +80 -0
  108. package/dist/_pkgs/affine-block-surface/extensions/violation-timeline.js +123 -0
  109. package/dist/_pkgs/affine-block-surface/framework-background/def.d.ts +321 -0
  110. package/dist/_pkgs/affine-block-surface/framework-background/def.js +81 -0
  111. package/dist/_pkgs/affine-block-surface/framework-background/facts.d.ts +188 -0
  112. package/dist/_pkgs/affine-block-surface/framework-background/facts.js +284 -0
  113. package/dist/_pkgs/affine-block-surface/framework-background/index.d.ts +5 -0
  114. package/dist/_pkgs/affine-block-surface/framework-background/index.js +5 -0
  115. package/dist/_pkgs/affine-block-surface/framework-background/interaction.d.ts +12 -0
  116. package/dist/_pkgs/affine-block-surface/framework-background/interaction.js +24 -0
  117. package/dist/_pkgs/affine-block-surface/framework-background/labels.d.ts +59 -0
  118. package/dist/_pkgs/affine-block-surface/framework-background/labels.js +117 -0
  119. package/dist/_pkgs/affine-block-surface/framework-background/renderer.d.ts +8 -0
  120. package/dist/_pkgs/affine-block-surface/framework-background/renderer.js +238 -0
  121. package/dist/_pkgs/affine-block-surface/index.d.ts +1 -0
  122. package/dist/_pkgs/affine-block-surface/index.js +1 -0
  123. package/dist/_pkgs/affine-block-surface/renderer/canvas-renderer.d.ts +69 -3
  124. package/dist/_pkgs/affine-block-surface/renderer/canvas-renderer.js +333 -44
  125. package/dist/_pkgs/affine-block-surface/renderer/dom-renderer.js +18 -2
  126. package/dist/_pkgs/affine-block-surface/tool/default-tool.js +8 -0
  127. package/dist/_pkgs/affine-block-surface/utils/font.js +9 -3
  128. package/dist/_pkgs/affine-block-surface/view.d.ts +17 -0
  129. package/dist/_pkgs/affine-block-surface/view.js +57 -2
  130. package/dist/_pkgs/affine-block-table/selection-controller.d.ts +6 -0
  131. package/dist/_pkgs/affine-block-table/selection-controller.js +24 -1
  132. package/dist/_pkgs/affine-block-table/table-block.js +8 -2
  133. package/dist/_pkgs/affine-block-table/table-cell.js +5 -6
  134. package/dist/_pkgs/affine-block-table/table-keymap.d.ts +18 -0
  135. package/dist/_pkgs/affine-block-table/table-keymap.js +41 -0
  136. package/dist/_pkgs/affine-block-table/utils.d.ts +7 -0
  137. package/dist/_pkgs/affine-block-table/utils.js +12 -0
  138. package/dist/_pkgs/affine-block-table/view.js +2 -0
  139. package/dist/_pkgs/affine-components/caption/captioned-block-component.js +2 -1
  140. package/dist/_pkgs/affine-components/context-menu/button.d.ts +7 -0
  141. package/dist/_pkgs/affine-components/context-menu/button.js +7 -2
  142. package/dist/_pkgs/affine-components/context-menu/input.d.ts +4 -0
  143. package/dist/_pkgs/affine-components/context-menu/input.js +12 -0
  144. package/dist/_pkgs/affine-components/context-menu/menu-all.d.ts +2 -0
  145. package/dist/_pkgs/affine-components/context-menu/menu-renderer.js +8 -1
  146. package/dist/_pkgs/affine-components/context-menu/sub-menu.js +3 -0
  147. package/dist/_pkgs/affine-components/highlight-dropdown-menu/highlight-duotone-icon.js +8 -8
  148. package/dist/_pkgs/affine-components/highlight-dropdown-menu/text-duotone-icon.js +11 -11
  149. package/dist/_pkgs/affine-components/icon-picker/affine-icon-picker-panel.d.ts +28 -0
  150. package/dist/_pkgs/affine-components/icon-picker/affine-icon-picker-panel.js +231 -0
  151. package/dist/_pkgs/affine-components/icon-picker/emoji-data.d.ts +40 -0
  152. package/dist/_pkgs/affine-components/icon-picker/emoji-data.js +99 -0
  153. package/dist/_pkgs/affine-components/icon-picker/emoji-picker-panel.d.ts +32 -0
  154. package/dist/_pkgs/affine-components/icon-picker/emoji-picker-panel.js +276 -0
  155. package/dist/_pkgs/affine-components/icon-picker/icon-data.d.ts +34 -0
  156. package/dist/_pkgs/affine-components/icon-picker/icon-data.js +83 -0
  157. package/dist/_pkgs/affine-components/icon-picker/icon-picker.d.ts +39 -0
  158. package/dist/_pkgs/affine-components/icon-picker/icon-picker.js +233 -0
  159. package/dist/_pkgs/affine-components/icon-picker/index.d.ts +8 -0
  160. package/dist/_pkgs/affine-components/icon-picker/index.js +15 -0
  161. package/dist/_pkgs/affine-components/icon-picker/recent-store.d.ts +8 -0
  162. package/dist/_pkgs/affine-components/icon-picker/recent-store.js +41 -0
  163. package/dist/_pkgs/affine-components/icon-picker/styles.d.ts +5 -0
  164. package/dist/_pkgs/affine-components/icon-picker/styles.js +166 -0
  165. package/dist/_pkgs/affine-components/icon-picker/types.d.ts +22 -0
  166. package/dist/_pkgs/affine-components/icon-picker/types.js +10 -0
  167. package/dist/_pkgs/affine-components/icons/text.js +426 -426
  168. package/dist/_pkgs/affine-components/open-doc-dropdown-menu/dropdown-menu.d.ts +1 -0
  169. package/dist/_pkgs/affine-components/portal/portal.d.ts +1 -1
  170. package/dist/_pkgs/affine-components/toolbar/menu-button.js +1 -0
  171. package/dist/_pkgs/affine-components/toolbar/toolbar.js +11 -10
  172. package/dist/_pkgs/affine-foundation/view.js +11 -2
  173. package/dist/_pkgs/affine-gfx-brush/index.d.ts +1 -0
  174. package/dist/_pkgs/affine-gfx-brush/index.js +1 -0
  175. package/dist/_pkgs/affine-gfx-brush/renderer/dom/brush.d.ts +1 -0
  176. package/dist/_pkgs/affine-gfx-brush/renderer/dom/brush.js +11 -0
  177. package/dist/_pkgs/affine-gfx-brush/renderer/dom/highlighter.d.ts +1 -0
  178. package/dist/_pkgs/affine-gfx-brush/renderer/dom/highlighter.js +11 -0
  179. package/dist/_pkgs/affine-gfx-brush/renderer/dom/index.d.ts +2 -0
  180. package/dist/_pkgs/affine-gfx-brush/renderer/dom/index.js +2 -0
  181. package/dist/_pkgs/affine-gfx-brush/renderer/dom/shared.d.ts +14 -0
  182. package/dist/_pkgs/affine-gfx-brush/renderer/dom/shared.js +54 -0
  183. package/dist/_pkgs/affine-gfx-brush/renderer/index.d.ts +1 -0
  184. package/dist/_pkgs/affine-gfx-brush/renderer/index.js +4 -0
  185. package/dist/_pkgs/affine-gfx-brush/view.d.ts +14 -0
  186. package/dist/_pkgs/affine-gfx-brush/view.js +29 -3
  187. package/dist/_pkgs/affine-gfx-connector/connector-manager.js +32 -6
  188. package/dist/_pkgs/affine-gfx-connector/connector-tool.d.ts +7 -0
  189. package/dist/_pkgs/affine-gfx-connector/connector-tool.js +2 -1
  190. package/dist/_pkgs/affine-gfx-connector/direction/direction-reveal.d.ts +123 -0
  191. package/dist/_pkgs/affine-gfx-connector/direction/direction-reveal.js +281 -0
  192. package/dist/_pkgs/affine-gfx-connector/direction/direction-widget.d.ts +65 -0
  193. package/dist/_pkgs/affine-gfx-connector/direction/direction-widget.js +395 -0
  194. package/dist/_pkgs/affine-gfx-connector/direction/index.d.ts +4 -0
  195. package/dist/_pkgs/affine-gfx-connector/direction/index.js +4 -0
  196. package/dist/_pkgs/affine-gfx-connector/direction/invert-direction.d.ts +72 -0
  197. package/dist/_pkgs/affine-gfx-connector/direction/invert-direction.js +187 -0
  198. package/dist/_pkgs/affine-gfx-connector/direction/typed-edge.d.ts +69 -0
  199. package/dist/_pkgs/affine-gfx-connector/direction/typed-edge.js +66 -0
  200. package/dist/_pkgs/affine-gfx-connector/effects.d.ts +2 -0
  201. package/dist/_pkgs/affine-gfx-connector/effects.js +2 -0
  202. package/dist/_pkgs/affine-gfx-connector/element-renderer/connector-dom/index.js +78 -41
  203. package/dist/_pkgs/affine-gfx-connector/index.d.ts +1 -0
  204. package/dist/_pkgs/affine-gfx-connector/index.js +1 -0
  205. package/dist/_pkgs/affine-gfx-connector/toolbar/config.d.ts +50 -0
  206. package/dist/_pkgs/affine-gfx-connector/toolbar/config.js +67 -1
  207. package/dist/_pkgs/affine-gfx-connector/view.js +16 -0
  208. package/dist/_pkgs/affine-gfx-group/command/group-api.js +150 -62
  209. package/dist/_pkgs/affine-gfx-group/text/edgeless-group-title-editor.js +4 -1
  210. package/dist/_pkgs/affine-gfx-pointer/tools/pan-tool.d.ts +16 -0
  211. package/dist/_pkgs/affine-gfx-pointer/tools/pan-tool.js +102 -32
  212. package/dist/_pkgs/affine-gfx-shape/commands.d.ts +2 -0
  213. package/dist/_pkgs/affine-gfx-shape/commands.js +33 -0
  214. package/dist/_pkgs/affine-gfx-shape/element-renderer/shape-dom/index.js +48 -19
  215. package/dist/_pkgs/affine-gfx-shape/index.d.ts +1 -1
  216. package/dist/_pkgs/affine-gfx-shape/index.js +1 -1
  217. package/dist/_pkgs/affine-gfx-shape/text/edgeless-shape-text-editor.d.ts +26 -0
  218. package/dist/_pkgs/affine-gfx-shape/text/edgeless-shape-text-editor.js +124 -13
  219. package/dist/_pkgs/affine-gfx-shape/view.js +3 -3
  220. package/dist/_pkgs/affine-gfx-template/toolbar/template-tool-button.d.ts +2 -0
  221. package/dist/_pkgs/affine-gfx-template/toolbar/template-tool-button.js +18 -1
  222. package/dist/_pkgs/affine-gfx-text/edgeless-text-editor.js +9 -5
  223. package/dist/_pkgs/affine-inline-latex/command.js +46 -26
  224. package/dist/_pkgs/affine-inline-latex/latex-node/latex-node.d.ts +10 -0
  225. package/dist/_pkgs/affine-inline-latex/latex-node/latex-node.js +23 -0
  226. package/dist/_pkgs/affine-inline-link/link-node/affine-link.js +4 -1
  227. package/dist/_pkgs/affine-inline-preset/adapters/html/html-inline.d.ts +3 -0
  228. package/dist/_pkgs/affine-inline-preset/adapters/html/html-inline.js +29 -1
  229. package/dist/_pkgs/affine-model/blocks/code/code-model.d.ts +1 -0
  230. package/dist/_pkgs/affine-model/blocks/code/code-model.js +1 -0
  231. package/dist/_pkgs/affine-model/elements/connector/connector.js +24 -0
  232. package/dist/_pkgs/affine-model/elements/edgy/board.d.ts +32 -0
  233. package/dist/_pkgs/affine-model/elements/edgy/board.js +112 -0
  234. package/dist/_pkgs/affine-model/elements/edgy/facets.d.ts +12 -0
  235. package/dist/_pkgs/affine-model/elements/edgy/facets.js +25 -1
  236. package/dist/_pkgs/affine-model/elements/edgy/index.d.ts +1 -0
  237. package/dist/_pkgs/affine-model/elements/edgy/index.js +1 -0
  238. package/dist/_pkgs/affine-model/elements/framework-background/background.d.ts +42 -0
  239. package/dist/_pkgs/affine-model/elements/framework-background/background.js +42 -0
  240. package/dist/_pkgs/affine-model/elements/framework-background/index.d.ts +1 -0
  241. package/dist/_pkgs/affine-model/elements/framework-background/index.js +1 -0
  242. package/dist/_pkgs/affine-model/elements/index.d.ts +3 -1
  243. package/dist/_pkgs/affine-model/elements/index.js +1 -0
  244. package/dist/_pkgs/affine-model/elements/mindmap/mindmap.js +8 -3
  245. package/dist/_pkgs/affine-model/elements/mindmap/style.d.ts +10 -0
  246. package/dist/_pkgs/affine-model/elements/mindmap/style.js +8 -0
  247. package/dist/_pkgs/affine-model/elements/wardley/wardley.d.ts +21 -29
  248. package/dist/_pkgs/affine-model/elements/wardley/wardley.js +41 -48
  249. package/dist/_pkgs/affine-shared/adapters/markdown/delta-converter.d.ts +6 -1
  250. package/dist/_pkgs/affine-shared/adapters/markdown/delta-converter.js +160 -2
  251. package/dist/_pkgs/affine-shared/adapters/markdown/markdown.js +5 -1
  252. package/dist/_pkgs/affine-shared/adapters/types/delta-converter.d.ts +1 -0
  253. package/dist/_pkgs/affine-shared/adapters/utils/color.d.ts +24 -0
  254. package/dist/_pkgs/affine-shared/adapters/utils/color.js +280 -0
  255. package/dist/_pkgs/affine-shared/adapters/utils/index.d.ts +1 -0
  256. package/dist/_pkgs/affine-shared/adapters/utils/index.js +1 -0
  257. package/dist/_pkgs/affine-shared/commands/block-crud/get-selected-blocks.js +10 -2
  258. package/dist/_pkgs/affine-shared/services/audit-service.d.ts +300 -0
  259. package/dist/_pkgs/affine-shared/services/audit-service.js +228 -0
  260. package/dist/_pkgs/affine-shared/services/edit-props-store.d.ts +7 -0
  261. package/dist/_pkgs/affine-shared/services/edit-props-store.js +11 -0
  262. package/dist/_pkgs/affine-shared/services/font-loader/font-loader-service.d.ts +26 -1
  263. package/dist/_pkgs/affine-shared/services/font-loader/font-loader-service.js +124 -7
  264. package/dist/_pkgs/affine-shared/services/index.d.ts +5 -0
  265. package/dist/_pkgs/affine-shared/services/index.js +5 -0
  266. package/dist/_pkgs/affine-shared/services/pivot-materiality-publisher.d.ts +129 -0
  267. package/dist/_pkgs/affine-shared/services/pivot-materiality-publisher.js +311 -0
  268. package/dist/_pkgs/affine-shared/services/pivot-properties-service.d.ts +217 -0
  269. package/dist/_pkgs/affine-shared/services/pivot-properties-service.js +114 -0
  270. package/dist/_pkgs/affine-shared/services/telemetry-service/code-block.d.ts +1 -1
  271. package/dist/_pkgs/affine-shared/services/telemetry-service/lifecycle.d.ts +182 -0
  272. package/dist/_pkgs/affine-shared/services/telemetry-service/telemetry-service.d.ts +2 -2
  273. package/dist/_pkgs/affine-shared/services/telemetry-service/types.d.ts +6 -1
  274. package/dist/_pkgs/affine-shared/services/toolbar-service/action.d.ts +10 -0
  275. package/dist/_pkgs/affine-shared/services/toolbar-service/index.d.ts +1 -0
  276. package/dist/_pkgs/affine-shared/services/toolbar-service/index.js +1 -0
  277. package/dist/_pkgs/affine-shared/services/toolbar-service/layout.d.ts +134 -0
  278. package/dist/_pkgs/affine-shared/services/toolbar-service/layout.js +146 -0
  279. package/dist/_pkgs/affine-shared/services/translation-service/index.d.ts +68 -0
  280. package/dist/_pkgs/affine-shared/services/translation-service/index.js +39 -0
  281. package/dist/_pkgs/affine-shared/services/universe-tag-defs-service.d.ts +155 -0
  282. package/dist/_pkgs/affine-shared/services/universe-tag-defs-service.js +254 -0
  283. package/dist/_pkgs/affine-shared/utils/dom/point-to-range.d.ts +4 -0
  284. package/dist/_pkgs/affine-shared/utils/dom/point-to-range.js +58 -2
  285. package/dist/_pkgs/affine-shared/utils/dom/viewport.d.ts +60 -0
  286. package/dist/_pkgs/affine-shared/utils/dom/viewport.js +58 -0
  287. package/dist/_pkgs/affine-shared/utils/print-to-pdf.d.ts +21 -0
  288. package/dist/_pkgs/affine-shared/utils/print-to-pdf.js +166 -32
  289. package/dist/_pkgs/affine-shared/utils/zod-schema.d.ts +7 -0
  290. package/dist/_pkgs/affine-shared/utils/zod-schema.js +27 -1
  291. package/dist/_pkgs/affine-widget-drag-handle/watchers/edgeless-watcher.d.ts +19 -10
  292. package/dist/_pkgs/affine-widget-drag-handle/watchers/edgeless-watcher.js +122 -23
  293. package/dist/_pkgs/affine-widget-drag-handle/watchers/pointer-event-watcher.d.ts +2 -0
  294. package/dist/_pkgs/affine-widget-drag-handle/watchers/pointer-event-watcher.js +25 -4
  295. package/dist/_pkgs/affine-widget-edgeless-selected-rect/auto-complete-panel.js +10 -5
  296. package/dist/_pkgs/affine-widget-edgeless-selected-rect/edgeless-auto-complete.d.ts +15 -1
  297. package/dist/_pkgs/affine-widget-edgeless-selected-rect/edgeless-auto-complete.js +37 -32
  298. package/dist/_pkgs/affine-widget-edgeless-selected-rect/edgeless-element-link.js +5 -4
  299. package/dist/_pkgs/affine-widget-edgeless-selected-rect/edgeless-selected-rect.js +19 -9
  300. package/dist/_pkgs/affine-widget-edgeless-selected-rect/utils.d.ts +16 -2
  301. package/dist/_pkgs/affine-widget-edgeless-selected-rect/utils.js +19 -2
  302. package/dist/_pkgs/affine-widget-edgeless-toolbar/index.d.ts +1 -0
  303. package/dist/_pkgs/affine-widget-edgeless-toolbar/index.js +1 -0
  304. package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/command-menu.d.ts +38 -0
  305. package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/command-menu.js +99 -0
  306. package/dist/_pkgs/affine-widget-frame-title/edgeless-frame-title-editor.js +4 -1
  307. package/dist/_pkgs/affine-widget-keyboard-toolbar/icons.js +98 -98
  308. package/dist/_pkgs/affine-widget-linked-doc/linked-doc-popover.js +2 -15
  309. package/dist/_pkgs/affine-widget-linked-doc/transformers/markdown.d.ts +10 -1
  310. package/dist/_pkgs/affine-widget-linked-doc/transformers/markdown.js +133 -6
  311. package/dist/_pkgs/affine-widget-linked-doc/transformers/utils.d.ts +10 -0
  312. package/dist/_pkgs/affine-widget-linked-doc/transformers/utils.js +120 -3
  313. package/dist/_pkgs/affine-widget-linked-doc/utils.d.ts +12 -0
  314. package/dist/_pkgs/affine-widget-linked-doc/utils.js +33 -0
  315. package/dist/_pkgs/affine-widget-remote-selection/edgeless/index.js +6 -4
  316. package/dist/_pkgs/affine-widget-slash-menu/slash-menu-popover.js +8 -4
  317. package/dist/_pkgs/affine-widget-slash-menu/utils.d.ts +9 -0
  318. package/dist/_pkgs/affine-widget-slash-menu/utils.js +24 -0
  319. package/dist/_pkgs/affine-widget-toolbar/toolbar.d.ts +6 -0
  320. package/dist/_pkgs/affine-widget-toolbar/toolbar.js +34 -6
  321. package/dist/_pkgs/affine-widget-toolbar/utils.d.ts +146 -3
  322. package/dist/_pkgs/affine-widget-toolbar/utils.js +738 -56
  323. package/dist/_pkgs/data-view/core/common/property-menu.js +3 -16
  324. package/dist/_pkgs/data-view/core/component/tags/multi-tag-select.d.ts +4 -0
  325. package/dist/_pkgs/data-view/core/component/tags/multi-tag-select.js +28 -1
  326. package/dist/_pkgs/data-view/core/data-view.d.ts +3 -1
  327. package/dist/_pkgs/data-view/core/data-view.js +25 -3
  328. package/dist/_pkgs/data-view/core/detail/field.js +2 -2
  329. package/dist/_pkgs/data-view/core/detail/selection.d.ts +4 -2
  330. package/dist/_pkgs/data-view/core/detail/selection.js +23 -7
  331. package/dist/_pkgs/data-view/core/effect.js +2 -0
  332. package/dist/_pkgs/data-view/core/filter/eval.js +36 -23
  333. package/dist/_pkgs/data-view/core/filter/filter-fn/matcher.d.ts +7 -0
  334. package/dist/_pkgs/data-view/core/filter/filter-fn/matcher.js +12 -0
  335. package/dist/_pkgs/data-view/core/group-by/compare-date-keys.d.ts +11 -0
  336. package/dist/_pkgs/data-view/core/group-by/compare-date-keys.js +55 -0
  337. package/dist/_pkgs/data-view/core/group-by/define.d.ts +6 -0
  338. package/dist/_pkgs/data-view/core/group-by/define.js +114 -0
  339. package/dist/_pkgs/data-view/core/group-by/matcher.d.ts +7 -0
  340. package/dist/_pkgs/data-view/core/group-by/matcher.js +13 -0
  341. package/dist/_pkgs/data-view/core/group-by/renderer/boolean-group.js +11 -11
  342. package/dist/_pkgs/data-view/core/group-by/renderer/date-group.d.ts +9 -0
  343. package/dist/_pkgs/data-view/core/group-by/renderer/date-group.js +97 -0
  344. package/dist/_pkgs/data-view/core/group-by/setting.js +86 -7
  345. package/dist/_pkgs/data-view/core/group-by/trait.d.ts +34 -0
  346. package/dist/_pkgs/data-view/core/group-by/trait.js +106 -10
  347. package/dist/_pkgs/data-view/core/utils/menu-title.js +17 -17
  348. package/dist/_pkgs/data-view/property-presets/multi-select/cell-renderer.js +3 -1
  349. package/dist/_pkgs/data-view/property-presets/number/define.js +2 -1
  350. package/dist/_pkgs/data-view/property-presets/select/cell-renderer.js +3 -1
  351. package/dist/_pkgs/data-view/view-presets/calendar/calendar-view-manager.d.ts +70 -0
  352. package/dist/_pkgs/data-view/view-presets/calendar/calendar-view-manager.js +449 -0
  353. package/dist/_pkgs/data-view/view-presets/calendar/define.d.ts +10 -0
  354. package/dist/_pkgs/data-view/view-presets/calendar/define.js +27 -0
  355. package/dist/_pkgs/data-view/view-presets/calendar/effect.d.ts +1 -0
  356. package/dist/_pkgs/data-view/view-presets/calendar/effect.js +4 -0
  357. package/dist/_pkgs/data-view/view-presets/calendar/index.d.ts +6 -0
  358. package/dist/_pkgs/data-view/view-presets/calendar/index.js +6 -0
  359. package/dist/_pkgs/data-view/view-presets/calendar/layout.d.ts +37 -0
  360. package/dist/_pkgs/data-view/view-presets/calendar/layout.js +138 -0
  361. package/dist/_pkgs/data-view/view-presets/calendar/pc/actions.d.ts +7 -0
  362. package/dist/_pkgs/data-view/view-presets/calendar/pc/actions.js +68 -0
  363. package/dist/_pkgs/data-view/view-presets/calendar/pc/dnd.d.ts +32 -0
  364. package/dist/_pkgs/data-view/view-presets/calendar/pc/dnd.js +159 -0
  365. package/dist/_pkgs/data-view/view-presets/calendar/pc/effect.d.ts +1 -0
  366. package/dist/_pkgs/data-view/view-presets/calendar/pc/effect.js +7 -0
  367. package/dist/_pkgs/data-view/view-presets/calendar/pc/hit-test.d.ts +1 -0
  368. package/dist/_pkgs/data-view/view-presets/calendar/pc/hit-test.js +28 -0
  369. package/dist/_pkgs/data-view/view-presets/calendar/pc/styles.d.ts +1 -0
  370. package/dist/_pkgs/data-view/view-presets/calendar/pc/styles.js +707 -0
  371. package/dist/_pkgs/data-view/view-presets/calendar/pc/view.d.ts +89 -0
  372. package/dist/_pkgs/data-view/view-presets/calendar/pc/view.js +837 -0
  373. package/dist/_pkgs/data-view/view-presets/calendar/renderer.d.ts +2 -0
  374. package/dist/_pkgs/data-view/view-presets/calendar/renderer.js +8 -0
  375. package/dist/_pkgs/data-view/view-presets/calendar/source.d.ts +8 -0
  376. package/dist/_pkgs/data-view/view-presets/calendar/source.js +3 -0
  377. package/dist/_pkgs/data-view/view-presets/calendar/types.d.ts +79 -0
  378. package/dist/_pkgs/data-view/view-presets/calendar/types.js +1 -0
  379. package/dist/_pkgs/data-view/view-presets/convert.js +28 -0
  380. package/dist/_pkgs/data-view/view-presets/effect.js +2 -0
  381. package/dist/_pkgs/data-view/view-presets/index.d.ts +2 -0
  382. package/dist/_pkgs/data-view/view-presets/index.js +3 -0
  383. package/dist/_pkgs/data-view/view-presets/kanban/kanban-view-manager.js +3 -1
  384. package/dist/_pkgs/data-view/view-presets/kanban/mobile/cell.js +2 -2
  385. package/dist/_pkgs/data-view/view-presets/table/collapsed-state.d.ts +18 -0
  386. package/dist/_pkgs/data-view/view-presets/table/collapsed-state.js +36 -0
  387. package/dist/_pkgs/data-view/view-presets/table/mobile/cell.js +2 -2
  388. package/dist/_pkgs/data-view/view-presets/table/mobile/group.d.ts +11 -0
  389. package/dist/_pkgs/data-view/view-presets/table/mobile/group.js +87 -4
  390. package/dist/_pkgs/data-view/view-presets/table/pc/cell.d.ts +3 -0
  391. package/dist/_pkgs/data-view/view-presets/table/pc/cell.js +11 -2
  392. package/dist/_pkgs/data-view/view-presets/table/pc/controller/hotkeys.d.ts +1 -0
  393. package/dist/_pkgs/data-view/view-presets/table/pc/controller/hotkeys.js +39 -33
  394. package/dist/_pkgs/data-view/view-presets/table/pc/group.d.ts +10 -0
  395. package/dist/_pkgs/data-view/view-presets/table/pc/group.js +84 -5
  396. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/controller/hotkeys.d.ts +1 -0
  397. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/controller/hotkeys.js +39 -33
  398. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/group/top/group-title.js +18 -18
  399. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/row/cell.d.ts +3 -0
  400. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/row/cell.js +8 -0
  401. package/dist/_pkgs/data-view/view-presets/table/table-view-manager.js +3 -1
  402. package/dist/_pkgs/data-view/view-presets/table/utils.d.ts +3 -0
  403. package/dist/_pkgs/data-view/view-presets/table/utils.js +16 -1
  404. package/dist/_pkgs/data-view/widget-presets/tools/presets/view-options/view-options.js +3 -1
  405. package/dist/_pkgs/global/gfx/curve.js +4 -3
  406. package/dist/_pkgs/std/clipboard/clipboard.js +13 -3
  407. package/dist/_pkgs/std/clipboard/utils.d.ts +5 -0
  408. package/dist/_pkgs/std/clipboard/utils.js +7 -0
  409. package/dist/_pkgs/std/event/dispatcher.js +27 -1
  410. package/dist/_pkgs/std/event/keymap.js +16 -6
  411. package/dist/_pkgs/std/extension/command-registry.d.ts +321 -0
  412. package/dist/_pkgs/std/extension/command-registry.js +233 -0
  413. package/dist/_pkgs/std/extension/dnd/index.d.ts +1 -1
  414. package/dist/_pkgs/std/extension/index.d.ts +2 -0
  415. package/dist/_pkgs/std/extension/index.js +2 -0
  416. package/dist/_pkgs/std/extension/translation-manifest.d.ts +49 -0
  417. package/dist/_pkgs/std/extension/translation-manifest.js +71 -0
  418. package/dist/_pkgs/std/gfx/index.d.ts +7 -3
  419. package/dist/_pkgs/std/gfx/index.js +6 -2
  420. package/dist/_pkgs/std/gfx/interactivity/gfx-view-event-handler.js +6 -1
  421. package/dist/_pkgs/std/gfx/interactivity/manager.d.ts +8 -0
  422. package/dist/_pkgs/std/gfx/interactivity/manager.js +18 -0
  423. package/dist/_pkgs/std/gfx/layer.d.ts +1 -1
  424. package/dist/_pkgs/std/gfx/layer.js +1 -2
  425. package/dist/_pkgs/std/gfx/model/surface/decorators/field.js +9 -0
  426. package/dist/_pkgs/std/gfx/model/surface/decorators/index.d.ts +2 -2
  427. package/dist/_pkgs/std/gfx/model/surface/decorators/index.js +2 -2
  428. package/dist/_pkgs/std/gfx/model/surface/decorators/local.d.ts +14 -0
  429. package/dist/_pkgs/std/gfx/model/surface/decorators/local.js +22 -0
  430. package/dist/_pkgs/std/gfx/model/surface/decorators/observer.d.ts +2 -0
  431. package/dist/_pkgs/std/gfx/model/surface/decorators/observer.js +40 -1
  432. package/dist/_pkgs/std/gfx/model/surface/element-model.d.ts +282 -0
  433. package/dist/_pkgs/std/gfx/model/surface/element-model.js +436 -25
  434. package/dist/_pkgs/std/gfx/model/surface/pivot.d.ts +48 -0
  435. package/dist/_pkgs/std/gfx/model/surface/pivot.js +34 -0
  436. package/dist/_pkgs/std/gfx/model/surface/role.d.ts +153 -0
  437. package/dist/_pkgs/std/gfx/model/surface/role.js +115 -0
  438. package/dist/_pkgs/std/gfx/model/surface/surface-model.d.ts +70 -0
  439. package/dist/_pkgs/std/gfx/model/surface/surface-model.js +304 -17
  440. package/dist/_pkgs/std/gfx/model/surface/tags.d.ts +77 -0
  441. package/dist/_pkgs/std/gfx/model/surface/tags.js +246 -0
  442. package/dist/_pkgs/std/gfx/perf.d.ts +10 -0
  443. package/dist/_pkgs/std/gfx/perf.js +30 -0
  444. package/dist/_pkgs/std/gfx/tool/tool-controller.d.ts +13 -0
  445. package/dist/_pkgs/std/gfx/tool/tool-controller.js +26 -0
  446. package/dist/_pkgs/std/gfx/viewport.d.ts +12 -0
  447. package/dist/_pkgs/std/gfx/viewport.js +19 -1
  448. package/dist/_pkgs/std/inline/services/event.d.ts +2 -0
  449. package/dist/_pkgs/std/inline/services/event.js +96 -21
  450. package/dist/_pkgs/std/utils/layer.js +2 -6
  451. package/dist/_pkgs/std/utils/tree.d.ts +14 -0
  452. package/dist/_pkgs/std/utils/tree.js +59 -8
  453. package/dist/_pkgs/std/view/element/gfx-block-component.js +23 -13
  454. package/dist/_pkgs/store/extension/workspace/workspace-meta.d.ts +10 -0
  455. package/dist/_pkgs/store/model/block/flat-sync-controller.js +2 -12
  456. package/dist/_pkgs/store/model/store/crud.js +7 -4
  457. package/dist/_pkgs/store/reactive/flat-native-y/index.d.ts +1 -1
  458. package/dist/_pkgs/store/reactive/flat-native-y/index.js +24 -2
  459. package/dist/commands.d.ts +58 -0
  460. package/dist/commands.js +66 -0
  461. package/dist/extensions/command-telemetry.d.ts +21 -0
  462. package/dist/extensions/command-telemetry.js +89 -0
  463. package/dist/extensions/store.d.ts +9 -4
  464. package/dist/extensions/store.js +27 -24
  465. package/dist/extensions/view.d.ts +9 -4
  466. package/dist/extensions/view.js +23 -8
  467. package/dist/flags.d.ts +98 -21
  468. package/dist/flags.js +103 -22
  469. package/dist/frameworks.d.ts +45 -0
  470. package/dist/frameworks.js +154 -0
  471. package/dist/schemas.d.ts +8 -5
  472. package/dist/schemas.js +28 -32
  473. package/dist/shortcuts.d.ts +16 -16
  474. package/dist/shortcuts.js +8 -36
  475. package/dist/translations.d.ts +56 -0
  476. package/dist/translations.js +112 -0
  477. package/package.json +16 -4
  478. package/dist/_pkgs/affine-block-root/keyboard/shortcuts.d.ts +0 -8
  479. package/dist/_pkgs/affine-block-root/keyboard/shortcuts.js +0 -48
  480. package/dist/_pkgs/affine-gfx-shape/shortcuts.d.ts +0 -6
  481. package/dist/_pkgs/affine-gfx-shape/shortcuts.js +0 -28
  482. package/dist/_pkgs/data-view/core/utils/cache.d.ts +0 -5
  483. package/dist/_pkgs/data-view/core/utils/cache.js +0 -28
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Reading and writing the level-3 qualification carried by
3
+ * {@link GfxPrimitiveElementModel.tags} (ADR 0007 § 4).
4
+ *
5
+ * The persisted shape is a nested `Y.Map<string[]>` keyed by tag def id, so two
6
+ * people qualifying one element on two DIFFERENT tags both keep their work.
7
+ * Everything that reads it wants a plain object, and everything that writes it
8
+ * has exactly three cases to get right (create the map, mutate it in place,
9
+ * remove the key when the last tag goes). Both live here so no call site has to
10
+ * remember either.
11
+ *
12
+ * Nothing in this module knows what a tag MEANS. Definitions are runtime
13
+ * configuration owned by the host (`UniverseTagDefsProvider`) and are never
14
+ * persisted: a value whose def has vanished still loads, and is displayed as its
15
+ * raw id.
16
+ */
17
+ import * as Y from 'yjs';
18
+ /** The `@field()` key. Spelled once. */
19
+ export const ELEMENT_TAGS_FIELD = 'tags';
20
+ /**
21
+ * Value ids, cleaned: strings only, no blanks, no duplicates, order preserved.
22
+ *
23
+ * Persisted values are plain `string`s and are never narrowed, because a
24
+ * document may legitimately carry an id whose def was removed, renamed or never
25
+ * seeded in this deployment — and it must still open. What this rejects is not
26
+ * an unknown id but a non-value: `null`, a number, an object, the empty string.
27
+ */
28
+ function cleanValues(values) {
29
+ if (!Array.isArray(values))
30
+ return [];
31
+ const seen = new Set();
32
+ const cleaned = [];
33
+ for (const value of values) {
34
+ if (typeof value !== 'string' || value.length === 0)
35
+ continue;
36
+ if (seen.has(value))
37
+ continue;
38
+ seen.add(value);
39
+ cleaned.push(value);
40
+ }
41
+ return cleaned;
42
+ }
43
+ const sameValues = (a, b) => a.length === b.length && a.every((value, i) => value === b[i]);
44
+ /**
45
+ * The **degraded shape**: `tags` stored as a plain object rather than a
46
+ * `Y.Map`.
47
+ *
48
+ * This is not a hypothetical. A client that predates this field does not
49
+ * DECLARE it, so on the five element-creation-from-props paths (paste,
50
+ * duplicate, alt-drag clone, turn-into-linked-doc, `updateElement` with an
51
+ * undeclared key) `_assignElementProp` routes it down the unknown-key branch —
52
+ * and that branch's encodability guard accepts the serialized form of the
53
+ * nested map perfectly, because it IS flat JSON: an object of arrays of
54
+ * strings. So the value is written verbatim, as a plain object.
55
+ *
56
+ * The unknown-key branch is doing exactly its job — preserving a key it does
57
+ * not understand. It is THIS side that has to meet it halfway, and in this
58
+ * release rather than a later one: the whole point of shipping the declaration
59
+ * before anything writes the field is that the fleet floor tolerates the key,
60
+ * and tolerance that cannot read the only other shape in existence is not
61
+ * tolerance.
62
+ *
63
+ * Reading normalizes it (below); the first write CONVERTS it
64
+ * ({@link setElementTag}), so the degraded shape is transitional per element
65
+ * and never persists past a qualification gesture.
66
+ */
67
+ function isDegradedTags(value) {
68
+ return (typeof value === 'object' &&
69
+ value !== null &&
70
+ !(value instanceof Y.AbstractType) &&
71
+ !Array.isArray(value) &&
72
+ !(value instanceof Uint8Array));
73
+ }
74
+ /**
75
+ * The element's tags as `[tagId, rawValues]` pairs, whichever shape they are
76
+ * stored in. One place normalizes the two vintages so no reader has to know
77
+ * that there are two.
78
+ */
79
+ function tagEntries(element) {
80
+ const stored = element.tags;
81
+ if (stored instanceof Y.Map)
82
+ return [...stored.entries()];
83
+ if (isDegradedTags(stored))
84
+ return Object.entries(stored);
85
+ return [];
86
+ }
87
+ /**
88
+ * Every tag on the element, as plain JSON. `{}` when unqualified — absent and
89
+ * empty are the same fact, and no caller should have to distinguish them.
90
+ *
91
+ * Defensive by construction: the map is a document value, so a client of any
92
+ * vintage may have written something else into it. Both shapes a real client
93
+ * can produce are read ({@link isDegradedTags}); a malformed entry is skipped,
94
+ * never thrown on. A board that cannot be read is worse than a tag that is not.
95
+ */
96
+ export function readElementTags(element) {
97
+ const tags = {};
98
+ for (const [tagId, values] of tagEntries(element)) {
99
+ if (typeof tagId !== 'string' || tagId.length === 0)
100
+ continue;
101
+ const cleaned = cleanValues(values);
102
+ if (cleaned.length)
103
+ tags[tagId] = cleaned;
104
+ }
105
+ return tags;
106
+ }
107
+ /** The value ids selected for one tag, `[]` when it carries none. */
108
+ export function elementTagValues(element, tagId) {
109
+ const stored = element.tags;
110
+ if (stored instanceof Y.Map)
111
+ return cleanValues(stored.get(tagId));
112
+ if (isDegradedTags(stored))
113
+ return cleanValues(stored[tagId]);
114
+ return [];
115
+ }
116
+ /** Whether the element carries `valueId` under `tagId`. */
117
+ export function hasElementTagValue(element, tagId, valueId) {
118
+ return elementTagValues(element, tagId).includes(valueId);
119
+ }
120
+ /**
121
+ * Set (or, with an empty `values`, remove) ONE tag on ONE element. Returns
122
+ * whether anything was written — a gesture that changes nothing must not cost an
123
+ * undo step and must not be reported.
124
+ *
125
+ * The caller owns `store.captureSync()`, and owes it BEFORE this call: the undo
126
+ * manager is built with no `captureTimeout`, so a qualification issued within
127
+ * 500 ms of a drag would otherwise be undone together with the drag — making a
128
+ * promotion look like it moved geometry, which is exactly what the ladder's
129
+ * invariants forbid.
130
+ *
131
+ * ## The cases, and why the first one is the point
132
+ *
133
+ * - **A `Y.Map` already** — the entry is set IN PLACE. Replacing the whole map
134
+ * instead would restore whole-blob last-write-wins and silently drop a
135
+ * concurrent edit on a different tag, which is the single reason the field is
136
+ * a nested map at all. Removing the last entry removes the key with
137
+ * `clearField` rather than leaving an empty map behind: an element qualified
138
+ * and then un-qualified goes back to costing nothing, like one that never was.
139
+ * - **Nothing yet** — a map is created and assigned through `updateElement`,
140
+ * which is what attaches it to the document and starts the nested observer.
141
+ * - **The degraded shape** ({@link isDegradedTags}) — the map is created from
142
+ * what is ALREADY there, plus the change. This is the one case where
143
+ * replacing wholesale is right, because a plain object was never mergeable in
144
+ * the first place; what would be wrong, and was, is replacing it with a map
145
+ * holding only the new tag. A colleague's qualification, written by a client
146
+ * that predates this field, would leave without a word.
147
+ *
148
+ * ## Read-only
149
+ *
150
+ * A read-only store is a no-op with a warning, not a throw and not a write.
151
+ * This is exported from `@labre/std/gfx`, so a host can call it directly, and
152
+ * the three write paths below reach the document three different ways: an
153
+ * in-place `store.transact` and `clearField` carry no read-only guard of their
154
+ * own (they would silently succeed), while `updateElement` throws. Three
155
+ * behaviours for one refusal is not a contract; one guard here is.
156
+ */
157
+ export function setElementTag(element, tagId, values) {
158
+ if (typeof tagId !== 'string' || tagId.length === 0)
159
+ return false;
160
+ if (element.surface.store.readonly) {
161
+ console.warn(`Refusing to qualify element "${element.id}" with "${tagId}": the document is read-only.`);
162
+ return false;
163
+ }
164
+ const next = cleanValues(values);
165
+ const stored = element.tags;
166
+ if (sameValues(elementTagValues(element, tagId), next))
167
+ return false;
168
+ // The native shape: merge per tag, which is the whole design.
169
+ if (stored instanceof Y.Map) {
170
+ if (next.length === 0) {
171
+ element.surface.store.transact(() => {
172
+ stored.delete(tagId);
173
+ });
174
+ if (stored.size === 0)
175
+ element.clearField(ELEMENT_TAGS_FIELD);
176
+ }
177
+ else {
178
+ element.surface.store.transact(() => {
179
+ stored.set(tagId, next);
180
+ });
181
+ }
182
+ return true;
183
+ }
184
+ // Absent, or the degraded shape. `readElementTags` normalizes both, so the
185
+ // conversion preserves whatever a pre-declaration client left behind.
186
+ const merged = readElementTags(element);
187
+ if (next.length === 0)
188
+ delete merged[tagId];
189
+ else
190
+ merged[tagId] = next;
191
+ const entries = Object.entries(merged);
192
+ if (entries.length === 0) {
193
+ // A degraded value emptied by this call: remove the key rather than write
194
+ // an empty map. (Absent-and-empty returned above, at `sameValues`.)
195
+ element.clearField(ELEMENT_TAGS_FIELD);
196
+ return true;
197
+ }
198
+ const created = new Y.Map();
199
+ for (const [id, cleaned] of entries)
200
+ created.set(id, cleaned);
201
+ element.surface.updateElement(element.id, { tags: created });
202
+ return true;
203
+ }
204
+ /**
205
+ * Rebuild `tags` as a `Y.Map` when it arrives as plain JSON.
206
+ *
207
+ * Called by `SurfaceBlockModel._propsToY` for EVERY element type, because the
208
+ * field is declared on the base class and per-class `propsToY` hooks are not.
209
+ * Without it, paste / duplicate / alt-drag clone would each store the copy's
210
+ * qualification as one opaque plain object — indistinguishable from a correct
211
+ * copy until two people edited it and one of them lost their tag.
212
+ *
213
+ * `element.serialize()` is `yMap.toJSON()`, so the nested map reaches every one
214
+ * of those paths as a plain object with no wrapper; the snapshot path arrives
215
+ * already converted by the `SURFACE_YMAP_UNIQ_IDENTIFIER` branch above the call
216
+ * and is passed through untouched. An empty (or unusable) value drops the key
217
+ * entirely rather than writing a tombstone.
218
+ */
219
+ export function tagsPropToY(props) {
220
+ if (!(ELEMENT_TAGS_FIELD in props))
221
+ return;
222
+ const value = props[ELEMENT_TAGS_FIELD];
223
+ if (value instanceof Y.AbstractType)
224
+ return;
225
+ if (value === null || typeof value !== 'object') {
226
+ delete props[ELEMENT_TAGS_FIELD];
227
+ return;
228
+ }
229
+ const entries = Object.entries(value)
230
+ .filter(([tagId]) => tagId.length > 0)
231
+ .map(([tagId, values]) => [tagId, cleanValues(values)])
232
+ .filter(([, cleaned]) => cleaned.length > 0);
233
+ if (entries.length === 0) {
234
+ delete props[ELEMENT_TAGS_FIELD];
235
+ return;
236
+ }
237
+ const map = new Y.Map();
238
+ for (const [tagId, cleaned] of entries)
239
+ map.set(tagId, cleaned);
240
+ // The entry count is taken from the array above and NOT from `map.size`: a
241
+ // `Y.Map` that has not been integrated into a document yet holds its content
242
+ // in `_prelimContent`, so `size` reads 0 and logs "Add Yjs type to a document
243
+ // before reading data". Silently dropping every pasted qualification is
244
+ // exactly the failure this whole conversion exists to prevent.
245
+ props[ELEMENT_TAGS_FIELD] = map;
246
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Measure the cost of an operation through the Performance API when the host
3
+ * provides one, and just run it when it does not.
4
+ *
5
+ * This is a devtools aid, not telemetry: nothing is sent anywhere, and the
6
+ * editor's telemetry bus stays the single reporting seam. The marks are
7
+ * cleared, while the measure entries are kept on purpose so the operation
8
+ * shows up in a browser performance profile.
9
+ */
10
+ export declare const measureOperation: <T>(name: string, fn: () => T) => T;
@@ -0,0 +1,30 @@
1
+ let opMeasureSeq = 0;
2
+ /**
3
+ * Measure the cost of an operation through the Performance API when the host
4
+ * provides one, and just run it when it does not.
5
+ *
6
+ * This is a devtools aid, not telemetry: nothing is sent anywhere, and the
7
+ * editor's telemetry bus stays the single reporting seam. The marks are
8
+ * cleared, while the measure entries are kept on purpose so the operation
9
+ * shows up in a browser performance profile.
10
+ */
11
+ export const measureOperation = (name, fn) => {
12
+ if (typeof performance === 'undefined' ||
13
+ typeof performance.mark !== 'function' ||
14
+ typeof performance.measure !== 'function') {
15
+ return fn();
16
+ }
17
+ const operationId = opMeasureSeq++;
18
+ const startMark = `${name}:${operationId}:start`;
19
+ const endMark = `${name}:${operationId}:end`;
20
+ performance.mark(startMark);
21
+ try {
22
+ return fn();
23
+ }
24
+ finally {
25
+ performance.mark(endMark);
26
+ performance.measure(name, startMark, endMark);
27
+ performance.clearMarks(startMark);
28
+ performance.clearMarks(endMark);
29
+ }
30
+ };
@@ -36,6 +36,19 @@ export interface ToolEventTarget {
36
36
  */
37
37
  addHook<K extends SupportedHooks | SupportedEvents>(evtName: K, handler: (evtState: K extends SupportedHooks ? BuiltInEventMap[K] : PointerEventState) => void | boolean): void;
38
38
  }
39
+ /**
40
+ * The only tools a readonly document will activate: selection, panning, the
41
+ * presentation navigator and the no-op placeholder. Everything else — brush,
42
+ * highlighter, connector, shape, polygon, text, note, frame, template, eraser —
43
+ * creates or erases on its first gesture, calling `surface.addElement` /
44
+ * `store.addBlock` directly, which used to raise uncaught `BlockSuiteError`s on
45
+ * ordinary keystrokes.
46
+ *
47
+ * A whitelist rather than a blacklist, and enforced at {@link
48
+ * ToolController.setTool}: a new tool is a writer until someone proves
49
+ * otherwise, and no new entry point can bypass the check by construction.
50
+ */
51
+ export declare const READONLY_SAFE_TOOLS: Set<string>;
39
52
  export declare class ToolController extends GfxExtension {
40
53
  static key: string;
41
54
  private readonly _builtInHookSlot;
@@ -25,6 +25,24 @@ export var MouseButton;
25
25
  MouseButton[MouseButton["MIDDLE"] = 1] = "MIDDLE";
26
26
  MouseButton[MouseButton["SECONDARY"] = 2] = "SECONDARY";
27
27
  })(MouseButton || (MouseButton = {}));
28
+ /**
29
+ * The only tools a readonly document will activate: selection, panning, the
30
+ * presentation navigator and the no-op placeholder. Everything else — brush,
31
+ * highlighter, connector, shape, polygon, text, note, frame, template, eraser —
32
+ * creates or erases on its first gesture, calling `surface.addElement` /
33
+ * `store.addBlock` directly, which used to raise uncaught `BlockSuiteError`s on
34
+ * ordinary keystrokes.
35
+ *
36
+ * A whitelist rather than a blacklist, and enforced at {@link
37
+ * ToolController.setTool}: a new tool is a writer until someone proves
38
+ * otherwise, and no new entry point can bypass the check by construction.
39
+ */
40
+ export const READONLY_SAFE_TOOLS = new Set([
41
+ 'default',
42
+ 'pan',
43
+ 'frameNavigator',
44
+ 'empty',
45
+ ]);
28
46
  export class ToolController extends GfxExtension {
29
47
  constructor() {
30
48
  super(...arguments);
@@ -110,6 +128,14 @@ export class ToolController extends GfxExtension {
110
128
  };
111
129
  this.setTool = (toolType, options) => {
112
130
  const toolNameStr = toolType.toolName;
131
+ // THE bottleneck for tool activation: keyboard managers, the toolbar and
132
+ // its mixins, senior buttons and framework modules all land here. A guard
133
+ // placed higher up is an inventory that goes stale — `s` (shape) is bound
134
+ // by `shape-draggable.ts` through the toolbar mixin and never sees the
135
+ // keyboard manager at all.
136
+ if (this.std.store.readonly && !READONLY_SAFE_TOOLS.has(toolNameStr)) {
137
+ return;
138
+ }
113
139
  const beforeUpdateCtx = this._createBuiltInHookCtx('beforeToolUpdate', {
114
140
  toolName: toolNameStr,
115
141
  });
@@ -67,6 +67,18 @@ export declare class Viewport {
67
67
  * Note this is different from the zoom property.
68
68
  * The editor itself may be scaled by outer container which is common in nested editor scenarios.
69
69
  * This property is used to calculate the scale of the editor.
70
+ *
71
+ * The scale is read as "what the host paints" over "what the host lays out":
72
+ * `getBoundingClientRect().width` is the painted width, transforms included
73
+ * and fractional; `offsetWidth` is the laid out width with no transform, but
74
+ * the browser gives it as an integer — it rounds both border-box edges, so it
75
+ * can sit up to a pixel away from the fractional width even when nothing is
76
+ * scaled at all. A host that is merely a fraction of a pixel wide (a HiDPI
77
+ * window, a flex remainder) would otherwise report a phantom scale of
78
+ * ~1.0001, and every pointer delta divided by it comes back short: a 100px
79
+ * drag moves the element 99.986. Below the rounding error there is no scale
80
+ * to read, so answer exactly 1; a container that really scales the editor is
81
+ * orders of magnitude past that pixel.
70
82
  */
71
83
  get viewScale(): number;
72
84
  get top(): number;
@@ -132,13 +132,31 @@ export class Viewport {
132
132
  * Note this is different from the zoom property.
133
133
  * The editor itself may be scaled by outer container which is common in nested editor scenarios.
134
134
  * This property is used to calculate the scale of the editor.
135
+ *
136
+ * The scale is read as "what the host paints" over "what the host lays out":
137
+ * `getBoundingClientRect().width` is the painted width, transforms included
138
+ * and fractional; `offsetWidth` is the laid out width with no transform, but
139
+ * the browser gives it as an integer — it rounds both border-box edges, so it
140
+ * can sit up to a pixel away from the fractional width even when nothing is
141
+ * scaled at all. A host that is merely a fraction of a pixel wide (a HiDPI
142
+ * window, a flex remainder) would otherwise report a phantom scale of
143
+ * ~1.0001, and every pointer delta divided by it comes back short: a 100px
144
+ * drag moves the element 99.986. Below the rounding error there is no scale
145
+ * to read, so answer exactly 1; a container that really scales the editor is
146
+ * orders of magnitude past that pixel.
135
147
  */
136
148
  get viewScale() {
137
149
  if (!this._shell ||
138
150
  this._cachedOffsetWidth === null ||
139
151
  this._cachedOffsetWidth === 0)
140
152
  return 1;
141
- return this.boundingClientRect.width / this._cachedOffsetWidth;
153
+ const width = this.boundingClientRect.width;
154
+ // offsetWidth is rounded to an integer while the client rect is not:
155
+ // on fractional devicePixelRatio displays an untransformed shell has a
156
+ // fractional CSS width, which must not be mistaken for an outer scale.
157
+ if (Math.abs(width - this._cachedOffsetWidth) <= 0.5)
158
+ return 1;
159
+ return width / this._cachedOffsetWidth;
142
160
  }
143
161
  get top() {
144
162
  return this._top;
@@ -4,6 +4,8 @@ export declare class EventService<TextAttributes extends BaseTextAttributes> {
4
4
  readonly editor: InlineEditor<TextAttributes>;
5
5
  private _compositionInlineRange;
6
6
  private _isComposing;
7
+ private readonly _getClosestInlineRoot;
8
+ private readonly _containsNode;
7
9
  private readonly _isRangeCompletelyInRoot;
8
10
  private readonly _onBeforeInput;
9
11
  private readonly _onClick;
@@ -1,3 +1,4 @@
1
+ import { INLINE_ROOT_ATTR } from '../consts.js';
1
2
  import { isInEmbedElement, isInEmbedGap, isInEmptyLine, } from '../utils/index.js';
2
3
  import { isMaybeInlineRangeEqual } from '../utils/inline-range.js';
3
4
  import { transformInput } from '../utils/transform-input.js';
@@ -9,34 +10,105 @@ export class EventService {
9
10
  this.editor = editor;
10
11
  this._compositionInlineRange = null;
11
12
  this._isComposing = false;
13
+ this._getClosestInlineRoot = (node) => {
14
+ const el = node instanceof Element ? node : node.parentElement;
15
+ return el?.closest(`[${INLINE_ROOT_ATTR}]`) ?? null;
16
+ };
17
+ this._containsNode = (rootElement, node) => node === rootElement || rootElement.contains(node);
12
18
  this._isRangeCompletelyInRoot = (range) => {
13
19
  if (range.commonAncestorContainer.ownerDocument !== document)
14
20
  return false;
15
21
  const rootElement = this.editor.rootElement;
16
22
  if (!rootElement)
17
23
  return false;
18
- const rootRange = document.createRange();
19
- rootRange.selectNode(rootElement);
20
- if (range.startContainer.compareDocumentPosition(range.endContainer) &
21
- Node.DOCUMENT_POSITION_FOLLOWING) {
22
- return (rootRange.comparePoint(range.startContainer, range.startOffset) >= 0 &&
23
- rootRange.comparePoint(range.endContainer, range.endOffset) <= 0);
24
- }
25
- else {
26
- return (rootRange.comparePoint(range.endContainer, range.startOffset) >= 0 &&
27
- rootRange.comparePoint(range.startContainer, range.endOffset) <= 0);
28
- }
24
+ // Avoid `Range.comparePoint` here — Firefox and Chrome have subtle
25
+ // differences around selection points in `contenteditable` and around
26
+ // comment marker nodes.
27
+ return (this._containsNode(rootElement, range.startContainer) &&
28
+ this._containsNode(rootElement, range.endContainer));
29
29
  };
30
- this._onBeforeInput = (event) => {
30
+ this._onBeforeInput = async (event) => {
31
31
  const range = this.editor.rangeService.getNativeRange();
32
- if (this.editor.isReadonly ||
33
- this._isComposing ||
34
- !range ||
35
- !this._isRangeCompletelyInRoot(range))
32
+ if (this.editor.isReadonly || !range)
36
33
  return;
37
- let inlineRange = this.editor.toInlineRange(range);
38
- if (!inlineRange)
34
+ const rootElement = this.editor.rootElement;
35
+ if (!rootElement)
36
+ return;
37
+ const startInRoot = this._containsNode(rootElement, range.startContainer);
38
+ const endInRoot = this._containsNode(rootElement, range.endContainer);
39
+ // Not this inline editor.
40
+ if (!startInRoot && !endInRoot)
39
41
  return;
42
+ // If the selection spans into another inline editor, let the range binding
43
+ // handle it.
44
+ if (startInRoot !== endInRoot) {
45
+ const otherNode = startInRoot ? range.endContainer : range.startContainer;
46
+ const otherRoot = this._getClosestInlineRoot(otherNode);
47
+ if (otherRoot && otherRoot !== rootElement)
48
+ return;
49
+ }
50
+ if (this._isComposing)
51
+ return;
52
+ // Always prevent native DOM mutations inside the inline editor. Browsers
53
+ // (notably Firefox) may remove Lit marker comment nodes during native
54
+ // edits, which crashes subsequent Lit updates with
55
+ // `ChildPart has no parentNode`.
56
+ event.preventDefault();
57
+ let inlineRange = this.editor.toInlineRange(range);
58
+ if (!inlineRange) {
59
+ // Some browsers may report selection points on non-text nodes inside
60
+ // `contenteditable`. Prefer the target range if available.
61
+ try {
62
+ const targetRanges = event.getTargetRanges();
63
+ if (targetRanges.length > 0) {
64
+ const staticRange = targetRanges[0];
65
+ const targetRange = document.createRange();
66
+ targetRange.setStart(staticRange.startContainer, staticRange.startOffset);
67
+ targetRange.setEnd(staticRange.endContainer, staticRange.endOffset);
68
+ inlineRange = this.editor.toInlineRange(targetRange);
69
+ }
70
+ }
71
+ catch {
72
+ // ignore
73
+ }
74
+ }
75
+ if (!inlineRange && startInRoot !== endInRoot) {
76
+ // Clamp a partially-outside selection to this editor so native editing
77
+ // won't touch Lit marker nodes.
78
+ const pointRange = document.createRange();
79
+ if (startInRoot) {
80
+ pointRange.setStart(range.startContainer, range.startOffset);
81
+ pointRange.setEnd(range.startContainer, range.startOffset);
82
+ const startPoint = this.editor.toInlineRange(pointRange);
83
+ if (startPoint) {
84
+ inlineRange = {
85
+ index: startPoint.index,
86
+ length: this.editor.yTextLength - startPoint.index,
87
+ };
88
+ }
89
+ }
90
+ else {
91
+ pointRange.setStart(range.endContainer, range.endOffset);
92
+ pointRange.setEnd(range.endContainer, range.endOffset);
93
+ const endPoint = this.editor.toInlineRange(pointRange);
94
+ if (endPoint) {
95
+ inlineRange = {
96
+ index: 0,
97
+ length: endPoint.index,
98
+ };
99
+ }
100
+ }
101
+ }
102
+ if (!inlineRange) {
103
+ // Try to recover from an unexpected DOM/selection state by rebuilding the
104
+ // editor DOM and retrying the range conversion.
105
+ this.editor.rerenderWholeEditor();
106
+ await this.editor.waitForUpdate();
107
+ const newRange = this.editor.rangeService.getNativeRange();
108
+ inlineRange = newRange ? this.editor.toInlineRange(newRange) : null;
109
+ if (!inlineRange)
110
+ return;
111
+ }
40
112
  let ifHandleTargetRange = true;
41
113
  if (event.inputType.startsWith('delete')) {
42
114
  if (isInEmbedGap(range.commonAncestorContainer) &&
@@ -70,14 +142,15 @@ export class EventService {
70
142
  range.setStart(staticRange.startContainer, staticRange.startOffset);
71
143
  range.setEnd(staticRange.endContainer, staticRange.endOffset);
72
144
  const targetInlineRange = this.editor.toInlineRange(range);
73
- if (!isMaybeInlineRangeEqual(inlineRange, targetInlineRange)) {
145
+ // Ignore an un-resolvable target range to avoid swallowing the input.
146
+ if (targetInlineRange &&
147
+ !isMaybeInlineRangeEqual(inlineRange, targetInlineRange)) {
74
148
  inlineRange = targetInlineRange;
75
149
  }
76
150
  }
77
151
  }
78
152
  if (!inlineRange)
79
153
  return;
80
- event.preventDefault();
81
154
  const ctx = {
82
155
  inlineEditor: this.editor,
83
156
  raw: event,
@@ -276,7 +349,9 @@ export class EventService {
276
349
  console.error('Mount inline editor without event source ready');
277
350
  return;
278
351
  }
279
- this.editor.disposables.addFromEvent(eventSource, 'beforeinput', this._onBeforeInput);
352
+ this.editor.disposables.addFromEvent(eventSource, 'beforeinput', e => {
353
+ this._onBeforeInput(e).catch(console.error);
354
+ });
280
355
  this.editor.disposables.addFromEvent(eventSource, 'compositionstart', this._onCompositionStart);
281
356
  this.editor.disposables.addFromEvent(eventSource, 'compositionupdate', this._onCompositionUpdate);
282
357
  this.editor.disposables.addFromEvent(eventSource, 'compositionend', e => {
@@ -3,11 +3,7 @@ import {} from '../gfx/model/gfx-block-model.js';
3
3
  import { GfxLocalElementModel } from '../gfx/model/surface/local-element-model.js';
4
4
  export function getLayerEndZIndex(layers, layerIndex) {
5
5
  const layer = layers[layerIndex];
6
- return layer
7
- ? layer.type === 'block'
8
- ? layer.zIndex + layer.elements.length - 1
9
- : layer.zIndex
10
- : 0;
6
+ return layer ? layer.zIndex + layer.elements.length - 1 : 0;
11
7
  }
12
8
  export function updateLayersZIndex(layers, startIdx) {
13
9
  const startLayer = layers[startIdx];
@@ -15,7 +11,7 @@ export function updateLayersZIndex(layers, startIdx) {
15
11
  for (let i = startIdx; i < layers.length; ++i) {
16
12
  const curLayer = layers[i];
17
13
  curLayer.zIndex = curIndex;
18
- curIndex += curLayer.type === 'block' ? curLayer.elements.length : 1;
14
+ curIndex += curLayer.elements.length;
19
15
  }
20
16
  }
21
17
  export function getElementIndex(indexable) {
@@ -20,6 +20,20 @@ import type { GfxGroupModel, GfxModel } from '../gfx/model/model.js';
20
20
  * The result should be `[G1, G4, E6]`
21
21
  */
22
22
  export declare function getTopElements(elements: GfxModel[]): GfxModel[];
23
+ /**
24
+ * Add several children to a container in one go.
25
+ *
26
+ * A container that knows how to take a batch (`addChildren`) gets the whole
27
+ * list, so it can write them within a single transaction; anything else falls
28
+ * back to one `addChild` per element, which is exactly what the caller would
29
+ * have written by hand.
30
+ */
31
+ export declare function batchAddChildren(container: GfxGroupCompatibleInterface, elements: GfxModel[]): void;
32
+ /**
33
+ * Remove several children from a container in one go. See
34
+ * {@link batchAddChildren}.
35
+ */
36
+ export declare function batchRemoveChildren(container: GfxGroupCompatibleInterface, elements: GfxModel[]): void;
23
37
  export declare function descendantElementsImpl(container: GfxGroupCompatibleInterface): GfxModel[];
24
38
  export declare function hasDescendantElementImpl(container: GfxGroupCompatibleInterface, element: GfxCompatibleInterface): boolean;
25
39
  /**