@formicoidea/labre-core 0.31.0 → 0.32.0

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