@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
@@ -1,3 +1,4 @@
1
+ import type { FrameworkId } from '../../../std/index.js';
1
2
  import type { TelemetryEvent } from './types.js';
2
3
  /**
3
4
  * Per-block lifecycle taxonomy. Every block flavour reports the same five
@@ -36,8 +37,189 @@ export interface FrameworkElementEvent extends TelemetryEvent {
36
37
  framework: 'wardley' | 'edgy' | 'cynefin' | 'bpmn' | 'event-storming' | 'core-domain' | 'context-map';
37
38
  element: string;
38
39
  }
40
+ /**
41
+ * A rung of the promotion ladder was crossed (MF1 / ADR 0007 § 7):
42
+ * shape → role → component (a pivot record) → materialities. Promotion is
43
+ * never a conversion — no element is created, destroyed or swapped, and no
44
+ * geometry moves.
45
+ *
46
+ * **A new event name, deliberately.** An earlier draft reused
47
+ * `FrameworkElementAdded` under a "no new event names" rule; that was a
48
+ * taxonomy break. ADR 0003 § 2 defines the creation event as UI intent emitted
49
+ * at INSERTION sites, and a promotion inserts nothing — so drawing a shape and
50
+ * then binding it would emit `FrameworkElementAdded` twice and permanently
51
+ * inflate "elements added per framework". A new event is cheaper than a
52
+ * corrupted funnel.
53
+ *
54
+ * Ids only, never board content: which rung was crossed, in which direction,
55
+ * under which role.
56
+ */
57
+ export interface FrameworkPromotionEvent extends TelemetryEvent {
58
+ page?: 'whiteboard editor';
59
+ /**
60
+ * Owning framework, when the element has one — derived from the namespace of
61
+ * its `role` (`wardley:component` → `wardley`).
62
+ *
63
+ * OPTIONAL, which is a deviation from ADR 0007 § 7's `framework: FrameworkId`.
64
+ * That ADR's own § 6 states no rung requires the previous one: an element may
65
+ * carry a `pivotDocId` with no `role` at all, and a plain rectangle bound to
66
+ * a record belongs to no framework. Requiring the field would force the
67
+ * library to invent an identity it does not have — the one thing the
68
+ * `FrameworkId` unification exists to stop. Absent rather than `'unknown'`,
69
+ * per the repo convention.
70
+ */
71
+ framework?: FrameworkId;
72
+ /** Which rung was crossed. */
73
+ rung: 'role' | 'pivot' | 'tag';
74
+ /** Forward (`shape`→`role`) or the reverse gesture. */
75
+ direction: 'promote' | 'demote';
76
+ /** Role id at the time of the gesture, when there is one. */
77
+ role?: string;
78
+ /** How many elements the single gesture wrote to. */
79
+ elementCount: number;
80
+ }
81
+ /**
82
+ * The persisted direction of a TYPED EDGE was reversed (`docs/adr/0010` M3):
83
+ * `source` and `target` swapped, in one undo step, by the only supported
84
+ * inversion.
85
+ *
86
+ * Worth its own event for the same reason an exception is worth one: this is
87
+ * the correction gesture of a decision the user could not previously see, so
88
+ * how often it is used is the measurement of whether the DRAWING gesture (M1)
89
+ * announces itself well enough. A framework whose links are reversed constantly
90
+ * is a framework whose hint is wrong.
91
+ *
92
+ * Ids only — the role and the framework its namespace names — never board
93
+ * content, and never the two element ids.
94
+ */
95
+ export interface EdgeDirectionEvent extends TelemetryEvent {
96
+ page?: 'whiteboard editor';
97
+ /** Role id of the inverted edges, when they all carry the same one. */
98
+ role?: string;
99
+ /** Its namespace, when that names a framework: `wardley:dependency` → `wardley`. */
100
+ framework?: string;
101
+ /** How many edges the single gesture reversed. */
102
+ elementCount: number;
103
+ }
39
104
  export type FrameworkDiagramEvents = {
40
105
  FrameworkElementAdded: FrameworkElementEvent;
41
106
  FrameworkToolPicked: FrameworkElementEvent;
42
107
  FrameworkLegendCreated: FrameworkElementEvent;
108
+ FrameworkElementPromoted: FrameworkPromotionEvent;
109
+ EdgeDirectionInverted: EdgeDirectionEvent;
110
+ };
111
+ /**
112
+ * A user arbitration on a validation rule (PF8): "no rule is a wall", so every
113
+ * rule can be waived — and every waiver is worth knowing about. A rule that
114
+ * gets waived constantly is a rule that is wrong, and this is the only place
115
+ * that says so.
116
+ *
117
+ * `ruleId` is the framework-namespaced rule id (`wardley.change-arrow-against-evolution`)
118
+ * and never carries user content — the event describes which RULE was arbitrated
119
+ * on, never what the board contains.
120
+ */
121
+ export interface ValidationExceptionEvent extends TelemetryEvent {
122
+ page?: 'whiteboard editor';
123
+ /** Namespaced rule id, e.g. `wardley.change-arrow-against-evolution`. */
124
+ ruleId: string;
125
+ /** Owning framework of the rule, when it is registered. */
126
+ framework?: string;
127
+ /** `element` = this one element; `map` = every element the map frames. */
128
+ scope: 'element' | 'map';
129
+ /** How many elements the single gesture wrote to. */
130
+ elementCount: number;
131
+ }
132
+ /**
133
+ * A change of the level of requirement a framework instance is checked against
134
+ * (PF9). Worth knowing about for the same reason an exception is: a profile
135
+ * nobody ever leaves is a default that is right, and one everybody escapes on
136
+ * the first day is a default that is wrong.
137
+ *
138
+ * Ids only — the framework's own namespaced profile ids — never user content.
139
+ */
140
+ export interface ValidationProfileEvent extends TelemetryEvent {
141
+ page?: 'whiteboard editor';
142
+ /** Owning framework of the profile, e.g. `wardley`. */
143
+ framework: string;
144
+ /** Namespaced profile id now in force, e.g. `wardley.strict`. */
145
+ profileId: string;
146
+ /** The one it replaces, when it is known. */
147
+ previousProfileId?: string;
148
+ }
149
+ /**
150
+ * A map-quality NUDGE ticked or unticked (PF7.10). Worth knowing about for the
151
+ * same reason an exception is, and for one more: a nudge everybody ticks
152
+ * immediately is a reminder nobody needed, and one nobody ever ticks is an
153
+ * expectation the tool has failed to make actionable. Neither is visible any
154
+ * other way, because nothing here is ever computed.
155
+ *
156
+ * Ids only — the framework's own namespaced nudge ids — never board content.
157
+ */
158
+ export interface MapQualityNudgeEvent extends TelemetryEvent {
159
+ page?: 'whiteboard editor';
160
+ /** Owning framework of the nudge, e.g. `wardley`. */
161
+ framework: string;
162
+ /** Namespaced nudge id, e.g. `wardley.q1-title`. */
163
+ nudgeId: string;
164
+ /** `true` = ticked ("I have taken care of this"), `false` = taken back. */
165
+ checked: boolean;
166
+ }
167
+ export type ValidationEvents = {
168
+ ValidationExceptionGranted: ValidationExceptionEvent;
169
+ ValidationExceptionRevoked: ValidationExceptionEvent;
170
+ ValidationProfileChanged: ValidationProfileEvent;
171
+ MapQualityNudgeToggled: MapQualityNudgeEvent;
172
+ };
173
+ /**
174
+ * An AI audit run (PF14.1) — level 3, executed app-side by the Labre Assistant
175
+ * through the `AuditProvider` seam.
176
+ *
177
+ * Three events rather than one, because the three questions are different: how
178
+ * often is an audit asked for (started), does it ever finish (completed), and
179
+ * how often does it not (interrupted). A single event with a status field would
180
+ * answer the first and lose the other two the moment a run never resolves.
181
+ *
182
+ * Ids and counts only — criterion ids and how many findings came back. The
183
+ * board's content, the criteria's prompts and the findings' wording never leave
184
+ * the editor through this bus.
185
+ */
186
+ export interface MapAuditEvent extends TelemetryEvent {
187
+ page?: 'whiteboard editor';
188
+ /** Owning framework of the criteria, when the run carries only one. */
189
+ framework?: string;
190
+ /** How many criteria the run was given. */
191
+ criterionCount: number;
192
+ /** How many framework frames the facts described. */
193
+ frameCount: number;
194
+ }
195
+ export interface MapAuditCompletedEvent extends MapAuditEvent {
196
+ /** How many findings came back, after the library's normalisation. */
197
+ findingCount: number;
198
+ /** Wall-clock duration of the run, in milliseconds. */
199
+ durationMs: number;
200
+ }
201
+ export interface MapAuditInterruptedEvent extends MapAuditEvent {
202
+ /**
203
+ * Why it did not complete.
204
+ *
205
+ * `unavailable` is a first-class member and not an error: no assistant is
206
+ * wired in this assembly, or the one that is declared itself unable to answer
207
+ * (feature flag, quota, no model configured). Knowing how often a user
208
+ * reaches for an audit that cannot run is precisely the number that decides
209
+ * whether the affordance should be there at all.
210
+ *
211
+ * `superseded` means a newer run for the same editor started while this one
212
+ * was in flight, so its answer was dropped rather than published. It is
213
+ * reported here rather than as a completion because a `findingCount` for
214
+ * findings nobody will see is a metric that lies — and a rising `superseded`
215
+ * count is itself the signal that audits are slow enough that users ask
216
+ * twice.
217
+ */
218
+ reason: 'aborted' | 'error' | 'unavailable' | 'superseded';
219
+ durationMs: number;
220
+ }
221
+ export type AuditEvents = {
222
+ MapAuditStarted: MapAuditEvent;
223
+ MapAuditCompleted: MapAuditCompletedEvent;
224
+ MapAuditInterrupted: MapAuditInterruptedEvent;
43
225
  };
