@formicoidea/labre-core 0.31.0 → 0.33.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 (637) hide show
  1. package/dist/_pkgs/affine-block-attachment/attachment-block.js +1 -1
  2. package/dist/_pkgs/affine-block-callout/callout-block.d.ts +6 -0
  3. package/dist/_pkgs/affine-block-callout/callout-block.js +26 -4
  4. package/dist/_pkgs/affine-block-callout/callout-keymap.js +59 -19
  5. package/dist/_pkgs/affine-block-callout/commands/callout-to-paragraph.d.ts +20 -0
  6. package/dist/_pkgs/affine-block-callout/commands/callout-to-paragraph.js +60 -0
  7. package/dist/_pkgs/affine-block-callout/commands/split-callout.d.ts +17 -0
  8. package/dist/_pkgs/affine-block-callout/commands/split-callout.js +42 -0
  9. package/dist/_pkgs/affine-block-callout/configs/slash-menu.js +9 -6
  10. package/dist/_pkgs/affine-block-callout/emoji-margin.d.ts +9 -0
  11. package/dist/_pkgs/affine-block-callout/emoji-margin.js +36 -0
  12. package/dist/_pkgs/affine-block-callout/emoji-menu.d.ts +5 -1
  13. package/dist/_pkgs/affine-block-callout/emoji-menu.js +5 -0
  14. package/dist/_pkgs/affine-block-code/code-block-inline.js +1 -1
  15. package/dist/_pkgs/affine-block-code/code-block.d.ts +14 -0
  16. package/dist/_pkgs/affine-block-code/code-block.js +44 -6
  17. package/dist/_pkgs/affine-block-code/code-toolbar/components/code-toolbar.d.ts +2 -0
  18. package/dist/_pkgs/affine-block-code/code-toolbar/components/code-toolbar.js +23 -14
  19. package/dist/_pkgs/affine-block-code/code-toolbar/components/more-menu.d.ts +16 -0
  20. package/dist/_pkgs/affine-block-code/code-toolbar/components/more-menu.js +93 -0
  21. package/dist/_pkgs/affine-block-code/code-toolbar/config.js +54 -5
  22. package/dist/_pkgs/affine-block-code/code-toolbar/index.js +1 -1
  23. package/dist/_pkgs/affine-block-code/effects.d.ts +2 -0
  24. package/dist/_pkgs/affine-block-code/effects.js +2 -0
  25. package/dist/_pkgs/affine-block-code/highlight/affine-code-unit.js +6 -1
  26. package/dist/_pkgs/affine-block-code/index.d.ts +1 -0
  27. package/dist/_pkgs/affine-block-code/index.js +1 -0
  28. package/dist/_pkgs/affine-block-code/line-numbers.d.ts +25 -0
  29. package/dist/_pkgs/affine-block-code/line-numbers.js +27 -0
  30. package/dist/_pkgs/affine-block-code/styles.js +31 -0
  31. package/dist/_pkgs/affine-block-data-view/data-view-block.js +1 -0
  32. package/dist/_pkgs/affine-block-database/components/title/index.js +4 -1
  33. package/dist/_pkgs/affine-block-database/configs/slash-menu.js +28 -1
  34. package/dist/_pkgs/affine-block-database/data-source.js +1 -2
  35. package/dist/_pkgs/affine-block-database/database-block.js +13 -0
  36. package/dist/_pkgs/affine-block-database/external-data-source.js +1 -1
  37. package/dist/_pkgs/affine-block-database/properties/paste-url.d.ts +24 -0
  38. package/dist/_pkgs/affine-block-database/properties/paste-url.js +98 -0
  39. package/dist/_pkgs/affine-block-database/properties/rich-text/cell-renderer.js +9 -19
  40. package/dist/_pkgs/affine-block-database/properties/title/text.js +20 -25
  41. package/dist/_pkgs/affine-block-database/views/index.js +1 -0
  42. package/dist/_pkgs/affine-block-edgeless-text/edgeless-text-block.js +11 -1
  43. package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/config.d.ts +3 -0
  44. package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/config.js +48 -1
  45. package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/font-size.d.ts +17 -0
  46. package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/font-size.js +24 -0
  47. package/dist/_pkgs/affine-block-embed/embed-figma-block/embed-figma-service.js +1 -1
  48. package/dist/_pkgs/affine-block-embed/embed-iframe-block/configs/toolbar.js +2 -2
  49. package/dist/_pkgs/affine-block-embed-doc/common/doc-trashed.d.ts +9 -0
  50. package/dist/_pkgs/affine-block-embed-doc/common/doc-trashed.js +10 -0
  51. package/dist/_pkgs/affine-block-embed-doc/embed-linked-doc-block/configs/toolbar.js +1 -1
  52. package/dist/_pkgs/affine-block-embed-doc/embed-linked-doc-block/embed-linked-doc-block.js +8 -4
  53. package/dist/_pkgs/affine-block-embed-doc/embed-linked-doc-block/utils.js +1 -1
  54. package/dist/_pkgs/affine-block-embed-doc/embed-synced-doc-block/configs/toolbar.js +1 -1
  55. package/dist/_pkgs/affine-block-embed-doc/embed-synced-doc-block/embed-synced-doc-block.d.ts +4 -0
  56. package/dist/_pkgs/affine-block-embed-doc/embed-synced-doc-block/embed-synced-doc-block.js +23 -4
  57. package/dist/_pkgs/affine-block-frame/frame-manager.d.ts +13 -0
  58. package/dist/_pkgs/affine-block-frame/frame-manager.js +34 -2
  59. package/dist/_pkgs/affine-block-frame/frame-tool.js +1 -1
  60. package/dist/_pkgs/affine-block-image/components/page-image-block.js +1 -1
  61. package/dist/_pkgs/affine-block-image/image-edgeless-block.js +1 -1
  62. package/dist/_pkgs/affine-block-latex/styles.js +6 -1
  63. package/dist/_pkgs/affine-block-list/utils/forward-delete.js +1 -1
  64. package/dist/_pkgs/affine-block-note/commands/select-block.js +1 -1
  65. package/dist/_pkgs/affine-block-note/commands/select-blocks-between.js +1 -1
  66. package/dist/_pkgs/affine-block-note/move-block.js +1 -1
  67. package/dist/_pkgs/affine-block-note/note-edgeless-block.d.ts +9 -0
  68. package/dist/_pkgs/affine-block-note/note-edgeless-block.js +29 -1
  69. package/dist/_pkgs/affine-block-paragraph/utils/forward-delete.js +2 -2
  70. package/dist/_pkgs/affine-block-paragraph/utils/merge-with-prev.js +1 -1
  71. package/dist/_pkgs/affine-block-root/commands/pivot-commands.d.ts +37 -0
  72. package/dist/_pkgs/affine-block-root/commands/pivot-commands.js +168 -0
  73. package/dist/_pkgs/affine-block-root/commands/reading-commands.d.ts +23 -0
  74. package/dist/_pkgs/affine-block-root/commands/reading-commands.js +107 -0
  75. package/dist/_pkgs/affine-block-root/commands/tag-commands.d.ts +47 -0
  76. package/dist/_pkgs/affine-block-root/commands/tag-commands.js +159 -0
  77. package/dist/_pkgs/affine-block-root/configs/toolbar.d.ts +1 -0
  78. package/dist/_pkgs/affine-block-root/edgeless/configs/toolbar/more.js +10 -3
  79. package/dist/_pkgs/affine-block-root/edgeless/configs/toolbar/render-linked-doc.js +1 -1
  80. package/dist/_pkgs/affine-block-root/edgeless/edgeless-keyboard.js +27 -2
  81. package/dist/_pkgs/affine-block-root/edgeless/edgeless-root-block.js +11 -2
  82. package/dist/_pkgs/affine-block-root/edgeless/edgeless-root-service.js +14 -0
  83. package/dist/_pkgs/affine-block-root/edgeless/index.d.ts +1 -0
  84. package/dist/_pkgs/affine-block-root/edgeless/index.js +1 -0
  85. package/dist/_pkgs/affine-block-root/edgeless/reserved-keys.d.ts +21 -0
  86. package/dist/_pkgs/affine-block-root/edgeless/reserved-keys.js +34 -0
  87. package/dist/_pkgs/affine-block-root/edgeless/utils/clipboard-utils.js +1 -1
  88. package/dist/_pkgs/affine-block-root/edgeless/utils/clone-utils.d.ts +7 -1
  89. package/dist/_pkgs/affine-block-root/edgeless/utils/clone-utils.js +11 -2
  90. package/dist/_pkgs/affine-block-root/index.d.ts +4 -1
  91. package/dist/_pkgs/affine-block-root/index.js +4 -1
  92. package/dist/_pkgs/affine-block-root/keyboard/commands.d.ts +2 -0
  93. package/dist/_pkgs/affine-block-root/keyboard/commands.js +147 -0
  94. package/dist/_pkgs/affine-block-root/view.js +13 -4
  95. package/dist/_pkgs/affine-block-surface/adapters/markdown/element-adapter/type.js +1 -1
  96. package/dist/_pkgs/affine-block-surface/adapters/plain-text/element-adapter/type.js +1 -1
  97. package/dist/_pkgs/affine-block-surface/commands/reassociate-connectors.js +0 -1
  98. package/dist/_pkgs/affine-block-surface/effects.js +6 -0
  99. package/dist/_pkgs/affine-block-surface/element-model/index.d.ts +21 -3
  100. package/dist/_pkgs/affine-block-surface/element-model/index.js +14 -2
  101. package/dist/_pkgs/affine-block-surface/extensions/audit.d.ts +107 -0
  102. package/dist/_pkgs/affine-block-surface/extensions/audit.js +489 -0
  103. package/dist/_pkgs/affine-block-surface/extensions/crud-extension.d.ts +14 -0
  104. package/dist/_pkgs/affine-block-surface/extensions/crud-extension.js +37 -5
  105. package/dist/_pkgs/affine-block-surface/extensions/editor-anchored-panel.d.ts +133 -0
  106. package/dist/_pkgs/affine-block-surface/extensions/editor-anchored-panel.js +327 -0
  107. package/dist/_pkgs/affine-block-surface/extensions/element-renderer.js +1 -1
  108. package/dist/_pkgs/affine-block-surface/extensions/export-manager/export-manager.js +1 -1
  109. package/dist/_pkgs/affine-block-surface/extensions/index.d.ts +17 -0
  110. package/dist/_pkgs/affine-block-surface/extensions/index.js +17 -0
  111. package/dist/_pkgs/affine-block-surface/extensions/interchange-import.d.ts +172 -0
  112. package/dist/_pkgs/affine-block-surface/extensions/interchange-import.js +393 -0
  113. package/dist/_pkgs/affine-block-surface/extensions/interchange.d.ts +306 -0
  114. package/dist/_pkgs/affine-block-surface/extensions/interchange.js +64 -0
  115. package/dist/_pkgs/affine-block-surface/extensions/map-quality-widget.d.ts +146 -0
  116. package/dist/_pkgs/affine-block-surface/extensions/map-quality-widget.js +528 -0
  117. package/dist/_pkgs/affine-block-surface/extensions/map-quality.d.ts +109 -0
  118. package/dist/_pkgs/affine-block-surface/extensions/map-quality.js +84 -0
  119. package/dist/_pkgs/affine-block-surface/extensions/morph-toolbar.d.ts +248 -0
  120. package/dist/_pkgs/affine-block-surface/extensions/morph-toolbar.js +248 -0
  121. package/dist/_pkgs/affine-block-surface/extensions/reading-toolbar.d.ts +15 -0
  122. package/dist/_pkgs/affine-block-surface/extensions/reading-toolbar.js +158 -0
  123. package/dist/_pkgs/affine-block-surface/extensions/reading-widget.d.ts +145 -0
  124. package/dist/_pkgs/affine-block-surface/extensions/reading-widget.js +588 -0
  125. package/dist/_pkgs/affine-block-surface/extensions/reading.d.ts +494 -0
  126. package/dist/_pkgs/affine-block-surface/extensions/reading.js +767 -0
  127. package/dist/_pkgs/affine-block-surface/extensions/spotlight.d.ts +45 -0
  128. package/dist/_pkgs/affine-block-surface/extensions/spotlight.js +177 -0
  129. package/dist/_pkgs/affine-block-surface/extensions/svg-sketch.d.ts +107 -0
  130. package/dist/_pkgs/affine-block-surface/extensions/svg-sketch.js +958 -0
  131. package/dist/_pkgs/affine-block-surface/extensions/tags-toolbar.d.ts +10 -0
  132. package/dist/_pkgs/affine-block-surface/extensions/tags-toolbar.js +295 -0
  133. package/dist/_pkgs/affine-block-surface/extensions/validation-toolbar.d.ts +27 -0
  134. package/dist/_pkgs/affine-block-surface/extensions/validation-toolbar.js +361 -0
  135. package/dist/_pkgs/affine-block-surface/extensions/validation.d.ts +2129 -0
  136. package/dist/_pkgs/affine-block-surface/extensions/validation.js +4620 -0
  137. package/dist/_pkgs/affine-block-surface/extensions/violation-detail-widget.d.ts +330 -0
  138. package/dist/_pkgs/affine-block-surface/extensions/violation-detail-widget.js +1004 -0
  139. package/dist/_pkgs/affine-block-surface/extensions/violation-timeline.d.ts +80 -0
  140. package/dist/_pkgs/affine-block-surface/extensions/violation-timeline.js +123 -0
  141. package/dist/_pkgs/affine-block-surface/framework-background/def.d.ts +610 -0
  142. package/dist/_pkgs/affine-block-surface/framework-background/def.js +206 -0
  143. package/dist/_pkgs/affine-block-surface/framework-background/facts.d.ts +188 -0
  144. package/dist/_pkgs/affine-block-surface/framework-background/facts.js +284 -0
  145. package/dist/_pkgs/affine-block-surface/framework-background/index.d.ts +5 -0
  146. package/dist/_pkgs/affine-block-surface/framework-background/index.js +5 -0
  147. package/dist/_pkgs/affine-block-surface/framework-background/interaction.d.ts +12 -0
  148. package/dist/_pkgs/affine-block-surface/framework-background/interaction.js +24 -0
  149. package/dist/_pkgs/affine-block-surface/framework-background/labels.d.ts +99 -0
  150. package/dist/_pkgs/affine-block-surface/framework-background/labels.js +193 -0
  151. package/dist/_pkgs/affine-block-surface/framework-background/renderer.d.ts +8 -0
  152. package/dist/_pkgs/affine-block-surface/framework-background/renderer.js +399 -0
  153. package/dist/_pkgs/affine-block-surface/index.d.ts +1 -0
  154. package/dist/_pkgs/affine-block-surface/index.js +1 -0
  155. package/dist/_pkgs/affine-block-surface/renderer/canvas-renderer.d.ts +69 -3
  156. package/dist/_pkgs/affine-block-surface/renderer/canvas-renderer.js +333 -44
  157. package/dist/_pkgs/affine-block-surface/renderer/dom-renderer.js +18 -2
  158. package/dist/_pkgs/affine-block-surface/renderer/overlay.js +1 -1
  159. package/dist/_pkgs/affine-block-surface/tool/default-tool.js +8 -0
  160. package/dist/_pkgs/affine-block-surface/utils/font.js +9 -3
  161. package/dist/_pkgs/affine-block-surface/view.d.ts +17 -0
  162. package/dist/_pkgs/affine-block-surface/view.js +57 -2
  163. package/dist/_pkgs/affine-block-surface-ref/portal/note.js +2 -2
  164. package/dist/_pkgs/affine-block-table/commands.js +1 -1
  165. package/dist/_pkgs/affine-block-table/selection-controller.d.ts +6 -0
  166. package/dist/_pkgs/affine-block-table/selection-controller.js +24 -1
  167. package/dist/_pkgs/affine-block-table/table-block.js +8 -2
  168. package/dist/_pkgs/affine-block-table/table-cell.js +5 -6
  169. package/dist/_pkgs/affine-block-table/table-keymap.d.ts +18 -0
  170. package/dist/_pkgs/affine-block-table/table-keymap.js +41 -0
  171. package/dist/_pkgs/affine-block-table/utils.d.ts +7 -0
  172. package/dist/_pkgs/affine-block-table/utils.js +12 -0
  173. package/dist/_pkgs/affine-block-table/view.js +2 -0
  174. package/dist/_pkgs/affine-components/caption/captioned-block-component.js +2 -1
  175. package/dist/_pkgs/affine-components/context-menu/button.d.ts +7 -0
  176. package/dist/_pkgs/affine-components/context-menu/button.js +7 -2
  177. package/dist/_pkgs/affine-components/context-menu/input.d.ts +4 -0
  178. package/dist/_pkgs/affine-components/context-menu/input.js +12 -0
  179. package/dist/_pkgs/affine-components/context-menu/menu-all.d.ts +2 -0
  180. package/dist/_pkgs/affine-components/context-menu/menu-renderer.js +8 -1
  181. package/dist/_pkgs/affine-components/context-menu/sub-menu.js +3 -0
  182. package/dist/_pkgs/affine-components/edgeless-shape-color-picker/color-picker.js +1 -1
  183. package/dist/_pkgs/affine-components/embed-card-modal/embed-card-edit-modal.js +1 -1
  184. package/dist/_pkgs/affine-components/filterable-list/styles.js +1 -1
  185. package/dist/_pkgs/affine-components/highlight-dropdown-menu/highlight-duotone-icon.js +8 -8
  186. package/dist/_pkgs/affine-components/highlight-dropdown-menu/text-duotone-icon.js +11 -11
  187. package/dist/_pkgs/affine-components/icon-picker/affine-icon-picker-panel.d.ts +28 -0
  188. package/dist/_pkgs/affine-components/icon-picker/affine-icon-picker-panel.js +231 -0
  189. package/dist/_pkgs/affine-components/icon-picker/emoji-data.d.ts +40 -0
  190. package/dist/_pkgs/affine-components/icon-picker/emoji-data.js +99 -0
  191. package/dist/_pkgs/affine-components/icon-picker/emoji-picker-panel.d.ts +32 -0
  192. package/dist/_pkgs/affine-components/icon-picker/emoji-picker-panel.js +276 -0
  193. package/dist/_pkgs/affine-components/icon-picker/icon-data.d.ts +34 -0
  194. package/dist/_pkgs/affine-components/icon-picker/icon-data.js +83 -0
  195. package/dist/_pkgs/affine-components/icon-picker/icon-picker.d.ts +39 -0
  196. package/dist/_pkgs/affine-components/icon-picker/icon-picker.js +233 -0
  197. package/dist/_pkgs/affine-components/icon-picker/index.d.ts +8 -0
  198. package/dist/_pkgs/affine-components/icon-picker/index.js +15 -0
  199. package/dist/_pkgs/affine-components/icon-picker/recent-store.d.ts +8 -0
  200. package/dist/_pkgs/affine-components/icon-picker/recent-store.js +41 -0
  201. package/dist/_pkgs/affine-components/icon-picker/styles.d.ts +5 -0
  202. package/dist/_pkgs/affine-components/icon-picker/styles.js +166 -0
  203. package/dist/_pkgs/affine-components/icon-picker/types.d.ts +22 -0
  204. package/dist/_pkgs/affine-components/icon-picker/types.js +10 -0
  205. package/dist/_pkgs/affine-components/icons/text.js +426 -426
  206. package/dist/_pkgs/affine-components/open-doc-dropdown-menu/dropdown-menu.d.ts +1 -0
  207. package/dist/_pkgs/affine-components/peek/peekable.js +1 -1
  208. package/dist/_pkgs/affine-components/portal/portal.d.ts +1 -1
  209. package/dist/_pkgs/affine-components/toolbar/index.d.ts +1 -0
  210. package/dist/_pkgs/affine-components/toolbar/index.js +1 -0
  211. package/dist/_pkgs/affine-components/toolbar/menu-button.js +2 -1
  212. package/dist/_pkgs/affine-components/toolbar/picker-menu.d.ts +55 -0
  213. package/dist/_pkgs/affine-components/toolbar/picker-menu.js +47 -0
  214. package/dist/_pkgs/affine-components/toolbar/toolbar.js +11 -10
  215. package/dist/_pkgs/affine-foundation/view.js +11 -2
  216. package/dist/_pkgs/affine-fragment-frame-panel/body/frame-panel-body.js +2 -2
  217. package/dist/_pkgs/affine-fragment-frame-panel/header/frame-panel-header.js +2 -2
  218. package/dist/_pkgs/affine-fragment-frame-panel/header/frames-setting-menu.js +1 -1
  219. package/dist/_pkgs/affine-fragment-outline/mobile-outline-panel.js +1 -1
  220. package/dist/_pkgs/affine-gfx-brush/index.d.ts +1 -0
  221. package/dist/_pkgs/affine-gfx-brush/index.js +1 -0
  222. package/dist/_pkgs/affine-gfx-brush/renderer/dom/brush.d.ts +1 -0
  223. package/dist/_pkgs/affine-gfx-brush/renderer/dom/brush.js +11 -0
  224. package/dist/_pkgs/affine-gfx-brush/renderer/dom/highlighter.d.ts +1 -0
  225. package/dist/_pkgs/affine-gfx-brush/renderer/dom/highlighter.js +11 -0
  226. package/dist/_pkgs/affine-gfx-brush/renderer/dom/index.d.ts +2 -0
  227. package/dist/_pkgs/affine-gfx-brush/renderer/dom/index.js +2 -0
  228. package/dist/_pkgs/affine-gfx-brush/renderer/dom/shared.d.ts +14 -0
  229. package/dist/_pkgs/affine-gfx-brush/renderer/dom/shared.js +54 -0
  230. package/dist/_pkgs/affine-gfx-brush/renderer/index.d.ts +1 -0
  231. package/dist/_pkgs/affine-gfx-brush/renderer/index.js +4 -0
  232. package/dist/_pkgs/affine-gfx-brush/toolbar/components/pen/pen-tool-button.js +1 -1
  233. package/dist/_pkgs/affine-gfx-brush/view.d.ts +14 -0
  234. package/dist/_pkgs/affine-gfx-brush/view.js +29 -3
  235. package/dist/_pkgs/affine-gfx-connector/connector-manager.js +39 -16
  236. package/dist/_pkgs/affine-gfx-connector/connector-tool.d.ts +26 -1
  237. package/dist/_pkgs/affine-gfx-connector/connector-tool.js +12 -3
  238. package/dist/_pkgs/affine-gfx-connector/connector-watcher.js +1 -4
  239. package/dist/_pkgs/affine-gfx-connector/direction/direction-reveal.d.ts +123 -0
  240. package/dist/_pkgs/affine-gfx-connector/direction/direction-reveal.js +282 -0
  241. package/dist/_pkgs/affine-gfx-connector/direction/direction-widget.d.ts +65 -0
  242. package/dist/_pkgs/affine-gfx-connector/direction/direction-widget.js +395 -0
  243. package/dist/_pkgs/affine-gfx-connector/direction/index.d.ts +4 -0
  244. package/dist/_pkgs/affine-gfx-connector/direction/index.js +4 -0
  245. package/dist/_pkgs/affine-gfx-connector/direction/invert-direction.d.ts +72 -0
  246. package/dist/_pkgs/affine-gfx-connector/direction/invert-direction.js +185 -0
  247. package/dist/_pkgs/affine-gfx-connector/direction/typed-edge.d.ts +69 -0
  248. package/dist/_pkgs/affine-gfx-connector/direction/typed-edge.js +66 -0
  249. package/dist/_pkgs/affine-gfx-connector/effects.d.ts +2 -0
  250. package/dist/_pkgs/affine-gfx-connector/effects.js +2 -0
  251. package/dist/_pkgs/affine-gfx-connector/element-renderer/connector-dom/index.js +78 -41
  252. package/dist/_pkgs/affine-gfx-connector/element-renderer/index.js +1 -1
  253. package/dist/_pkgs/affine-gfx-connector/element-renderer/utils.js +1 -1
  254. package/dist/_pkgs/affine-gfx-connector/index.d.ts +1 -0
  255. package/dist/_pkgs/affine-gfx-connector/index.js +1 -0
  256. package/dist/_pkgs/affine-gfx-connector/toolbar/config.d.ts +50 -0
  257. package/dist/_pkgs/affine-gfx-connector/toolbar/config.js +68 -2
  258. package/dist/_pkgs/affine-gfx-connector/view.js +16 -0
  259. package/dist/_pkgs/affine-gfx-group/command/group-api.js +150 -62
  260. package/dist/_pkgs/affine-gfx-group/text/edgeless-group-title-editor.js +4 -1
  261. package/dist/_pkgs/affine-gfx-mindmap/adapter/markdown/index.js +1 -1
  262. package/dist/_pkgs/affine-gfx-mindmap/adapter/utils.js +1 -1
  263. package/dist/_pkgs/affine-gfx-mindmap/templates/index.js +583 -4
  264. package/dist/_pkgs/affine-gfx-mindmap/toolbar/mindmap-menu.js +23 -23
  265. package/dist/_pkgs/affine-gfx-mindmap/toolbar/mindmap-tool-button.js +5 -1
  266. package/dist/_pkgs/affine-gfx-mindmap/view/utils.js +1 -1
  267. package/dist/_pkgs/affine-gfx-note/overlay/overlay.js +1 -1
  268. package/dist/_pkgs/affine-gfx-note/toolbar/note-senior-button.js +1 -1
  269. package/dist/_pkgs/affine-gfx-pointer/tools/pan-tool.d.ts +16 -0
  270. package/dist/_pkgs/affine-gfx-pointer/tools/pan-tool.js +102 -32
  271. package/dist/_pkgs/affine-gfx-shape/commands.d.ts +2 -0
  272. package/dist/_pkgs/affine-gfx-shape/commands.js +33 -0
  273. package/dist/_pkgs/affine-gfx-shape/consts.js +1 -1
  274. package/dist/_pkgs/affine-gfx-shape/draggable/shape-draggable.js +1 -1
  275. package/dist/_pkgs/affine-gfx-shape/element-renderer/shape/polygon.js +17 -9
  276. package/dist/_pkgs/affine-gfx-shape/element-renderer/shape/utils.js +8 -3
  277. package/dist/_pkgs/affine-gfx-shape/element-renderer/shape-dom/index.js +48 -19
  278. package/dist/_pkgs/affine-gfx-shape/element-view.js +19 -12
  279. package/dist/_pkgs/affine-gfx-shape/index.d.ts +1 -1
  280. package/dist/_pkgs/affine-gfx-shape/index.js +1 -1
  281. package/dist/_pkgs/affine-gfx-shape/overlay/polygon-drawing-overlay.js +1 -1
  282. package/dist/_pkgs/affine-gfx-shape/overlay/polygon-vertex-editing-overlay.js +12 -7
  283. package/dist/_pkgs/affine-gfx-shape/overlay/shape-overlay.js +1 -1
  284. package/dist/_pkgs/affine-gfx-shape/polygon-tool.js +4 -2
  285. package/dist/_pkgs/affine-gfx-shape/shape-tool.js +1 -1
  286. package/dist/_pkgs/affine-gfx-shape/text/edgeless-shape-text-editor.d.ts +26 -0
  287. package/dist/_pkgs/affine-gfx-shape/text/edgeless-shape-text-editor.js +124 -15
  288. package/dist/_pkgs/affine-gfx-shape/view.js +3 -3
  289. package/dist/_pkgs/affine-gfx-template/builtin/other.js +66 -17
  290. package/dist/_pkgs/affine-gfx-template/toolbar/overlay-scrollbar.js +1 -1
  291. package/dist/_pkgs/affine-gfx-template/toolbar/template-panel.js +1 -1
  292. package/dist/_pkgs/affine-gfx-template/toolbar/template-tool-button.d.ts +2 -0
  293. package/dist/_pkgs/affine-gfx-template/toolbar/template-tool-button.js +18 -1
  294. package/dist/_pkgs/affine-gfx-text/edgeless-text-editor.js +9 -5
  295. package/dist/_pkgs/affine-gfx-text/toolbar/actions.js +1 -1
  296. package/dist/_pkgs/affine-inline-latex/command.js +46 -26
  297. package/dist/_pkgs/affine-inline-latex/latex-node/latex-node.d.ts +10 -0
  298. package/dist/_pkgs/affine-inline-latex/latex-node/latex-node.js +23 -0
  299. package/dist/_pkgs/affine-inline-link/command.js +1 -1
  300. package/dist/_pkgs/affine-inline-link/link-node/affine-link.js +4 -1
  301. package/dist/_pkgs/affine-inline-preset/adapters/html/html-inline.d.ts +3 -0
  302. package/dist/_pkgs/affine-inline-preset/adapters/html/html-inline.js +29 -1
  303. package/dist/_pkgs/affine-inline-preset/command/format-block.js +1 -1
  304. package/dist/_pkgs/affine-inline-preset/command/format-native.js +2 -2
  305. package/dist/_pkgs/affine-inline-preset/command/format-text.js +1 -1
  306. package/dist/_pkgs/affine-inline-preset/inline-spec.js +1 -1
  307. package/dist/_pkgs/affine-inline-reference/reference-node/reference-node.js +1 -1
  308. package/dist/_pkgs/affine-model/blocks/code/code-model.d.ts +1 -0
  309. package/dist/_pkgs/affine-model/blocks/code/code-model.js +1 -0
  310. package/dist/_pkgs/affine-model/elements/bpmn/node.d.ts +40 -7
  311. package/dist/_pkgs/affine-model/elements/bpmn/node.js +4 -2
  312. package/dist/_pkgs/affine-model/elements/bpmn/pool.d.ts +74 -17
  313. package/dist/_pkgs/affine-model/elements/bpmn/pool.js +55 -26
  314. package/dist/_pkgs/affine-model/elements/c4/board.d.ts +88 -0
  315. package/dist/_pkgs/affine-model/elements/c4/board.js +128 -0
  316. package/dist/_pkgs/affine-model/elements/c4/boundary.d.ts +63 -0
  317. package/dist/_pkgs/affine-model/elements/c4/boundary.js +134 -0
  318. package/dist/_pkgs/affine-model/elements/c4/index.d.ts +3 -0
  319. package/dist/_pkgs/affine-model/elements/c4/index.js +3 -0
  320. package/dist/_pkgs/affine-model/elements/c4/node.d.ts +97 -0
  321. package/dist/_pkgs/affine-model/elements/c4/node.js +130 -0
  322. package/dist/_pkgs/affine-model/elements/connector/connector.js +25 -1
  323. package/dist/_pkgs/affine-model/elements/context-map/context-map.d.ts +27 -0
  324. package/dist/_pkgs/affine-model/elements/context-map/context-map.js +94 -0
  325. package/dist/_pkgs/affine-model/elements/context-map/index.d.ts +1 -0
  326. package/dist/_pkgs/affine-model/elements/context-map/index.js +1 -0
  327. package/dist/_pkgs/affine-model/elements/core-domain/core-domain.d.ts +34 -17
  328. package/dist/_pkgs/affine-model/elements/core-domain/core-domain.js +28 -26
  329. package/dist/_pkgs/affine-model/elements/edgy/board.d.ts +32 -0
  330. package/dist/_pkgs/affine-model/elements/edgy/board.js +112 -0
  331. package/dist/_pkgs/affine-model/elements/edgy/facets.d.ts +12 -0
  332. package/dist/_pkgs/affine-model/elements/edgy/facets.js +25 -1
  333. package/dist/_pkgs/affine-model/elements/edgy/index.d.ts +1 -0
  334. package/dist/_pkgs/affine-model/elements/edgy/index.js +1 -0
  335. package/dist/_pkgs/affine-model/elements/event-storming/event-storming.d.ts +36 -0
  336. package/dist/_pkgs/affine-model/elements/event-storming/event-storming.js +103 -0
  337. package/dist/_pkgs/affine-model/elements/event-storming/index.d.ts +1 -0
  338. package/dist/_pkgs/affine-model/elements/event-storming/index.js +1 -0
  339. package/dist/_pkgs/affine-model/elements/framework-background/background.d.ts +42 -0
  340. package/dist/_pkgs/affine-model/elements/framework-background/background.js +42 -0
  341. package/dist/_pkgs/affine-model/elements/framework-background/index.d.ts +1 -0
  342. package/dist/_pkgs/affine-model/elements/framework-background/index.js +1 -0
  343. package/dist/_pkgs/affine-model/elements/index.d.ts +14 -1
  344. package/dist/_pkgs/affine-model/elements/index.js +4 -0
  345. package/dist/_pkgs/affine-model/elements/mindmap/mindmap.js +8 -3
  346. package/dist/_pkgs/affine-model/elements/mindmap/style.d.ts +10 -0
  347. package/dist/_pkgs/affine-model/elements/mindmap/style.js +8 -0
  348. package/dist/_pkgs/affine-model/elements/shape/api/polygon.js +2 -8
  349. package/dist/_pkgs/affine-model/elements/wardley/wardley.d.ts +21 -29
  350. package/dist/_pkgs/affine-model/elements/wardley/wardley.js +41 -48
  351. package/dist/_pkgs/affine-shared/adapters/html/block-adapter.js +1 -1
  352. package/dist/_pkgs/affine-shared/adapters/markdown/block-adapter.js +1 -1
  353. package/dist/_pkgs/affine-shared/adapters/markdown/delta-converter.d.ts +6 -1
  354. package/dist/_pkgs/affine-shared/adapters/markdown/delta-converter.js +161 -3
  355. package/dist/_pkgs/affine-shared/adapters/markdown/markdown.js +5 -1
  356. package/dist/_pkgs/affine-shared/adapters/notion-html/block-adapter.js +1 -1
  357. package/dist/_pkgs/affine-shared/adapters/notion-html/delta-converter.js +1 -1
  358. package/dist/_pkgs/affine-shared/adapters/plain-text/block-adapter.js +1 -1
  359. package/dist/_pkgs/affine-shared/adapters/plain-text/delta-converter.js +1 -1
  360. package/dist/_pkgs/affine-shared/adapters/types/delta-converter.d.ts +1 -0
  361. package/dist/_pkgs/affine-shared/adapters/utils/color.d.ts +24 -0
  362. package/dist/_pkgs/affine-shared/adapters/utils/color.js +283 -0
  363. package/dist/_pkgs/affine-shared/adapters/utils/index.d.ts +1 -0
  364. package/dist/_pkgs/affine-shared/adapters/utils/index.js +1 -0
  365. package/dist/_pkgs/affine-shared/commands/block-crud/get-selected-blocks.js +10 -2
  366. package/dist/_pkgs/affine-shared/commands/model-crud/draft-selected-models.js +1 -1
  367. package/dist/_pkgs/affine-shared/commands/selection/focus-block-end.js +1 -1
  368. package/dist/_pkgs/affine-shared/commands/selection/focus-block-start.js +1 -1
  369. package/dist/_pkgs/affine-shared/consts/index.d.ts +10 -0
  370. package/dist/_pkgs/affine-shared/consts/index.js +10 -0
  371. package/dist/_pkgs/affine-shared/services/artefact-catalogue-service.d.ts +55 -0
  372. package/dist/_pkgs/affine-shared/services/artefact-catalogue-service.js +35 -0
  373. package/dist/_pkgs/affine-shared/services/audit-service.d.ts +311 -0
  374. package/dist/_pkgs/affine-shared/services/audit-service.js +228 -0
  375. package/dist/_pkgs/affine-shared/services/command-usage-service.d.ts +31 -0
  376. package/dist/_pkgs/affine-shared/services/command-usage-service.js +109 -0
  377. package/dist/_pkgs/affine-shared/services/comment-service/block-comment-manager.js +1 -1
  378. package/dist/_pkgs/affine-shared/services/doc-display-meta-service.js +1 -1
  379. package/dist/_pkgs/affine-shared/services/edit-props-store.d.ts +7 -0
  380. package/dist/_pkgs/affine-shared/services/edit-props-store.js +11 -0
  381. package/dist/_pkgs/affine-shared/services/embed-iframe/embed-iframe-config.js +1 -1
  382. package/dist/_pkgs/affine-shared/services/font-loader/font-loader-service.d.ts +26 -1
  383. package/dist/_pkgs/affine-shared/services/font-loader/font-loader-service.js +124 -7
  384. package/dist/_pkgs/affine-shared/services/index.d.ts +7 -0
  385. package/dist/_pkgs/affine-shared/services/index.js +7 -0
  386. package/dist/_pkgs/affine-shared/services/pivot-materiality-publisher.d.ts +129 -0
  387. package/dist/_pkgs/affine-shared/services/pivot-materiality-publisher.js +312 -0
  388. package/dist/_pkgs/affine-shared/services/pivot-properties-service.d.ts +217 -0
  389. package/dist/_pkgs/affine-shared/services/pivot-properties-service.js +114 -0
  390. package/dist/_pkgs/affine-shared/services/telemetry-service/code-block.d.ts +1 -1
  391. package/dist/_pkgs/affine-shared/services/telemetry-service/lifecycle.d.ts +255 -1
  392. package/dist/_pkgs/affine-shared/services/telemetry-service/telemetry-service.d.ts +2 -2
  393. package/dist/_pkgs/affine-shared/services/telemetry-service/types.d.ts +6 -1
  394. package/dist/_pkgs/affine-shared/services/toolbar-service/action.d.ts +10 -0
  395. package/dist/_pkgs/affine-shared/services/toolbar-service/index.d.ts +1 -0
  396. package/dist/_pkgs/affine-shared/services/toolbar-service/index.js +1 -0
  397. package/dist/_pkgs/affine-shared/services/toolbar-service/layout.d.ts +134 -0
  398. package/dist/_pkgs/affine-shared/services/toolbar-service/layout.js +146 -0
  399. package/dist/_pkgs/affine-shared/services/toolbar-service/registry.d.ts +44 -0
  400. package/dist/_pkgs/affine-shared/services/toolbar-service/registry.js +161 -3
  401. package/dist/_pkgs/affine-shared/services/translation-service/index.d.ts +68 -0
  402. package/dist/_pkgs/affine-shared/services/translation-service/index.js +39 -0
  403. package/dist/_pkgs/affine-shared/services/universe-tag-defs-service.d.ts +155 -0
  404. package/dist/_pkgs/affine-shared/services/universe-tag-defs-service.js +256 -0
  405. package/dist/_pkgs/affine-shared/test-utils/affine-template.js +1 -1
  406. package/dist/_pkgs/affine-shared/utils/dom/point-to-range.d.ts +4 -0
  407. package/dist/_pkgs/affine-shared/utils/dom/point-to-range.js +58 -2
  408. package/dist/_pkgs/affine-shared/utils/dom/viewport.d.ts +60 -0
  409. package/dist/_pkgs/affine-shared/utils/dom/viewport.js +58 -0
  410. package/dist/_pkgs/affine-shared/utils/edgeless.js +1 -1
  411. package/dist/_pkgs/affine-shared/utils/file/filesys.d.ts +34 -0
  412. package/dist/_pkgs/affine-shared/utils/file/filesys.js +48 -7
  413. package/dist/_pkgs/affine-shared/utils/print-to-pdf.d.ts +21 -0
  414. package/dist/_pkgs/affine-shared/utils/print-to-pdf.js +166 -32
  415. package/dist/_pkgs/affine-shared/utils/zod-schema.d.ts +7 -0
  416. package/dist/_pkgs/affine-shared/utils/zod-schema.js +25 -1
  417. package/dist/_pkgs/affine-widget-drag-handle/utils.js +1 -1
  418. package/dist/_pkgs/affine-widget-drag-handle/watchers/edgeless-watcher.d.ts +19 -10
  419. package/dist/_pkgs/affine-widget-drag-handle/watchers/edgeless-watcher.js +122 -23
  420. package/dist/_pkgs/affine-widget-drag-handle/watchers/pointer-event-watcher.d.ts +2 -0
  421. package/dist/_pkgs/affine-widget-drag-handle/watchers/pointer-event-watcher.js +25 -4
  422. package/dist/_pkgs/affine-widget-edgeless-auto-connect/index.js +1 -1
  423. package/dist/_pkgs/affine-widget-edgeless-dragging-area/edgeless-dragging-area-rect.js +1 -1
  424. package/dist/_pkgs/affine-widget-edgeless-selected-rect/auto-complete-panel.js +10 -5
  425. package/dist/_pkgs/affine-widget-edgeless-selected-rect/edgeless-auto-complete.d.ts +15 -1
  426. package/dist/_pkgs/affine-widget-edgeless-selected-rect/edgeless-auto-complete.js +37 -32
  427. package/dist/_pkgs/affine-widget-edgeless-selected-rect/edgeless-element-link.js +5 -4
  428. package/dist/_pkgs/affine-widget-edgeless-selected-rect/edgeless-selected-rect.js +19 -9
  429. package/dist/_pkgs/affine-widget-edgeless-selected-rect/utils.d.ts +16 -2
  430. package/dist/_pkgs/affine-widget-edgeless-selected-rect/utils.js +19 -2
  431. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/artefact-catalogue-default.d.ts +14 -0
  432. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/artefact-catalogue-default.js +40 -0
  433. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/artefact-catalogue-widget.d.ts +158 -0
  434. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/artefact-catalogue-widget.js +572 -0
  435. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/catalogue-groups.d.ts +46 -0
  436. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/catalogue-groups.js +66 -0
  437. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/chord-format.d.ts +13 -0
  438. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/chord-format.js +50 -0
  439. package/dist/_pkgs/affine-widget-edgeless-toolbar/edgeless-toolbar.d.ts +6 -0
  440. package/dist/_pkgs/affine-widget-edgeless-toolbar/edgeless-toolbar.js +15 -5
  441. package/dist/_pkgs/affine-widget-edgeless-toolbar/effects.d.ts +2 -0
  442. package/dist/_pkgs/affine-widget-edgeless-toolbar/effects.js +2 -0
  443. package/dist/_pkgs/affine-widget-edgeless-toolbar/extension/index.d.ts +7 -0
  444. package/dist/_pkgs/affine-widget-edgeless-toolbar/index.d.ts +5 -0
  445. package/dist/_pkgs/affine-widget-edgeless-toolbar/index.js +5 -0
  446. package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/command-menu.d.ts +57 -0
  447. package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/command-menu.js +140 -0
  448. package/dist/_pkgs/affine-widget-edgeless-toolbar/view.js +9 -0
  449. package/dist/_pkgs/affine-widget-frame-title/edgeless-frame-title-editor.js +4 -1
  450. package/dist/_pkgs/affine-widget-keyboard-toolbar/icons.js +98 -98
  451. package/dist/_pkgs/affine-widget-keyboard-toolbar/keyboard-tool-panel.js +1 -1
  452. package/dist/_pkgs/affine-widget-linked-doc/import-doc/import-doc.js +1 -1
  453. package/dist/_pkgs/affine-widget-linked-doc/linked-doc-popover.js +2 -15
  454. package/dist/_pkgs/affine-widget-linked-doc/transformers/markdown.d.ts +10 -1
  455. package/dist/_pkgs/affine-widget-linked-doc/transformers/markdown.js +133 -6
  456. package/dist/_pkgs/affine-widget-linked-doc/transformers/utils.d.ts +10 -0
  457. package/dist/_pkgs/affine-widget-linked-doc/transformers/utils.js +120 -3
  458. package/dist/_pkgs/affine-widget-linked-doc/utils.d.ts +12 -0
  459. package/dist/_pkgs/affine-widget-linked-doc/utils.js +33 -0
  460. package/dist/_pkgs/affine-widget-page-dragging-area/index.js +1 -1
  461. package/dist/_pkgs/affine-widget-remote-selection/doc/doc-remote-selection.js +1 -1
  462. package/dist/_pkgs/affine-widget-remote-selection/edgeless/index.js +6 -4
  463. package/dist/_pkgs/affine-widget-slash-menu/slash-menu-popover.js +8 -4
  464. package/dist/_pkgs/affine-widget-slash-menu/utils.d.ts +9 -0
  465. package/dist/_pkgs/affine-widget-slash-menu/utils.js +24 -0
  466. package/dist/_pkgs/affine-widget-toolbar/toolbar.d.ts +6 -0
  467. package/dist/_pkgs/affine-widget-toolbar/toolbar.js +40 -8
  468. package/dist/_pkgs/affine-widget-toolbar/utils.d.ts +146 -3
  469. package/dist/_pkgs/affine-widget-toolbar/utils.js +744 -58
  470. package/dist/_pkgs/data-view/core/common/property-menu.js +3 -16
  471. package/dist/_pkgs/data-view/core/component/tags/multi-tag-select.d.ts +4 -0
  472. package/dist/_pkgs/data-view/core/component/tags/multi-tag-select.js +28 -1
  473. package/dist/_pkgs/data-view/core/data-view.d.ts +3 -1
  474. package/dist/_pkgs/data-view/core/data-view.js +25 -3
  475. package/dist/_pkgs/data-view/core/detail/field.js +2 -2
  476. package/dist/_pkgs/data-view/core/detail/selection.d.ts +4 -2
  477. package/dist/_pkgs/data-view/core/detail/selection.js +23 -7
  478. package/dist/_pkgs/data-view/core/effect.js +2 -0
  479. package/dist/_pkgs/data-view/core/filter/eval.js +36 -23
  480. package/dist/_pkgs/data-view/core/filter/filter-fn/matcher.d.ts +7 -0
  481. package/dist/_pkgs/data-view/core/filter/filter-fn/matcher.js +12 -0
  482. package/dist/_pkgs/data-view/core/group-by/compare-date-keys.d.ts +11 -0
  483. package/dist/_pkgs/data-view/core/group-by/compare-date-keys.js +55 -0
  484. package/dist/_pkgs/data-view/core/group-by/define.d.ts +6 -0
  485. package/dist/_pkgs/data-view/core/group-by/define.js +114 -0
  486. package/dist/_pkgs/data-view/core/group-by/matcher.d.ts +7 -0
  487. package/dist/_pkgs/data-view/core/group-by/matcher.js +13 -0
  488. package/dist/_pkgs/data-view/core/group-by/renderer/boolean-group.js +11 -11
  489. package/dist/_pkgs/data-view/core/group-by/renderer/date-group.d.ts +9 -0
  490. package/dist/_pkgs/data-view/core/group-by/renderer/date-group.js +97 -0
  491. package/dist/_pkgs/data-view/core/group-by/setting.js +86 -7
  492. package/dist/_pkgs/data-view/core/group-by/trait.d.ts +34 -0
  493. package/dist/_pkgs/data-view/core/group-by/trait.js +106 -10
  494. package/dist/_pkgs/data-view/core/utils/menu-title.js +17 -17
  495. package/dist/_pkgs/data-view/property-presets/multi-select/cell-renderer.js +3 -1
  496. package/dist/_pkgs/data-view/property-presets/number/define.js +2 -1
  497. package/dist/_pkgs/data-view/property-presets/select/cell-renderer.js +3 -1
  498. package/dist/_pkgs/data-view/view-presets/calendar/calendar-view-manager.d.ts +70 -0
  499. package/dist/_pkgs/data-view/view-presets/calendar/calendar-view-manager.js +449 -0
  500. package/dist/_pkgs/data-view/view-presets/calendar/define.d.ts +10 -0
  501. package/dist/_pkgs/data-view/view-presets/calendar/define.js +27 -0
  502. package/dist/_pkgs/data-view/view-presets/calendar/effect.d.ts +1 -0
  503. package/dist/_pkgs/data-view/view-presets/calendar/effect.js +4 -0
  504. package/dist/_pkgs/data-view/view-presets/calendar/index.d.ts +6 -0
  505. package/dist/_pkgs/data-view/view-presets/calendar/index.js +6 -0
  506. package/dist/_pkgs/data-view/view-presets/calendar/layout.d.ts +37 -0
  507. package/dist/_pkgs/data-view/view-presets/calendar/layout.js +138 -0
  508. package/dist/_pkgs/data-view/view-presets/calendar/pc/actions.d.ts +7 -0
  509. package/dist/_pkgs/data-view/view-presets/calendar/pc/actions.js +64 -0
  510. package/dist/_pkgs/data-view/view-presets/calendar/pc/dnd.d.ts +32 -0
  511. package/dist/_pkgs/data-view/view-presets/calendar/pc/dnd.js +159 -0
  512. package/dist/_pkgs/data-view/view-presets/calendar/pc/effect.d.ts +1 -0
  513. package/dist/_pkgs/data-view/view-presets/calendar/pc/effect.js +7 -0
  514. package/dist/_pkgs/data-view/view-presets/calendar/pc/hit-test.d.ts +1 -0
  515. package/dist/_pkgs/data-view/view-presets/calendar/pc/hit-test.js +28 -0
  516. package/dist/_pkgs/data-view/view-presets/calendar/pc/styles.d.ts +1 -0
  517. package/dist/_pkgs/data-view/view-presets/calendar/pc/styles.js +707 -0
  518. package/dist/_pkgs/data-view/view-presets/calendar/pc/view.d.ts +89 -0
  519. package/dist/_pkgs/data-view/view-presets/calendar/pc/view.js +849 -0
  520. package/dist/_pkgs/data-view/view-presets/calendar/renderer.d.ts +2 -0
  521. package/dist/_pkgs/data-view/view-presets/calendar/renderer.js +8 -0
  522. package/dist/_pkgs/data-view/view-presets/calendar/source.d.ts +8 -0
  523. package/dist/_pkgs/data-view/view-presets/calendar/source.js +3 -0
  524. package/dist/_pkgs/data-view/view-presets/calendar/types.d.ts +79 -0
  525. package/dist/_pkgs/data-view/view-presets/calendar/types.js +1 -0
  526. package/dist/_pkgs/data-view/view-presets/convert.js +28 -0
  527. package/dist/_pkgs/data-view/view-presets/effect.js +2 -0
  528. package/dist/_pkgs/data-view/view-presets/index.d.ts +2 -0
  529. package/dist/_pkgs/data-view/view-presets/index.js +3 -0
  530. package/dist/_pkgs/data-view/view-presets/kanban/kanban-view-manager.js +3 -1
  531. package/dist/_pkgs/data-view/view-presets/kanban/mobile/cell.js +2 -2
  532. package/dist/_pkgs/data-view/view-presets/table/collapsed-state.d.ts +18 -0
  533. package/dist/_pkgs/data-view/view-presets/table/collapsed-state.js +36 -0
  534. package/dist/_pkgs/data-view/view-presets/table/mobile/cell.js +2 -2
  535. package/dist/_pkgs/data-view/view-presets/table/mobile/group.d.ts +11 -0
  536. package/dist/_pkgs/data-view/view-presets/table/mobile/group.js +89 -4
  537. package/dist/_pkgs/data-view/view-presets/table/pc/cell.d.ts +3 -0
  538. package/dist/_pkgs/data-view/view-presets/table/pc/cell.js +11 -2
  539. package/dist/_pkgs/data-view/view-presets/table/pc/controller/hotkeys.d.ts +1 -0
  540. package/dist/_pkgs/data-view/view-presets/table/pc/controller/hotkeys.js +39 -33
  541. package/dist/_pkgs/data-view/view-presets/table/pc/group.d.ts +10 -0
  542. package/dist/_pkgs/data-view/view-presets/table/pc/group.js +86 -5
  543. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/controller/hotkeys.d.ts +1 -0
  544. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/controller/hotkeys.js +39 -33
  545. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/group/top/group-title.js +18 -18
  546. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/row/cell.d.ts +3 -0
  547. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/row/cell.js +8 -0
  548. package/dist/_pkgs/data-view/view-presets/table/table-view-manager.js +3 -1
  549. package/dist/_pkgs/data-view/view-presets/table/utils.d.ts +3 -0
  550. package/dist/_pkgs/data-view/view-presets/table/utils.js +16 -1
  551. package/dist/_pkgs/data-view/widget-presets/tools/presets/view-options/view-options.js +3 -1
  552. package/dist/_pkgs/global/gfx/curve.js +4 -3
  553. package/dist/_pkgs/std/clipboard/clipboard.js +13 -3
  554. package/dist/_pkgs/std/clipboard/utils.d.ts +5 -0
  555. package/dist/_pkgs/std/clipboard/utils.js +10 -0
  556. package/dist/_pkgs/std/event/dispatcher.js +27 -1
  557. package/dist/_pkgs/std/event/keymap.js +16 -6
  558. package/dist/_pkgs/std/extension/command-registry.d.ts +475 -0
  559. package/dist/_pkgs/std/extension/command-registry.js +431 -0
  560. package/dist/_pkgs/std/extension/dnd/index.d.ts +1 -1
  561. package/dist/_pkgs/std/extension/index.d.ts +2 -0
  562. package/dist/_pkgs/std/extension/index.js +2 -0
  563. package/dist/_pkgs/std/extension/shortcut.js +2 -1
  564. package/dist/_pkgs/std/extension/translation-manifest.d.ts +49 -0
  565. package/dist/_pkgs/std/extension/translation-manifest.js +71 -0
  566. package/dist/_pkgs/std/gfx/grid.js +1 -1
  567. package/dist/_pkgs/std/gfx/index.d.ts +7 -3
  568. package/dist/_pkgs/std/gfx/index.js +6 -2
  569. package/dist/_pkgs/std/gfx/interactivity/gfx-view-event-handler.js +6 -1
  570. package/dist/_pkgs/std/gfx/interactivity/manager.d.ts +8 -0
  571. package/dist/_pkgs/std/gfx/interactivity/manager.js +18 -0
  572. package/dist/_pkgs/std/gfx/layer.d.ts +1 -1
  573. package/dist/_pkgs/std/gfx/layer.js +1 -2
  574. package/dist/_pkgs/std/gfx/model/surface/decorators/field.js +9 -0
  575. package/dist/_pkgs/std/gfx/model/surface/decorators/index.d.ts +2 -2
  576. package/dist/_pkgs/std/gfx/model/surface/decorators/index.js +2 -2
  577. package/dist/_pkgs/std/gfx/model/surface/decorators/local.d.ts +14 -0
  578. package/dist/_pkgs/std/gfx/model/surface/decorators/local.js +22 -0
  579. package/dist/_pkgs/std/gfx/model/surface/decorators/observer.d.ts +2 -0
  580. package/dist/_pkgs/std/gfx/model/surface/decorators/observer.js +40 -1
  581. package/dist/_pkgs/std/gfx/model/surface/element-model.d.ts +442 -0
  582. package/dist/_pkgs/std/gfx/model/surface/element-model.js +510 -25
  583. package/dist/_pkgs/std/gfx/model/surface/pivot.d.ts +48 -0
  584. package/dist/_pkgs/std/gfx/model/surface/pivot.js +34 -0
  585. package/dist/_pkgs/std/gfx/model/surface/role.d.ts +153 -0
  586. package/dist/_pkgs/std/gfx/model/surface/role.js +117 -0
  587. package/dist/_pkgs/std/gfx/model/surface/surface-model.d.ts +70 -0
  588. package/dist/_pkgs/std/gfx/model/surface/surface-model.js +305 -17
  589. package/dist/_pkgs/std/gfx/model/surface/tags.d.ts +77 -0
  590. package/dist/_pkgs/std/gfx/model/surface/tags.js +246 -0
  591. package/dist/_pkgs/std/gfx/perf.d.ts +10 -0
  592. package/dist/_pkgs/std/gfx/perf.js +30 -0
  593. package/dist/_pkgs/std/gfx/selection.js +1 -1
  594. package/dist/_pkgs/std/gfx/tool/tool-controller.d.ts +13 -0
  595. package/dist/_pkgs/std/gfx/tool/tool-controller.js +26 -0
  596. package/dist/_pkgs/std/gfx/viewport.d.ts +12 -0
  597. package/dist/_pkgs/std/gfx/viewport.js +20 -2
  598. package/dist/_pkgs/std/inline/extensions/inline-manager.js +1 -1
  599. package/dist/_pkgs/std/inline/extensions/markdown-matcher.js +1 -1
  600. package/dist/_pkgs/std/inline/services/event.d.ts +2 -0
  601. package/dist/_pkgs/std/inline/services/event.js +96 -21
  602. package/dist/_pkgs/std/utils/layer.js +2 -6
  603. package/dist/_pkgs/std/utils/tree.d.ts +14 -0
  604. package/dist/_pkgs/std/utils/tree.js +59 -8
  605. package/dist/_pkgs/std/view/element/gfx-block-component.js +23 -13
  606. package/dist/_pkgs/store/extension/workspace/workspace-meta.d.ts +10 -0
  607. package/dist/_pkgs/store/model/block/flat-sync-controller.js +2 -12
  608. package/dist/_pkgs/store/model/store/crud.js +10 -4
  609. package/dist/_pkgs/store/reactive/flat-native-y/index.d.ts +1 -1
  610. package/dist/_pkgs/store/reactive/flat-native-y/index.js +24 -2
  611. package/dist/commands.d.ts +58 -0
  612. package/dist/commands.js +66 -0
  613. package/dist/extensions/command-telemetry.d.ts +21 -0
  614. package/dist/extensions/command-telemetry.js +89 -0
  615. package/dist/extensions/command-usage.d.ts +23 -0
  616. package/dist/extensions/command-usage.js +37 -0
  617. package/dist/extensions/store.d.ts +9 -4
  618. package/dist/extensions/store.js +27 -24
  619. package/dist/extensions/view.d.ts +9 -4
  620. package/dist/extensions/view.js +35 -8
  621. package/dist/flags.d.ts +98 -21
  622. package/dist/flags.js +103 -22
  623. package/dist/frameworks.d.ts +45 -0
  624. package/dist/frameworks.js +186 -0
  625. package/dist/schemas.d.ts +8 -5
  626. package/dist/schemas.js +28 -32
  627. package/dist/shortcuts.d.ts +16 -16
  628. package/dist/shortcuts.js +8 -36
  629. package/dist/translations.d.ts +56 -0
  630. package/dist/translations.js +200 -0
  631. package/package.json +16 -4
  632. package/dist/_pkgs/affine-block-root/keyboard/shortcuts.d.ts +0 -8
  633. package/dist/_pkgs/affine-block-root/keyboard/shortcuts.js +0 -48
  634. package/dist/_pkgs/affine-gfx-shape/shortcuts.d.ts +0 -6
  635. package/dist/_pkgs/affine-gfx-shape/shortcuts.js +0 -28
  636. package/dist/_pkgs/data-view/core/utils/cache.d.ts +0 -5
  637. package/dist/_pkgs/data-view/core/utils/cache.js +0 -28
