@formicoidea/labre-core 0.41.0 → 0.43.1

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 (343) hide show
  1. package/LICENSE +384 -0
  2. package/dist/_pkgs/affine-block-bookmark/bookmark-block.js +2 -2
  3. package/dist/_pkgs/affine-block-data-view/configs/tooltips.js +1 -1
  4. package/dist/_pkgs/affine-block-database/configs/tooltips.js +1 -1
  5. package/dist/_pkgs/affine-block-edgeless-text/edgeless-text-block.js +4 -2
  6. package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/config.js +7 -1
  7. package/dist/_pkgs/affine-block-embed/common/iframe-sandbox.d.ts +39 -0
  8. package/dist/_pkgs/affine-block-embed/common/iframe-sandbox.js +39 -0
  9. package/dist/_pkgs/affine-block-embed/embed-figma-block/embed-figma-block.js +4 -1
  10. package/dist/_pkgs/affine-block-embed/embed-github-block/embed-github-block.js +2 -1
  11. package/dist/_pkgs/affine-block-embed/embed-iframe-block/components/embed-iframe-error-card.d.ts +14 -1
  12. package/dist/_pkgs/affine-block-embed/embed-iframe-block/components/embed-iframe-error-card.js +21 -2
  13. package/dist/_pkgs/affine-block-embed/embed-iframe-block/consts.js +2 -0
  14. package/dist/_pkgs/affine-block-embed/embed-iframe-block/embed-iframe-block.d.ts +2 -1
  15. package/dist/_pkgs/affine-block-embed/embed-iframe-block/embed-iframe-block.js +41 -11
  16. package/dist/_pkgs/affine-block-embed/embed-iframe-block/types.d.ts +16 -0
  17. package/dist/_pkgs/affine-block-embed/embed-iframe-block/types.js +17 -1
  18. package/dist/_pkgs/affine-block-embed/embed-iframe-block/utils.d.ts +8 -0
  19. package/dist/_pkgs/affine-block-embed/embed-iframe-block/utils.js +19 -0
  20. package/dist/_pkgs/affine-block-embed/embed-loom-block/embed-loom-block.js +4 -1
  21. package/dist/_pkgs/affine-block-embed/embed-youtube-block/embed-youtube-block.js +4 -1
  22. package/dist/_pkgs/affine-block-embed/index.d.ts +1 -0
  23. package/dist/_pkgs/affine-block-embed/index.js +1 -0
  24. package/dist/_pkgs/affine-block-embed/translations.d.ts +8 -0
  25. package/dist/_pkgs/affine-block-embed/translations.js +28 -0
  26. package/dist/_pkgs/affine-block-embed-doc/embed-linked-doc-block/embed-linked-doc-block.js +4 -2
  27. package/dist/_pkgs/affine-block-embed-doc/embed-synced-doc-block/embed-synced-doc-block.js +2 -2
  28. package/dist/_pkgs/affine-block-frame/frame-manager.js +6 -3
  29. package/dist/_pkgs/affine-block-frame/frame-tool.js +1 -1
  30. package/dist/_pkgs/affine-block-frame/frame-toolbar.js +6 -1
  31. package/dist/_pkgs/affine-block-list/list-keymap.js +7 -0
  32. package/dist/_pkgs/affine-block-list/utils/get-list-icon.js +3 -1
  33. package/dist/_pkgs/affine-block-note/configs/tooltips.js +1 -1
  34. package/dist/_pkgs/affine-block-note/note-keymap.js +7 -1
  35. package/dist/_pkgs/affine-block-paragraph/paragraph-keymap.js +7 -1
  36. package/dist/_pkgs/affine-block-root/adapters/html.js +2 -2
  37. package/dist/_pkgs/affine-block-root/commands/copy-link-commands.d.ts +2 -0
  38. package/dist/_pkgs/affine-block-root/commands/copy-link-commands.js +155 -0
  39. package/dist/_pkgs/affine-block-root/commands/pivot-commands.js +1 -8
  40. package/dist/_pkgs/affine-block-root/commands/tag-commands.js +1 -8
  41. package/dist/_pkgs/affine-block-root/edgeless/edgeless-keyboard.d.ts +9 -0
  42. package/dist/_pkgs/affine-block-root/edgeless/edgeless-keyboard.js +51 -0
  43. package/dist/_pkgs/affine-block-root/edgeless/edgeless-root-block.d.ts +22 -0
  44. package/dist/_pkgs/affine-block-root/edgeless/edgeless-root-block.js +46 -0
  45. package/dist/_pkgs/affine-block-root/edgeless/utils/pinch-zoom.d.ts +21 -0
  46. package/dist/_pkgs/affine-block-root/edgeless/utils/pinch-zoom.js +24 -0
  47. package/dist/_pkgs/affine-block-root/edgeless/utils/query.js +8 -0
  48. package/dist/_pkgs/affine-block-root/index.d.ts +1 -0
  49. package/dist/_pkgs/affine-block-root/index.js +1 -0
  50. package/dist/_pkgs/affine-block-root/keyboard/keymap.js +1 -16
  51. package/dist/_pkgs/affine-block-root/view.js +2 -0
  52. package/dist/_pkgs/affine-block-surface/element-model/index.d.ts +21 -3
  53. package/dist/_pkgs/affine-block-surface/element-model/index.js +14 -2
  54. package/dist/_pkgs/affine-block-surface/extensions/export-svg/command.d.ts +23 -0
  55. package/dist/_pkgs/affine-block-surface/extensions/export-svg/command.js +89 -0
  56. package/dist/_pkgs/affine-block-surface/extensions/export-svg/index.d.ts +7 -0
  57. package/dist/_pkgs/affine-block-surface/extensions/export-svg/index.js +5 -0
  58. package/dist/_pkgs/affine-block-surface/extensions/export-svg/render.d.ts +41 -0
  59. package/dist/_pkgs/affine-block-surface/extensions/export-svg/render.js +70 -0
  60. package/dist/_pkgs/affine-block-surface/extensions/export-svg/svg-context.d.ts +49 -0
  61. package/dist/_pkgs/affine-block-surface/extensions/export-svg/svg-context.js +257 -0
  62. package/dist/_pkgs/affine-block-surface/extensions/export-svg/tagged-path.d.ts +16 -0
  63. package/dist/_pkgs/affine-block-surface/extensions/export-svg/tagged-path.js +24 -0
  64. package/dist/_pkgs/affine-block-surface/extensions/export-svg/toolbar.d.ts +24 -0
  65. package/dist/_pkgs/affine-block-surface/extensions/export-svg/toolbar.js +66 -0
  66. package/dist/_pkgs/affine-block-surface/extensions/index.d.ts +4 -0
  67. package/dist/_pkgs/affine-block-surface/extensions/index.js +4 -0
  68. package/dist/_pkgs/affine-block-surface/extensions/interchange-import.d.ts +66 -4
  69. package/dist/_pkgs/affine-block-surface/extensions/interchange-import.js +253 -11
  70. package/dist/_pkgs/affine-block-surface/extensions/interchange.d.ts +18 -0
  71. package/dist/_pkgs/affine-block-surface/extensions/legend-toolbar.d.ts +81 -0
  72. package/dist/_pkgs/affine-block-surface/extensions/legend-toolbar.js +81 -0
  73. package/dist/_pkgs/affine-block-surface/extensions/legend.d.ts +144 -0
  74. package/dist/_pkgs/affine-block-surface/extensions/legend.js +495 -0
  75. package/dist/_pkgs/affine-block-surface/extensions/morph-toolbar.js +4 -0
  76. package/dist/_pkgs/affine-block-surface/extensions/reading-widget.d.ts +17 -3
  77. package/dist/_pkgs/affine-block-surface/extensions/reading-widget.js +35 -13
  78. package/dist/_pkgs/affine-block-surface/extensions/reading.d.ts +61 -1
  79. package/dist/_pkgs/affine-block-surface/extensions/reading.js +85 -39
  80. package/dist/_pkgs/affine-block-surface/extensions/record-action.d.ts +66 -0
  81. package/dist/_pkgs/affine-block-surface/extensions/record-action.js +145 -0
  82. package/dist/_pkgs/affine-block-surface/extensions/svg-sketch-translations.d.ts +3 -0
  83. package/dist/_pkgs/affine-block-surface/extensions/svg-sketch-translations.js +23 -0
  84. package/dist/_pkgs/affine-block-surface/extensions/svg-sketch.d.ts +1 -1
  85. package/dist/_pkgs/affine-block-surface/extensions/svg-sketch.js +12 -4
  86. package/dist/_pkgs/affine-block-surface/extensions/validation.d.ts +253 -28
  87. package/dist/_pkgs/affine-block-surface/extensions/validation.js +489 -41
  88. package/dist/_pkgs/affine-block-surface/framework-background/background-view.d.ts +115 -0
  89. package/dist/_pkgs/affine-block-surface/framework-background/background-view.js +185 -0
  90. package/dist/_pkgs/affine-block-surface/framework-background/fit.d.ts +36 -0
  91. package/dist/_pkgs/affine-block-surface/framework-background/fit.js +30 -0
  92. package/dist/_pkgs/affine-block-surface/framework-background/index.d.ts +2 -0
  93. package/dist/_pkgs/affine-block-surface/framework-background/index.js +2 -0
  94. package/dist/_pkgs/affine-block-surface/framework-background/labels.d.ts +16 -1
  95. package/dist/_pkgs/affine-block-surface/framework-background/labels.js +31 -21
  96. package/dist/_pkgs/affine-block-surface/framework-background/renderer.js +29 -5
  97. package/dist/_pkgs/affine-block-surface/framework-background/stacking.d.ts +6 -4
  98. package/dist/_pkgs/affine-block-surface/framework-background/stacking.js +56 -8
  99. package/dist/_pkgs/affine-block-surface/renderer/canvas-renderer.d.ts +12 -0
  100. package/dist/_pkgs/affine-block-surface/renderer/canvas-renderer.js +15 -0
  101. package/dist/_pkgs/affine-block-surface/renderer/element-highlight-overlay.js +2 -7
  102. package/dist/_pkgs/affine-block-surface/view.js +8 -1
  103. package/dist/_pkgs/affine-block-surface-ref/configs/slash-menu.js +1 -1
  104. package/dist/_pkgs/affine-block-surface-ref/configs/tooltips.js +2 -2
  105. package/dist/_pkgs/affine-components/color-picker/button.d.ts +56 -1
  106. package/dist/_pkgs/affine-components/color-picker/button.js +168 -23
  107. package/dist/_pkgs/affine-components/color-picker/framework-palette.d.ts +106 -0
  108. package/dist/_pkgs/affine-components/color-picker/framework-palette.js +177 -0
  109. package/dist/_pkgs/affine-components/color-picker/index.d.ts +2 -0
  110. package/dist/_pkgs/affine-components/color-picker/index.js +2 -0
  111. package/dist/_pkgs/affine-components/color-picker/palette-carousel.d.ts +85 -0
  112. package/dist/_pkgs/affine-components/color-picker/palette-carousel.js +445 -0
  113. package/dist/_pkgs/affine-components/color-picker/styles.js +1 -1
  114. package/dist/_pkgs/affine-components/context-menu/button.js +3 -1
  115. package/dist/_pkgs/affine-components/edgeless-shape-color-picker/color-picker.d.ts +31 -1
  116. package/dist/_pkgs/affine-components/edgeless-shape-color-picker/color-picker.js +189 -63
  117. package/dist/_pkgs/affine-components/icons/ai.js +3 -3
  118. package/dist/_pkgs/affine-components/icons/list.js +7 -1
  119. package/dist/_pkgs/affine-components/resource/resource.js +29 -16
  120. package/dist/_pkgs/affine-components/size-dropdown-menu/dropdown-menu.js +6 -1
  121. package/dist/_pkgs/affine-components/toolbar/index.d.ts +1 -1
  122. package/dist/_pkgs/affine-components/toolbar/index.js +1 -1
  123. package/dist/_pkgs/affine-components/toolbar/menu-button.d.ts +7 -0
  124. package/dist/_pkgs/affine-components/toolbar/menu-button.js +30 -0
  125. package/dist/_pkgs/affine-components/toolbar/picker-menu.d.ts +16 -1
  126. package/dist/_pkgs/affine-components/toolbar/picker-menu.js +2 -2
  127. package/dist/_pkgs/affine-components/toolbar/toolbar.d.ts +1 -0
  128. package/dist/_pkgs/affine-components/toolbar/toolbar.js +67 -0
  129. package/dist/_pkgs/affine-components/translations.d.ts +8 -0
  130. package/dist/_pkgs/affine-components/translations.js +17 -0
  131. package/dist/_pkgs/affine-foundation/view.js +2 -1
  132. package/dist/_pkgs/affine-fragment-frame-panel/card/frame-card-title-editor.js +1 -1
  133. package/dist/_pkgs/affine-fragment-frame-panel/card/frame-card.js +1 -1
  134. package/dist/_pkgs/affine-gfx-brush/element-renderer.js +2 -2
  135. package/dist/_pkgs/affine-gfx-brush/toolbar/components/eraser/icons.js +1 -1
  136. package/dist/_pkgs/affine-gfx-brush/toolbar/configs/brush.js +6 -1
  137. package/dist/_pkgs/affine-gfx-brush/toolbar/configs/highlighter.js +6 -1
  138. package/dist/_pkgs/affine-gfx-connector/connector-manager.d.ts +9 -1
  139. package/dist/_pkgs/affine-gfx-connector/connector-manager.js +61 -0
  140. package/dist/_pkgs/affine-gfx-connector/direction/direction-reveal.d.ts +11 -2
  141. package/dist/_pkgs/affine-gfx-connector/direction/direction-reveal.js +11 -2
  142. package/dist/_pkgs/affine-gfx-connector/element-renderer/connector-dom/index.d.ts +7 -1
  143. package/dist/_pkgs/affine-gfx-connector/element-renderer/connector-dom/index.js +87 -17
  144. package/dist/_pkgs/affine-gfx-connector/element-renderer/index.js +78 -17
  145. package/dist/_pkgs/affine-gfx-connector/element-renderer/utils.d.ts +24 -2
  146. package/dist/_pkgs/affine-gfx-connector/element-renderer/utils.js +31 -8
  147. package/dist/_pkgs/affine-gfx-connector/text/edgeless-connector-label-editor.d.ts +124 -3
  148. package/dist/_pkgs/affine-gfx-connector/text/edgeless-connector-label-editor.js +219 -56
  149. package/dist/_pkgs/affine-gfx-connector/text/text.d.ts +13 -4
  150. package/dist/_pkgs/affine-gfx-connector/text/text.js +13 -44
  151. package/dist/_pkgs/affine-gfx-connector/toolbar/config.d.ts +56 -0
  152. package/dist/_pkgs/affine-gfx-connector/toolbar/config.js +94 -10
  153. package/dist/_pkgs/affine-gfx-connector/toolbar/hollow-endpoint-icons.d.ts +8 -0
  154. package/dist/_pkgs/affine-gfx-connector/toolbar/hollow-endpoint-icons.js +118 -0
  155. package/dist/_pkgs/affine-gfx-connector/translations.d.ts +3 -0
  156. package/dist/_pkgs/affine-gfx-connector/translations.js +23 -0
  157. package/dist/_pkgs/affine-gfx-connector/view/view.d.ts +37 -1
  158. package/dist/_pkgs/affine-gfx-connector/view/view.js +97 -8
  159. package/dist/_pkgs/affine-gfx-group/command/group-api.js +1 -1
  160. package/dist/_pkgs/affine-gfx-group/store.js +0 -2
  161. package/dist/_pkgs/affine-gfx-group/translations.d.ts +9 -10
  162. package/dist/_pkgs/affine-gfx-group/translations.js +9 -13
  163. package/dist/_pkgs/affine-gfx-mindmap/indicator-overlay/index.js +6 -2
  164. package/dist/_pkgs/affine-gfx-mindmap/templates/index.js +1 -1
  165. package/dist/_pkgs/affine-gfx-mindmap/toolbar/basket-elements.js +1 -1
  166. package/dist/_pkgs/affine-gfx-mindmap/toolbar/config.js +4 -2
  167. package/dist/_pkgs/affine-gfx-mindmap/toolbar/utils/import-mindmap.js +2 -2
  168. package/dist/_pkgs/affine-gfx-mindmap/translations.d.ts +7 -1
  169. package/dist/_pkgs/affine-gfx-mindmap/translations.js +11 -1
  170. package/dist/_pkgs/affine-gfx-shape/element-renderer/highlighter.js +2 -2
  171. package/dist/_pkgs/affine-gfx-shape/overlay/polygon-drawing-overlay.d.ts +6 -0
  172. package/dist/_pkgs/affine-gfx-shape/overlay/polygon-drawing-overlay.js +30 -1
  173. package/dist/_pkgs/affine-gfx-shape/polygon-tool.d.ts +20 -1
  174. package/dist/_pkgs/affine-gfx-shape/polygon-tool.js +9 -1
  175. package/dist/_pkgs/affine-gfx-shape/toolbar/config.js +10 -3
  176. package/dist/_pkgs/affine-gfx-shape/toolbar/palette-color-action.js +11 -1
  177. package/dist/_pkgs/affine-gfx-shape/translations.d.ts +7 -0
  178. package/dist/_pkgs/affine-gfx-shape/translations.js +11 -0
  179. package/dist/_pkgs/affine-gfx-template/builtin/other.js +14 -8
  180. package/dist/_pkgs/affine-gfx-template/snapshot-from-action.js +32 -119
  181. package/dist/_pkgs/affine-gfx-template/toolbar/template-loading.js +1 -1
  182. package/dist/_pkgs/affine-gfx-template/toolbar/template-type.d.ts +1 -1
  183. package/dist/_pkgs/affine-gfx-template/translations.d.ts +5 -0
  184. package/dist/_pkgs/affine-gfx-template/translations.js +38 -0
  185. package/dist/_pkgs/affine-gfx-text/dblclick-add-edgeless-text.d.ts +13 -1
  186. package/dist/_pkgs/affine-gfx-text/dblclick-add-edgeless-text.js +19 -4
  187. package/dist/_pkgs/affine-gfx-text/edgeless-text-editor.d.ts +41 -0
  188. package/dist/_pkgs/affine-gfx-text/edgeless-text-editor.js +60 -4
  189. package/dist/_pkgs/affine-gfx-text/toolbar/actions.d.ts +8 -1
  190. package/dist/_pkgs/affine-gfx-text/toolbar/actions.js +14 -2
  191. package/dist/_pkgs/affine-gfx-text/translations.d.ts +9 -0
  192. package/dist/_pkgs/affine-gfx-text/translations.js +14 -1
  193. package/dist/_pkgs/affine-inline-latex/latex-node/latex-editor-menu.js +2 -1
  194. package/dist/_pkgs/affine-inline-preset/markdown.js +5 -1
  195. package/dist/_pkgs/affine-model/consts/connector.d.ts +28 -2
  196. package/dist/_pkgs/affine-model/consts/connector.js +26 -0
  197. package/dist/_pkgs/affine-model/consts/text.d.ts +15 -2
  198. package/dist/_pkgs/affine-model/consts/text.js +25 -1
  199. package/dist/_pkgs/affine-model/elements/bpmn/pool.js +1 -1
  200. package/dist/_pkgs/affine-model/elements/brush/brush.js +1 -1
  201. package/dist/_pkgs/affine-model/elements/c4/board.js +1 -1
  202. package/dist/_pkgs/affine-model/elements/c4/boundary.js +1 -1
  203. package/dist/_pkgs/affine-model/elements/connector/connector.d.ts +135 -0
  204. package/dist/_pkgs/affine-model/elements/connector/connector.js +246 -5
  205. package/dist/_pkgs/affine-model/elements/connector/end-label.d.ts +83 -0
  206. package/dist/_pkgs/affine-model/elements/connector/end-label.js +119 -0
  207. package/dist/_pkgs/affine-model/elements/connector/index.d.ts +1 -0
  208. package/dist/_pkgs/affine-model/elements/connector/index.js +1 -0
  209. package/dist/_pkgs/affine-model/elements/context-map/context-map.js +1 -1
  210. package/dist/_pkgs/affine-model/elements/core-domain/core-domain.d.ts +28 -0
  211. package/dist/_pkgs/affine-model/elements/core-domain/core-domain.js +129 -2
  212. package/dist/_pkgs/affine-model/elements/cynefin/cynefin.d.ts +8 -0
  213. package/dist/_pkgs/affine-model/elements/cynefin/cynefin.js +45 -2
  214. package/dist/_pkgs/affine-model/elements/edgy/board.js +1 -1
  215. package/dist/_pkgs/affine-model/elements/edgy/facets.js +1 -1
  216. package/dist/_pkgs/affine-model/elements/estuarine/estuarine.d.ts +6 -0
  217. package/dist/_pkgs/affine-model/elements/estuarine/estuarine.js +36 -2
  218. package/dist/_pkgs/affine-model/elements/event-storming/event-storming.d.ts +18 -7
  219. package/dist/_pkgs/affine-model/elements/event-storming/event-storming.js +23 -8
  220. package/dist/_pkgs/affine-model/elements/framework-background/background.d.ts +16 -0
  221. package/dist/_pkgs/affine-model/elements/framework-background/background.js +18 -0
  222. package/dist/_pkgs/affine-model/elements/highlighter/highlighter.js +1 -1
  223. package/dist/_pkgs/affine-model/elements/index.d.ts +8 -0
  224. package/dist/_pkgs/affine-model/elements/index.js +1 -0
  225. package/dist/_pkgs/affine-model/elements/shape/shape.js +1 -1
  226. package/dist/_pkgs/affine-model/elements/text/text.js +1 -1
  227. package/dist/_pkgs/affine-model/elements/uml/band.d.ts +39 -0
  228. package/dist/_pkgs/affine-model/elements/uml/band.js +31 -0
  229. package/dist/_pkgs/affine-model/elements/uml/diagram.d.ts +158 -0
  230. package/dist/_pkgs/affine-model/elements/uml/diagram.js +229 -0
  231. package/dist/_pkgs/affine-model/elements/uml/fragment.d.ts +161 -0
  232. package/dist/_pkgs/affine-model/elements/uml/fragment.js +205 -0
  233. package/dist/_pkgs/affine-model/elements/uml/index.d.ts +8 -0
  234. package/dist/_pkgs/affine-model/elements/uml/index.js +8 -0
  235. package/dist/_pkgs/affine-model/elements/uml/lifeline.d.ts +77 -0
  236. package/dist/_pkgs/affine-model/elements/uml/lifeline.js +89 -0
  237. package/dist/_pkgs/affine-model/elements/uml/node.d.ts +142 -0
  238. package/dist/_pkgs/affine-model/elements/uml/node.js +190 -0
  239. package/dist/_pkgs/affine-model/elements/uml/partition.d.ts +106 -0
  240. package/dist/_pkgs/affine-model/elements/uml/partition.js +172 -0
  241. package/dist/_pkgs/affine-model/elements/uml/region.d.ts +75 -0
  242. package/dist/_pkgs/affine-model/elements/uml/region.js +150 -0
  243. package/dist/_pkgs/affine-model/elements/uml/subject.d.ts +37 -0
  244. package/dist/_pkgs/affine-model/elements/uml/subject.js +108 -0
  245. package/dist/_pkgs/affine-model/elements/wardley/wardley.js +1 -1
  246. package/dist/_pkgs/affine-shared/services/embed-iframe/embed-iframe-config.d.ts +1 -0
  247. package/dist/_pkgs/affine-shared/services/font-loader/config.d.ts +18 -0
  248. package/dist/_pkgs/affine-shared/services/font-loader/config.js +82 -50
  249. package/dist/_pkgs/affine-shared/services/pivot-materiality-publisher.js +1 -9
  250. package/dist/_pkgs/affine-shared/services/telemetry-service/document-damage-watcher.d.ts +53 -0
  251. package/dist/_pkgs/affine-shared/services/telemetry-service/document-damage-watcher.js +95 -0
  252. package/dist/_pkgs/affine-shared/services/telemetry-service/index.d.ts +1 -0
  253. package/dist/_pkgs/affine-shared/services/telemetry-service/index.js +1 -0
  254. package/dist/_pkgs/affine-shared/services/telemetry-service/lifecycle.d.ts +26 -1
  255. package/dist/_pkgs/affine-shared/services/telemetry-service/telemetry-service.d.ts +2 -2
  256. package/dist/_pkgs/affine-shared/services/theme-service.d.ts +19 -0
  257. package/dist/_pkgs/affine-shared/services/theme-service.js +24 -0
  258. package/dist/_pkgs/affine-shared/services/toolbar-service/command-action.d.ts +34 -0
  259. package/dist/_pkgs/affine-shared/services/toolbar-service/command-action.js +63 -0
  260. package/dist/_pkgs/affine-shared/services/toolbar-service/index.d.ts +1 -0
  261. package/dist/_pkgs/affine-shared/services/toolbar-service/index.js +1 -0
  262. package/dist/_pkgs/affine-shared/services/translation-service/chrome.d.ts +97 -7
  263. package/dist/_pkgs/affine-shared/services/translation-service/chrome.js +178 -7
  264. package/dist/_pkgs/affine-shared/styles/index.d.ts +1 -0
  265. package/dist/_pkgs/affine-shared/styles/index.js +1 -0
  266. package/dist/_pkgs/affine-shared/styles/motion.d.ts +14 -0
  267. package/dist/_pkgs/affine-shared/styles/motion.js +38 -0
  268. package/dist/_pkgs/affine-shared/utils/event.d.ts +10 -0
  269. package/dist/_pkgs/affine-shared/utils/event.js +20 -0
  270. package/dist/_pkgs/affine-shared/utils/file/filesys.d.ts +16 -0
  271. package/dist/_pkgs/affine-shared/utils/file/filesys.js +25 -0
  272. package/dist/_pkgs/affine-shared/utils/index.d.ts +1 -0
  273. package/dist/_pkgs/affine-shared/utils/index.js +1 -0
  274. package/dist/_pkgs/affine-shared/utils/link-preview-refresh.d.ts +12 -0
  275. package/dist/_pkgs/affine-shared/utils/link-preview-refresh.js +13 -0
  276. package/dist/_pkgs/affine-widget-edgeless-dragging-area/edgeless-dragging-area-rect.js +2 -2
  277. package/dist/_pkgs/affine-widget-edgeless-selected-rect/utils.js +5 -1
  278. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/artefact-catalogue-widget.d.ts +12 -4
  279. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/artefact-catalogue-widget.js +27 -4
  280. package/dist/_pkgs/affine-widget-edgeless-toolbar/config/types.d.ts +15 -0
  281. package/dist/_pkgs/affine-widget-edgeless-toolbar/config/utils.d.ts +1 -1
  282. package/dist/_pkgs/affine-widget-edgeless-toolbar/config/utils.js +7 -2
  283. package/dist/_pkgs/affine-widget-edgeless-toolbar/create-popper.js +13 -0
  284. package/dist/_pkgs/affine-widget-edgeless-toolbar/index.d.ts +2 -0
  285. package/dist/_pkgs/affine-widget-edgeless-toolbar/index.js +2 -0
  286. package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/command-menu.d.ts +80 -0
  287. package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/command-menu.js +270 -81
  288. package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/senior-menu-selection.d.ts +15 -0
  289. package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/senior-menu-selection.js +15 -0
  290. package/dist/_pkgs/affine-widget-edgeless-toolbar/panel/font-family-panel.d.ts +18 -0
  291. package/dist/_pkgs/affine-widget-edgeless-toolbar/panel/font-family-panel.js +52 -6
  292. package/dist/_pkgs/affine-widget-edgeless-toolbar/panel/font-weight-and-style-panel.js +8 -1
  293. package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/artefact-ghost-overlay.d.ts +42 -0
  294. package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/artefact-ghost-overlay.js +100 -0
  295. package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/artefact-placement-tool.d.ts +100 -0
  296. package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/artefact-placement-tool.js +274 -0
  297. package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/index.d.ts +3 -0
  298. package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/index.js +3 -0
  299. package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/translate-created.d.ts +25 -0
  300. package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/translate-created.js +67 -0
  301. package/dist/_pkgs/affine-widget-edgeless-toolbar/translations.d.ts +6 -0
  302. package/dist/_pkgs/affine-widget-edgeless-toolbar/translations.js +10 -0
  303. package/dist/_pkgs/affine-widget-edgeless-toolbar/view.js +5 -0
  304. package/dist/_pkgs/affine-widget-frame-title/edgeless-frame-title-editor.js +2 -1
  305. package/dist/_pkgs/affine-widget-slash-menu/translations.d.ts +16 -0
  306. package/dist/_pkgs/affine-widget-slash-menu/translations.js +23 -1
  307. package/dist/_pkgs/affine-widget-toolbar/utils.js +57 -14
  308. package/dist/_pkgs/data-view/core/detail/field.js +2 -1
  309. package/dist/_pkgs/data-view/core/filter/literal/define.js +3 -1
  310. package/dist/_pkgs/data-view/core/group-by/renderer/boolean-group.js +1 -1
  311. package/dist/_pkgs/data-view/property-presets/checkbox/cell-renderer.js +8 -2
  312. package/dist/_pkgs/data-view/view-presets/kanban/pc/cell.js +1 -1
  313. package/dist/_pkgs/data-view/view-presets/kanban/pc/controller/drag.js +2 -1
  314. package/dist/_pkgs/data-view/view-presets/table/pc/controller/drag.js +2 -1
  315. package/dist/_pkgs/data-view/view-presets/table/pc/controller/selection.js +1 -1
  316. package/dist/_pkgs/data-view/view-presets/table/pc/header/vertical-indicator.js +2 -1
  317. package/dist/_pkgs/data-view/view-presets/table/pc/row/row-select-checkbox.js +3 -1
  318. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/controller/drag.js +2 -1
  319. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/controller/selection.js +1 -1
  320. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/group/top/header/vertical-indicator.js +2 -1
  321. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/row/row-header.js +3 -1
  322. package/dist/_pkgs/global/gfx/xywh.js +7 -0
  323. package/dist/_pkgs/std/extension/command-registry.d.ts +158 -1
  324. package/dist/_pkgs/std/extension/command-registry.js +22 -0
  325. package/dist/_pkgs/std/gfx/index.d.ts +1 -1
  326. package/dist/_pkgs/std/gfx/interactivity/gfx-view-event-handler.d.ts +12 -0
  327. package/dist/_pkgs/std/gfx/interactivity/gfx-view-event-handler.js +20 -1
  328. package/dist/_pkgs/std/gfx/interactivity/manager.d.ts +10 -0
  329. package/dist/_pkgs/std/gfx/interactivity/manager.js +12 -0
  330. package/dist/_pkgs/std/gfx/model/surface/element-model.js +12 -7
  331. package/dist/_pkgs/std/gfx/model/surface/role.d.ts +10 -5
  332. package/dist/_pkgs/std/gfx/model/surface/surface-model.d.ts +56 -0
  333. package/dist/_pkgs/std/gfx/model/surface/surface-model.js +84 -3
  334. package/dist/_pkgs/std/gfx/view/view.d.ts +11 -2
  335. package/dist/_pkgs/std/gfx/view/view.js +16 -2
  336. package/dist/commands.d.ts +6 -0
  337. package/dist/commands.js +10 -2
  338. package/dist/frameworks.d.ts +9 -0
  339. package/dist/frameworks.js +19 -0
  340. package/dist/translations.js +21 -0
  341. package/package.json +13 -4
  342. package/dist/_pkgs/affine-gfx-group/group-watcher.d.ts +0 -1
  343. package/dist/_pkgs/affine-gfx-group/group-watcher.js +0 -20