@@ -2,12 +2,12 @@ import type { ExtensionType } from '../../../store/index.js';
2
2
  import type { CitationEvents } from './citation.js';
3
3
  import type { CodeBlockEvents } from './code-block.js';
4
4
  import type { OutDatabaseAllEvents } from './database.js';
5
- import type { BlockLifecycleEvents, FrameworkDiagramEvents } from './lifecycle.js';
5
+ import type { AuditEvents, BlockLifecycleEvents, FrameworkDiagramEvents, ValidationEvents } from './lifecycle.js';
6
6
  import type { LinkToolbarEvents } from './link.js';
7
7
  import type { NoteEvents } from './note.js';
8
8
  import type { SlashMenuEvents } from './slash-menu.js';
9
9
  import type { AttachmentReloadedEvent, AttachmentReloadedEventInToolbar, AttachmentUpgradedEvent, AttachmentUploadedEvent, BlockCreationEvent, DocCreatedEvent, EdgelessToolPickedEvent, ElementCreationEvent, ElementLockEvent, ElementUpdatedEvent, LatexEvent, LinkedDocCreatedEvent, LinkEvent, MindMapCollapseEvent, TelemetryEvent } from './types.js';
10
- export type TelemetryEventMap = OutDatabaseAllEvents & LinkToolbarEvents & SlashMenuEvents & CodeBlockEvents & NoteEvents & CitationEvents & BlockLifecycleEvents & FrameworkDiagramEvents & {
10
+ export type TelemetryEventMap = OutDatabaseAllEvents & LinkToolbarEvents & SlashMenuEvents & CodeBlockEvents & NoteEvents & CitationEvents & BlockLifecycleEvents & FrameworkDiagramEvents & ValidationEvents & AuditEvents & {
11
11
  DocCreated: DocCreatedEvent;
12
12
  Link: TelemetryEvent;
13
13
  LinkedDocCreated: LinkedDocCreatedEvent;
@@ -1,4 +1,9 @@
1
- export type ElementCreationSource = 'shortcut' | 'toolbar:general' | 'toolbar:dnd' | 'canvas:drop' | 'canvas:draw' | 'canvas:dbclick' | 'canvas:paste' | 'context-menu' | 'ai' | 'internal' | 'conversation' | 'manually save';
1
+ /**
2
+ * Re-exported, unchanged, from `@labre/std`: `CommandInvocation.source` is
3
+ * typed on it and the command registry sits below this layer (ADR 0008).
4
+ */
5
+ import type { ElementCreationSource } from '../../../std/index.js';
6
+ export type { ElementCreationSource };
2
7
  export interface TelemetryEvent {
3
8
  page?: string;
4
9
  segment?: string;
@@ -12,6 +12,16 @@ type ActionBase = {
12
12
  when?: ((cx: ToolbarContext) => boolean) | boolean;
13
13
  active?: ((cx: ToolbarContext) => boolean) | boolean;
14
14
  placement?: ActionPlacement;
15
+ /**
16
+ * How hard this entry holds its place when the row runs out of room —
17
+ * **higher stays on the row longer**. Defaults to `0`, and among equals the
18
+ * entry rendered LAST gives way first, so an action that says nothing keeps
19
+ * the order the toolbar already has (see `layout.ts`).
20
+ *
21
+ * Declaring it is how an entry escapes that default: a rare, wordy entry that
22
+ * happens to sort early asks to give way sooner with a negative number.
23
+ */
24
+ priority?: number;
15
25
  };
16
26
  export type ToolbarAction = ActionBase & {
17
27
  label?: string;
@@ -2,5 +2,6 @@ export * from './action.js';
2
2
  export * from './config.js';
3
3
  export * from './context.js';
4
4
  export { Flag as ToolbarFlag } from './flags.js';
5
+ export * from './layout.js';
5
6
  export * from './module.js';
6
7
  export * from './registry.js';
@@ -2,5 +2,6 @@ export * from './action.js';
2
2
  export * from './config.js';
3
3
  export * from './context.js';
4
4
  export { Flag as ToolbarFlag } from './flags.js';
5
+ export * from './layout.js';
5
6
  export * from './module.js';
6
7
  export * from './registry.js';
@@ -0,0 +1,134 @@
1
+ /**
2
+ * **Priority collapse** — how a contextual toolbar stays on ONE line.
3
+ *
4
+ * The PO's arbitration of 02/08/2026 killed the previous answer, which was to
5
+ * let the toolbar wrap onto a second row: the "⋮" button ended up alone on a
6
+ * line of its own, and a toolbar whose height changes with the selection is a
7
+ * toolbar that moves under the cursor. The replacement is the one every desktop
8
+ * toolbar has used for thirty years — when the row runs out of room, the least
9
+ * important entries give way, in that order, into the overflow menu that is
10
+ * already there.
11
+ *
12
+ * ## Why the algorithm lives here and not in the widget
13
+ *
14
+ * Nothing below touches the DOM. It takes the entries' DECLARED priority and a
15
+ * handful of measured widths and answers "which entries give way, and how" —
16
+ * which makes it a pure function the unit suite can pin down entirely, and
17
+ * leaves the widget with only the two things that genuinely need a browser:
18
+ * measuring, and re-rendering.
19
+ *
20
+ * It also keeps the rule where the rule belongs. `priority` is a field of
21
+ * {@link ToolbarAction}, so an entry decides its own fate from its own config
22
+ * file; the widget never learns that a framework exists.
23
+ *
24
+ * ## The two ways an entry gives way, in order
25
+ *
26
+ * 1. **Icon only.** An entry that renders an icon AND a label drops its label
27
+ * first, keeping the label as its tooltip. A wordy entry costs three times
28
+ * an icon, and losing the word to a hover is a far smaller loss than losing
29
+ * the entry to a menu.
30
+ * 2. **Into the "⋮" menu.** Only then does the entry leave the row, keeping its
31
+ * full label and its behaviour as an entry of the menu.
32
+ *
33
+ * Every entry that CAN shrink shrinks before any entry moves — a row of icons
34
+ * is still a row of things you can click, and a menu is not.
35
+ *
36
+ * ## When a plan is worth remaking
37
+ *
38
+ * The arithmetic above answers "what should the row look like at this width".
39
+ * It does NOT answer "is this width worth answering for", and the PO's second
40
+ * pass of 02/08/2026 is about that second question: during a zoom the room the
41
+ * row has moves sixty times a second, and a row that replans on every one of
42
+ * those frames visibly hesitates between several compositions — and, since its
43
+ * width is what the positioner anchors, between several places.
44
+ *
45
+ * Two answers are refused, both of them pure and both of them here:
46
+ * {@link toolbarRoomChanged} refuses a change too small to mean anything, and
47
+ * {@link TOOLBAR_SETTLE_DELAY} is how long the room must hold still before the
48
+ * widget bothers to ask at all.
49
+ */
50
+ /**
51
+ * How much the room must move before the row is worth re-composing, in pixels.
52
+ *
53
+ * A few pixels, deliberately: less than the narrowest thing the row could give
54
+ * up, so no real degradation is ever delayed by it, and more than the noise the
55
+ * measurements carry — a fractional zoom, a rounded rect, a scrollbar coming
56
+ * and going. Two measurements that differ by a hair are the same measurement,
57
+ * and treating them as two is how a composition ends up alternating forever.
58
+ */
59
+ export declare const TOOLBAR_ROOM_HYSTERESIS = 4;
60
+ /**
61
+ * How long the room must hold still before the row is replanned, in ms.
62
+ *
63
+ * Long enough to bridge the frames of a gesture — a zoom, a pan, a window being
64
+ * dragged — so the row keeps ONE composition for the whole of it, and short
65
+ * enough that letting go feels like the row simply followed.
66
+ */
67
+ export declare const TOOLBAR_SETTLE_DELAY = 150;
68
+ /**
69
+ * Whether the room the row has really changed since the plan on screen.
70
+ *
71
+ * `Infinity` is a value like any other here: a row nothing has positioned yet
72
+ * has all the room in the world, and going from that to a finite cap (or back)
73
+ * is always a change, however large the numbers are.
74
+ */
75
+ export declare function toolbarRoomChanged(planned: number, measured: number, threshold?: number): boolean;
76
+ /** One entry of the row, as the planner sees it. */
77
+ export interface ToolbarLayoutItem {
78
+ id: string;
79
+ /**
80
+ * Higher stays on the row longer. `0` unless the entry says otherwise; among
81
+ * equals the one rendered LAST gives way first, so leaving every entry alone
82
+ * reproduces the order the toolbar already has.
83
+ */
84
+ priority: number;
85
+ /** Renders an icon and a label today, so it has a label to drop. */
86
+ shrinkable: boolean;
87
+ /** The widget knows how to re-render it as an entry of the "⋮" menu. */
88
+ collapsible: boolean;
89
+ }
90
+ /** One degradation, applied to one entry. */
91
+ export type ToolbarLayoutStep = {
92
+ kind: 'shrink';
93
+ id: string;
94
+ } | {
95
+ kind: 'collapse';
96
+ id: string;
97
+ };
98
+ /** What the row currently measures, in CSS pixels. */
99
+ export interface ToolbarMetrics {
100
+ /** Width the entries occupy when nothing has given way yet. */
101
+ content: number;
102
+ /** Width they may occupy. `Infinity` when nothing constrains the row. */
103
+ available: number;
104
+ /** Width freed by dropping an entry's label, by action id. */
105
+ label: Readonly<Record<string, number>>;
106
+ /** Width freed by moving an entry into the menu, by action id. */
107
+ entry: Readonly<Record<string, number>>;
108
+ /** What the "⋮" button costs on a row that has none yet. */
109
+ menuCost: number;
110
+ /** Whether the row already carries a "⋮" button. */
111
+ hasMenu: boolean;
112
+ }
113
+ /**
114
+ * Every degradation available for this row, in the order they must be spent.
115
+ *
116
+ * All the shrinks first, then all the collapses; within each phase, the least
117
+ * important entry first. An entry that can do both appears twice — which is
118
+ * exactly the arbitration's "icon only BEFORE it is a candidate for the ⋮".
119
+ */
120
+ export declare function toolbarDegradationSteps(items: readonly ToolbarLayoutItem[]): ToolbarLayoutStep[];
121
+ /**
122
+ * The shortest prefix of `steps` that brings the row back within `available`.
123
+ *
124
+ * Spends steps one at a time, cheapest loss first, and stops the moment the row
125
+ * fits — a toolbar that collapses more than it must is a toolbar that hides
126
+ * things for nothing. A step that would free nothing is skipped rather than
127
+ * spent: dropping a label of zero width, or opening a "⋮" that costs more than
128
+ * the entry it swallows, is a change with no benefit.
129
+ *
130
+ * Returns `[]` when the row already fits, and may return fewer steps than are
131
+ * needed when the row cannot fit at all — the caller renders what it can and
132
+ * the row stays one line, which is the whole point.
133
+ */
134
+ export declare function planToolbarLayout(steps: readonly ToolbarLayoutStep[], metrics: ToolbarMetrics): ToolbarLayoutStep[];
@@ -0,0 +1,146 @@
1
+ /**
2
+ * **Priority collapse** — how a contextual toolbar stays on ONE line.
3
+ *
4
+ * The PO's arbitration of 02/08/2026 killed the previous answer, which was to
5
+ * let the toolbar wrap onto a second row: the "⋮" button ended up alone on a
6
+ * line of its own, and a toolbar whose height changes with the selection is a
7
+ * toolbar that moves under the cursor. The replacement is the one every desktop
8
+ * toolbar has used for thirty years — when the row runs out of room, the least
9
+ * important entries give way, in that order, into the overflow menu that is
10
+ * already there.
11
+ *
12
+ * ## Why the algorithm lives here and not in the widget
13
+ *
14
+ * Nothing below touches the DOM. It takes the entries' DECLARED priority and a
15
+ * handful of measured widths and answers "which entries give way, and how" —
16
+ * which makes it a pure function the unit suite can pin down entirely, and
17
+ * leaves the widget with only the two things that genuinely need a browser:
18
+ * measuring, and re-rendering.
19
+ *
20
+ * It also keeps the rule where the rule belongs. `priority` is a field of
21
+ * {@link ToolbarAction}, so an entry decides its own fate from its own config
22
+ * file; the widget never learns that a framework exists.
23
+ *
24
+ * ## The two ways an entry gives way, in order
25
+ *
26
+ * 1. **Icon only.** An entry that renders an icon AND a label drops its label
27
+ * first, keeping the label as its tooltip. A wordy entry costs three times
28
+ * an icon, and losing the word to a hover is a far smaller loss than losing
29
+ * the entry to a menu.
30
+ * 2. **Into the "⋮" menu.** Only then does the entry leave the row, keeping its
31
+ * full label and its behaviour as an entry of the menu.
32
+ *
33
+ * Every entry that CAN shrink shrinks before any entry moves — a row of icons
34
+ * is still a row of things you can click, and a menu is not.
35
+ *
36
+ * ## When a plan is worth remaking
37
+ *
38
+ * The arithmetic above answers "what should the row look like at this width".
39
+ * It does NOT answer "is this width worth answering for", and the PO's second
40
+ * pass of 02/08/2026 is about that second question: during a zoom the room the
41
+ * row has moves sixty times a second, and a row that replans on every one of
42
+ * those frames visibly hesitates between several compositions — and, since its
43
+ * width is what the positioner anchors, between several places.
44
+ *
45
+ * Two answers are refused, both of them pure and both of them here:
46
+ * {@link toolbarRoomChanged} refuses a change too small to mean anything, and
47
+ * {@link TOOLBAR_SETTLE_DELAY} is how long the room must hold still before the
48
+ * widget bothers to ask at all.
49
+ */
50
+ /**
51
+ * How much the room must move before the row is worth re-composing, in pixels.
52
+ *
53
+ * A few pixels, deliberately: less than the narrowest thing the row could give
54
+ * up, so no real degradation is ever delayed by it, and more than the noise the
55
+ * measurements carry — a fractional zoom, a rounded rect, a scrollbar coming
56
+ * and going. Two measurements that differ by a hair are the same measurement,
57
+ * and treating them as two is how a composition ends up alternating forever.
58
+ */
59
+ export const TOOLBAR_ROOM_HYSTERESIS = 4;
60
+ /**
61
+ * How long the room must hold still before the row is replanned, in ms.
62
+ *
63
+ * Long enough to bridge the frames of a gesture — a zoom, a pan, a window being
64
+ * dragged — so the row keeps ONE composition for the whole of it, and short
65
+ * enough that letting go feels like the row simply followed.
66
+ */
67
+ export const TOOLBAR_SETTLE_DELAY = 150;
68
+ /**
69
+ * Whether the room the row has really changed since the plan on screen.
70
+ *
71
+ * `Infinity` is a value like any other here: a row nothing has positioned yet
72
+ * has all the room in the world, and going from that to a finite cap (or back)
73
+ * is always a change, however large the numbers are.
74
+ */
75
+ export function toolbarRoomChanged(planned, measured, threshold = TOOLBAR_ROOM_HYSTERESIS) {
76
+ if (planned === measured)
77
+ return false;
78
+ if (!Number.isFinite(planned) || !Number.isFinite(measured))
79
+ return true;
80
+ return Math.abs(measured - planned) > threshold;
81
+ }
82
+ /**
83
+ * Every degradation available for this row, in the order they must be spent.
84
+ *
85
+ * All the shrinks first, then all the collapses; within each phase, the least
86
+ * important entry first. An entry that can do both appears twice — which is
87
+ * exactly the arbitration's "icon only BEFORE it is a candidate for the ⋮".
88
+ */
89
+ export function toolbarDegradationSteps(items) {
90
+ const order = items
91
+ .map((item, index) => ({ item, index }))
92
+ // Least important first: by declared priority, then — for the entries that
93
+ // declared nothing, which is most of them — by reverse rendered order.
94
+ .sort((a, b) => a.item.priority - b.item.priority || b.index - a.index);
95
+ return [
96
+ ...order
97
+ .filter(({ item }) => item.shrinkable)
98
+ .map(({ item }) => ({ kind: 'shrink', id: item.id })),
99
+ ...order
100
+ .filter(({ item }) => item.collapsible)
101
+ .map(({ item }) => ({
102
+ kind: 'collapse',
103
+ id: item.id,
104
+ })),
105
+ ];
106
+ }
107
+ /**
108
+ * The shortest prefix of `steps` that brings the row back within `available`.
109
+ *
110
+ * Spends steps one at a time, cheapest loss first, and stops the moment the row
111
+ * fits — a toolbar that collapses more than it must is a toolbar that hides
112
+ * things for nothing. A step that would free nothing is skipped rather than
113
+ * spent: dropping a label of zero width, or opening a "⋮" that costs more than
114
+ * the entry it swallows, is a change with no benefit.
115
+ *
116
+ * Returns `[]` when the row already fits, and may return fewer steps than are
117
+ * needed when the row cannot fit at all — the caller renders what it can and
118
+ * the row stays one line, which is the whole point.
119
+ */
120
+ export function planToolbarLayout(steps, metrics) {
121
+ const { available } = metrics;
122
+ let width = metrics.content;
123
+ if (width <= available)
124
+ return [];
125
+ let hasMenu = metrics.hasMenu;
126
+ const applied = [];
127
+ for (const step of steps) {
128
+ if (width <= available)
129
+ break;
130
+ if (step.kind === 'shrink') {
131
+ const saved = metrics.label[step.id] ?? 0;
132
+ if (saved <= 0)
133
+ continue;
134
+ width -= saved;
135
+ }
136
+ else {
137
+ const saved = (metrics.entry[step.id] ?? 0) - (hasMenu ? 0 : metrics.menuCost);
138
+ if (saved <= 0)
139
+ continue;
140
+ width -= saved;
141
+ hasMenu = true;
142
+ }
143
+ applied.push(step);
144
+ }
145
+ return applied;
146
+ }
@@ -0,0 +1,68 @@
1
+ import type { BlockStdScope } from '../../../std/index.js';
2
+ import type { ExtensionType } from '../../../store/index.js';
3
+ /**
4
+ * The library holds no prose: every human-readable string it produces —
5
+ * shortcut labels, role names, validation messages — is an i18n KEY
6
+ * (`com.labre.wardley.validation.change-arrow-against-evolution`). Historically those
7
+ * keys never had to be rendered here: `getShortcutManifest` hands them to the
8
+ * host, which owns the catalogue and the settings panel.
9
+ *
10
+ * PF7 is the first library UI that has to SHOW one — a violation bubble names
11
+ * the rule it reports. This is the seam for it, and nothing more: the host
12
+ * injects a catalogue, the library asks it for a key. There is no bundled
13
+ * catalogue, no locale negotiation and no pluralisation. Those belong to the
14
+ * host, which already runs an i18n stack.
15
+ *
16
+ * Mirrors `TelemetryExtension` / `KeymapOverrideExtension`: an optional
17
+ * host-injected service, absent by default, with a graceful fallback at every
18
+ * call site (see {@link translateKey}).
19
+ *
20
+ * A host builds its catalogue from `getTranslationKeyManifest()`
21
+ * (`@labre/affine/translations`) — every key the library can ask for, with its
22
+ * English fallback — rather than chasing call sites. See `./README.md`.
23
+ */
24
+ export interface TranslationService {
25
+ /**
26
+ * Resolve an i18n key. Return `undefined` when the catalogue has no entry,
27
+ * so the caller can fall back rather than render an empty bubble.
28
+ */
29
+ t(key: string): string | undefined;
30
+ /**
31
+ * The language the catalogue is currently serving, as a BCP-47 tag
32
+ * (`'fr'`, `'en-GB'`). Optional, and NOT locale negotiation — the library
33
+ * still holds no catalogue and still chooses nothing.
34
+ *
35
+ * It exists for the one kind of statement the library cannot make without
36
+ * knowing the language: a suggestion ABOUT WORDS. A naming convention is a
37
+ * motif in one language (see `ReadingNamingConvention.lang`), and applying an
38
+ * English motif to a board named in French produces a confident wrong answer
39
+ * in both directions. The host that owns the catalogue is the only thing here
40
+ * that knows which language the user is working in; a host that does not say
41
+ * gets silence rather than a guess.
42
+ */
43
+ language?: string;
44
+ }
45
+ /**
46
+ * The primary subtag of the host's language, lower-cased — `'fr'` for
47
+ * `'fr-CA'` — or `undefined` when no host said.
48
+ *
49
+ * Primary subtag only: a naming motif is a property of a LANGUAGE, and no
50
+ * framework has a convention that holds in `en-GB` and not in `en-US`.
51
+ */
52
+ export declare function hostLanguage(std: BlockStdScope): string | undefined;
53
+ export declare const TranslationProvider: import("../../../global/di/types.js").ServiceIdentifier<TranslationService> & (<U extends TranslationService = TranslationService>(variant: import("../../../global/di/types.js").ServiceVariant) => import("../../../global/di/types.js").ServiceIdentifier<U>);
54
+ export declare const TranslationExtension: (service: TranslationService) => ExtensionType;
55
+ /**
56
+ * Resolve `key`, falling back to `fallback` — which defaults to the key itself.
57
+ *
58
+ * Two deliberate cases:
59
+ *
60
+ * - **Framework prose** (a rule message, a role name) passes NO fallback. With
61
+ * no catalogue registered the raw key is shown. It is ugly, and that is the
62
+ * point: the library must never invent the wording of somebody else's rule,
63
+ * and a dangling key is a bug the host has to see rather than a sentence we
64
+ * made up.
65
+ * - **Chrome** (the word "Warning" on a severity chip) passes an English
66
+ * default, so a standalone playground reads correctly without a catalogue.
67
+ */
68
+ export declare function translateKey(std: BlockStdScope, key: string, fallback?: string): string;
@@ -0,0 +1,39 @@
1
+ import { createIdentifier } from '../../../global/di/index.js';
2
+ /**
3
+ * The primary subtag of the host's language, lower-cased — `'fr'` for
4
+ * `'fr-CA'` — or `undefined` when no host said.
5
+ *
6
+ * Primary subtag only: a naming motif is a property of a LANGUAGE, and no
7
+ * framework has a convention that holds in `en-GB` and not in `en-US`.
8
+ */
9
+ export function hostLanguage(std) {
10
+ const tag = std.getOptional(TranslationProvider)?.language;
11
+ if (typeof tag !== 'string' || tag.length === 0)
12
+ return undefined;
13
+ return tag.split('-')[0].toLowerCase();
14
+ }
15
+ export const TranslationProvider = createIdentifier('AffineTranslationService');
16
+ export const TranslationExtension = (service) => {
17
+ return {
18
+ setup: di => {
19
+ di.override(TranslationProvider, () => service);
20
+ },
21
+ };
22
+ };
23
+ /**
24
+ * Resolve `key`, falling back to `fallback` — which defaults to the key itself.
25
+ *
26
+ * Two deliberate cases:
27
+ *
28
+ * - **Framework prose** (a rule message, a role name) passes NO fallback. With
29
+ * no catalogue registered the raw key is shown. It is ugly, and that is the
30
+ * point: the library must never invent the wording of somebody else's rule,
31
+ * and a dangling key is a bug the host has to see rather than a sentence we
32
+ * made up.
33
+ * - **Chrome** (the word "Warning" on a severity chip) passes an English
34
+ * default, so a standalone playground reads correctly without a catalogue.
35
+ */
36
+ export function translateKey(std, key, fallback = key) {
37
+ const resolved = std.getOptional(TranslationProvider)?.t(key);
38
+ return resolved !== undefined && resolved !== '' ? resolved : fallback;
39
+ }