@@ -0,0 +1,1004 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { TelemetryProvider, translateKey } from '../../affine-shared/services/index.js';
36
+ import { overlayScale, overlayViewportSize, toOverlayCoord, } from '../../affine-shared/utils/index.js';
37
+ import { WidgetComponent, WidgetViewExtension } from '../../std/index.js';
38
+ import { GfxControllerIdentifier, RoleVocabularyIdentifier, } from '../../std/gfx/index.js';
39
+ import { effect } from '@preact/signals-core';
40
+ import { css, html, nothing, unsafeCSS } from 'lit';
41
+ import { state } from 'lit/decorators.js';
42
+ import { styleMap } from 'lit/directives/style-map.js';
43
+ import { literal, unsafeStatic } from 'lit/static-html.js';
44
+ import { anchorEmphasis, distinctByRule, resolveViolationAnchors, touchesVerdict, userFacingViolations, ValidationManager, VIOLATION_BADGE_SIZE, VIOLATION_MARK_COLOR, VIOLATION_MARK_PADDING, } from './validation.js';
45
+ export const VIOLATION_DETAIL_WIDGET = 'affine-violation-detail-widget';
46
+ /**
47
+ * The bubble is TEXT, so it stays in screen pixels while the markers that open
48
+ * it scale with the board. A tooltip rendered at a quarter size is not a
49
+ * smaller tooltip, it is an unreadable one — the same reasoning that puts the
50
+ * markers in model units puts the prose in screen units.
51
+ */
52
+ const BUBBLE_WIDTH = 280;
53
+ const BUBBLE_GAP = 12;
54
+ const BUBBLE_MAX_HEIGHT = 320;
55
+ /**
56
+ * Screen-pixel floor for anything clickable. The VISUAL is strictly model
57
+ * space; this is invisible padding around it, so a badge drawn three pixels
58
+ * wide at zoom 0.2 can still be hit with a thumb.
59
+ *
60
+ * 44 px is the figure the repo already uses for canvas affordances —
61
+ * `edgeless-auto-complete` wraps a 24 px arrow in a 44 px-tall hit box.
62
+ */
63
+ const MIN_HIT_TARGET = 44;
64
+ /**
65
+ * Outward thickness, in screen pixels, of the invisible band that makes the
66
+ * BRACKET clickable while it is on screen.
67
+ *
68
+ * Outward only, never inward: the bracket rings an element the user is very
69
+ * likely to want to grab and drag back where it belongs, and a hit surface
70
+ * covering the anchor's whole area would make that element unclickable for the
71
+ * three seconds the mark lasts — trading a readable board for an unusable one.
72
+ * The band is the mark, not the thing the mark points at.
73
+ */
74
+ const BRACKET_HIT_BAND = 22;
75
+ /**
76
+ * Chrome wording, and only chrome: an English default so a catalogue-less
77
+ * playground reads correctly. A RULE's wording never gets a default — see
78
+ * {@link translateKey}.
79
+ *
80
+ * Exported because it is DATA, and the translation-key manifest walks it under
81
+ * the `com.labre.validation.severity.` prefix rather than restating the three
82
+ * wordings a second time. The keys behind a template literal are the ones a
83
+ * source scan cannot check; making the table the single declaration is what
84
+ * removes the question. Same for {@link EXEMPTION_FALLBACK}.
85
+ */
86
+ export const SEVERITY_FALLBACK = {
87
+ 'blocking-overridable': 'Blocking',
88
+ warning: 'Warning',
89
+ audit: 'Audit',
90
+ };
91
+ /** What the badge says of an excused violation, per scope of the exception. */
92
+ export const EXEMPTION_FALLBACK = {
93
+ element: 'Exception',
94
+ map: 'Exception (whole map)',
95
+ };
96
+ /**
97
+ * What the bubble calls each kind of authority a rule can claim
98
+ * ({@link RuleProvenance}).
99
+ *
100
+ * The one wording in this file that changes what a finding MEANS rather than
101
+ * how it looks: "Standard" tells an architect the diagram breaks a published
102
+ * specification, "Labre convention" tells them it does not. An external review
103
+ * of the BPMN pack asked for exactly this line, because a house style shown
104
+ * without it reads as a norm violation — and a tool that cannot be trusted on
105
+ * that distinction is a tool an architect stops believing.
106
+ *
107
+ * The word only; the CITATION beside it is the rule's own `reference`, rendered
108
+ * verbatim and never translated (a page number is the same in every language).
109
+ *
110
+ * Exported for the same reason {@link SEVERITY_FALLBACK} is: the manifest walks
111
+ * this table under `com.labre.validation.provenance.` instead of restating four
112
+ * wordings a source scan could not check behind a template key.
113
+ */
114
+ export const PROVENANCE_FALLBACK = {
115
+ standard: 'Standard',
116
+ recommendation: 'Recommendation',
117
+ 'labre-convention': 'Labre convention',
118
+ organization: 'Organisation rule',
119
+ };
120
+ /**
121
+ * The PERSISTENT half of the PF7 affordance, and the restitution behind it.
122
+ *
123
+ * `ValidationOverlay` flashes a bracket when a violation appears and fades it
124
+ * out a few seconds later. What survives that fade is this: a small amber
125
+ * badge pinned to the anchor for as long as the violation holds, and — on
126
+ * click — a bubble naming what is wrong.
127
+ *
128
+ * WHERE on the anchor follows what the anchor IS: the top-right corner of a
129
+ * box, the MIDDLE of a link. A diagonal connector's bounding box is a rectangle
130
+ * whose corners are on empty paper, and a badge there accuses the white space
131
+ * next to the trait rather than the trait (PO, 02/08). The choice is made once,
132
+ * in `validation.ts`, by the anchor's `kind`.
133
+ *
134
+ * ## Why DOM and not the canvas overlay
135
+ *
136
+ * Because it is clickable. Widgets render into the root block's
137
+ * `.widgets-container`, which covers the canvas; the container itself is
138
+ * `pointer-events: none` but explicitly re-enables them on each widget host
139
+ * (`.widgets-container > * { pointer-events: auto }`). What keeps the canvas
140
+ * usable is therefore not that rule but the host's geometry: it is an
141
+ * absolutely positioned, zero-sized box at the viewport origin, so it has no
142
+ * area to intercept anything and only its positioned children are hit. That is
143
+ * the house pattern for an affordance that takes clicks over the canvas
144
+ * (`edgeless-element-link`, whose hover bubble this one is modelled on,
145
+ * `edgeless-auto-connect`, `note-slicer`).
146
+ * Stopping the pointer pair there (see {@link ViolationDetailWidget._swallow})
147
+ * keeps the click off the element underneath, with no special case in
148
+ * `DefaultTool` and no change to the edgeless event dispatcher.
149
+ *
150
+ * ## Sizing
151
+ *
152
+ * Both markers are sized in MODEL units and multiplied by the board's own
153
+ * scale on the way to the screen, so they shrink with it instead of swelling —
154
+ * see the note on the mark constants in `validation.ts`. The exception is the
155
+ * hit area: a transparent box with a screen-pixel floor around the model-sized
156
+ * visual, so a badge three pixels wide stays reachable. That split is the
157
+ * `edgeless-auto-complete` pattern (a 24 px arrow inside a 44 px target).
158
+ *
159
+ * ## Sequencing
160
+ *
161
+ * The badge is shown only for anchors whose {@link anchorEmphasis} has reached
162
+ * zero — i.e. whose bracket has finished fading. While the bracket is up the
163
+ * widget renders an invisible band over it instead, so the mark on the canvas
164
+ * is clickable and opens the same bubble. The two markers are never on screen
165
+ * together.
166
+ *
167
+ * ## Exceptions (PF8)
168
+ *
169
+ * Every line of the bubble carries the way out of the rule it names — one
170
+ * click, never a detour through a settings panel. Taking it writes an exception
171
+ * on the elements the rule indicts, and the finding switches to "exception":
172
+ * it drops out of the flash and out of the bracket, keeps a muted badge, and
173
+ * keeps its line in the bubble with a **Revoke** that puts it back. Nothing is
174
+ * ever hidden — the board stays honest about the gaps it was told to live with.
175
+ *
176
+ * The second, wider way out — "ignore this rule on the whole map" — appears
177
+ * only once the same call has been made elsewhere on the board (PF8.4), and
178
+ * writes the exception on the framework's own background element.
179
+ *
180
+ * ## What it knows
181
+ *
182
+ * No rule LOGIC, and no hard-coded rule wording — the library must not put
183
+ * words in a framework's mouth. It consumes normalised {@link Violation}
184
+ * objects off `ValidationManager.violations$` and resolves their `messageKey`
185
+ * through the host's catalogue ({@link translateKey}), falling back to the raw
186
+ * key.
187
+ *
188
+ * The one thing it reads off the RULE rather than off the finding is
189
+ * {@link ValidationRule.provenance} — whether the sentence above it restates a
190
+ * published standard, a linter's recommendation, or a Labre house style. It is
191
+ * looked up by `ruleId` through {@link ValidationManager.ruleOf}, the same path
192
+ * this widget already walks to name a finding's framework when it reports an
193
+ * exception, and it is still declared data rather than logic: the widget
194
+ * chooses the LABEL for a source it is handed, and prints the citation
195
+ * verbatim.
196
+ */
197
+ let ViolationDetailWidget = (() => {
198
+ let _classSuper = WidgetComponent;
199
+ let __openAnchorId_decorators;
200
+ let __openAnchorId_initializers = [];
201
+ let __openAnchorId_extraInitializers = [];
202
+ let __violations_decorators;
203
+ let __violations_initializers = [];
204
+ let __violations_extraInitializers = [];
205
+ return class ViolationDetailWidget extends _classSuper {
206
+ constructor() {
207
+ super(...arguments);
208
+ this.#_openAnchorId_accessor_storage = __runInitializers(this, __openAnchorId_initializers, null);
209
+ this.#_violations_accessor_storage = (__runInitializers(this, __openAnchorId_extraInitializers), __runInitializers(this, __violations_initializers, []));
210
+ this._elementSubscription = (__runInitializers(this, __violations_extraInitializers), null);
211
+ /** The surface {@link _elementSubscription} is attached to, if any. */
212
+ this._watchedSurface = null;
213
+ /** Fires once, when the oldest bracket finishes fading and a badge is due. */
214
+ this._handoverTimer = null;
215
+ this._onDocumentPointerDown = (event) => {
216
+ if (this._openAnchorId === null)
217
+ return;
218
+ // Anything inside this widget — the badge itself, the bubble — keeps it
219
+ // open; a click anywhere else, canvas included, closes it.
220
+ if (event.composedPath().includes(this))
221
+ return;
222
+ this._openAnchorId = null;
223
+ };
224
+ /**
225
+ * Escape is listened for on the EDITOR HOST, not on `document`.
226
+ *
227
+ * The handler swallows the key so that, with a bubble open, Escape dismisses
228
+ * the bubble rather than clearing the canvas selection behind it — and a
229
+ * library has no business making that call for the whole page. Scoped to the
230
+ * host, the host application keeps its own global Escape (close the modal,
231
+ * leave full screen) whatever this widget is doing.
232
+ */
233
+ this._onHostKeydown = (event) => {
234
+ if (this._openAnchorId === null || event.key !== 'Escape')
235
+ return;
236
+ event.stopPropagation();
237
+ this._openAnchorId = null;
238
+ };
239
+ /**
240
+ * While a bubble is open, the CANVAS does not take the wheel (PO, 02/08).
241
+ *
242
+ * The bug it fixes has two halves and one cause. `EdgelessRootBlock` handles
243
+ * `wheel` off the event dispatcher, which listens on the editor host, and its
244
+ * handler `preventDefault()`s unconditionally before panning. So a wheel over
245
+ * an overflowing bubble (a) never scrolled the bubble, because the default
246
+ * action was cancelled on its way past, and (b) panned the board, which closed
247
+ * the bubble on `viewportUpdated` — the finding became unreadable at exactly
248
+ * the length it most needed reading.
249
+ *
250
+ * The fix is one CAPTURE-phase listener on the editor host that stops the
251
+ * event before it can reach any bubble-phase handler on that host — the
252
+ * dispatcher's included. What it deliberately does NOT do:
253
+ *
254
+ * - no `preventDefault()`. The default action is precisely what has to
255
+ * survive: it is what scrolls the bubble. Cancelling it globally is the bug,
256
+ * not the fix.
257
+ * - nothing on `document`. Outside the editor host the page keeps its wheel,
258
+ * like it keeps its Escape ({@link _onHostKeydown}) — a library does not
259
+ * freeze somebody else's page because one of its bubbles is open.
260
+ * - nothing while the bubble is closed. The listener is registered for the
261
+ * widget's lifetime and returns on the first line, so a board with no
262
+ * finding open behaves exactly as it did.
263
+ *
264
+ * The board is frozen wherever the pointer is, not only over the bubble, and
265
+ * that is the PO's call: the gesture belongs to the thing being read until it
266
+ * is dismissed, and dismissing it is one click anywhere.
267
+ */
268
+ this._onHostWheel = (event) => {
269
+ if (this._openAnchorId === null)
270
+ return;
271
+ event.stopPropagation();
272
+ };
273
+ /**
274
+ * The edgeless `click` is SYNTHESISED by the event dispatcher from a
275
+ * `pointerdown`/`pointerup` pair observed on the editor host, and the tool
276
+ * then picks its target by coordinate — not by DOM target. Swallowing the
277
+ * native `click` would therefore not be enough: the pointer pair alone is
278
+ * what selects the element sitting under the badge (and starts dragging it).
279
+ *
280
+ * Stopping the pair on the affordance is what makes it click-through safe,
281
+ * and it costs nothing else: the dispatcher listens on an ancestor, so
282
+ * everything that is not aimed at the mark is untouched.
283
+ */
284
+ this._swallow = (event) => {
285
+ event.stopPropagation();
286
+ };
287
+ this._toggle = (anchorId) => (event) => {
288
+ event.stopPropagation();
289
+ this._openAnchorId = this._openAnchorId === anchorId ? null : anchorId;
290
+ };
291
+ /** Open on the bracket, never toggle: a second click on a fading mark that
292
+ * has just been replaced by a badge would read as the bubble refusing to
293
+ * open. */
294
+ this._open = (anchorId) => (event) => {
295
+ event.stopPropagation();
296
+ this._openAnchorId = anchorId;
297
+ };
298
+ this._exception = (violations, scope, granted) => (event) => {
299
+ event.stopPropagation();
300
+ this._setException(violations, scope, granted);
301
+ };
302
+ }
303
+ static {
304
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
305
+ __openAnchorId_decorators = [state()];
306
+ __violations_decorators = [state()];
307
+ __esDecorate(this, null, __openAnchorId_decorators, { kind: "accessor", name: "_openAnchorId", static: false, private: false, access: { has: obj => "_openAnchorId" in obj, get: obj => obj._openAnchorId, set: (obj, value) => { obj._openAnchorId = value; } }, metadata: _metadata }, __openAnchorId_initializers, __openAnchorId_extraInitializers);
308
+ __esDecorate(this, null, __violations_decorators, { kind: "accessor", name: "_violations", static: false, private: false, access: { has: obj => "_violations" in obj, get: obj => obj._violations, set: (obj, value) => { obj._violations = value; } }, metadata: _metadata }, __violations_initializers, __violations_extraInitializers);
309
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
310
+ }
311
+ static { this.styles = css `
312
+ /* Above edgeless-selected-rect (z-index 1), whose north-east resize handle
313
+ lands exactly where the badge does and would otherwise bury it — widget
314
+ hosts are siblings, so a tie is settled by registration order, which
315
+ nothing guarantees. Still well below the toolbars. */
316
+ :host {
317
+ position: absolute;
318
+ top: 0;
319
+ left: 0;
320
+ z-index: 2;
321
+ pointer-events: none;
322
+ }
323
+
324
+ /* ...except while a bubble is open, when it is the frontmost thing on the
325
+ board (PO, 02/08: the bubble opened UNDER the element toolbar and could
326
+ not be read).
327
+
328
+ The whole HOST is raised rather than the bubble alone, because a z-index
329
+ of its own makes the host a stacking context and the bubble can never
330
+ climb out of it. What comes up with it is a handful of amber dots, for
331
+ exactly as long as the user is reading one of them — and they are already
332
+ drawn over the canvas. The bubble is a transient, click-away read, so it
333
+ outranks the toolbars the way a popover does, plus one so it also clears
334
+ an element toolbar sitting at the popover level itself. */
335
+ :host([data-bubble-open]) {
336
+ z-index: calc(var(--affine-z-index-popover, 1000) + 1);
337
+ }
338
+
339
+ /* Transparent hit box with a screen-pixel floor; the amber dot inside it
340
+ is the model-sized visual. */
341
+ .violation-badge {
342
+ position: absolute;
343
+ display: flex;
344
+ align-items: center;
345
+ justify-content: center;
346
+ box-sizing: border-box;
347
+ border: none;
348
+ padding: 0;
349
+ background: transparent;
350
+ cursor: pointer;
351
+ pointer-events: auto;
352
+ transform: translate(-50%, -50%);
353
+ }
354
+
355
+ .violation-badge-dot {
356
+ display: block;
357
+ box-sizing: border-box;
358
+ border-radius: 50%;
359
+ background: ${unsafeCSS(VIOLATION_MARK_COLOR)};
360
+ box-shadow: var(--affine-shadow-1);
361
+ }
362
+
363
+ .violation-badge:hover .violation-badge-dot,
364
+ .violation-badge[aria-expanded='true'] .violation-badge-dot {
365
+ filter: brightness(1.1);
366
+ }
367
+
368
+ .violation-badge:focus-visible .violation-badge-dot {
369
+ outline: 2px solid var(--affine-primary-color);
370
+ outline-offset: 2px;
371
+ }
372
+
373
+ /* One of the four invisible strips that make the canvas bracket clickable
374
+ while it is on screen. Outward of the anchor only — never over it. */
375
+ .violation-bracket-hit {
376
+ position: absolute;
377
+ background: transparent;
378
+ border: none;
379
+ padding: 0;
380
+ cursor: pointer;
381
+ pointer-events: auto;
382
+ }
383
+
384
+ .violation-bubble {
385
+ position: absolute;
386
+ box-sizing: border-box;
387
+ width: ${unsafeCSS(BUBBLE_WIDTH)}px;
388
+ max-height: ${unsafeCSS(BUBBLE_MAX_HEIGHT)}px;
389
+ overflow-y: auto;
390
+ /* The wheel stops here: what is under the bubble never scrolls because
391
+ it was reached through the bubble. Belt to the braces of the wheel
392
+ guard, which stops the CANVAS from taking the gesture at all. */
393
+ overscroll-behavior: contain;
394
+ padding: 12px;
395
+ border-radius: 8px;
396
+ border: 1px solid var(--affine-border-color);
397
+ background: var(--affine-background-overlay-panel-color, #fff);
398
+ box-shadow: var(--affine-shadow-2);
399
+ color: var(--affine-text-primary-color);
400
+ font-family: var(--affine-font-family);
401
+ font-size: 14px;
402
+ line-height: 1.4;
403
+ pointer-events: auto;
404
+ }
405
+
406
+ .violation-entry + .violation-entry {
407
+ margin-top: 12px;
408
+ padding-top: 12px;
409
+ border-top: 1px solid var(--affine-border-color);
410
+ }
411
+
412
+ .violation-severity {
413
+ display: inline-block;
414
+ margin-bottom: 4px;
415
+ padding: 1px 6px;
416
+ border-radius: 4px;
417
+ background: var(--affine-hover-color);
418
+ color: var(--affine-text-secondary-color);
419
+ font-size: 11px;
420
+ text-transform: uppercase;
421
+ letter-spacing: 0.04em;
422
+ }
423
+
424
+ .violation-severity[data-severity='blocking-overridable'] {
425
+ color: var(--affine-error-color, #eb4335);
426
+ }
427
+
428
+ .violation-message {
429
+ overflow-wrap: anywhere;
430
+ }
431
+
432
+ .violation-suggestion {
433
+ margin-top: 4px;
434
+ color: var(--affine-text-secondary-color);
435
+ font-size: 13px;
436
+ overflow-wrap: anywhere;
437
+ }
438
+
439
+ /* Where the rule's authority comes from. Discreet on purpose: it is
440
+ context for the sentence above it, not a second finding — one line,
441
+ secondary colour, below the suggestion and above the way out. */
442
+ .violation-provenance {
443
+ margin-top: 6px;
444
+ color: var(--affine-text-secondary-color);
445
+ font-size: 12px;
446
+ overflow-wrap: anywhere;
447
+ }
448
+
449
+ /* The LABEL carries the weight, because it is the word that decides how
450
+ much an architect has to care. The citation beside it stays plain. */
451
+ .violation-provenance-source {
452
+ font-weight: 600;
453
+ }
454
+
455
+ /* "No rule is a wall": the way out is on the message, one click away, and
456
+ never behind a settings panel (PF8.1). */
457
+ .violation-actions {
458
+ display: flex;
459
+ flex-wrap: wrap;
460
+ gap: 8px;
461
+ margin-top: 8px;
462
+ }
463
+
464
+ .violation-action {
465
+ padding: 2px 8px;
466
+ border-radius: 4px;
467
+ border: 1px solid var(--affine-border-color);
468
+ background: transparent;
469
+ color: var(--affine-text-secondary-color);
470
+ font-family: inherit;
471
+ font-size: 12px;
472
+ cursor: pointer;
473
+ }
474
+
475
+ .violation-action:hover {
476
+ background: var(--affine-hover-color);
477
+ color: var(--affine-text-primary-color);
478
+ }
479
+
480
+ .violation-action:focus-visible {
481
+ outline: 2px solid var(--affine-primary-color);
482
+ outline-offset: 1px;
483
+ }
484
+
485
+ .violation-state {
486
+ display: inline-block;
487
+ margin-bottom: 4px;
488
+ margin-left: 6px;
489
+ padding: 1px 6px;
490
+ border-radius: 4px;
491
+ background: var(--affine-hover-color);
492
+ color: var(--affine-text-secondary-color);
493
+ font-size: 11px;
494
+ text-transform: uppercase;
495
+ letter-spacing: 0.04em;
496
+ }
497
+ `; }
498
+ #_openAnchorId_accessor_storage;
499
+ /**
500
+ * The anchor whose bubble is open, or `null`. Purely local UI state: which
501
+ * findings a user has looked at is nobody's business but this session's.
502
+ */
503
+ get _openAnchorId() { return this.#_openAnchorId_accessor_storage; }
504
+ set _openAnchorId(value) { this.#_openAnchorId_accessor_storage = value; }
505
+ #_violations_accessor_storage;
506
+ get _violations() { return this.#_violations_accessor_storage; }
507
+ set _violations(value) { this.#_violations_accessor_storage = value; }
508
+ get gfx() {
509
+ return this.std.get(GfxControllerIdentifier);
510
+ }
511
+ /**
512
+ * Every role vocabulary registered in this assembly, for the semantic half of
513
+ * "is this anchor an edge" — a link is marked in its MIDDLE, a box on its
514
+ * corner. Read on demand rather than cached: a framework's vocabulary arrives
515
+ * with its always-on render extension, and the registry is a map lookup.
516
+ */
517
+ get _vocabularies() {
518
+ return [...this.std.provider.getAll(RoleVocabularyIdentifier).values()];
519
+ }
520
+ get _timeline() {
521
+ return this.std.getOptional(ValidationManager)?.timeline ?? null;
522
+ }
523
+ /**
524
+ * Wake up at the exact instant the bracket hands over.
525
+ *
526
+ * The canvas half repaints itself on animation frames while it fades; the DOM
527
+ * half has nothing to react to, because no violation changed — only time
528
+ * passed. One timer, set to the earliest expiry and re-armed after each
529
+ * render, is all it takes; there is nothing to arm once every mark has
530
+ * settled, so a quiet board runs no clock.
531
+ */
532
+ _scheduleHandover() {
533
+ if (this._handoverTimer) {
534
+ clearTimeout(this._handoverTimer);
535
+ this._handoverTimer = null;
536
+ }
537
+ const timeline = this._timeline;
538
+ if (!timeline || this._violations.length === 0)
539
+ return;
540
+ const now = performance.now();
541
+ const expiry = timeline.nextExpiryAt(now);
542
+ if (expiry === null)
543
+ return;
544
+ this._handoverTimer = setTimeout(() => {
545
+ this._handoverTimer = null;
546
+ this.requestUpdate();
547
+ }, Math.max(0, expiry - now));
548
+ }
549
+ /**
550
+ * Follow a moving anchor, but only while something is flagged. On a clean
551
+ * board — the overwhelming majority of boards, and every board with no
552
+ * framework enabled — this subscription does not exist, so the busiest
553
+ * signal on the surface costs the widget nothing.
554
+ *
555
+ * Idempotent on purpose: `violations$` is handed a freshly built array on
556
+ * every 120 ms re-evaluation, so this runs constantly while a violation
557
+ * holds and must not tear the subscription down and rebuild it each time.
558
+ */
559
+ _watchElements() {
560
+ const surface = this._violations.length > 0 ? this.gfx.surface : null;
561
+ if (surface === this._watchedSurface)
562
+ return;
563
+ this._elementSubscription?.unsubscribe();
564
+ this._elementSubscription = null;
565
+ this._watchedSurface = surface;
566
+ if (!surface)
567
+ return;
568
+ // Same filter the engine uses: only a prop that can move an anchor is
569
+ // worth a repaint. `SpotlightManager` writes `opacity` on every element it
570
+ // dims, and that must not redraw a badge that has not moved.
571
+ // `requestUpdate` is batched by lit into one render per frame anyway.
572
+ this._elementSubscription = surface.elementUpdated.subscribe(payload => {
573
+ if (!touchesVerdict(payload))
574
+ return;
575
+ this.requestUpdate();
576
+ });
577
+ }
578
+ /**
579
+ * Forget the open bubble once its anchor stops being flagged.
580
+ *
581
+ * Not cosmetic: `render` would already skip a bubble whose anchor is gone,
582
+ * but a STALE `_openAnchorId` would silently match again if the same group
583
+ * were broken a second time, and the bubble would reappear on its own,
584
+ * unasked. A correction closes the bubble for good.
585
+ */
586
+ _closeIfAnchorGone() {
587
+ if (this._openAnchorId === null)
588
+ return;
589
+ const surface = this.gfx.surface;
590
+ // "Still flagged" means still carrying a LIVE finding: an anchor whose
591
+ // findings have all been excused no longer draws a badge, so a bubble left
592
+ // open on it would float with nothing underneath it.
593
+ const stillFlagged = surface !== null &&
594
+ resolveViolationAnchors(this._violations, surface, this._vocabularies).some(anchor => anchor.id === this._openAnchorId &&
595
+ anchor.violations.some(v => v.exemption === undefined));
596
+ if (!stillFlagged)
597
+ this._openAnchorId = null;
598
+ }
599
+ /**
600
+ * `WithDisposable` throws the disposable group away on disconnect and starts
601
+ * a fresh one on reconnect, while lit runs `firstUpdated` exactly once — so
602
+ * wiring set up there and nowhere else never comes back if the widget is
603
+ * detached and re-attached, and a persistent finding indicator would go
604
+ * silently dead. Wiring lives in one idempotent method, called from both.
605
+ */
606
+ _wire() {
607
+ const { _disposables, gfx } = this;
608
+ const validation = this.std.getOptional(ValidationManager);
609
+ if (validation) {
610
+ _disposables.add(effect(() => {
611
+ const next = userFacingViolations(validation.violations$.value);
612
+ // Stay still on a clean board: the effect runs once on creation, and
613
+ // assigning a new empty array there would re-render the widget from
614
+ // inside its own first update for nothing.
615
+ if (next.length === 0 && this._violations.length === 0)
616
+ return;
617
+ this._violations = next;
618
+ this._watchElements();
619
+ this._closeIfAnchorGone();
620
+ }));
621
+ }
622
+ _disposables.add(gfx.viewport.viewportUpdated.subscribe(() => {
623
+ // Badges follow the viewport; the bubble does not. Closing it on
624
+ // pan/zoom is the honest simple answer — it can never end up pointing
625
+ // at a badge that has moved, scrolled off screen or changed size.
626
+ this._openAnchorId = null;
627
+ if (this._violations.length > 0)
628
+ this.requestUpdate();
629
+ }));
630
+ // Click-away stays on `document` — it only OBSERVES, never swallows, so a
631
+ // click anywhere in the page can close the bubble without the library
632
+ // taking anything from the host.
633
+ document.addEventListener('pointerdown', this._onDocumentPointerDown, true);
634
+ const host = this.std.host;
635
+ host.addEventListener('keydown', this._onHostKeydown, true);
636
+ host.addEventListener('wheel', this._onHostWheel, true);
637
+ _disposables.add(() => {
638
+ document.removeEventListener('pointerdown', this._onDocumentPointerDown, true);
639
+ host.removeEventListener('keydown', this._onHostKeydown, true);
640
+ host.removeEventListener('wheel', this._onHostWheel, true);
641
+ this._elementSubscription?.unsubscribe();
642
+ this._elementSubscription = null;
643
+ this._watchedSurface = null;
644
+ if (this._handoverTimer) {
645
+ clearTimeout(this._handoverTimer);
646
+ this._handoverTimer = null;
647
+ }
648
+ });
649
+ }
650
+ connectedCallback() {
651
+ super.connectedCallback();
652
+ // First connection is handled by `firstUpdated`, when `std` is guaranteed
653
+ // to have arrived through the lit context.
654
+ if (this.hasUpdated)
655
+ this._wire();
656
+ }
657
+ firstUpdated() {
658
+ this._wire();
659
+ }
660
+ /**
661
+ * Mirror "a bubble is open" onto the host as an attribute, so the stylesheet
662
+ * can raise the whole host over the toolbars for the duration (see the
663
+ * `:host([data-bubble-open])` rule). An attribute rather than an inline
664
+ * `z-index` because the value belongs with the other stacking decisions, in
665
+ * one place, next to the reason it exists.
666
+ */
667
+ updated() {
668
+ this.toggleAttribute('data-bubble-open', this._openAnchorId !== null);
669
+ }
670
+ /**
671
+ * Roughly how tall the bubble will be, to decide WHETHER to flip. It only
672
+ * has to be good enough to pick a side; once flipped, the transform pins the
673
+ * bottom edge exactly, so an underestimate cannot push content off screen.
674
+ */
675
+ _estimateBubbleHeight(entries) {
676
+ const padding = 24;
677
+ // Message, optional hint, severity chip and the action row underneath it.
678
+ const perEntry = 100;
679
+ // ...plus one line for each entry that will actually SHOW a provenance,
680
+ // asked the same way the render asks it. A framework whose rules declare
681
+ // none must not have the bubble reserve room for a line it never draws.
682
+ const provenanceLine = 18;
683
+ const validation = this.std.getOptional(ValidationManager);
684
+ const cited = entries.filter(entry => validation?.ruleOf(entry.ruleId)?.provenance !== undefined).length;
685
+ return Math.min(BUBBLE_MAX_HEIGHT, padding + Math.max(1, entries.length) * perEntry + cited * provenanceLine);
686
+ }
687
+ _severityLabel(severity) {
688
+ return translateKey(this.std, `com.labre.validation.severity.${severity}`, SEVERITY_FALLBACK[severity]);
689
+ }
690
+ /**
691
+ * The one line saying where the rule behind a finding gets its authority.
692
+ *
693
+ * Resolved through {@link ValidationManager.ruleOf}, which is the path this
694
+ * widget already uses to name a finding's framework when it reports an
695
+ * exception — the bubble consumes normalised {@link Violation}s and knows
696
+ * nothing about rules, so the manager is the only place a rule can come from.
697
+ *
698
+ * Rendered ONLY when the rule declares one. A rule that says nothing about
699
+ * its provenance gets no line and no invented one: the library must not put
700
+ * an authority in a framework's mouth any more than it puts words there
701
+ * (see {@link translateKey}). That is also why the fallback is chrome-only —
702
+ * the LABEL is ours, the citation is the framework's, and the citation is
703
+ * printed exactly as declared rather than translated.
704
+ */
705
+ _renderProvenance(ruleId) {
706
+ const provenance = this.std
707
+ .getOptional(ValidationManager)
708
+ ?.ruleOf(ruleId)?.provenance;
709
+ if (provenance === undefined)
710
+ return nothing;
711
+ const { source, reference } = provenance;
712
+ const label = translateKey(this.std, `com.labre.validation.provenance.${source}`, PROVENANCE_FALLBACK[source]);
713
+ return html `<div
714
+ class="violation-provenance"
715
+ data-testid="violation-provenance"
716
+ data-provenance=${source}
717
+ >
718
+ <span class="violation-provenance-source">${label}</span>${reference
719
+ ? html ` — ${reference}`
720
+ : nothing}
721
+ </div>`;
722
+ }
723
+ /**
724
+ * Grant or revoke, then report it.
725
+ *
726
+ * The AUTHOR is deliberately not filled in here: the library has no seam for
727
+ * "who am I" (`UserProvider` resolves an id, it does not hand one out), and
728
+ * inventing one for this would be a bigger change than the feature. The field
729
+ * and `ValidationManager.setException` both carry the parameter, so a host
730
+ * that knows its user can populate it without a schema change.
731
+ */
732
+ _setException(violations, scope, granted) {
733
+ const validation = this.std.getOptional(ValidationManager);
734
+ if (!validation)
735
+ return;
736
+ const written = validation.setException(violations, scope, granted);
737
+ // A gesture that changed nothing is not an arbitration and is not reported.
738
+ if (written.length === 0)
739
+ return;
740
+ const ruleId = violations[0].ruleId;
741
+ const framework = validation.ruleOf(ruleId)?.framework;
742
+ this.std
743
+ .getOptional(TelemetryProvider)
744
+ ?.track(granted ? 'ValidationExceptionGranted' : 'ValidationExceptionRevoked', {
745
+ page: 'whiteboard editor',
746
+ segment: 'whiteboard',
747
+ module: 'validation bubble',
748
+ control: granted ? 'ignore rule' : 'revoke exception',
749
+ ruleId,
750
+ ...(framework !== undefined ? { framework } : {}),
751
+ scope,
752
+ elementCount: written.length,
753
+ });
754
+ }
755
+ /**
756
+ * Whether the user has already made this same call elsewhere on the board.
757
+ *
758
+ * PF8.4 offers "ignore this rule on the whole map" only once the choice has
759
+ * been REPEATED — the first exception is a local judgement about one element,
760
+ * and pre-emptively offering to disarm a rule everywhere would turn a
761
+ * one-element decision into a map-wide one nobody asked for.
762
+ *
763
+ * Read off the ENGINE's own output — another finding of the same rule, on
764
+ * another element, that an exception already covers. Scanning the surface for
765
+ * elements merely carrying the key would count things that are not decisions:
766
+ * a neutral rectangle pasted from another board with a residual
767
+ * `validationExceptions` entry is never evaluated by this rule, so it must
768
+ * never be read as the user having arbitrated on it.
769
+ */
770
+ _isRepeated(violations) {
771
+ const ruleId = violations[0].ruleId;
772
+ const here = new Set(violations);
773
+ return this._violations.some(violation => !here.has(violation) &&
774
+ violation.ruleId === ruleId &&
775
+ violation.exemption !== undefined);
776
+ }
777
+ /**
778
+ * The one line the bubble shows for a rule, and the ways out of it.
779
+ *
780
+ * `violations` are every finding of that rule on this anchor — one bubble line
781
+ * can stand for several indicted members of a group, and one click settles all
782
+ * of them.
783
+ */
784
+ _renderEntry(entry, violations) {
785
+ const { exemption } = entry;
786
+ const action = (key, fallback, testid, scope, granted) => html `<button
787
+ class="violation-action"
788
+ type="button"
789
+ data-testid=${testid}
790
+ @pointerdown=${this._swallow}
791
+ @pointerup=${this._swallow}
792
+ @click=${this._exception(violations, scope, granted)}
793
+ >
794
+ ${translateKey(this.std, key, fallback)}
795
+ </button>`;
796
+ return html `<div class="violation-entry" data-exemption=${exemption ?? ''}>
797
+ <div class="violation-severity" data-severity=${entry.severity}>
798
+ ${this._severityLabel(entry.severity)}
799
+ </div>
800
+ ${exemption
801
+ ? html `<span class="violation-state" data-testid="violation-state"
802
+ >${translateKey(this.std, `com.labre.validation.state.exempted.${exemption}`, EXEMPTION_FALLBACK[exemption])}</span
803
+ >`
804
+ : nothing}
805
+ <div class="violation-message">
806
+ ${
807
+ // The FRAMEWORK's own wording when the host ships no catalogue, and
808
+ // the raw key when the framework shipped none either — the library
809
+ // still never invents the wording of somebody else's rule.
810
+ translateKey(this.std, entry.messageKey, entry.messageFallback)}
811
+ </div>
812
+ ${entry.suggestion
813
+ ? html `<div class="violation-suggestion">
814
+ ${translateKey(this.std, entry.suggestion, entry.suggestionFallback)}
815
+ </div>`
816
+ : nothing}
817
+ ${this._renderProvenance(entry.ruleId)}
818
+ <div class="violation-actions">
819
+ ${exemption
820
+ ? action('com.labre.validation.action.revoke', 'Revoke', 'violation-revoke', exemption, false)
821
+ : html `${action('com.labre.validation.action.ignore', 'Ignore this validation rule', 'violation-ignore', 'element', true)}
822
+ ${
823
+ // A family that measures against no background records no
824
+ // `backgroundId`, so there is no map to write the wider
825
+ // arbitration on and the action simply does not exist.
826
+ violations.some(violation => violation.backgroundId !== undefined) && this._isRepeated(violations)
827
+ ? action('com.labre.validation.action.ignore-map', 'Ignore this rule on the whole map', 'violation-ignore-map', 'map', true)
828
+ : nothing}`}
829
+ </div>
830
+ </div>`;
831
+ }
832
+ _renderBubble(violations, x, y) {
833
+ const entries = distinctByRule(violations);
834
+ const { viewport } = this.gfx;
835
+ // Flip rather than overflow the viewport. Horizontally the width is known,
836
+ // so the position is computed outright; vertically it is not, so the
837
+ // flipped bubble is pinned by its BOTTOM edge with a transform — exact
838
+ // whatever the content turns out to measure, where an estimate would leave
839
+ // a tall bubble hanging off the screen again.
840
+ //
841
+ // The edges are read in the same space the bubble is placed in — the
842
+ // widgets container, which the host may have scaled — rather than in the
843
+ // screen pixels `viewport.width` answers.
844
+ const [viewWidth, viewHeight] = overlayViewportSize(viewport);
845
+ const flipX = x + BUBBLE_GAP + BUBBLE_WIDTH > viewWidth;
846
+ const flipY = y + BUBBLE_GAP + this._estimateBubbleHeight(entries) > viewHeight;
847
+ return html `<div
848
+ class="violation-bubble"
849
+ role="dialog"
850
+ data-testid="violation-bubble"
851
+ data-flip-y=${flipY}
852
+ aria-label=${translateKey(this.std, 'com.labre.validation.bubble.label', 'Validation details')}
853
+ style=${styleMap({
854
+ left: flipX
855
+ ? `${x - BUBBLE_GAP - BUBBLE_WIDTH}px`
856
+ : `${x + BUBBLE_GAP}px`,
857
+ top: flipY ? `${y - BUBBLE_GAP}px` : `${y + BUBBLE_GAP}px`,
858
+ ...(flipY ? { transform: 'translateY(-100%)' } : {}),
859
+ })}
860
+ @pointerdown=${this._swallow}
861
+ @pointerup=${this._swallow}
862
+ @click=${this._swallow}
863
+ >
864
+ ${entries.map(entry => this._renderEntry(entry, violations.filter(violation => violation.ruleId === entry.ruleId)))}
865
+ </div>`;
866
+ }
867
+ /**
868
+ * Badge centre, in the CSS pixels of the widgets container.
869
+ *
870
+ * WHERE that is, per anchor kind, is `resolveViolationAnchors`' answer
871
+ * ({@link ViolationAnchor.markAt}) — a corner for a box, the middle of the
872
+ * trait for a link. Here it is one conversion of one model point, so the
873
+ * offsets scale with the mark instead of drifting away from it as the board
874
+ * is zoomed, and there is no second copy of the geometry to keep in step.
875
+ *
876
+ * Not `toViewCoord`: that answers in screen pixels, and the badge is drawn
877
+ * inside the container an embedding host may have scaled, so it states its
878
+ * placement the way the element it accuses does.
879
+ */
880
+ _badgeAt(anchor) {
881
+ return toOverlayCoord(this.gfx.viewport, anchor.markAt[0], anchor.markAt[1]);
882
+ }
883
+ _renderBadge(anchor, label) {
884
+ const [x, y] = this._badgeAt(anchor);
885
+ const visual = VIOLATION_BADGE_SIZE * overlayScale(this.gfx.viewport);
886
+ const target = Math.max(visual, MIN_HIT_TARGET);
887
+ const open = this._openAnchorId === anchor.id;
888
+ return html `<button
889
+ class="violation-badge"
890
+ type="button"
891
+ data-anchor-id=${anchor.id}
892
+ data-testid="violation-badge"
893
+ aria-expanded=${open}
894
+ aria-label=${label}
895
+ title=${label}
896
+ style=${styleMap({
897
+ left: `${x}px`,
898
+ top: `${y}px`,
899
+ width: `${target}px`,
900
+ height: `${target}px`,
901
+ })}
902
+ @pointerdown=${this._swallow}
903
+ @pointerup=${this._swallow}
904
+ @click=${this._toggle(anchor.id)}
905
+ >
906
+ <span
907
+ class="violation-badge-dot"
908
+ data-testid="violation-badge-dot"
909
+ style=${styleMap({ width: `${visual}px`, height: `${visual}px` })}
910
+ ></span>
911
+ </button>`;
912
+ }
913
+ /**
914
+ * Four invisible strips hugging the outside of the bracket, so the mark the
915
+ * user is looking at is the thing they can click.
916
+ *
917
+ * Strips rather than one box over the anchor: the interior belongs to the
918
+ * element, which stays selectable and draggable throughout — the three
919
+ * seconds the bracket lasts are exactly when someone is most likely to grab
920
+ * the node and put it back on the map.
921
+ */
922
+ _renderBracketHit(anchor, label) {
923
+ const { viewport } = this.gfx;
924
+ const { bound } = anchor;
925
+ const [left, top] = toOverlayCoord(viewport, bound.x - VIOLATION_MARK_PADDING, bound.y - VIOLATION_MARK_PADDING);
926
+ const [right, bottom] = toOverlayCoord(viewport, bound.maxX + VIOLATION_MARK_PADDING, bound.maxY + VIOLATION_MARK_PADDING);
927
+ const band = BRACKET_HIT_BAND;
928
+ const width = right - left;
929
+ const height = bottom - top;
930
+ const strips = [
931
+ {
932
+ left: left - band,
933
+ top: top - band,
934
+ width: width + band * 2,
935
+ height: band,
936
+ },
937
+ { left: left - band, top: bottom, width: width + band * 2, height: band },
938
+ { left: left - band, top, width: band, height },
939
+ { left: right, top, width: band, height },
940
+ ];
941
+ return strips.map(strip => html `<button
942
+ class="violation-bracket-hit"
943
+ type="button"
944
+ tabindex="-1"
945
+ aria-hidden="true"
946
+ data-anchor-id=${anchor.id}
947
+ data-testid="violation-bracket-hit"
948
+ title=${label}
949
+ style=${styleMap({
950
+ left: `${strip.left}px`,
951
+ top: `${strip.top}px`,
952
+ width: `${Math.max(0, strip.width)}px`,
953
+ height: `${Math.max(0, strip.height)}px`,
954
+ })}
955
+ @pointerdown=${this._swallow}
956
+ @pointerup=${this._swallow}
957
+ @click=${this._open(anchor.id)}
958
+ ></button>`);
959
+ }
960
+ render() {
961
+ if (this._violations.length === 0)
962
+ return nothing;
963
+ const surface = this.gfx.surface;
964
+ if (!surface)
965
+ return nothing;
966
+ // Anchors are resolved at render time, exactly like the canvas overlay
967
+ // resolves them at paint time: the marker follows a group that moves and
968
+ // falls back onto the element the moment the group is dissolved.
969
+ const anchors = resolveViolationAnchors(this._violations, surface, this._vocabularies);
970
+ const timeline = this._timeline;
971
+ const now = performance.now();
972
+ const label = translateKey(this.std, 'com.labre.validation.badge.label', 'Show validation details');
973
+ // Re-arm for the next handover; a render is the only moment we know one is
974
+ // still pending.
975
+ this._scheduleHandover();
976
+ return html `${anchors.map(anchor => {
977
+ // An anchor whose findings are ALL excused carries no marker: the user
978
+ // decided to live with them, and a permanent dot arguing with that
979
+ // decision is what the PO sent back. The way to take the arbitration back
980
+ // is the element's contextual toolbar (see `validation-toolbar.ts`) —
981
+ // selection, not a badge. A live finding on the same anchor still gets
982
+ // its amber badge, and its bubble still lists the excused ones with their
983
+ // state (PF8.3: nothing is hidden).
984
+ if (!anchor.violations.some(v => v.exemption === undefined)) {
985
+ return nothing;
986
+ }
987
+ // Strictly one marker at a time: while the bracket is still drawn the
988
+ // badge does not exist, and the bracket's own band takes the clicks.
989
+ const fresh = timeline
990
+ ? anchorEmphasis(anchor, timeline, now) > 0
991
+ : false;
992
+ const [badgeX, badgeY] = this._badgeAt(anchor);
993
+ return html `${fresh
994
+ ? this._renderBracketHit(anchor, label)
995
+ : this._renderBadge(anchor, label)}
996
+ ${this._openAnchorId === anchor.id
997
+ ? this._renderBubble(anchor.violations, badgeX, badgeY)
998
+ : nothing}`;
999
+ })}`;
1000
+ }
1001
+ };
1002
+ })();
1003
+ export { ViolationDetailWidget };
1004
+ export const violationDetailWidget = WidgetViewExtension('affine:page', VIOLATION_DETAIL_WIDGET, literal `${unsafeStatic(VIOLATION_DETAIL_WIDGET)}`);