@@ -0,0 +1,115 @@
1
+ import type { EditorHost } from '../../std/index.js';
2
+ import type { GfxPrimitiveElementModel, PointTestOptions } from '../../std/gfx/index.js';
3
+ import { GfxElementModelView } from '../../std/gfx/index.js';
4
+ import type { FrameworkBackgroundDef } from './def.js';
5
+ /** A label a double-click may rename: the prop to write, and the words shown. */
6
+ export interface EditableBackgroundLabel {
7
+ /** The model prop the in-place editor writes back to. */
8
+ prop: string;
9
+ /**
10
+ * The words currently DRAWN there.
11
+ *
12
+ * The editor opens on this, not on `model[prop]`: a label whose prop has
13
+ * never been written shows its vocabulary, and opening an empty box on it
14
+ * would silently offer to erase a name the user can see.
15
+ */
16
+ text: string;
17
+ /**
18
+ * Where the edited words go, when a flat `{ [prop]: value }` patch cannot say
19
+ * it. Absent — the case for every label a declaration binds — the editor
20
+ * writes `updateElement(id, { [prop]: value })`.
21
+ *
22
+ * The one label shape that needs it is a name kept INSIDE a structured prop:
23
+ * a UML combined fragment's operand guard lives in `operands[i].name`, and
24
+ * renaming it means rewriting that array (trimmed, the key dropped when
25
+ * cleared), which no single-prop patch expresses. A write hook on the label
26
+ * rather than on the view, because the target is a property of the label hit
27
+ * — one view carries labels of both kinds.
28
+ *
29
+ * Called only for an ACTUAL change (the untouched-value rule below still
30
+ * applies), after the editor has closed and after the undo boundary has been
31
+ * captured: the hook writes, and nothing else.
32
+ */
33
+ commit?: (value: string) => void;
34
+ }
35
+ /**
36
+ * The rename gesture every framework background shares: double-click a label,
37
+ * type, Enter or click away.
38
+ *
39
+ * Written ONCE here, and that is the whole point of the file. The Wardley map
40
+ * shipped it first, EDGY copied the half it needed, C4 and BPMN copied other
41
+ * halves — and the three backgrounds that never got a copy (the Core Domain
42
+ * Chart, the Event Storming board, Cynefin and Estuarine) simply had no way to
43
+ * rename anything, which is how issue #355 was reported. R14 of
44
+ * `docs/add-a-framework/02-framework-rules.md` — extend, never copy — applies
45
+ * to a view's overrides exactly as it applies to a model's: seven copies of an
46
+ * `<input>` is not a seam, it is six places for the next fix to miss.
47
+ *
48
+ * A subclass says only WHERE its labels are, through {@link labelAt}. Almost
49
+ * every framework answers that from its declaration and should extend
50
+ * {@link DeclaredBackgroundView} instead; a framework that paints its words by
51
+ * hand (Cynefin, Estuarine — figurative reproductions of an official drawing,
52
+ * with no `FrameworkBackgroundDef` behind them) extends this class and hit-tests
53
+ * in its own reference space.
54
+ *
55
+ * UML's five frames were the last copy standing and now extend
56
+ * {@link DeclaredBackgroundView} like the rest (2026-09-17); the combined
57
+ * fragment's operand guards are why a label may carry its own
58
+ * {@link EditableBackgroundLabel.commit}.
59
+ */
60
+ export declare abstract class FrameworkBackgroundView<T extends GfxPrimitiveElementModel = GfxPrimitiveElementModel> extends GfxElementModelView<T> {
61
+ /** The in-place `<input>` used to edit a label, or null when idle. */
62
+ private _labelEditor;
63
+ onCreated(): void;
64
+ onDestroyed(): void;
65
+ /**
66
+ * The editable label under an ELEMENT-LOCAL point, or null.
67
+ *
68
+ * `lx` / `ly` are already de-rotated and relative to the element's top-left
69
+ * corner, and `w` / `h` are its current size: a subclass never repeats the
70
+ * rotation arithmetic, which is precisely what four copies of it got wrong in
71
+ * four slightly different ways.
72
+ */
73
+ protected abstract labelAt(lx: number, ly: number, w: number, h: number): EditableBackgroundLabel | null;
74
+ /**
75
+ * A background is SELECTED by its border (`FrameworkBackgroundElementModel`,
76
+ * issue #194) — but the words written on it must still receive the
77
+ * double-click that renames them.
78
+ *
79
+ * So the two areas differ, and this is where they are allowed to: the pointer
80
+ * router asks the VIEW (`GfxViewEventManager`), and the view adds the zones
81
+ * its labels are drawn in. Picking is unaffected — `getElementByPoint` still
82
+ * asks the model, so a click in the middle of the frame still goes to
83
+ * whatever the user put there.
84
+ */
85
+ includesPoint(x: number, y: number, options: PointTestOptions, host: EditorHost): boolean;
86
+ /** The editable label under a MODEL-space point, or null. */
87
+ private _labelAtModelPoint;
88
+ /** Double-click on a label → edit its text in place. */
89
+ private _onDblClick;
90
+ /**
91
+ * @param label the label aimed at. The editor opens on `label.text`, the
92
+ * words currently DRAWN — which is the vocabulary, not `model[prop]`, for a
93
+ * label the user has never renamed. Opening on the raw prop would show an
94
+ * empty box for a label that plainly reads "Evolution".
95
+ */
96
+ private _openLabelEditor;
97
+ private _closeLabelEditor;
98
+ }
99
+ /**
100
+ * The same gesture, aimed by the DECLARATION the renderer paints.
101
+ *
102
+ * Which labels exist, where they sit, what they SAY and which are editable all
103
+ * come from one place, resolved through the same catalogue — so a label can
104
+ * never be drawn in one place and clicked in another, nor read one thing and
105
+ * open on another. A subclass supplies its {@link def} and nothing else.
106
+ *
107
+ * A framework that needs to narrow the answer — a closed list of writable
108
+ * props, a hit region wider than the words — overrides {@link labelAt} and
109
+ * calls `super.labelAt` for the declaration's answer first.
110
+ */
111
+ export declare abstract class DeclaredBackgroundView<T extends GfxPrimitiveElementModel = GfxPrimitiveElementModel> extends FrameworkBackgroundView<T> {
112
+ /** The declaration this view hit-tests against — the one the renderer paints. */
113
+ protected abstract get def(): FrameworkBackgroundDef;
114
+ protected labelAt(lx: number, ly: number, w: number, h: number): EditableBackgroundLabel | null;
115
+ }
@@ -0,0 +1,185 @@
1
+ import { TranslationProvider } from '../../affine-shared/services/index.js';
2
+ import { rotatePoint } from '../../global/gfx/index.js';
3
+ import { GfxElementModelView } from '../../std/gfx/index.js';
4
+ import { EdgelessCRUDIdentifier } from '../extensions/crud-extension.js';
5
+ import { backgroundLabelHits, hitTestBackgroundLabel } from './labels.js';
6
+ /**
7
+ * The rename gesture every framework background shares: double-click a label,
8
+ * type, Enter or click away.
9
+ *
10
+ * Written ONCE here, and that is the whole point of the file. The Wardley map
11
+ * shipped it first, EDGY copied the half it needed, C4 and BPMN copied other
12
+ * halves — and the three backgrounds that never got a copy (the Core Domain
13
+ * Chart, the Event Storming board, Cynefin and Estuarine) simply had no way to
14
+ * rename anything, which is how issue #355 was reported. R14 of
15
+ * `docs/add-a-framework/02-framework-rules.md` — extend, never copy — applies
16
+ * to a view's overrides exactly as it applies to a model's: seven copies of an
17
+ * `<input>` is not a seam, it is six places for the next fix to miss.
18
+ *
19
+ * A subclass says only WHERE its labels are, through {@link labelAt}. Almost
20
+ * every framework answers that from its declaration and should extend
21
+ * {@link DeclaredBackgroundView} instead; a framework that paints its words by
22
+ * hand (Cynefin, Estuarine — figurative reproductions of an official drawing,
23
+ * with no `FrameworkBackgroundDef` behind them) extends this class and hit-tests
24
+ * in its own reference space.
25
+ *
26
+ * UML's five frames were the last copy standing and now extend
27
+ * {@link DeclaredBackgroundView} like the rest (2026-09-17); the combined
28
+ * fragment's operand guards are why a label may carry its own
29
+ * {@link EditableBackgroundLabel.commit}.
30
+ */
31
+ export class FrameworkBackgroundView extends GfxElementModelView {
32
+ constructor() {
33
+ super(...arguments);
34
+ /** The in-place `<input>` used to edit a label, or null when idle. */
35
+ this._labelEditor = null;
36
+ }
37
+ onCreated() {
38
+ super.onCreated();
39
+ this.on('dblclick', e => this._onDblClick(e));
40
+ }
41
+ onDestroyed() {
42
+ this._closeLabelEditor();
43
+ super.onDestroyed();
44
+ }
45
+ /**
46
+ * A background is SELECTED by its border (`FrameworkBackgroundElementModel`,
47
+ * issue #194) — but the words written on it must still receive the
48
+ * double-click that renames them.
49
+ *
50
+ * So the two areas differ, and this is where they are allowed to: the pointer
51
+ * router asks the VIEW (`GfxViewEventManager`), and the view adds the zones
52
+ * its labels are drawn in. Picking is unaffected — `getElementByPoint` still
53
+ * asks the model, so a click in the middle of the frame still goes to
54
+ * whatever the user put there.
55
+ */
56
+ includesPoint(x, y, options, host) {
57
+ if (super.includesPoint(x, y, options, host))
58
+ return true;
59
+ return this._labelAtModelPoint(x, y) !== null;
60
+ }
61
+ /** The editable label under a MODEL-space point, or null. */
62
+ _labelAtModelPoint(mx, my) {
63
+ const [bx, by, w, h] = this.model.deserializedXYWH;
64
+ // Element-local coordinates, undoing the element rotation about its centre.
65
+ let lx = mx - bx;
66
+ let ly = my - by;
67
+ const rot = this.model.rotate ?? 0;
68
+ if (rot) {
69
+ const center = [bx + w / 2, by + h / 2];
70
+ const [ux, uy] = rotatePoint([mx, my], center, -rot);
71
+ lx = ux - bx;
72
+ ly = uy - by;
73
+ }
74
+ return this.labelAt(lx, ly, w, h);
75
+ }
76
+ /** Double-click on a label → edit its text in place. */
77
+ _onDblClick(e) {
78
+ if (this.gfx.std.store.readonly || this.model.isLocked())
79
+ return;
80
+ const [mx, my] = this.gfx.viewport.toModelCoord(e.x, e.y);
81
+ const hit = this._labelAtModelPoint(mx, my);
82
+ if (!hit)
83
+ return;
84
+ this._openLabelEditor(hit, e);
85
+ }
86
+ /**
87
+ * @param label the label aimed at. The editor opens on `label.text`, the
88
+ * words currently DRAWN — which is the vocabulary, not `model[prop]`, for a
89
+ * label the user has never renamed. Opening on the raw prop would show an
90
+ * empty box for a label that plainly reads "Evolution".
91
+ */
92
+ _openLabelEditor(label, e) {
93
+ this._closeLabelEditor();
94
+ const current = label.text;
95
+ const input = document.createElement('input');
96
+ input.value = current;
97
+ Object.assign(input.style, {
98
+ position: 'fixed',
99
+ left: `${e.raw.clientX}px`,
100
+ top: `${e.raw.clientY}px`,
101
+ transform: 'translate(-50%, -50%)',
102
+ zIndex: '10000',
103
+ minWidth: '140px',
104
+ padding: '3px 8px',
105
+ font: '14px Inter, sans-serif',
106
+ color: 'var(--affine-text-primary-color, #1f2328)',
107
+ background: 'var(--affine-background-overlay-panel-color, #ffffff)',
108
+ border: '1px solid var(--affine-primary-color)',
109
+ borderRadius: '6px',
110
+ boxShadow: 'var(--affine-shadow-2, 0 2px 8px rgba(0,0,0,0.18))',
111
+ outline: 'none',
112
+ });
113
+ document.body.append(input);
114
+ this._labelEditor = input;
115
+ // Mark the element as "editing" so the global edgeless key handlers
116
+ // (delete, escape, etc.) don't act on it while the user types.
117
+ this.gfx.selection.set({ elements: [this.model.id], editing: true });
118
+ input.focus();
119
+ input.select();
120
+ const commit = () => {
121
+ // Guard against re-entrancy: removing the input fires `blur` — Chrome
122
+ // fires it SYNCHRONOUSLY inside `remove()` — which would otherwise call
123
+ // `commit` a second time. `_closeLabelEditor` clears the field before it
124
+ // removes the node, so that nested call finds it gone and returns.
125
+ if (this._labelEditor !== input)
126
+ return;
127
+ const value = input.value;
128
+ this._closeLabelEditor();
129
+ // Opening an editor is not renaming. Writing back an untouched value
130
+ // would persist the resolved VOCABULARY as the user's own text, freezing
131
+ // the label in whatever language it was read in and putting it beyond
132
+ // any catalogue for good — and it would push an empty entry onto undo.
133
+ if (value === current)
134
+ return;
135
+ this.gfx.std.store.captureSync();
136
+ if (label.commit) {
137
+ label.commit(value);
138
+ return;
139
+ }
140
+ this.gfx.std
141
+ .get(EdgelessCRUDIdentifier)
142
+ .updateElement(this.model.id, { [label.prop]: value });
143
+ };
144
+ input.addEventListener('keydown', ev => {
145
+ ev.stopPropagation();
146
+ if (ev.key === 'Enter') {
147
+ ev.preventDefault();
148
+ commit();
149
+ }
150
+ else if (ev.key === 'Escape') {
151
+ ev.preventDefault();
152
+ this._closeLabelEditor();
153
+ }
154
+ });
155
+ input.addEventListener('blur', commit);
156
+ }
157
+ _closeLabelEditor() {
158
+ if (!this._labelEditor)
159
+ return;
160
+ const input = this._labelEditor;
161
+ this._labelEditor = null;
162
+ input.remove();
163
+ if (this.isConnected) {
164
+ this.gfx.selection.set({ elements: [this.model.id], editing: false });
165
+ }
166
+ }
167
+ }
168
+ /**
169
+ * The same gesture, aimed by the DECLARATION the renderer paints.
170
+ *
171
+ * Which labels exist, where they sit, what they SAY and which are editable all
172
+ * come from one place, resolved through the same catalogue — so a label can
173
+ * never be drawn in one place and clicked in another, nor read one thing and
174
+ * open on another. A subclass supplies its {@link def} and nothing else.
175
+ *
176
+ * A framework that needs to narrow the answer — a closed list of writable
177
+ * props, a hit region wider than the words — overrides {@link labelAt} and
178
+ * calls `super.labelAt` for the declaration's answer first.
179
+ */
180
+ export class DeclaredBackgroundView extends FrameworkBackgroundView {
181
+ labelAt(lx, ly, w, h) {
182
+ const hit = hitTestBackgroundLabel(backgroundLabelHits(this.def, this.model, w, h, this.gfx.std.getOptional(TranslationProvider)), lx, ly);
183
+ return hit ? { prop: hit.prop, text: hit.text } : null;
184
+ }
185
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * How a framework that draws a FIXED reference artwork puts it in its element.
3
+ *
4
+ * A declared background (`FrameworkBackgroundDef`) never needs this: it is made
5
+ * of ratios of a plot and stretches with the element by construction. The
6
+ * frameworks that reproduce an authored drawing — Cynefin, Estuarine, EDGY, the
7
+ * DDD stencils — cannot stretch: circles would turn into ellipses and a
8
+ * hand-drawn boundary into a smear. They fit the artwork uniformly instead and
9
+ * centre what is left over.
10
+ *
11
+ * This was written three times over — `gfx/cynefin-estuarine/src/utils.ts`,
12
+ * `gfx/ddd-shared/src/shared/utils.ts` and `gfx/edgy/src/consts.ts` — with the
13
+ * same body each time. One source of truth (R37): the three call it, and a
14
+ * board that crops itself onto its drawing
15
+ * (`gfx/cynefin-estuarine/src/cynefin/crop.ts`) reads the very function the
16
+ * renderer painted through, so the two can never disagree about where the
17
+ * drawing is.
18
+ */
19
+ /** A uniform fit: the scale, and the offsets that centre the letterbox. */
20
+ export interface RefFit {
21
+ /** Scale from reference units to element units. */
22
+ s: number;
23
+ /** Left offset of the fitted artwork inside the element, in element units. */
24
+ ox: number;
25
+ /** Top offset of the fitted artwork inside the element, in element units. */
26
+ oy: number;
27
+ }
28
+ /**
29
+ * Uniform fit of a `refW × refH` reference design into a `w × h` box: the
30
+ * scale factor plus the centring offsets (letterboxed), undistorted.
31
+ *
32
+ * The fitted artwork is `refW * s` by `refH * s` and shares the box's CENTRE —
33
+ * `ox + refW * s / 2 === w / 2` — which is what lets a board crop itself onto
34
+ * its drawing without the drawing moving, rotation included.
35
+ */
36
+ export declare function refScale(w: number, h: number, refW: number, refH: number): RefFit;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * How a framework that draws a FIXED reference artwork puts it in its element.
3
+ *
4
+ * A declared background (`FrameworkBackgroundDef`) never needs this: it is made
5
+ * of ratios of a plot and stretches with the element by construction. The
6
+ * frameworks that reproduce an authored drawing — Cynefin, Estuarine, EDGY, the
7
+ * DDD stencils — cannot stretch: circles would turn into ellipses and a
8
+ * hand-drawn boundary into a smear. They fit the artwork uniformly instead and
9
+ * centre what is left over.
10
+ *
11
+ * This was written three times over — `gfx/cynefin-estuarine/src/utils.ts`,
12
+ * `gfx/ddd-shared/src/shared/utils.ts` and `gfx/edgy/src/consts.ts` — with the
13
+ * same body each time. One source of truth (R37): the three call it, and a
14
+ * board that crops itself onto its drawing
15
+ * (`gfx/cynefin-estuarine/src/cynefin/crop.ts`) reads the very function the
16
+ * renderer painted through, so the two can never disagree about where the
17
+ * drawing is.
18
+ */
19
+ /**
20
+ * Uniform fit of a `refW × refH` reference design into a `w × h` box: the
21
+ * scale factor plus the centring offsets (letterboxed), undistorted.
22
+ *
23
+ * The fitted artwork is `refW * s` by `refH * s` and shares the box's CENTRE —
24
+ * `ox + refW * s / 2 === w / 2` — which is what lets a board crop itself onto
25
+ * its drawing without the drawing moving, rotation included.
26
+ */
27
+ export function refScale(w, h, refW, refH) {
28
+ const s = Math.min(w / refW, h / refH);
29
+ return { s, ox: (w - refW * s) / 2, oy: (h - refH * s) / 2 };
30
+ }
@@ -1,5 +1,7 @@
1
+ export * from './background-view.js';
1
2
  export * from './def.js';
2
3
  export * from './facts.js';
4
+ export * from './fit.js';
3
5
  export * from './interaction.js';
4
6
  export * from './labels.js';
5
7
  export * from './renderer.js';
@@ -1,5 +1,7 @@
1
+ export * from './background-view.js';
1
2
  export * from './def.js';
2
3
  export * from './facts.js';
4
+ export * from './fit.js';
3
5
  export * from './interaction.js';
4
6
  export * from './labels.js';
5
7
  export * from './renderer.js';
@@ -36,7 +36,7 @@ export declare function backgroundVisible(visibleProp: string | undefined, model
36
36
  */
37
37
  export declare function backgroundInVariant(def: FrameworkBackgroundDef, variants: readonly string[] | undefined, model: BackgroundModelLike): boolean;
38
38
  /** A label's clickable box in element-local coordinates (axis-aligned, padded). */
39
- export interface BackgroundLabelHit {
39
+ export interface BackgroundLabelHit extends BackgroundTextBox {
40
40
  /** The declaration id of the text. */
41
41
  id: string;
42
42
  /** The model prop the in-place editor must write back to. */
@@ -49,11 +49,26 @@ export interface BackgroundLabelHit {
49
49
  * would silently offer to erase a name the user can see.
50
50
  */
51
51
  text: string;
52
+ }
53
+ /** The padded box of one drawn word, in the space its anchor is expressed in. */
54
+ export interface BackgroundTextBox {
52
55
  minX: number;
53
56
  minY: number;
54
57
  maxX: number;
55
58
  maxY: number;
56
59
  }
60
+ /**
61
+ * The clickable box of a word drawn at `(ax, ay)` on an ALPHABETIC baseline —
62
+ * the one convention every background in the library paints its text on.
63
+ *
64
+ * Exported because two frameworks place their words without a declaration
65
+ * (Cynefin and Estuarine are figurative reproductions of an official drawing,
66
+ * scaled by their own fit) and still have to offer the same forgiving target as
67
+ * everybody else. They pass a point already mapped into element coordinates;
68
+ * the padding, the rough advance and the baseline arithmetic stay here, in one
69
+ * place, so a label is not easier to hit on one framework than on the next.
70
+ */
71
+ export declare function backgroundTextHitBox(words: string, fontSize: number, ax: number, ay: number, align?: 'left' | 'center' | 'right', vertical?: boolean): BackgroundTextBox;
57
72
  /**
58
73
  * Every text of a declaration, in PAINTING ORDER: the side-band labels, the
59
74
  * zone labels, then each axis' title followed by its end labels.
@@ -75,6 +75,36 @@ export function backgroundInVariant(def, variants, model) {
75
75
  const approxTextWidth = (text, fontSize) => Math.max(fontSize, text.length * fontSize * 0.6);
76
76
  /** Padding so double-clicking a label is forgiving. */
77
77
  const HIT_PAD = 6;
78
+ /**
79
+ * The clickable box of a word drawn at `(ax, ay)` on an ALPHABETIC baseline —
80
+ * the one convention every background in the library paints its text on.
81
+ *
82
+ * Exported because two frameworks place their words without a declaration
83
+ * (Cynefin and Estuarine are figurative reproductions of an official drawing,
84
+ * scaled by their own fit) and still have to offer the same forgiving target as
85
+ * everybody else. They pass a point already mapped into element coordinates;
86
+ * the padding, the rough advance and the baseline arithmetic stay here, in one
87
+ * place, so a label is not easier to hit on one framework than on the next.
88
+ */
89
+ export function backgroundTextHitBox(words, fontSize, ax, ay, align = 'left', vertical = false) {
90
+ const tw = approxTextWidth(words, fontSize);
91
+ if (vertical) {
92
+ return {
93
+ minX: ax - fontSize - HIT_PAD,
94
+ maxX: ax + fontSize * 0.4 + HIT_PAD,
95
+ minY: ay - tw / 2 - HIT_PAD,
96
+ maxY: ay + tw / 2 + HIT_PAD,
97
+ };
98
+ }
99
+ const minX = align === 'right' ? ax - tw : align === 'center' ? ax - tw / 2 : ax;
100
+ const maxX = align === 'right' ? ax : align === 'center' ? ax + tw / 2 : ax + tw;
101
+ return {
102
+ minX: minX - HIT_PAD,
103
+ maxX: maxX + HIT_PAD,
104
+ minY: ay - fontSize - HIT_PAD,
105
+ maxY: ay + fontSize * 0.3 + HIT_PAD,
106
+ };
107
+ }
78
108
  /**
79
109
  * Every text of a declaration, in PAINTING ORDER: the side-band labels, the
80
110
  * zone labels, then each axis' title followed by its end labels.
@@ -152,32 +182,12 @@ export function backgroundLabelHits(def, model, w, h, translation) {
152
182
  if (!backgroundVisible(text.visibleProp, model))
153
183
  continue;
154
184
  const words = backgroundLabelText(text, model, translation);
155
- const size = text.style.size;
156
- const tw = approxTextWidth(words, size);
157
185
  const [ax, ay] = backgroundPoint(text.anchor, plot);
158
- if (text.vertical) {
159
- hits.push({
160
- id: text.id,
161
- prop: text.prop,
162
- text: words,
163
- minX: ax - size - HIT_PAD,
164
- maxX: ax + size * 0.4 + HIT_PAD,
165
- minY: ay - tw / 2 - HIT_PAD,
166
- maxY: ay + tw / 2 + HIT_PAD,
167
- });
168
- continue;
169
- }
170
- const align = text.align ?? 'left';
171
- const minX = align === 'right' ? ax - tw : align === 'center' ? ax - tw / 2 : ax;
172
- const maxX = align === 'right' ? ax : align === 'center' ? ax + tw / 2 : ax + tw;
173
186
  hits.push({
174
187
  id: text.id,
175
188
  prop: text.prop,
176
189
  text: words,
177
- minX: minX - HIT_PAD,
178
- maxX: maxX + HIT_PAD,
179
- minY: ay - size - HIT_PAD,
180
- maxY: ay + size * 0.3 + HIT_PAD,
190
+ ...backgroundTextHitBox(words, text.style.size, ax, ay, text.align, text.vertical),
181
191
  });
182
192
  }
183
193
  return hits;
@@ -33,8 +33,22 @@ import { backgroundInVariant, backgroundLabelText, backgroundTexts, backgroundVi
33
33
  * legible however large the background is stretched. Only the plot interior
34
34
  * moves.
35
35
  */
36
+ /**
37
+ * Trace the card, and say whether there was one to trace.
38
+ *
39
+ * The drawable box has the border subtracted from it, so a background dragged
40
+ * to nothing — or one whose `xywh` came back degenerate from a damaged
41
+ * document — asks for a negative radius: a 1.5 border on a 1-unit card gives
42
+ * -0.75. `arcTo` throws `IndexSizeError` on that rather than clamping, and the
43
+ * surface render loop wraps no renderer in a `try`, so one such throw aborts
44
+ * the rest of the frame with an unbalanced save stack. Returning `false` lets
45
+ * the caller skip the fill and the stroke too, rather than painting a
46
+ * degenerate path.
47
+ */
36
48
  function roundRectPath(ctx, x, y, w, h, r) {
37
- const rr = Math.min(r, w / 2, h / 2);
49
+ if (!(w > 0) || !(h > 0))
50
+ return false;
51
+ const rr = Math.max(0, Math.min(r, w / 2, h / 2));
38
52
  ctx.beginPath();
39
53
  ctx.moveTo(x + rr, y);
40
54
  ctx.arcTo(x + w, y, x + w, y + h, rr);
@@ -42,6 +56,7 @@ function roundRectPath(ctx, x, y, w, h, r) {
42
56
  ctx.arcTo(x, y + h, x, y, rr);
43
57
  ctx.arcTo(x, y, x + w, y, rr);
44
58
  ctx.closePath();
59
+ return true;
45
60
  }
46
61
  const HEX6 = /^#[0-9a-fA-F]{6}$/;
47
62
  /**
@@ -108,6 +123,13 @@ export function createFrameworkBackgroundRenderer(def) {
108
123
  // that ships no locale pack — both fall back to the declared wording.
109
124
  const translation = renderer?.std.getOptional(TranslationProvider) ?? null;
110
125
  const [, , w, h] = model.deserializedXYWH;
126
+ // A background with no area has no card, no bands, no plot and no text, so
127
+ // there is nothing to paint and every ratio below would divide by zero.
128
+ // Bailing here is also what keeps a degenerate element from reaching
129
+ // `arcTo` at all; `roundRectPath` stays the second line of defence for a
130
+ // card that is positive but smaller than its own border.
131
+ if (!(w > 0) || !(h > 0))
132
+ return;
111
133
  const cx = w / 2;
112
134
  const cy = h / 2;
113
135
  ctx.setTransform(matrix
@@ -149,8 +171,10 @@ export function createFrameworkBackgroundRenderer(def) {
149
171
  const border = surface.border;
150
172
  const inset = border ? border.width / 2 : 0;
151
173
  const cardPath = () => roundRectPath(ctx, inset, inset, w - inset * 2, h - inset * 2, border?.radius ?? 0);
152
- cardPath();
153
- if (surface.fill) {
174
+ // A card whose border eats the whole element is not traced at all, and then
175
+ // neither its fill nor its frame is painted.
176
+ const carded = cardPath();
177
+ if (carded && surface.fill) {
154
178
  ctx.fillStyle = color(surface.fill);
155
179
  ctx.fill();
156
180
  }
@@ -191,10 +215,10 @@ export function createFrameworkBackgroundRenderer(def) {
191
215
  ctx.setLineDash([]);
192
216
  }
193
217
  }
194
- if (border)
218
+ if (border && carded)
195
219
  cardPath();
196
220
  }
197
- if (border) {
221
+ if (border && carded) {
198
222
  ctx.strokeStyle = color(border.color);
199
223
  ctx.lineWidth = border.width;
200
224
  if (border.dash?.length)
@@ -62,10 +62,12 @@ export declare function indexOverBackgrounds(siblings: readonly StackedElement[]
62
62
  * is still below every artefact already drawn there. Otherwise nothing.
63
63
  * 2. `element` IS a background. If another background it overlaps sits above
64
64
  * it, the same raise applies — superposed boards stack in the order they
65
- * were placed, each still under its own artefacts. Otherwise, if it covers
66
- * an artefact it overlaps, it is acting as a lid: lower it to just above
67
- * the floor it lies on, or to the back of the surface when it lies on bare
68
- * canvas. Otherwise nothing.
65
+ * were placed, each still under its own artefacts — unless it ENCLOSES that
66
+ * background, in which case it is the sheet the other is drawn on and stays
67
+ * under it ({@link encloses}). Otherwise, if it covers an artefact it
68
+ * overlaps, it is acting as a lid: lower it to just above the floor it lies
69
+ * on, or to the back of the surface when it lies on bare canvas. Otherwise
70
+ * nothing.
69
71
  *
70
72
  * `siblings` are the OTHER top-level elements of the surface — canvas elements
71
73
  * and blocks alike, since the surface paints both by index — with `element`