@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
@@ -18,14 +18,19 @@ export function resolveMenuItemLabel(items, currentValue, std) {
18
18
  ? translateKey(std, ...item.keyWording)
19
19
  : item.key;
20
20
  }
21
- export function renderMenu({ label, labelWording, tooltip, tooltipWording, icon, items, currentValue, onPick, std, }) {
21
+ export function renderMenu({ label, labelWording, tooltip, tooltipWording, menuAriaWording, icon, items, currentValue, onPick, std, }) {
22
22
  const resolvedLabel = labelWording && std ? translateKey(std, ...labelWording) : label;
23
23
  const resolvedTooltip = tooltipWording && std
24
24
  ? translateKey(std, ...tooltipWording)
25
25
  : (tooltip ?? resolvedLabel);
26
+ // Composed from the ENGLISH `label`, never `resolvedLabel` (#390): sewing
27
+ // `-menu` onto a translated word produced "changer le type de forme-menu".
28
+ const menuAria = menuAriaWording && std
29
+ ? translateKey(std, ...menuAriaWording)
30
+ : `${label.toLowerCase()}-menu`;
26
31
  return html `
27
32
  <editor-menu-button
28
- aria-label="${`${resolvedLabel.toLowerCase()}-menu`}"
33
+ aria-label="${menuAria}"
29
34
  .button=${html `
30
35
  <editor-icon-button
31
36
  aria-label="${resolvedLabel}"
@@ -19,6 +19,19 @@ export function createPopper(tagName, reference, options) {
19
19
  const popper = elMap.get(tagName);
20
20
  if (popper) {
21
21
  popper.cancel?.();
22
+ // The cached element is handed back with the DOM it rendered the LAST
23
+ // time it opened, and a menu whose content depends on anything but its
24
+ // own properties never recomputes it. The senior rows do: an
25
+ // `EdgelessCommandMenu` ranks its buttons by command usage, read per
26
+ // render precisely so the row reflects what the user did this morning —
27
+ // and the PO's recette of 2026-09-15 found that a command that had just
28
+ // earned its seat (`uml.importXmi`, one import in) only appeared after a
29
+ // reload, because reopening the row re-showed yesterday's DOM.
30
+ //
31
+ // One update per reopen, requested from the toggle and not from a render,
32
+ // so there is no loop: Lit coalesces it into the next microtask and the
33
+ // menu's own `render()` is what reads the measure again.
34
+ popper.element.requestUpdate?.();
22
35
  requestAnimationFrame(() => animateEnter(popper.element));
23
36
  return popper;
24
37
  }
@@ -9,4 +9,6 @@ export * from './draggable/index.js';
9
9
  export * from './edgeless-toolbar.js';
10
10
  export * from './extension/index.js';
11
11
  export * from './menu/command-menu.js';
12
+ export * from './menu/senior-menu-selection.js';
12
13
  export * from './mixins/index.js';
14
+ export * from './placement/index.js';
@@ -9,4 +9,6 @@ export * from './draggable/index.js';
9
9
  export * from './edgeless-toolbar.js';
10
10
  export * from './extension/index.js';
11
11
  export * from './menu/command-menu.js';
12
+ export * from './menu/senior-menu-selection.js';
12
13
  export * from './mixins/index.js';
14
+ export * from './placement/index.js';
@@ -11,6 +11,12 @@ declare const EdgelessCommandMenu_base: typeof LitElement & import("../../global
11
11
  * There is now exactly one renderer, and it enumerates
12
12
  * `getCommandsForSurface(std, owner, 'senior-menu')`. A framework subclass
13
13
  * declares its owner and its tool type, nothing else. See `docs/adr/0008`.
14
+ *
15
+ * `SignalWatcher` and not the mixin's own effect: the mixin registers that
16
+ * effect in `connectedCallback`, and bails out when `edgeless` is still unset —
17
+ * which it always is here, because the senior button assigns it AFTER appending
18
+ * the popover. So the row is re-rendered by reading the tool signal in
19
+ * {@link _armed} during render, the way the senior buttons do it.
14
20
  */
15
21
  export declare abstract class EdgelessCommandMenu extends EdgelessCommandMenu_base {
16
22
  /**
@@ -27,9 +33,73 @@ export declare abstract class EdgelessCommandMenu extends EdgelessCommandMenu_ba
27
33
  * frame, and the usage measure it reads is the whole point — a list cached
28
34
  * across openings would show the user yesterday's ranking of what they did
29
35
  * this morning.
36
+ *
37
+ * "Per render" is only worth anything if reopening the row IS a render, and
38
+ * for a while it was not: `createPopper` hands a cached element back rather
39
+ * than building a new one, so the row re-showed the DOM of its last opening
40
+ * and a command that had just earned its seat waited for a reload. The reopen
41
+ * path now requests an update; this getter is what it exists to re-ask.
30
42
  */
31
43
  private get _selection();
32
44
  get commands(): CommandDescriptor[];
45
+ /** Whoever shows an owner's whole catalogue, when anything does. */
46
+ private get _catalogue();
47
+ /**
48
+ * How many buttons a keypress can land on: the commands, plus the overflow
49
+ * button on the rows that render one. Read from the same `_selection` the
50
+ * render does, so the highlight can never point past what is on screen.
51
+ */
52
+ private get _slots();
53
+ /**
54
+ * Which button the armed artefact sits on, `-1` when this owner has none
55
+ * armed. Read off the tool option signal the mixin already subscribes to, so
56
+ * arming from anywhere — this menu, a keystroke, the catalogue — lights the
57
+ * same button.
58
+ */
59
+ private get _armed();
60
+ /**
61
+ * What the row shows as highlighted: the armed artefact when there is one,
62
+ * otherwise wherever the keyboard walked. The armed command WINS, so the
63
+ * menu can never point at one artefact while the ghost under the cursor is
64
+ * another.
65
+ */
66
+ private get _highlight();
67
+ /**
68
+ * Move the highlight by one button, wrapping at both ends.
69
+ *
70
+ * Shift+S over an open senior menu is the analogue of Shift+S over the shape
71
+ * tool: the same keystroke walks the row backwards.
72
+ *
73
+ * With an artefact ARMED it walks the tool instead — same row, same
74
+ * direction, and the ghost under the cursor changes with the highlight. The
75
+ * row it walks then is the row's artefacts alone: an entry of kind `'tool'`
76
+ * arms a gesture of its own and has no ghost to offer.
77
+ *
78
+ * With nothing armed it moves a HIGHLIGHT and nothing else, because these
79
+ * commands each drop an artefact on the canvas and "run the next one on every
80
+ * press" would litter the board.
81
+ */
82
+ cycle(dir: 1 | -1): void;
83
+ /**
84
+ * Do whatever the keyboard points at, and say whether it did.
85
+ *
86
+ * It goes through the same {@link _invoke} the click goes through, so an
87
+ * artefact reached from the keyboard is armed exactly like a clicked one, and
88
+ * a command run from it is measured and reported exactly like a clicked one.
89
+ * With nothing highlighted it consumes nothing and the caller's own Enter
90
+ * stands.
91
+ */
92
+ activate(): boolean;
93
+ /**
94
+ * An artefact is ARMED, not created (PO decision, 2026-09-16): the ghost goes
95
+ * under the cursor and the click on the canvas says where. Everything else —
96
+ * a link tool, a toggle, an export — runs on the spot, as it always has.
97
+ *
98
+ * Arming deliberately emits nothing and measures nothing. The ONE emission
99
+ * point is still `runCommand`, which the placement tool calls when the
100
+ * artefact actually lands; a user who arms one and changes their mind has not
101
+ * used it.
102
+ */
33
103
  private _invoke;
34
104
  /**
35
105
  * What the button says on hover: its label, plus — when the command declares
@@ -53,5 +123,15 @@ export declare abstract class EdgelessCommandMenu extends EdgelessCommandMenu_ba
53
123
  */
54
124
  private _renderCatalogueButton;
55
125
  render(): import("lit-html").TemplateResult<1>;
126
+ /**
127
+ * Which button the keyboard points at, `-1` while it points at none.
128
+ *
129
+ * It starts empty and stays empty until a cycling key is pressed: a menu that
130
+ * opened with its first artefact already lit would read as a choice the user
131
+ * did not make. Nothing resets it on close because each opening builds a new
132
+ * menu element — the only case the popover hands the same one back is a
133
+ * re-open during the leave transition, where the row never left the screen.
134
+ */
135
+ private accessor _active;
56
136
  }
57
137
  export {};
@@ -1,8 +1,46 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
1
35
  import { ArtefactCatalogueProvider, translateKey, } from '../../affine-shared/services/index.js';
2
- import { CommandUsageIdentifier, getCommandIcon, getCommandsForSurface, runCommand, selectSeniorMenuCommands, } from '../../std/index.js';
36
+ import { getCommandIcon, runCommand, } from '../../std/index.js';
3
37
  import { MoreHorizontalIcon } from '@blocksuite/icons/lit';
38
+ import { SignalWatcher } from '../../global/lit/index.js';
4
39
  import { css, html, LitElement, nothing } from 'lit';
40
+ import { state } from 'lit/decorators.js';
5
41
  import { EdgelessToolbarToolMixin } from '../mixins/tool.mixin.js';
42
+ import { armArtefact, armedArtefact, cycleArmedArtefact, } from '../placement/artefact-placement-tool.js';
43
+ import { seniorMenuSelection } from './senior-menu-selection.js';
6
44
  /**
7
45
  * The senior button sub-menu, rendered FROM the command registry.
8
46
  *
@@ -13,13 +51,30 @@ import { EdgelessToolbarToolMixin } from '../mixins/tool.mixin.js';
13
51
  * There is now exactly one renderer, and it enumerates
14
52
  * `getCommandsForSurface(std, owner, 'senior-menu')`. A framework subclass
15
53
  * declares its owner and its tool type, nothing else. See `docs/adr/0008`.
54
+ *
55
+ * `SignalWatcher` and not the mixin's own effect: the mixin registers that
56
+ * effect in `connectedCallback`, and bails out when `edgeless` is still unset —
57
+ * which it always is here, because the senior button assigns it AFTER appending
58
+ * the popover. So the row is re-rendered by reading the tool signal in
59
+ * {@link _armed} during render, the way the senior buttons do it.
16
60
  */
17
- export class EdgelessCommandMenu extends EdgelessToolbarToolMixin(LitElement) {
18
- /**
19
- * Typed as a group so a subclass can extend rather than replace it — the DDD
20
- * palettes narrow `--labre-command-menu-gap`.
21
- */
22
- static { this.styles = css `
61
+ let EdgelessCommandMenu = (() => {
62
+ let _classSuper = EdgelessToolbarToolMixin(SignalWatcher(LitElement));
63
+ let __active_decorators;
64
+ let __active_initializers = [];
65
+ let __active_extraInitializers = [];
66
+ return class EdgelessCommandMenu extends _classSuper {
67
+ static {
68
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
69
+ __active_decorators = [state()];
70
+ __esDecorate(this, null, __active_decorators, { kind: "accessor", name: "_active", static: false, private: false, access: { has: obj => "_active" in obj, get: obj => obj._active, set: (obj, value) => { obj._active = value; } }, metadata: _metadata }, __active_initializers, __active_extraInitializers);
71
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
72
+ }
73
+ /**
74
+ * Typed as a group so a subclass can extend rather than replace it — the DDD
75
+ * palettes narrow `--labre-command-menu-gap`.
76
+ */
77
+ static { this.styles = css `
23
78
  :host {
24
79
  display: flex;
25
80
  z-index: -1;
@@ -41,100 +96,234 @@ export class EdgelessCommandMenu extends EdgelessToolbarToolMixin(LitElement) {
41
96
  height: 24px;
42
97
  }
43
98
  `; }
44
- /**
45
- * The buttons, and whether the owner outgrew the fourteen slots.
46
- *
47
- * Recomputed per render on purpose: it opens with the popover, not with a
48
- * frame, and the usage measure it reads is the whole point — a list cached
49
- * across openings would show the user yesterday's ranking of what they did
50
- * this morning.
51
- */
52
- get _selection() {
53
- const std = this.edgeless.std;
54
- const usage = std.getOptional(CommandUsageIdentifier);
55
- return selectSeniorMenuCommands(getCommandsForSurface(std, this.owner, 'senior-menu'), getCommandsForSurface(std, this.owner, 'catalogue'), id => usage?.statsOf(id));
56
- }
57
- get commands() {
58
- return this._selection.commands;
59
- }
60
- _invoke(command) {
61
- // The ONE emission point: no `_track()` helper anywhere in the menus.
62
- runCommand(this.edgeless.std, command, {
63
- surface: 'senior-menu',
64
- source: 'toolbar:general',
65
- });
66
- }
67
- /**
68
- * What the button says on hover: its label, plus — when the command declares
69
- * one — the sentence that tells the user what its GESTURE means.
70
- *
71
- * That second line is M1 of `docs/adr/0010`: a link tool whose drag decides
72
- * the orientation of a persisted relation has to SAY so, or the direction it
73
- * writes is a by-product rather than a statement. The library still puts no
74
- * words in a framework's mouth — both halves are the framework's own keys and
75
- * fallbacks, resolved through the host's catalogue.
76
- */
77
- _tooltip(command) {
78
- const label = translateKey(this.edgeless.std, command.labelKey, command.labelFallback);
79
- const { descriptionKey, descriptionFallback } = command;
80
- if (!descriptionKey && !descriptionFallback)
81
- return label;
82
- const hint = descriptionKey
83
- ? translateKey(this.edgeless.std, descriptionKey, descriptionFallback)
84
- : descriptionFallback;
85
- // A key with no catalogue entry and no fallback resolves to itself — show
86
- // the label alone rather than a raw i18n key under it.
87
- if (!hint || hint === descriptionKey)
88
- return label;
89
- // Inline, not a class: the template is rendered inside the icon button's
90
- // own shadow root, where this component's stylesheet does not reach.
91
- return html `${label}<span
99
+ /**
100
+ * The buttons, and whether the owner outgrew the fourteen slots.
101
+ *
102
+ * Recomputed per render on purpose: it opens with the popover, not with a
103
+ * frame, and the usage measure it reads is the whole point — a list cached
104
+ * across openings would show the user yesterday's ranking of what they did
105
+ * this morning.
106
+ *
107
+ * "Per render" is only worth anything if reopening the row IS a render, and
108
+ * for a while it was not: `createPopper` hands a cached element back rather
109
+ * than building a new one, so the row re-showed the DOM of its last opening
110
+ * and a command that had just earned its seat waited for a reload. The reopen
111
+ * path now requests an update; this getter is what it exists to re-ask.
112
+ */
113
+ get _selection() {
114
+ return seniorMenuSelection(this.edgeless.std, this.owner);
115
+ }
116
+ get commands() {
117
+ return this._selection.commands;
118
+ }
119
+ /** Whoever shows an owner's whole catalogue, when anything does. */
120
+ get _catalogue() {
121
+ return this.edgeless.std.getOptional(ArtefactCatalogueProvider);
122
+ }
123
+ /**
124
+ * How many buttons a keypress can land on: the commands, plus the overflow
125
+ * button on the rows that render one. Read from the same `_selection` the
126
+ * render does, so the highlight can never point past what is on screen.
127
+ */
128
+ get _slots() {
129
+ const { commands, overflow } = this._selection;
130
+ return commands.length + (overflow && this._catalogue ? 1 : 0);
131
+ }
132
+ /**
133
+ * Which button the armed artefact sits on, `-1` when this owner has none
134
+ * armed. Read off the tool option signal the mixin already subscribes to, so
135
+ * arming from anywhere — this menu, a keystroke, the catalogue — lights the
136
+ * same button.
137
+ */
138
+ get _armed() {
139
+ const armed = armedArtefact(this.gfx);
140
+ if (!armed || armed.owner !== this.owner)
141
+ return -1;
142
+ return this._selection.commands.findIndex(command => command.id === armed.command.id);
143
+ }
144
+ /**
145
+ * What the row shows as highlighted: the armed artefact when there is one,
146
+ * otherwise wherever the keyboard walked. The armed command WINS, so the
147
+ * menu can never point at one artefact while the ghost under the cursor is
148
+ * another.
149
+ */
150
+ get _highlight() {
151
+ const armed = this._armed;
152
+ return armed >= 0 ? armed : this._active;
153
+ }
154
+ /**
155
+ * Move the highlight by one button, wrapping at both ends.
156
+ *
157
+ * Shift+S over an open senior menu is the analogue of Shift+S over the shape
158
+ * tool: the same keystroke walks the row backwards.
159
+ *
160
+ * With an artefact ARMED it walks the tool instead — same row, same
161
+ * direction, and the ghost under the cursor changes with the highlight. The
162
+ * row it walks then is the row's artefacts alone: an entry of kind `'tool'`
163
+ * arms a gesture of its own and has no ghost to offer.
164
+ *
165
+ * With nothing armed it moves a HIGHLIGHT and nothing else, because these
166
+ * commands each drop an artefact on the canvas and "run the next one on every
167
+ * press" would litter the board.
168
+ */
169
+ cycle(dir) {
170
+ if (this._armed >= 0) {
171
+ cycleArmedArtefact(this.gfx, dir);
172
+ return;
173
+ }
174
+ const slots = this._slots;
175
+ if (slots === 0)
176
+ return;
177
+ if (this._active < 0) {
178
+ // Nothing highlighted yet: forwards enters on the first button,
179
+ // backwards on the last — the "previous" the shape tool gives too.
180
+ this._active = dir === 1 ? 0 : slots - 1;
181
+ return;
182
+ }
183
+ this._active = (this._active + dir + slots) % slots;
184
+ }
185
+ /**
186
+ * Do whatever the keyboard points at, and say whether it did.
187
+ *
188
+ * It goes through the same {@link _invoke} the click goes through, so an
189
+ * artefact reached from the keyboard is armed exactly like a clicked one, and
190
+ * a command run from it is measured and reported exactly like a clicked one.
191
+ * With nothing highlighted it consumes nothing and the caller's own Enter
192
+ * stands.
193
+ */
194
+ activate() {
195
+ const highlight = this._highlight;
196
+ if (highlight < 0)
197
+ return false;
198
+ const { commands, overflow } = this._selection;
199
+ const command = commands[highlight];
200
+ if (command) {
201
+ this._invoke(command);
202
+ return true;
203
+ }
204
+ const catalogue = this._catalogue;
205
+ if (overflow && catalogue) {
206
+ catalogue.open(this.owner);
207
+ return true;
208
+ }
209
+ return false;
210
+ }
211
+ /**
212
+ * An artefact is ARMED, not created (PO decision, 2026-09-16): the ghost goes
213
+ * under the cursor and the click on the canvas says where. Everything else —
214
+ * a link tool, a toggle, an export — runs on the spot, as it always has.
215
+ *
216
+ * Arming deliberately emits nothing and measures nothing. The ONE emission
217
+ * point is still `runCommand`, which the placement tool calls when the
218
+ * artefact actually lands; a user who arms one and changes their mind has not
219
+ * used it.
220
+ */
221
+ _invoke(command) {
222
+ if (command.kind === 'artefact') {
223
+ armArtefact(this.gfx, this.owner, command);
224
+ return;
225
+ }
226
+ // The ONE emission point: no `_track()` helper anywhere in the menus.
227
+ runCommand(this.edgeless.std, command, {
228
+ surface: 'senior-menu',
229
+ source: 'toolbar:general',
230
+ });
231
+ }
232
+ /**
233
+ * What the button says on hover: its label, plus — when the command declares
234
+ * one — the sentence that tells the user what its GESTURE means.
235
+ *
236
+ * That second line is M1 of `docs/adr/0010`: a link tool whose drag decides
237
+ * the orientation of a persisted relation has to SAY so, or the direction it
238
+ * writes is a by-product rather than a statement. The library still puts no
239
+ * words in a framework's mouth — both halves are the framework's own keys and
240
+ * fallbacks, resolved through the host's catalogue.
241
+ */
242
+ _tooltip(command) {
243
+ const label = translateKey(this.edgeless.std, command.labelKey, command.labelFallback);
244
+ const { descriptionKey, descriptionFallback } = command;
245
+ if (!descriptionKey && !descriptionFallback)
246
+ return label;
247
+ const hint = descriptionKey
248
+ ? translateKey(this.edgeless.std, descriptionKey, descriptionFallback)
249
+ : descriptionFallback;
250
+ // A key with no catalogue entry and no fallback resolves to itself — show
251
+ // the label alone rather than a raw i18n key under it.
252
+ if (!hint || hint === descriptionKey)
253
+ return label;
254
+ // Inline, not a class: the template is rendered inside the icon button's
255
+ // own shadow root, where this component's stylesheet does not reach.
256
+ return html `${label}<span
92
257
  style="display:block;max-width:220px;margin-top:2px;opacity:0.75;font-size:11px;line-height:1.35;white-space:normal"
93
258
  >${hint}</span
94
259
  >`;
95
- }
96
- /**
97
- * The way out of a menu that no longer shows everything.
98
- *
99
- * It appears only past the cap, and only when something answers
100
- * {@link ArtefactCatalogueProvider}: a button that opens nothing is a dead
101
- * control, and the thirteen ranked slots are only defensible as a *shortcut*
102
- * to a catalogue the user can still reach in full. Thirteen plus this one is
103
- * fourteen — the overflowed row is exactly as wide as the cap.
104
- */
105
- _renderCatalogueButton() {
106
- const std = this.edgeless.std;
107
- const catalogue = std.getOptional(ArtefactCatalogueProvider);
108
- if (!catalogue)
109
- return nothing;
110
- const label = translateKey(std, 'com.labre.catalogue.open', 'More artefacts…');
111
- return html `<edgeless-tool-icon-button
260
+ }
261
+ /**
262
+ * The way out of a menu that no longer shows everything.
263
+ *
264
+ * It appears only past the cap, and only when something answers
265
+ * {@link ArtefactCatalogueProvider}: a button that opens nothing is a dead
266
+ * control, and the thirteen ranked slots are only defensible as a *shortcut*
267
+ * to a catalogue the user can still reach in full. Thirteen plus this one is
268
+ * fourteen — the overflowed row is exactly as wide as the cap.
269
+ */
270
+ _renderCatalogueButton(index) {
271
+ const std = this.edgeless.std;
272
+ const catalogue = this._catalogue;
273
+ if (!catalogue)
274
+ return nothing;
275
+ const label = translateKey(std, 'com.labre.catalogue.open', 'More artefacts…');
276
+ return html `<edgeless-tool-icon-button
112
277
  .tooltip=${html `${label}<span
113
278
  style="display:block;max-width:220px;margin-top:2px;opacity:0.75;font-size:11px;line-height:1.35;white-space:normal"
114
279
  >${translateKey(std, 'com.labre.catalogue.open.description', 'This framework offers more than the menu can show.')}</span
115
280
  >`}
281
+ .active=${index === this._highlight}
282
+ .hoverState=${index === this._highlight}
116
283
  @click=${() => catalogue.open(this.owner)}
117
284
  >
118
285
  ${MoreHorizontalIcon()}
119
286
  </edgeless-tool-icon-button>`;
120
- }
121
- render() {
122
- const std = this.edgeless.std;
123
- const { commands, overflow } = this._selection;
124
- return html `
287
+ }
288
+ render() {
289
+ const std = this.edgeless.std;
290
+ const { commands, overflow } = this._selection;
291
+ const highlight = this._highlight;
292
+ return html `
125
293
  <edgeless-slide-menu>
126
294
  <div class="menu-content">
127
295
  <div class="button-group-container">
128
- ${commands.map(command => html `<edgeless-tool-icon-button
296
+ ${commands.map((command, index) => html `<edgeless-tool-icon-button
297
+ data-command-id=${command.id}
129
298
  .tooltip=${this._tooltip(command)}
299
+ .active=${index === highlight}
300
+ .hoverState=${index === highlight}
130
301
  @click=${() => this._invoke(command)}
131
302
  >
132
303
  ${getCommandIcon(std, command.iconKey)}
133
304
  </edgeless-tool-icon-button>`)}
134
- ${overflow ? this._renderCatalogueButton() : nothing}
305
+ ${overflow ? this._renderCatalogueButton(commands.length) : nothing}
135
306
  </div>
136
307
  </div>
137
308
  </edgeless-slide-menu>
138
309
  `;
139
- }
140
- }
310
+ }
311
+ #_active_accessor_storage = __runInitializers(this, __active_initializers, -1);
312
+ /**
313
+ * Which button the keyboard points at, `-1` while it points at none.
314
+ *
315
+ * It starts empty and stays empty until a cycling key is pressed: a menu that
316
+ * opened with its first artefact already lit would read as a choice the user
317
+ * did not make. Nothing resets it on close because each opening builds a new
318
+ * menu element — the only case the popover hands the same one back is a
319
+ * re-open during the leave transition, where the row never left the screen.
320
+ */
321
+ get _active() { return this.#_active_accessor_storage; }
322
+ set _active(value) { this.#_active_accessor_storage = value; }
323
+ constructor() {
324
+ super(...arguments);
325
+ __runInitializers(this, __active_extraInitializers);
326
+ }
327
+ };
328
+ })();
329
+ export { EdgelessCommandMenu };
@@ -0,0 +1,15 @@
1
+ import { type AnyCommandDescriptor, type BlockStdScope, type CommandOwner } from '../../std/index.js';
2
+ /**
3
+ * The row one framework's senior sub-menu shows, and whether the owner outgrew
4
+ * its slots — `selectSeniorMenuCommands` fed from the registry and the user's
5
+ * own usage measure.
6
+ *
7
+ * It lives beside the menu rather than inside it because the ROW is now read by
8
+ * two things: the popover that draws it, and the placement tool that cycles
9
+ * along it on Shift+S. One reading, so the ghost can never step onto a button
10
+ * the menu does not show.
11
+ */
12
+ export declare function seniorMenuSelection(std: BlockStdScope, owner: CommandOwner): {
13
+ commands: AnyCommandDescriptor[];
14
+ overflow: boolean;
15
+ };
@@ -0,0 +1,15 @@
1
+ import { CommandUsageIdentifier, getCommandsForSurface, selectSeniorMenuCommands, } from '../../std/index.js';
2
+ /**
3
+ * The row one framework's senior sub-menu shows, and whether the owner outgrew
4
+ * its slots — `selectSeniorMenuCommands` fed from the registry and the user's
5
+ * own usage measure.
6
+ *
7
+ * It lives beside the menu rather than inside it because the ROW is now read by
8
+ * two things: the popover that draws it, and the placement tool that cycles
9
+ * along it on Shift+S. One reading, so the ghost can never step onto a button
10
+ * the menu does not show.
11
+ */
12
+ export function seniorMenuSelection(std, owner) {
13
+ const usage = std.getOptional(CommandUsageIdentifier);
14
+ return selectSeniorMenuCommands(getCommandsForSurface(std, owner, 'senior-menu'), getCommandsForSurface(std, owner, 'catalogue'), id => usage?.statsOf(id));
15
+ }
@@ -1,9 +1,27 @@
1
1
  import { FontFamily } from '../../affine-model/index.js';
2
+ import type { BlockStdScope } from '../../std/index.js';
2
3
  import { LitElement } from 'lit';
3
4
  export declare class EdgelessFontFamilyPanel extends LitElement {
4
5
  static styles: import("lit").CSSResult;
6
+ /**
7
+ * The families the host configured: those with at least one face in its
8
+ * `FontConfig` (#396). Read from the config itself rather than from
9
+ * `document.fonts`, which the font loader fills a few seconds late for every
10
+ * non-critical family.
11
+ *
12
+ * `null` when no config is registered (the seam is absent, or empty, which
13
+ * the font loader also treats as absent): every family is offered, as before
14
+ * the seam narrowed the list. None of them has a file then, so each paints
15
+ * with the same fallback anyway.
16
+ */
17
+ private _configuredFamilies;
5
18
  private _onSelect;
19
+ private _unavailableLabel;
6
20
  render(): unknown;
7
21
  accessor onSelect: ((value: FontFamily) => void) | undefined;
22
+ /** Set by the caller that has one (`gfx/text`'s `createTextActions`): it
23
+ * carries the host's `FontConfig` and translations. Optional, so the panel
24
+ * still renders (every family, in English) when created with none. */
25
+ accessor std: BlockStdScope | undefined;
8
26
  accessor value: FontFamily;
9
27
  }