@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
@@ -2,11 +2,14 @@ import { ColorScheme } from '../../affine-model/index.js';
2
2
  import { FeatureFlagService } from '../../affine-shared/services/index.js';
3
3
  import { requestConnectedFrame } from '../../affine-shared/utils/index.js';
4
4
  import { DisposableGroup } from '../../global/disposable/index.js';
5
- import { getBoundWithRotation, intersects } from '../../global/gfx/index.js';
5
+ import { Bound, getBoundWithRotation, intersects, } from '../../global/gfx/index.js';
6
+ import { GfxControllerIdentifier } from '../../std/gfx/index.js';
7
+ import { effect } from '@preact/signals-core';
6
8
  import last from 'lodash-es/last.js';
7
9
  import { Subject } from 'rxjs';
8
10
  import { ElementRendererIdentifier } from '../extensions/element-renderer.js';
9
11
  import { RoughCanvas } from '../utils/rough/canvas.js';
12
+ const STACKING_CANVAS_PADDING = 32;
10
13
  export class CanvasRenderer {
11
14
  get stackingCanvas() {
12
15
  return this._stackingCanvas;
@@ -16,8 +19,40 @@ export class CanvasRenderer {
16
19
  this._overlays = new Set();
17
20
  this._refreshRafId = null;
18
21
  this._stackingCanvas = [];
22
+ this._stackingCanvasPool = [];
23
+ this._stackingCanvasState = new WeakMap();
24
+ this._dirtyStackingCanvasIndexes = new Set();
25
+ this._mainCanvasDirty = true;
26
+ this._needsFullRender = true;
27
+ this._debugMetrics = {
28
+ refreshCount: 0,
29
+ coalescedRefreshCount: 0,
30
+ renderCount: 0,
31
+ totalRenderDurationMs: 0,
32
+ lastRenderDurationMs: 0,
33
+ maxRenderDurationMs: 0,
34
+ lastRenderMetrics: {
35
+ renderByBoundCallCount: 0,
36
+ visibleElementCount: 0,
37
+ renderedElementCount: 0,
38
+ placeholderElementCount: 0,
39
+ overlayCount: 0,
40
+ },
41
+ dirtyLayerRenderCount: 0,
42
+ fallbackElementCount: 0,
43
+ };
19
44
  this.stackingCanvasUpdated = new Subject();
20
45
  this.usePlaceholder = false;
46
+ this._lastDebugSnapshot = {
47
+ canvasMemoryBytes: 0,
48
+ canvasMemorySnapshots: [],
49
+ canvasPixelCount: 0,
50
+ canvasLayerCount: 0,
51
+ pooledStackingCanvasCount: 0,
52
+ stackingCanvasCount: 0,
53
+ totalLayerCount: 0,
54
+ visibleStackingCanvasCount: 0,
55
+ };
21
56
  const canvas = document.createElement('canvas');
22
57
  this.canvas = canvas;
23
58
  this.ctx = this.canvas.getContext('2d');
@@ -26,6 +61,7 @@ export class CanvasRenderer {
26
61
  this.layerManager = options.layerManager;
27
62
  this.grid = options.gridManager;
28
63
  this.provider = options.provider ?? {};
64
+ this._gfx = this.std.get(GfxControllerIdentifier);
29
65
  this._turboEnabled = () => {
30
66
  const featureFlagService = options.std.get(FeatureFlagService);
31
67
  return featureFlagService.getFlag('enable_turbo_renderer');
@@ -45,7 +81,7 @@ export class CanvasRenderer {
45
81
  * It is not recommended to set width and height to 100%.
46
82
  */
47
83
  _canvasSizeUpdater(dpr = window.devicePixelRatio) {
48
- const { width, height } = this.viewport;
84
+ const { width, height, viewScale } = this.viewport;
49
85
  const actualWidth = Math.ceil(width * dpr);
50
86
  const actualHeight = Math.ceil(height * dpr);
51
87
  return {
@@ -55,18 +91,155 @@ export class CanvasRenderer {
55
91
  update(canvas) {
56
92
  canvas.style.width = `${width}px`;
57
93
  canvas.style.height = `${height}px`;
94
+ // The viewport size is read from `getBoundingClientRect()`, so it
95
+ // already carries the scale an outer container applies to the whole
96
+ // editor. Undo that scale here, otherwise the container would scale
97
+ // the canvas a second time and it would no longer fit its block.
98
+ canvas.style.transform = `scale(${1 / viewScale})`;
99
+ canvas.style.transformOrigin = `top left`;
58
100
  canvas.width = actualWidth;
59
101
  canvas.height = actualHeight;
60
102
  },
61
103
  };
62
104
  }
105
+ _applyStackingCanvasLayout(canvas, bound, dpr = window.devicePixelRatio) {
106
+ const state = this._stackingCanvasState.get(canvas) ??
107
+ {
108
+ bound: null,
109
+ layerId: canvas.dataset.layerId ?? null,
110
+ };
111
+ if (!bound || bound.w <= 0 || bound.h <= 0) {
112
+ canvas.style.display = 'none';
113
+ canvas.style.left = '0px';
114
+ canvas.style.top = '0px';
115
+ canvas.style.width = '0px';
116
+ canvas.style.height = '0px';
117
+ canvas.style.transform = '';
118
+ canvas.width = 0;
119
+ canvas.height = 0;
120
+ state.bound = null;
121
+ state.layerId = canvas.dataset.layerId ?? null;
122
+ this._stackingCanvasState.set(canvas, state);
123
+ return;
124
+ }
125
+ const { viewportBounds, zoom, viewScale } = this.viewport;
126
+ const width = bound.w * zoom;
127
+ const height = bound.h * zoom;
128
+ const left = (bound.x - viewportBounds.x) * zoom;
129
+ const top = (bound.y - viewportBounds.y) * zoom;
130
+ const actualWidth = Math.max(1, Math.ceil(width * dpr));
131
+ const actualHeight = Math.max(1, Math.ceil(height * dpr));
132
+ const transform = `translate(${left}px, ${top}px) scale(${1 / viewScale})`;
133
+ if (canvas.style.display !== 'block') {
134
+ canvas.style.display = 'block';
135
+ }
136
+ if (canvas.style.left !== '0px') {
137
+ canvas.style.left = '0px';
138
+ }
139
+ if (canvas.style.top !== '0px') {
140
+ canvas.style.top = '0px';
141
+ }
142
+ if (canvas.style.width !== `${width}px`) {
143
+ canvas.style.width = `${width}px`;
144
+ }
145
+ if (canvas.style.height !== `${height}px`) {
146
+ canvas.style.height = `${height}px`;
147
+ }
148
+ if (canvas.style.transform !== transform) {
149
+ canvas.style.transform = transform;
150
+ }
151
+ if (canvas.style.transformOrigin !== 'top left') {
152
+ canvas.style.transformOrigin = 'top left';
153
+ }
154
+ if (canvas.width !== actualWidth) {
155
+ canvas.width = actualWidth;
156
+ }
157
+ if (canvas.height !== actualHeight) {
158
+ canvas.height = actualHeight;
159
+ }
160
+ state.bound = bound;
161
+ state.layerId = canvas.dataset.layerId ?? null;
162
+ this._stackingCanvasState.set(canvas, state);
163
+ }
164
+ _clampBoundToViewport(bound, viewportBounds) {
165
+ const minX = Math.max(bound.x, viewportBounds.x);
166
+ const minY = Math.max(bound.y, viewportBounds.y);
167
+ const maxX = Math.min(bound.maxX, viewportBounds.maxX);
168
+ const maxY = Math.min(bound.maxY, viewportBounds.maxY);
169
+ if (maxX <= minX || maxY <= minY) {
170
+ return null;
171
+ }
172
+ return new Bound(minX, minY, maxX - minX, maxY - minY);
173
+ }
174
+ _createCanvasForLayer(onCreated) {
175
+ const reused = this._stackingCanvasPool.pop();
176
+ if (reused) {
177
+ return reused;
178
+ }
179
+ const created = document.createElement('canvas');
180
+ onCreated?.(created);
181
+ return created;
182
+ }
183
+ _findLayerIndexByElement(element) {
184
+ const canvasLayers = this.layerManager.getCanvasLayers();
185
+ const index = canvasLayers.findIndex(layer => layer.elements.some(layerElement => layerElement.id === element.id));
186
+ return index === -1 ? null : index;
187
+ }
188
+ _getLayerRenderBound(elements, viewportBounds) {
189
+ let layerBound = null;
190
+ for (const element of elements) {
191
+ const display = (element.display ?? true) && !element.hidden;
192
+ if (!display) {
193
+ continue;
194
+ }
195
+ const elementBound = Bound.from(getBoundWithRotation(element));
196
+ if (!intersects(elementBound, viewportBounds)) {
197
+ continue;
198
+ }
199
+ layerBound = layerBound ? layerBound.unite(elementBound) : elementBound;
200
+ }
201
+ if (!layerBound) {
202
+ return null;
203
+ }
204
+ return this._clampBoundToViewport(layerBound.expand(STACKING_CANVAS_PADDING), viewportBounds);
205
+ }
206
+ _getResolvedStackingCanvasBound(canvas, bound) {
207
+ if (!bound || !this._gfx.tool.dragging$.peek()) {
208
+ return bound;
209
+ }
210
+ const previousBound = this._stackingCanvasState.get(canvas)?.bound;
211
+ return previousBound ? previousBound.unite(bound) : bound;
212
+ }
213
+ _invalidate(target = { type: 'all' }) {
214
+ if (target.type === 'all') {
215
+ this._needsFullRender = true;
216
+ this._mainCanvasDirty = true;
217
+ this._dirtyStackingCanvasIndexes.clear();
218
+ return;
219
+ }
220
+ if (this._needsFullRender) {
221
+ return;
222
+ }
223
+ if (target.type === 'main') {
224
+ this._mainCanvasDirty = true;
225
+ return;
226
+ }
227
+ const elements = target.type === 'element' ? [target.element] : target.elements;
228
+ for (const element of elements) {
229
+ const layerIndex = this._findLayerIndexByElement(element);
230
+ if (layerIndex === null || layerIndex >= this._stackingCanvas.length) {
231
+ this._mainCanvasDirty = true;
232
+ continue;
233
+ }
234
+ this._dirtyStackingCanvasIndexes.add(layerIndex);
235
+ }
236
+ }
237
+ _resetPooledCanvas(canvas) {
238
+ canvas.dataset.layerId = '';
239
+ this._applyStackingCanvasLayout(canvas, null);
240
+ }
63
241
  _initStackingCanvas(onCreated) {
64
242
  const layer = this.layerManager;
65
- const updateStackingCanvasSize = (canvases) => {
66
- this._stackingCanvas = canvases;
67
- const sizeUpdater = this._canvasSizeUpdater();
68
- canvases.filter(sizeUpdater.filter).forEach(sizeUpdater.update);
69
- };
70
243
  const updateStackingCanvas = () => {
71
244
  /**
72
245
  * we already have a main canvas, so the last layer should be skipped
@@ -84,16 +257,12 @@ export class CanvasRenderer {
84
257
  const created = i < currentCanvases.length;
85
258
  const canvas = created
86
259
  ? currentCanvases[i]
87
- : document.createElement('canvas');
88
- if (!created) {
89
- onCreated?.(canvas);
90
- }
260
+ : this._createCanvasForLayer(onCreated);
91
261
  canvas.dataset.layerId = `[${layer.indexes[0]}--${layer.indexes[1]}]`;
92
262
  canvas.style.zIndex = layer.zIndex.toString();
93
263
  canvases.push(canvas);
94
264
  }
95
265
  this._stackingCanvas = canvases;
96
- updateStackingCanvasSize(canvases);
97
266
  if (currentCanvases.length !== canvases.length) {
98
267
  const diff = canvases.length - currentCanvases.length;
99
268
  const payload = {
@@ -106,10 +275,14 @@ export class CanvasRenderer {
106
275
  }
107
276
  else {
108
277
  payload.removed = currentCanvases.slice(diff);
278
+ payload.removed.forEach(canvas => {
279
+ this._resetPooledCanvas(canvas);
280
+ this._stackingCanvasPool.push(canvas);
281
+ });
109
282
  }
110
283
  this.stackingCanvasUpdated.next(payload);
111
284
  }
112
- this.refresh();
285
+ this.refresh({ type: 'all' });
113
286
  };
114
287
  this._disposables.add(this.layerManager.slots.layerUpdated.subscribe(() => {
115
288
  updateStackingCanvas();
@@ -119,7 +292,7 @@ export class CanvasRenderer {
119
292
  _initViewport() {
120
293
  let sizeUpdatedRafId = null;
121
294
  this._disposables.add(this.viewport.viewportUpdated.subscribe(() => {
122
- this.refresh();
295
+ this.refresh({ type: 'all' });
123
296
  }));
124
297
  this._disposables.add(this.viewport.sizeUpdated.subscribe(() => {
125
298
  if (sizeUpdatedRafId)
@@ -128,51 +301,127 @@ export class CanvasRenderer {
128
301
  sizeUpdatedRafId = null;
129
302
  this._resetSize();
130
303
  this._render();
131
- this.refresh();
132
304
  }, this._container);
133
305
  }));
134
306
  this._disposables.add(this.viewport.zooming$.subscribe(isZooming => {
135
307
  const shouldRenderPlaceholders = this._turboEnabled() && isZooming;
136
308
  if (this.usePlaceholder !== shouldRenderPlaceholders) {
137
309
  this.usePlaceholder = shouldRenderPlaceholders;
138
- this.refresh();
310
+ this.refresh({ type: 'all' });
311
+ }
312
+ }));
313
+ let wasDragging = false;
314
+ this._disposables.add(effect(() => {
315
+ const isDragging = this._gfx.tool.dragging$.value;
316
+ if (wasDragging && !isDragging) {
317
+ this.refresh({ type: 'all' });
139
318
  }
319
+ wasDragging = isDragging;
140
320
  }));
141
321
  this.usePlaceholder = false;
142
322
  }
323
+ _createRenderPassStats() {
324
+ return {
325
+ renderByBoundCallCount: 0,
326
+ visibleElementCount: 0,
327
+ renderedElementCount: 0,
328
+ placeholderElementCount: 0,
329
+ overlayCount: 0,
330
+ };
331
+ }
332
+ _getCanvasMemorySnapshots() {
333
+ return [this.canvas, ...this._stackingCanvas].map((canvas, index) => {
334
+ return {
335
+ kind: index === 0 ? 'main' : 'stacking',
336
+ width: canvas.width,
337
+ height: canvas.height,
338
+ bytes: canvas.width * canvas.height * 4,
339
+ zIndex: canvas.style.zIndex,
340
+ datasetLayerId: canvas.dataset.layerId ?? null,
341
+ };
342
+ });
343
+ }
143
344
  _render() {
345
+ const renderStart = performance.now();
144
346
  const { viewportBounds, zoom } = this.viewport;
145
347
  const { ctx } = this;
146
348
  const dpr = window.devicePixelRatio;
147
349
  const scale = zoom * dpr;
148
350
  const matrix = new DOMMatrix().scaleSelf(scale);
351
+ const renderStats = this._createRenderPassStats();
352
+ const fullRender = this._needsFullRender;
353
+ const stackingIndexesToRender = fullRender
354
+ ? this._stackingCanvas.map((_, idx) => idx)
355
+ : [...this._dirtyStackingCanvasIndexes];
149
356
  /**
150
357
  * if a layer does not have a corresponding canvas
151
358
  * its element will be add to this array and drawing on the
152
359
  * main canvas
153
360
  */
154
361
  let fallbackElement = [];
155
- this.layerManager.getCanvasLayers().forEach((layer, idx) => {
156
- if (!this._stackingCanvas[idx]) {
157
- fallbackElement = fallbackElement.concat(layer.elements);
158
- return;
159
- }
362
+ const allCanvasLayers = this.layerManager.getCanvasLayers();
363
+ const viewportBound = Bound.from(viewportBounds);
364
+ for (const idx of stackingIndexesToRender) {
365
+ const layer = allCanvasLayers[idx];
160
366
  const canvas = this._stackingCanvas[idx];
161
- const ctx = canvas.getContext('2d');
162
- const rc = new RoughCanvas(ctx.canvas);
163
- ctx.clearRect(0, 0, canvas.width, canvas.height);
367
+ if (!layer || !canvas) {
368
+ continue;
369
+ }
370
+ const layerRenderBound = this._getLayerRenderBound(layer.elements, viewportBound);
371
+ const resolvedLayerRenderBound = this._getResolvedStackingCanvasBound(canvas, layerRenderBound);
372
+ this._applyStackingCanvasLayout(canvas, resolvedLayerRenderBound);
373
+ if (!resolvedLayerRenderBound ||
374
+ canvas.width === 0 ||
375
+ canvas.height === 0) {
376
+ continue;
377
+ }
378
+ const layerCtx = canvas.getContext('2d');
379
+ const layerRc = new RoughCanvas(layerCtx.canvas);
380
+ layerCtx.clearRect(0, 0, canvas.width, canvas.height);
381
+ layerCtx.save();
382
+ layerCtx.setTransform(matrix);
383
+ this._renderByBound(layerCtx, matrix, layerRc, resolvedLayerRenderBound, layer.elements, false, renderStats);
384
+ }
385
+ if (fullRender || this._mainCanvasDirty) {
386
+ allCanvasLayers.forEach((layer, idx) => {
387
+ if (!this._stackingCanvas[idx]) {
388
+ fallbackElement = fallbackElement.concat(layer.elements);
389
+ }
390
+ });
391
+ ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
164
392
  ctx.save();
165
393
  ctx.setTransform(matrix);
166
- this._renderByBound(ctx, matrix, rc, viewportBounds, layer.elements);
167
- });
168
- ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
169
- ctx.save();
170
- ctx.setTransform(matrix);
171
- this._renderByBound(ctx, matrix, new RoughCanvas(ctx.canvas), viewportBounds, fallbackElement, true);
394
+ this._renderByBound(ctx, matrix, new RoughCanvas(ctx.canvas), viewportBounds, fallbackElement, true, renderStats);
395
+ }
396
+ const canvasMemorySnapshots = this._getCanvasMemorySnapshots();
397
+ const canvasMemoryBytes = canvasMemorySnapshots.reduce((sum, snapshot) => sum + snapshot.bytes, 0);
398
+ const layerTypes = this.layerManager.layers.map(layer => layer.type);
399
+ const renderDurationMs = performance.now() - renderStart;
400
+ this._debugMetrics.renderCount += 1;
401
+ this._debugMetrics.totalRenderDurationMs += renderDurationMs;
402
+ this._debugMetrics.lastRenderDurationMs = renderDurationMs;
403
+ this._debugMetrics.maxRenderDurationMs = Math.max(this._debugMetrics.maxRenderDurationMs, renderDurationMs);
404
+ this._debugMetrics.lastRenderMetrics = renderStats;
405
+ this._debugMetrics.fallbackElementCount = fallbackElement.length;
406
+ this._debugMetrics.dirtyLayerRenderCount = stackingIndexesToRender.length;
407
+ this._lastDebugSnapshot = {
408
+ canvasMemorySnapshots,
409
+ canvasMemoryBytes,
410
+ canvasPixelCount: canvasMemorySnapshots.reduce((sum, snapshot) => sum + snapshot.width * snapshot.height, 0),
411
+ stackingCanvasCount: this._stackingCanvas.length,
412
+ canvasLayerCount: layerTypes.filter(type => type === 'canvas').length,
413
+ totalLayerCount: layerTypes.length,
414
+ pooledStackingCanvasCount: this._stackingCanvasPool.length,
415
+ visibleStackingCanvasCount: this._stackingCanvas.filter(canvas => canvas.width > 0 && canvas.height > 0).length,
416
+ };
417
+ this._needsFullRender = false;
418
+ this._mainCanvasDirty = false;
419
+ this._dirtyStackingCanvasIndexes.clear();
172
420
  }
173
- _renderByBound(ctx, matrix, rc, bound, surfaceElements, overLay = false) {
421
+ _renderByBound(ctx, matrix, rc, bound, surfaceElements, overLay = false, renderStats) {
174
422
  if (!ctx)
175
423
  return;
424
+ renderStats && (renderStats.renderByBoundCallCount += 1);
176
425
  const elements = surfaceElements ??
177
426
  this.grid.search(bound, {
178
427
  filter: ['canvas', 'local'],
@@ -180,8 +429,10 @@ export class CanvasRenderer {
180
429
  for (const element of elements) {
181
430
  const display = (element.display ?? true) && !element.hidden;
182
431
  if (display && intersects(getBoundWithRotation(element), bound)) {
432
+ renderStats && (renderStats.visibleElementCount += 1);
183
433
  if (this.usePlaceholder &&
184
434
  !element.forceFullRender) {
435
+ renderStats && (renderStats.placeholderElementCount += 1);
185
436
  ctx.save();
186
437
  ctx.fillStyle = 'rgba(200, 200, 200, 0.5)';
187
438
  const drawX = element.x - bound.x;
@@ -190,6 +441,7 @@ export class CanvasRenderer {
190
441
  ctx.restore();
191
442
  }
192
443
  else {
444
+ renderStats && (renderStats.renderedElementCount += 1);
193
445
  ctx.save();
194
446
  const renderFn = this.std.getOptional(ElementRendererIdentifier(element.type));
195
447
  if (!renderFn)
@@ -203,6 +455,7 @@ export class CanvasRenderer {
203
455
  }
204
456
  }
205
457
  if (overLay) {
458
+ renderStats && (renderStats.overlayCount += this._overlays.size);
206
459
  for (const overlay of this._overlays) {
207
460
  ctx.save();
208
461
  ctx.translate(-bound.x, -bound.y);
@@ -215,26 +468,28 @@ export class CanvasRenderer {
215
468
  _resetSize() {
216
469
  const sizeUpdater = this._canvasSizeUpdater();
217
470
  sizeUpdater.update(this.canvas);
218
- this._stackingCanvas.forEach(sizeUpdater.update);
219
- this.refresh();
471
+ this._invalidate({ type: 'all' });
220
472
  }
221
473
  _watchSurface(surfaceModel) {
222
- this._disposables.add(surfaceModel.elementAdded.subscribe(() => this.refresh()));
223
- this._disposables.add(surfaceModel.elementRemoved.subscribe(() => this.refresh()));
224
- this._disposables.add(surfaceModel.localElementAdded.subscribe(() => this.refresh()));
225
- this._disposables.add(surfaceModel.localElementDeleted.subscribe(() => this.refresh()));
226
- this._disposables.add(surfaceModel.localElementUpdated.subscribe(() => this.refresh()));
474
+ this._disposables.add(surfaceModel.elementAdded.subscribe(() => this.refresh({ type: 'all' })));
475
+ this._disposables.add(surfaceModel.elementRemoved.subscribe(() => this.refresh({ type: 'all' })));
476
+ this._disposables.add(surfaceModel.localElementAdded.subscribe(() => this.refresh({ type: 'all' })));
477
+ this._disposables.add(surfaceModel.localElementDeleted.subscribe(() => this.refresh({ type: 'all' })));
478
+ this._disposables.add(surfaceModel.localElementUpdated.subscribe(({ model }) => {
479
+ this.refresh({ type: 'element', element: model });
480
+ }));
227
481
  this._disposables.add(surfaceModel.elementUpdated.subscribe(payload => {
228
482
  // ignore externalXYWH update cause it's updated by the renderer
229
483
  if (payload.props['externalXYWH'])
230
484
  return;
231
- this.refresh();
485
+ const element = surfaceModel.getElementById(payload.id);
486
+ this.refresh(element ? { type: 'element', element } : { type: 'all' });
232
487
  }));
233
488
  }
234
489
  addOverlay(overlay) {
235
490
  overlay.setRenderer(this);
236
491
  this._overlays.add(overlay);
237
- this.refresh();
492
+ this.refresh({ type: 'main' });
238
493
  }
239
494
  /**
240
495
  * Used to attach main canvas, main canvas will always exist
@@ -244,7 +499,7 @@ export class CanvasRenderer {
244
499
  this._container = container;
245
500
  container.append(this.canvas);
246
501
  this._resetSize();
247
- this.refresh();
502
+ this.refresh({ type: 'all' });
248
503
  }
249
504
  dispose() {
250
505
  this._overlays.forEach(overlay => overlay.dispose());
@@ -281,9 +536,43 @@ export class CanvasRenderer {
281
536
  getPropertyValue(property) {
282
537
  return this.provider.getPropertyValue?.(property) ?? '';
283
538
  }
284
- refresh() {
285
- if (this._refreshRafId !== null)
539
+ getDebugMetrics() {
540
+ return {
541
+ ...this._debugMetrics,
542
+ ...this._lastDebugSnapshot,
543
+ canvasMemoryMegabytes: this._lastDebugSnapshot.canvasMemoryBytes / 1024 / 1024,
544
+ };
545
+ }
546
+ resetDebugMetrics() {
547
+ this._debugMetrics = {
548
+ refreshCount: 0,
549
+ coalescedRefreshCount: 0,
550
+ renderCount: 0,
551
+ totalRenderDurationMs: 0,
552
+ lastRenderDurationMs: 0,
553
+ maxRenderDurationMs: 0,
554
+ lastRenderMetrics: this._createRenderPassStats(),
555
+ dirtyLayerRenderCount: 0,
556
+ fallbackElementCount: 0,
557
+ };
558
+ this._lastDebugSnapshot = {
559
+ canvasMemoryBytes: 0,
560
+ canvasMemorySnapshots: [],
561
+ canvasPixelCount: 0,
562
+ canvasLayerCount: 0,
563
+ pooledStackingCanvasCount: 0,
564
+ stackingCanvasCount: 0,
565
+ totalLayerCount: 0,
566
+ visibleStackingCanvasCount: 0,
567
+ };
568
+ }
569
+ refresh(target = { type: 'all' }) {
570
+ this._debugMetrics.refreshCount += 1;
571
+ this._invalidate(target);
572
+ if (this._refreshRafId !== null) {
573
+ this._debugMetrics.coalescedRefreshCount += 1;
286
574
  return;
575
+ }
287
576
  this._refreshRafId = requestConnectedFrame(() => {
288
577
  this._refreshRafId = null;
289
578
  this._render();
@@ -295,6 +584,6 @@ export class CanvasRenderer {
295
584
  }
296
585
  overlay.setRenderer(null);
297
586
  this._overlays.delete(overlay);
298
- this.refresh();
587
+ this.refresh({ type: 'main' });
299
588
  }
300
589
  }
@@ -242,7 +242,10 @@ export class DomRenderer {
242
242
  addedElements.push(domElement);
243
243
  }
244
244
  const geometricStyles = calculatePlaceholderRect(elementModel, viewportBounds, zoom);
245
- Object.assign(domElement.style, geometricStyles);
245
+ const zIndexStyle = {
246
+ 'z-index': this.layerManager.getZIndex(elementModel),
247
+ };
248
+ Object.assign(domElement.style, geometricStyles, zIndexStyle);
246
249
  Object.assign(domElement.style, PLACEHOLDER_RESET_STYLES);
247
250
  // Clear classes specific to shapes, if applicable
248
251
  if (elementModel.type === 'shape') {
@@ -264,7 +267,10 @@ export class DomRenderer {
264
267
  }
265
268
  const geometricStyles = calculateFullElementRect(elementModel, viewportBounds, zoom);
266
269
  const opacityStyle = getOpacity(elementModel);
267
- Object.assign(domElement.style, geometricStyles, opacityStyle);
270
+ const zIndexStyle = {
271
+ 'z-index': this.layerManager.getZIndex(elementModel),
272
+ };
273
+ Object.assign(domElement.style, geometricStyles, opacityStyle, zIndexStyle);
268
274
  this._renderElement(elementModel, domElement);
269
275
  }
270
276
  _render() {
@@ -273,22 +279,29 @@ export class DomRenderer {
273
279
  _watchSurface(surfaceModel) {
274
280
  this._disposables.add(surfaceModel.elementAdded.subscribe(payload => {
275
281
  this._markElementDirty(payload.id, UpdateType.ELEMENT_ADDED);
282
+ this._markViewportDirty();
276
283
  this.refresh();
277
284
  }));
278
285
  this._disposables.add(surfaceModel.elementRemoved.subscribe(payload => {
279
286
  this._markElementDirty(payload.id, UpdateType.ELEMENT_REMOVED);
287
+ this._markViewportDirty();
280
288
  this.refresh();
281
289
  }));
282
290
  this._disposables.add(surfaceModel.localElementAdded.subscribe(payload => {
283
291
  this._markElementDirty(payload.id, UpdateType.ELEMENT_ADDED);
292
+ this._markViewportDirty();
284
293
  this.refresh();
285
294
  }));
286
295
  this._disposables.add(surfaceModel.localElementDeleted.subscribe(payload => {
287
296
  this._markElementDirty(payload.id, UpdateType.ELEMENT_REMOVED);
297
+ this._markViewportDirty();
288
298
  this.refresh();
289
299
  }));
290
300
  this._disposables.add(surfaceModel.localElementUpdated.subscribe(payload => {
291
301
  this._markElementDirty(payload.model.id, UpdateType.ELEMENT_UPDATED);
302
+ if (payload.props['index'] || payload.props['groupId']) {
303
+ this._markViewportDirty();
304
+ }
292
305
  this.refresh();
293
306
  }));
294
307
  this._disposables.add(surfaceModel.elementUpdated.subscribe(payload => {
@@ -296,6 +309,9 @@ export class DomRenderer {
296
309
  if (payload.props['externalXYWH'])
297
310
  return;
298
311
  this._markElementDirty(payload.id, UpdateType.ELEMENT_UPDATED);
312
+ if (payload.props['index'] || payload.props['childIds']) {
313
+ this._markViewportDirty();
314
+ }
299
315
  this.refresh();
300
316
  }));
301
317
  }
@@ -244,6 +244,14 @@ export class DefaultTool extends BaseTool {
244
244
  if (this.selection.editing || preventDefaultState || handledByView)
245
245
  return;
246
246
  this.movementDragging = true;
247
+ // NOTE: no readonly branch here on purpose. The refusal lives one level
248
+ // down, in `InteractivityManager.handleElementMove` / `handleElementResize`
249
+ // / `handleElementRotate` / `requestElementClone` — the layer that actually
250
+ // writes `xywh` through `@field()` accessors, i.e. raw `store.transact`
251
+ // outside `EdgelessCRUDExtension`. Short-circuiting the drag HERE was both
252
+ // redundant (the net alone stops the write) and harmful: it left the tool
253
+ // holding a half-initialized selecting state, so once readonly was lifted
254
+ // the board no longer selected or moved anything.
247
255
  // Determine the drag type based on the current state and event
248
256
  let dragType = this._determineDragType(e);
249
257
  const elements = this.selection.selectedElements;
@@ -17,9 +17,15 @@ export const getFontFaces = IS_FIREFOX
17
17
  return fonts;
18
18
  }
19
19
  : () => [...document.fonts.keys()];
20
- export const isSameFontFamily = IS_FIREFOX
21
- ? (fontFamily) => (fontFace) => fontFace.family === `"${fontFamily}"`
22
- : (fontFamily) => (fontFace) => fontFace.family === fontFamily;
20
+ /**
21
+ * Surface fonts are registered with quoted family names (see `wrapFontFamily`),
22
+ * while models store them unquoted (`blocksuite:surface:Inter`). Browsers do not
23
+ * agree on whether `FontFace.family` echoes those quotes back, so compare
24
+ * unquoted on both sides instead of branching on the engine — a mismatch makes
25
+ * `getFontFacesByFontFamily` return nothing and renders an empty font style menu.
26
+ */
27
+ const unquoteFontFamily = (fontFamily) => fontFamily.replace(/^\s*["']|["']\s*$/g, '');
28
+ export const isSameFontFamily = (fontFamily) => (fontFace) => unquoteFontFamily(fontFace.family) === unquoteFontFamily(fontFamily);
23
29
  export function getFontFacesByFontFamily(fontFamily) {
24
30
  return (getFontFaces()
25
31
  .filter(isSameFontFamily(fontFamily))
@@ -4,3 +4,20 @@ export declare class SurfaceViewExtension extends ViewExtensionProvider {
4
4
  effect(): void;
5
5
  setup(context: ViewExtensionContext): void;
6
6
  }
7
+ /**
8
+ * The AI audit seam — gated by the `ai-audit` capability switch (PF14.1).
9
+ *
10
+ * Its own extension, registered from `getInternalViewExtensions` only when the
11
+ * switch is on, because that is what makes the gate REAL: off, `map.audit` is
12
+ * never registered, so it is absent from the command registry, from both
13
+ * manifests and from the keymap at once — the same two-sided gating a framework
14
+ * flag gets, asserted by the same test.
15
+ *
16
+ * Nothing here is registered by {@link SurfaceViewExtension}: the audit is not
17
+ * part of a surface's job, and folding it in would make the switch a filter
18
+ * over something already wired instead of a decision not to wire it.
19
+ */
20
+ export declare class AuditViewExtension extends ViewExtensionProvider {
21
+ name: string;
22
+ setup(context: ViewExtensionContext): void;
23
+ }