@formicoidea/labre-core 0.32.0 → 0.34.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 (308) hide show
  1. package/dist/_pkgs/affine-block-attachment/attachment-block.js +3 -3
  2. package/dist/_pkgs/affine-block-attachment/configs/toolbar.d.ts +2 -2
  3. package/dist/_pkgs/affine-block-attachment/configs/toolbar.js +9 -7
  4. package/dist/_pkgs/affine-block-bookmark/configs/toolbar.js +12 -12
  5. package/dist/_pkgs/affine-block-callout/callout-block.js +1 -1
  6. package/dist/_pkgs/affine-block-code/code-block-inline.js +1 -1
  7. package/dist/_pkgs/affine-block-code/code-block.js +2 -2
  8. package/dist/_pkgs/affine-block-code/code-toolbar/config.js +9 -1
  9. package/dist/_pkgs/affine-block-code/code-toolbar/index.js +1 -1
  10. package/dist/_pkgs/affine-block-database/data-source.js +1 -2
  11. package/dist/_pkgs/affine-block-database/database-block.js +2 -2
  12. package/dist/_pkgs/affine-block-database/external-data-source.js +1 -1
  13. package/dist/_pkgs/affine-block-edgeless-text/edgeless-text-block.js +1 -1
  14. package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/config.js +1 -1
  15. package/dist/_pkgs/affine-block-embed/common/render-linked-doc.js +3 -3
  16. package/dist/_pkgs/affine-block-embed/configs/toolbar.js +11 -11
  17. package/dist/_pkgs/affine-block-embed/embed-figma-block/embed-figma-service.js +1 -1
  18. package/dist/_pkgs/affine-block-embed/embed-html-block/configs/toolbar.js +5 -5
  19. package/dist/_pkgs/affine-block-embed/embed-iframe-block/configs/toolbar.d.ts +7 -7
  20. package/dist/_pkgs/affine-block-embed/embed-iframe-block/configs/toolbar.js +14 -14
  21. package/dist/_pkgs/affine-block-embed/embed-iframe-block/embed-iframe-block.js +2 -2
  22. package/dist/_pkgs/affine-block-embed-doc/embed-linked-doc-block/configs/toolbar.js +10 -10
  23. package/dist/_pkgs/affine-block-embed-doc/embed-linked-doc-block/embed-linked-doc-block.js +4 -4
  24. package/dist/_pkgs/affine-block-embed-doc/embed-linked-doc-block/utils.js +1 -1
  25. package/dist/_pkgs/affine-block-embed-doc/embed-synced-doc-block/components/embed-synced-doc-card.js +5 -4
  26. package/dist/_pkgs/affine-block-embed-doc/embed-synced-doc-block/configs/toolbar.js +10 -10
  27. package/dist/_pkgs/affine-block-embed-doc/embed-synced-doc-block/embed-synced-doc-block.js +1 -1
  28. package/dist/_pkgs/affine-block-frame/frame-manager.js +3 -1
  29. package/dist/_pkgs/affine-block-frame/frame-tool.js +1 -1
  30. package/dist/_pkgs/affine-block-frame/frame-toolbar.js +2 -2
  31. package/dist/_pkgs/affine-block-image/components/page-image-block.js +1 -1
  32. package/dist/_pkgs/affine-block-image/configs/toolbar.js +4 -4
  33. package/dist/_pkgs/affine-block-image/image-edgeless-block.js +1 -1
  34. package/dist/_pkgs/affine-block-list/utils/forward-delete.js +1 -1
  35. package/dist/_pkgs/affine-block-note/commands/select-block.js +1 -1
  36. package/dist/_pkgs/affine-block-note/commands/select-blocks-between.js +1 -1
  37. package/dist/_pkgs/affine-block-note/configs/toolbar.js +2 -2
  38. package/dist/_pkgs/affine-block-note/move-block.js +1 -1
  39. package/dist/_pkgs/affine-block-paragraph/utils/forward-delete.js +2 -2
  40. package/dist/_pkgs/affine-block-paragraph/utils/merge-with-prev.js +1 -1
  41. package/dist/_pkgs/affine-block-root/configs/toolbar.d.ts +6 -4
  42. package/dist/_pkgs/affine-block-root/configs/toolbar.js +6 -6
  43. package/dist/_pkgs/affine-block-root/edgeless/configs/toolbar/misc.d.ts +10 -10
  44. package/dist/_pkgs/affine-block-root/edgeless/configs/toolbar/misc.js +4 -4
  45. package/dist/_pkgs/affine-block-root/edgeless/configs/toolbar/more.d.ts +7 -7
  46. package/dist/_pkgs/affine-block-root/edgeless/configs/toolbar/more.js +9 -9
  47. package/dist/_pkgs/affine-block-root/edgeless/edgeless-keyboard.js +1 -1
  48. package/dist/_pkgs/affine-block-root/edgeless/edgeless-root-block.js +3 -1
  49. package/dist/_pkgs/affine-block-root/edgeless/utils/clipboard-utils.js +1 -1
  50. package/dist/_pkgs/affine-block-surface/adapters/markdown/element-adapter/type.js +1 -1
  51. package/dist/_pkgs/affine-block-surface/adapters/plain-text/element-adapter/type.js +1 -1
  52. package/dist/_pkgs/affine-block-surface/element-model/index.d.ts +18 -3
  53. package/dist/_pkgs/affine-block-surface/element-model/index.js +12 -2
  54. package/dist/_pkgs/affine-block-surface/extensions/audit.js +23 -6
  55. package/dist/_pkgs/affine-block-surface/extensions/crud-extension.js +10 -5
  56. package/dist/_pkgs/affine-block-surface/extensions/editor-anchored-panel.js +2 -1
  57. package/dist/_pkgs/affine-block-surface/extensions/element-renderer.js +1 -1
  58. package/dist/_pkgs/affine-block-surface/extensions/export-manager/export-manager.js +1 -1
  59. package/dist/_pkgs/affine-block-surface/extensions/index.d.ts +4 -0
  60. package/dist/_pkgs/affine-block-surface/extensions/index.js +4 -0
  61. package/dist/_pkgs/affine-block-surface/extensions/interchange-import.d.ts +172 -0
  62. package/dist/_pkgs/affine-block-surface/extensions/interchange-import.js +404 -0
  63. package/dist/_pkgs/affine-block-surface/extensions/interchange.d.ts +323 -0
  64. package/dist/_pkgs/affine-block-surface/extensions/interchange.js +64 -0
  65. package/dist/_pkgs/affine-block-surface/extensions/map-quality-widget.js +61 -61
  66. package/dist/_pkgs/affine-block-surface/extensions/morph-toolbar.d.ts +248 -0
  67. package/dist/_pkgs/affine-block-surface/extensions/morph-toolbar.js +248 -0
  68. package/dist/_pkgs/affine-block-surface/extensions/reading-widget.js +78 -80
  69. package/dist/_pkgs/affine-block-surface/extensions/reading.js +2 -2
  70. package/dist/_pkgs/affine-block-surface/extensions/spotlight.d.ts +21 -0
  71. package/dist/_pkgs/affine-block-surface/extensions/spotlight.js +17 -3
  72. package/dist/_pkgs/affine-block-surface/extensions/svg-sketch.d.ts +107 -0
  73. package/dist/_pkgs/affine-block-surface/extensions/svg-sketch.js +958 -0
  74. package/dist/_pkgs/affine-block-surface/extensions/validation.d.ts +809 -20
  75. package/dist/_pkgs/affine-block-surface/extensions/validation.js +1661 -50
  76. package/dist/_pkgs/affine-block-surface/extensions/violation-detail-widget.d.ts +50 -6
  77. package/dist/_pkgs/affine-block-surface/extensions/violation-detail-widget.js +129 -32
  78. package/dist/_pkgs/affine-block-surface/framework-background/def.d.ts +289 -0
  79. package/dist/_pkgs/affine-block-surface/framework-background/def.js +126 -1
  80. package/dist/_pkgs/affine-block-surface/framework-background/labels.d.ts +42 -2
  81. package/dist/_pkgs/affine-block-surface/framework-background/labels.js +80 -4
  82. package/dist/_pkgs/affine-block-surface/framework-background/renderer.js +172 -11
  83. package/dist/_pkgs/affine-block-surface/index.d.ts +1 -0
  84. package/dist/_pkgs/affine-block-surface/index.js +1 -0
  85. package/dist/_pkgs/affine-block-surface/renderer/element-highlight-overlay.d.ts +17 -0
  86. package/dist/_pkgs/affine-block-surface/renderer/element-highlight-overlay.js +66 -0
  87. package/dist/_pkgs/affine-block-surface/renderer/overlay.js +1 -1
  88. package/dist/_pkgs/affine-block-surface/view.js +5 -0
  89. package/dist/_pkgs/affine-block-surface-ref/configs/toolbar.js +4 -4
  90. package/dist/_pkgs/affine-block-surface-ref/portal/note.js +2 -2
  91. package/dist/_pkgs/affine-block-table/commands.js +1 -1
  92. package/dist/_pkgs/affine-components/edgeless-shape-color-picker/color-picker.js +1 -1
  93. package/dist/_pkgs/affine-components/embed-card-modal/embed-card-edit-modal.js +1 -1
  94. package/dist/_pkgs/affine-components/filterable-list/styles.js +1 -1
  95. package/dist/_pkgs/affine-components/highlight-dropdown-menu/highlight-duotone-icon.js +8 -8
  96. package/dist/_pkgs/affine-components/highlight-dropdown-menu/text-duotone-icon.js +11 -11
  97. package/dist/_pkgs/affine-components/icons/text.js +426 -426
  98. package/dist/_pkgs/affine-components/open-doc-dropdown-menu/dropdown-menu.d.ts +2 -0
  99. package/dist/_pkgs/affine-components/peek/peekable.js +1 -1
  100. package/dist/_pkgs/affine-components/resource/resource.js +2 -0
  101. package/dist/_pkgs/affine-components/toolbar/index.d.ts +1 -0
  102. package/dist/_pkgs/affine-components/toolbar/index.js +1 -0
  103. package/dist/_pkgs/affine-components/toolbar/menu-button.js +1 -1
  104. package/dist/_pkgs/affine-components/toolbar/picker-menu.d.ts +55 -0
  105. package/dist/_pkgs/affine-components/toolbar/picker-menu.js +47 -0
  106. package/dist/_pkgs/affine-components/view-dropdown-menu/dropdown-menu.js +27 -14
  107. package/dist/_pkgs/affine-fragment-frame-panel/body/frame-panel-body.js +2 -2
  108. package/dist/_pkgs/affine-fragment-frame-panel/header/frame-panel-header.js +2 -2
  109. package/dist/_pkgs/affine-fragment-frame-panel/header/frames-setting-menu.js +1 -1
  110. package/dist/_pkgs/affine-fragment-outline/mobile-outline-panel.js +1 -1
  111. package/dist/_pkgs/affine-gfx-brush/toolbar/components/pen/pen-tool-button.js +1 -1
  112. package/dist/_pkgs/affine-gfx-connector/connector-manager.js +7 -10
  113. package/dist/_pkgs/affine-gfx-connector/connector-tool.d.ts +19 -1
  114. package/dist/_pkgs/affine-gfx-connector/connector-tool.js +10 -2
  115. package/dist/_pkgs/affine-gfx-connector/connector-watcher.js +1 -4
  116. package/dist/_pkgs/affine-gfx-connector/direction/direction-reveal.js +2 -1
  117. package/dist/_pkgs/affine-gfx-connector/direction/invert-direction.js +1 -3
  118. package/dist/_pkgs/affine-gfx-connector/element-renderer/index.js +1 -1
  119. package/dist/_pkgs/affine-gfx-connector/element-renderer/utils.js +1 -1
  120. package/dist/_pkgs/affine-gfx-connector/toolbar/config.js +1 -1
  121. package/dist/_pkgs/affine-gfx-mindmap/adapter/markdown/index.js +1 -1
  122. package/dist/_pkgs/affine-gfx-mindmap/adapter/utils.js +1 -1
  123. package/dist/_pkgs/affine-gfx-mindmap/templates/index.js +583 -4
  124. package/dist/_pkgs/affine-gfx-mindmap/toolbar/mindmap-menu.js +23 -23
  125. package/dist/_pkgs/affine-gfx-mindmap/toolbar/mindmap-tool-button.js +5 -1
  126. package/dist/_pkgs/affine-gfx-mindmap/view/utils.js +1 -1
  127. package/dist/_pkgs/affine-gfx-note/overlay/overlay.js +1 -1
  128. package/dist/_pkgs/affine-gfx-note/toolbar/note-senior-button.js +1 -1
  129. package/dist/_pkgs/affine-gfx-shape/consts.js +1 -1
  130. package/dist/_pkgs/affine-gfx-shape/draggable/shape-draggable.js +1 -1
  131. package/dist/_pkgs/affine-gfx-shape/element-renderer/shape/polygon.js +17 -9
  132. package/dist/_pkgs/affine-gfx-shape/element-renderer/shape/utils.js +8 -3
  133. package/dist/_pkgs/affine-gfx-shape/element-view.js +19 -12
  134. package/dist/_pkgs/affine-gfx-shape/overlay/polygon-drawing-overlay.js +1 -1
  135. package/dist/_pkgs/affine-gfx-shape/overlay/polygon-vertex-editing-overlay.js +12 -7
  136. package/dist/_pkgs/affine-gfx-shape/overlay/shape-overlay.js +1 -1
  137. package/dist/_pkgs/affine-gfx-shape/polygon-tool.js +4 -2
  138. package/dist/_pkgs/affine-gfx-shape/shape-tool.js +1 -1
  139. package/dist/_pkgs/affine-gfx-shape/text/edgeless-shape-text-editor.js +1 -3
  140. package/dist/_pkgs/affine-gfx-template/builtin/other.js +66 -17
  141. package/dist/_pkgs/affine-gfx-template/toolbar/overlay-scrollbar.js +1 -1
  142. package/dist/_pkgs/affine-gfx-template/toolbar/template-panel.js +1 -1
  143. package/dist/_pkgs/affine-gfx-text/toolbar/actions.js +1 -1
  144. package/dist/_pkgs/affine-inline-link/command.js +1 -1
  145. package/dist/_pkgs/affine-inline-link/link-node/configs/toolbar.d.ts +4 -4
  146. package/dist/_pkgs/affine-inline-link/link-node/configs/toolbar.js +6 -6
  147. package/dist/_pkgs/affine-inline-preset/command/format-block.js +1 -1
  148. package/dist/_pkgs/affine-inline-preset/command/format-native.js +2 -2
  149. package/dist/_pkgs/affine-inline-preset/command/format-text.js +1 -1
  150. package/dist/_pkgs/affine-inline-preset/inline-spec.js +1 -1
  151. package/dist/_pkgs/affine-inline-reference/reference-node/configs/toolbar.d.ts +4 -4
  152. package/dist/_pkgs/affine-inline-reference/reference-node/configs/toolbar.js +6 -6
  153. package/dist/_pkgs/affine-inline-reference/reference-node/reference-node.js +1 -1
  154. package/dist/_pkgs/affine-model/elements/bpmn/node.d.ts +40 -7
  155. package/dist/_pkgs/affine-model/elements/bpmn/node.js +4 -2
  156. package/dist/_pkgs/affine-model/elements/bpmn/pool.d.ts +135 -17
  157. package/dist/_pkgs/affine-model/elements/bpmn/pool.js +148 -26
  158. package/dist/_pkgs/affine-model/elements/c4/board.d.ts +88 -0
  159. package/dist/_pkgs/affine-model/elements/c4/board.js +128 -0
  160. package/dist/_pkgs/affine-model/elements/c4/boundary.d.ts +63 -0
  161. package/dist/_pkgs/affine-model/elements/c4/boundary.js +134 -0
  162. package/dist/_pkgs/affine-model/elements/c4/index.d.ts +3 -0
  163. package/dist/_pkgs/affine-model/elements/c4/index.js +3 -0
  164. package/dist/_pkgs/affine-model/elements/c4/node.d.ts +97 -0
  165. package/dist/_pkgs/affine-model/elements/c4/node.js +130 -0
  166. package/dist/_pkgs/affine-model/elements/connector/connector.js +1 -1
  167. package/dist/_pkgs/affine-model/elements/context-map/context-map.d.ts +27 -0
  168. package/dist/_pkgs/affine-model/elements/context-map/context-map.js +94 -0
  169. package/dist/_pkgs/affine-model/elements/context-map/index.d.ts +1 -0
  170. package/dist/_pkgs/affine-model/elements/context-map/index.js +1 -0
  171. package/dist/_pkgs/affine-model/elements/core-domain/core-domain.d.ts +34 -17
  172. package/dist/_pkgs/affine-model/elements/core-domain/core-domain.js +28 -26
  173. package/dist/_pkgs/affine-model/elements/cynefin/cynefin.d.ts +7 -2
  174. package/dist/_pkgs/affine-model/elements/cynefin/cynefin.js +9 -4
  175. package/dist/_pkgs/affine-model/elements/edgy/board.d.ts +7 -2
  176. package/dist/_pkgs/affine-model/elements/edgy/board.js +9 -4
  177. package/dist/_pkgs/affine-model/elements/edgy/facets.d.ts +20 -3
  178. package/dist/_pkgs/affine-model/elements/edgy/facets.js +13 -4
  179. package/dist/_pkgs/affine-model/elements/estuarine/estuarine.d.ts +7 -2
  180. package/dist/_pkgs/affine-model/elements/estuarine/estuarine.js +9 -4
  181. package/dist/_pkgs/affine-model/elements/event-storming/event-storming.d.ts +36 -0
  182. package/dist/_pkgs/affine-model/elements/event-storming/event-storming.js +103 -0
  183. package/dist/_pkgs/affine-model/elements/event-storming/index.d.ts +1 -0
  184. package/dist/_pkgs/affine-model/elements/event-storming/index.js +1 -0
  185. package/dist/_pkgs/affine-model/elements/framework-background/background.d.ts +7 -2
  186. package/dist/_pkgs/affine-model/elements/framework-background/background.js +9 -4
  187. package/dist/_pkgs/affine-model/elements/framework-background/hit-test.d.ts +48 -0
  188. package/dist/_pkgs/affine-model/elements/framework-background/hit-test.js +55 -0
  189. package/dist/_pkgs/affine-model/elements/framework-background/index.d.ts +1 -0
  190. package/dist/_pkgs/affine-model/elements/framework-background/index.js +1 -0
  191. package/dist/_pkgs/affine-model/elements/index.d.ts +11 -0
  192. package/dist/_pkgs/affine-model/elements/index.js +3 -0
  193. package/dist/_pkgs/affine-model/elements/shape/api/polygon.js +2 -8
  194. package/dist/_pkgs/affine-shared/adapters/html/block-adapter.js +1 -1
  195. package/dist/_pkgs/affine-shared/adapters/markdown/block-adapter.js +1 -1
  196. package/dist/_pkgs/affine-shared/adapters/markdown/delta-converter.js +1 -1
  197. package/dist/_pkgs/affine-shared/adapters/notion-html/block-adapter.js +1 -1
  198. package/dist/_pkgs/affine-shared/adapters/notion-html/delta-converter.js +1 -1
  199. package/dist/_pkgs/affine-shared/adapters/plain-text/block-adapter.js +1 -1
  200. package/dist/_pkgs/affine-shared/adapters/plain-text/delta-converter.js +1 -1
  201. package/dist/_pkgs/affine-shared/adapters/utils/color.js +5 -2
  202. package/dist/_pkgs/affine-shared/commands/model-crud/draft-selected-models.js +1 -1
  203. package/dist/_pkgs/affine-shared/commands/selection/focus-block-end.js +1 -1
  204. package/dist/_pkgs/affine-shared/commands/selection/focus-block-start.js +1 -1
  205. package/dist/_pkgs/affine-shared/consts/index.d.ts +10 -0
  206. package/dist/_pkgs/affine-shared/consts/index.js +10 -0
  207. package/dist/_pkgs/affine-shared/services/artefact-catalogue-service.d.ts +55 -0
  208. package/dist/_pkgs/affine-shared/services/artefact-catalogue-service.js +35 -0
  209. package/dist/_pkgs/affine-shared/services/audit-service.d.ts +11 -0
  210. package/dist/_pkgs/affine-shared/services/command-usage-service.d.ts +31 -0
  211. package/dist/_pkgs/affine-shared/services/command-usage-service.js +109 -0
  212. package/dist/_pkgs/affine-shared/services/comment-service/block-comment-manager.js +1 -1
  213. package/dist/_pkgs/affine-shared/services/doc-display-meta-service.js +1 -1
  214. package/dist/_pkgs/affine-shared/services/edit-props-store.d.ts +11 -0
  215. package/dist/_pkgs/affine-shared/services/edit-props-store.js +15 -0
  216. package/dist/_pkgs/affine-shared/services/embed-iframe/embed-iframe-config.js +1 -1
  217. package/dist/_pkgs/affine-shared/services/index.d.ts +2 -0
  218. package/dist/_pkgs/affine-shared/services/index.js +2 -0
  219. package/dist/_pkgs/affine-shared/services/pivot-materiality-publisher.js +2 -1
  220. package/dist/_pkgs/affine-shared/services/telemetry-service/lifecycle.d.ts +73 -1
  221. package/dist/_pkgs/affine-shared/services/toolbar-service/action.d.ts +32 -0
  222. package/dist/_pkgs/affine-shared/services/toolbar-service/action.js +16 -0
  223. package/dist/_pkgs/affine-shared/services/toolbar-service/flags.d.ts +10 -0
  224. package/dist/_pkgs/affine-shared/services/toolbar-service/flags.js +32 -1
  225. package/dist/_pkgs/affine-shared/services/toolbar-service/registry.d.ts +44 -0
  226. package/dist/_pkgs/affine-shared/services/toolbar-service/registry.js +161 -3
  227. package/dist/_pkgs/affine-shared/services/translation-service/chrome.d.ts +106 -0
  228. package/dist/_pkgs/affine-shared/services/translation-service/chrome.js +201 -0
  229. package/dist/_pkgs/affine-shared/services/translation-service/index.d.ts +1 -0
  230. package/dist/_pkgs/affine-shared/services/translation-service/index.js +1 -0
  231. package/dist/_pkgs/affine-shared/services/universe-tag-defs-service.js +5 -3
  232. package/dist/_pkgs/affine-shared/test-utils/affine-template.js +1 -1
  233. package/dist/_pkgs/affine-shared/utils/edgeless.js +1 -1
  234. package/dist/_pkgs/affine-shared/utils/file/filesys.d.ts +34 -0
  235. package/dist/_pkgs/affine-shared/utils/file/filesys.js +48 -7
  236. package/dist/_pkgs/affine-shared/utils/zod-schema.js +1 -3
  237. package/dist/_pkgs/affine-widget-drag-handle/utils.js +1 -1
  238. package/dist/_pkgs/affine-widget-edgeless-auto-connect/index.js +1 -1
  239. package/dist/_pkgs/affine-widget-edgeless-dragging-area/edgeless-dragging-area-rect.js +1 -1
  240. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/artefact-catalogue-default.d.ts +14 -0
  241. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/artefact-catalogue-default.js +40 -0
  242. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/artefact-catalogue-widget.d.ts +158 -0
  243. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/artefact-catalogue-widget.js +572 -0
  244. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/catalogue-groups.d.ts +41 -0
  245. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/catalogue-groups.js +49 -0
  246. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/chord-format.d.ts +13 -0
  247. package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/chord-format.js +50 -0
  248. package/dist/_pkgs/affine-widget-edgeless-toolbar/edgeless-toolbar.d.ts +6 -0
  249. package/dist/_pkgs/affine-widget-edgeless-toolbar/edgeless-toolbar.js +15 -5
  250. package/dist/_pkgs/affine-widget-edgeless-toolbar/effects.d.ts +2 -0
  251. package/dist/_pkgs/affine-widget-edgeless-toolbar/effects.js +2 -0
  252. package/dist/_pkgs/affine-widget-edgeless-toolbar/extension/index.d.ts +7 -0
  253. package/dist/_pkgs/affine-widget-edgeless-toolbar/index.d.ts +4 -0
  254. package/dist/_pkgs/affine-widget-edgeless-toolbar/index.js +4 -0
  255. package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/command-menu.d.ts +19 -0
  256. package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/command-menu.js +51 -10
  257. package/dist/_pkgs/affine-widget-edgeless-toolbar/view.js +9 -0
  258. package/dist/_pkgs/affine-widget-keyboard-toolbar/config.js +2 -1
  259. package/dist/_pkgs/affine-widget-keyboard-toolbar/icons.js +98 -98
  260. package/dist/_pkgs/affine-widget-keyboard-toolbar/keyboard-tool-panel.js +1 -1
  261. package/dist/_pkgs/affine-widget-linked-doc/import-doc/import-doc.js +1 -1
  262. package/dist/_pkgs/affine-widget-linked-doc/linked-doc-popover.js +1 -1
  263. package/dist/_pkgs/affine-widget-page-dragging-area/index.js +1 -1
  264. package/dist/_pkgs/affine-widget-remote-selection/doc/doc-remote-selection.js +1 -1
  265. package/dist/_pkgs/affine-widget-slash-menu/config.js +2 -1
  266. package/dist/_pkgs/affine-widget-toolbar/toolbar.js +11 -2
  267. package/dist/_pkgs/affine-widget-toolbar/utils.d.ts +19 -2
  268. package/dist/_pkgs/affine-widget-toolbar/utils.js +28 -9
  269. package/dist/_pkgs/data-view/core/group-by/renderer/boolean-group.js +11 -11
  270. package/dist/_pkgs/data-view/core/utils/menu-title.js +17 -17
  271. package/dist/_pkgs/data-view/view-presets/calendar/pc/actions.js +8 -12
  272. package/dist/_pkgs/data-view/view-presets/calendar/pc/view.js +52 -40
  273. package/dist/_pkgs/data-view/view-presets/table/mobile/group.js +3 -1
  274. package/dist/_pkgs/data-view/view-presets/table/pc/group.js +3 -1
  275. package/dist/_pkgs/data-view/view-presets/table/pc-virtual/group/top/group-title.js +18 -18
  276. package/dist/_pkgs/std/clipboard/utils.js +4 -1
  277. package/dist/_pkgs/std/extension/command-registry.d.ts +195 -5
  278. package/dist/_pkgs/std/extension/command-registry.js +218 -4
  279. package/dist/_pkgs/std/extension/shortcut.js +2 -1
  280. package/dist/_pkgs/std/extension/translation-manifest.d.ts +46 -1
  281. package/dist/_pkgs/std/extension/translation-manifest.js +58 -0
  282. package/dist/_pkgs/std/gfx/grid.js +1 -1
  283. package/dist/_pkgs/std/gfx/highlight.d.ts +84 -0
  284. package/dist/_pkgs/std/gfx/highlight.js +112 -0
  285. package/dist/_pkgs/std/gfx/index.d.ts +2 -1
  286. package/dist/_pkgs/std/gfx/index.js +1 -0
  287. package/dist/_pkgs/std/gfx/interactivity/gfx-view-event-handler.js +17 -3
  288. package/dist/_pkgs/std/gfx/model/surface/element-model.d.ts +160 -0
  289. package/dist/_pkgs/std/gfx/model/surface/element-model.js +75 -1
  290. package/dist/_pkgs/std/gfx/model/surface/role.js +5 -3
  291. package/dist/_pkgs/std/gfx/model/surface/surface-model.js +2 -1
  292. package/dist/_pkgs/std/gfx/selection.js +1 -1
  293. package/dist/_pkgs/std/gfx/viewport.js +1 -1
  294. package/dist/_pkgs/std/inline/extensions/inline-manager.js +1 -1
  295. package/dist/_pkgs/std/inline/extensions/markdown-matcher.js +1 -1
  296. package/dist/_pkgs/std/scope/std-scope.d.ts +2 -1
  297. package/dist/_pkgs/std/scope/std-scope.js +2 -0
  298. package/dist/_pkgs/std/utils/gfx.js +2 -0
  299. package/dist/_pkgs/store/model/store/crud.js +4 -1
  300. package/dist/commands.js +1 -1
  301. package/dist/extensions/command-usage.d.ts +23 -0
  302. package/dist/extensions/command-usage.js +37 -0
  303. package/dist/extensions/view.js +12 -0
  304. package/dist/frameworks.js +32 -0
  305. package/dist/shortcuts.d.ts +20 -6
  306. package/dist/shortcuts.js +7 -9
  307. package/dist/translations.js +98 -3
  308. package/package.json +13 -1
@@ -0,0 +1,572 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { EDITOR_ANCHORED_PANEL_Z_INDEX } from '../../affine-block-surface/index.js';
36
+ import { TOUCH_TARGET_MIN_PX } from '../../affine-shared/consts/index.js';
37
+ import { translateKey } from '../../affine-shared/services/index.js';
38
+ import { IS_MAC } from '../../global/env/index.js';
39
+ import { getCommandIcon, CommandUsageIdentifier, getCommandsForSurface, isCommandAvailable, normalizeLegacyCombo, rankCommandsByUsage, runCommand, ShortcutOverrideIdentifier, WidgetComponent, WidgetViewExtension, } from '../../std/index.js';
40
+ import { css, html, nothing, unsafeCSS } from 'lit';
41
+ import { state } from 'lit/decorators.js';
42
+ import { literal, unsafeStatic } from 'lit/static-html.js';
43
+ import { CATALOGUE_CATEGORY_KEY_PREFIX, groupCommandsByCategory, humanizeCategory, } from './catalogue-groups.js';
44
+ import { formatChord } from './chord-format.js';
45
+ export const EDGELESS_ARTEFACT_CATALOGUE_WIDGET = 'edgeless-artefact-catalogue-widget';
46
+ /** Wide enough for an icon, a label and a chord; never more than most of a phone. */
47
+ const PANEL_WIDTH = 'min(320px, 85vw)';
48
+ /**
49
+ * The **artefact catalogue** sidepanel (PF6).
50
+ *
51
+ * A framework's senior sub-menu is a row of icons, and a row of icons stops
52
+ * working somewhere around fourteen. The BPMN pack is the first framework to
53
+ * pass that line, so the sub-menu shows the thirteen the ranking put first and
54
+ * hands the rest to this panel: everything the owner declares on the
55
+ * `'catalogue'` surface, grouped by the categories the framework itself
56
+ * declared, with the label and the chord spelled out instead of guessed from a
57
+ * glyph.
58
+ *
59
+ * ## Left, full height, inside the editor
60
+ *
61
+ * Not a popover, not a modal. It is a column down the left edge of the editor
62
+ * host — the side no toolbar occupies — the canvas stays live to its right, and
63
+ * a click on the canvas puts it away. Twenty artefacts want a list you scroll,
64
+ * and a list you scroll wants height; a floating box would have had to choose
65
+ * between covering the board and showing four rows at a time.
66
+ *
67
+ * ## Not an `EditorAnchoredPanel`
68
+ *
69
+ * The shared base (ADR 0011) exists for panels pinned ABOVE the senior button
70
+ * bar and measured against it: its host is bottom-left and zero-sized, and
71
+ * `anchorBox()` returns a `bottom` and a width read off the bar. None of that
72
+ * is expressible for a full-height column, so the geometry is this file's own —
73
+ * but the WISDOM is not reinvented. The layer constant is imported from there
74
+ * rather than copied, and the host is zero-WIDTH for the same reason its host is
75
+ * zero-sized (`.widgets-container > * { pointer-events: auto }` is an outer-tree
76
+ * rule that beats `:host { pointer-events: none }`, so a host with a real box
77
+ * would swallow canvas clicks down the whole left side of the board). The
78
+ * click-away, the Escape-on-`std.host` scope and the disconnect cleanup are the
79
+ * same contracts, replicated in about thirty lines.
80
+ *
81
+ * ## What closing does, and does not
82
+ *
83
+ * X, Escape and click-away all close, on the FIRST gesture, and none of them
84
+ * touches the active senior tool: the panel is a way of reaching a command, not
85
+ * a mode. Invoking a row closes it too — the PO's default is one tap and back
86
+ * to the canvas.
87
+ *
88
+ * ## Who opens it
89
+ *
90
+ * `ArtefactCatalogueProvider`. This widget registers itself as the DEFAULT
91
+ * implementation ({@link artefactCatalogueDefaultExtension}); a host with its
92
+ * own sidebar registers `ArtefactCatalogueExtension(service)`, whose
93
+ * `di.override` wins, and this panel is then never asked to open.
94
+ */
95
+ let EdgelessArtefactCatalogueWidget = (() => {
96
+ let _classSuper = WidgetComponent;
97
+ let __owner_decorators;
98
+ let __owner_initializers = [];
99
+ let __owner_extraInitializers = [];
100
+ return class EdgelessArtefactCatalogueWidget extends _classSuper {
101
+ constructor() {
102
+ super(...arguments);
103
+ this.#_owner_accessor_storage = __runInitializers(this, __owner_initializers, null);
104
+ /** The owner the body was last scrolled to the top for. */
105
+ this._scrolledFor = (__runInitializers(this, __owner_extraInitializers), null);
106
+ /**
107
+ * Put the panel away. Deliberately writes NOTHING but its own state: the
108
+ * senior tool the user armed before opening the catalogue is still armed
109
+ * after, whichever gesture closed it.
110
+ */
111
+ this.closePanel = () => {
112
+ this._owner = null;
113
+ };
114
+ /** Keep a gesture inside the panel from reaching the canvas behind it. */
115
+ this._swallow = (event) => {
116
+ event.stopPropagation();
117
+ };
118
+ this._onDocumentPointerDown = (event) => {
119
+ if (!this.catalogueOpen)
120
+ return;
121
+ // Anything inside this widget keeps it open. The sub-menu entry that opened
122
+ // it is in another tree, and its own click already landed.
123
+ if (event.composedPath().includes(this))
124
+ return;
125
+ this.closePanel();
126
+ };
127
+ /**
128
+ * Escape is listened for on the EDITOR HOST, not on `document`: a host
129
+ * application keeps its own global Escape, and with the catalogue open the
130
+ * key dismisses the catalogue rather than clearing the canvas selection
131
+ * behind it. Same scope and same reasoning as `EditorAnchoredPanel`.
132
+ */
133
+ this._onHostKeydown = (event) => {
134
+ if (!this.catalogueOpen || event.key !== 'Escape')
135
+ return;
136
+ event.stopPropagation();
137
+ this.closePanel();
138
+ };
139
+ /**
140
+ * A wheel OVER THE PANEL scrolls the panel, never the board.
141
+ *
142
+ * Same bug and same fix as the violation bubble (PR #103, PO 02/08):
143
+ * `EdgelessRootBlock` takes `wheel` off the event dispatcher on the editor
144
+ * host and `preventDefault()`s unconditionally before panning — so a wheel
145
+ * over the catalogue's overflowing list panned the canvas instead of
146
+ * scrolling the twenty artefacts under the pointer (PO recette, 27/08/2026).
147
+ * One CAPTURE-phase listener on the host stops the event before the
148
+ * dispatcher sees it; no `preventDefault`, because the default action IS the
149
+ * panel scrolling.
150
+ *
151
+ * Narrower than the bubble's freeze, deliberately: the bubble owns the wheel
152
+ * everywhere while open (a reading gesture); the catalogue only claims the
153
+ * wheel over its own box — `composedPath` gate — and the canvas to its right
154
+ * keeps panning, because furnishing a diagram means looking around it.
155
+ */
156
+ this._onHostWheel = (event) => {
157
+ if (!this.catalogueOpen)
158
+ return;
159
+ if (!event.composedPath().includes(this))
160
+ return;
161
+ event.stopPropagation();
162
+ };
163
+ }
164
+ static {
165
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
166
+ __owner_decorators = [state()];
167
+ __esDecorate(this, null, __owner_decorators, { kind: "accessor", name: "_owner", static: false, private: false, access: { has: obj => "_owner" in obj, get: obj => obj._owner, set: (obj, value) => { obj._owner = value; } }, metadata: _metadata }, __owner_initializers, __owner_extraInitializers);
168
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
169
+ }
170
+ static { this.styles = css `
171
+ /*
172
+ A zero-WIDTH host spanning the editor's full height. See the class
173
+ docstring: a host with a real box would take every pointer event down the
174
+ left edge of the canvas, open or not. The panel below carries the box.
175
+ */
176
+ :host {
177
+ position: absolute;
178
+ left: 0;
179
+ top: 0;
180
+ bottom: 0;
181
+ width: 0;
182
+ z-index: ${unsafeCSS(EDITOR_ANCHORED_PANEL_Z_INDEX)};
183
+ pointer-events: none;
184
+ font-family: var(--affine-font-family);
185
+ }
186
+
187
+ .artefact-catalogue-panel {
188
+ position: absolute;
189
+ left: 0;
190
+ top: 0;
191
+ bottom: 0;
192
+ width: ${unsafeCSS(PANEL_WIDTH)};
193
+ box-sizing: border-box;
194
+ display: flex;
195
+ flex-direction: column;
196
+ background: var(--affine-background-overlay-panel-color, #fff);
197
+ border-right: 1px solid var(--affine-border-color);
198
+ box-shadow: var(--affine-shadow-2);
199
+ color: var(--affine-text-primary-color);
200
+ font-size: 14px;
201
+ line-height: 1.4;
202
+ pointer-events: auto;
203
+ }
204
+
205
+ .artefact-catalogue-panel:focus-visible {
206
+ outline: 2px solid var(--affine-primary-color);
207
+ outline-offset: -2px;
208
+ }
209
+
210
+ .artefact-catalogue-head {
211
+ display: flex;
212
+ align-items: center;
213
+ justify-content: space-between;
214
+ gap: 8px;
215
+ padding: 8px 8px 8px 16px;
216
+ border-bottom: 1px solid var(--affine-border-color);
217
+ font-weight: 600;
218
+ }
219
+
220
+ .artefact-catalogue-title {
221
+ overflow: hidden;
222
+ text-overflow: ellipsis;
223
+ white-space: nowrap;
224
+ }
225
+
226
+ /*
227
+ A close button a finger can hit. Square at the touch minimum rather than
228
+ the 6px-padded × the anchored panels use: this one is the only way out of
229
+ a full-height surface on a tablet, where there is no Escape key.
230
+ */
231
+ .artefact-catalogue-close {
232
+ flex: none;
233
+ display: flex;
234
+ align-items: center;
235
+ justify-content: center;
236
+ width: ${unsafeCSS(TOUCH_TARGET_MIN_PX)}px;
237
+ height: ${unsafeCSS(TOUCH_TARGET_MIN_PX)}px;
238
+ border: none;
239
+ border-radius: 8px;
240
+ background: transparent;
241
+ color: var(--affine-text-secondary-color);
242
+ font-family: inherit;
243
+ font-size: 20px;
244
+ line-height: 1;
245
+ cursor: pointer;
246
+ }
247
+
248
+ .artefact-catalogue-close:hover,
249
+ .artefact-catalogue-close:focus-visible {
250
+ background: var(--affine-hover-color);
251
+ color: var(--affine-text-primary-color);
252
+ }
253
+
254
+ .artefact-catalogue-body {
255
+ flex: 1;
256
+ min-height: 0;
257
+ overflow-y: auto;
258
+ overflow-x: hidden;
259
+ /* The canvas behind must never scroll because this list bottomed out. */
260
+ overscroll-behavior: contain;
261
+ -webkit-overflow-scrolling: touch;
262
+ padding: 8px 0 16px;
263
+ }
264
+
265
+ .artefact-catalogue-group-label {
266
+ padding: 12px 16px 4px;
267
+ color: var(--affine-text-secondary-color);
268
+ font-size: 12px;
269
+ font-weight: 600;
270
+ letter-spacing: 0.04em;
271
+ text-transform: uppercase;
272
+ }
273
+
274
+ /*
275
+ Full-width rows, never narrower than a finger. A minimum and not a fixed
276
+ height: a long label in a translated catalogue wraps and the row grows,
277
+ which is the direction a touch target may move.
278
+ */
279
+ .artefact-catalogue-entry {
280
+ display: flex;
281
+ align-items: center;
282
+ gap: 12px;
283
+ width: 100%;
284
+ min-height: ${unsafeCSS(TOUCH_TARGET_MIN_PX)}px;
285
+ box-sizing: border-box;
286
+ padding: 6px 16px;
287
+ border: none;
288
+ background: transparent;
289
+ color: inherit;
290
+ font: inherit;
291
+ text-align: left;
292
+ cursor: pointer;
293
+ }
294
+
295
+ /*
296
+ Visible states, not hover-only affordances: a finger never hovers, so the
297
+ pressed state is what tells a tablet user the tap landed.
298
+ */
299
+ .artefact-catalogue-entry:hover {
300
+ background: var(--affine-hover-color);
301
+ }
302
+
303
+ .artefact-catalogue-entry:active {
304
+ background: var(--affine-hover-color);
305
+ filter: brightness(0.97);
306
+ }
307
+
308
+ .artefact-catalogue-entry:focus-visible {
309
+ outline: 2px solid var(--affine-primary-color);
310
+ outline-offset: -2px;
311
+ }
312
+
313
+ .artefact-catalogue-icon {
314
+ flex: none;
315
+ display: flex;
316
+ align-items: center;
317
+ justify-content: center;
318
+ width: 24px;
319
+ height: 24px;
320
+ fill: var(--affine-icon-color);
321
+ color: var(--affine-icon-color);
322
+ }
323
+
324
+ .artefact-catalogue-icon svg {
325
+ width: 24px;
326
+ height: 24px;
327
+ }
328
+
329
+ .artefact-catalogue-label {
330
+ flex: 1;
331
+ min-width: 0;
332
+ overflow-wrap: anywhere;
333
+ }
334
+
335
+ .artefact-catalogue-chord {
336
+ flex: none;
337
+ color: var(--affine-text-secondary-color);
338
+ font-size: 12px;
339
+ white-space: nowrap;
340
+ }
341
+ `; }
342
+ #_owner_accessor_storage;
343
+ /** Which framework's catalogue is on screen, or `null` when it is away. */
344
+ get _owner() { return this.#_owner_accessor_storage; }
345
+ set _owner(value) { this.#_owner_accessor_storage = value; }
346
+ get catalogueOpen() {
347
+ return this._owner !== null;
348
+ }
349
+ /**
350
+ * Show `owner`'s catalogue. Called through `ArtefactCatalogueProvider`, never
351
+ * from another widget's DOM — the sub-menu that opens it lives in a different
352
+ * tree, and the seam is what keeps a host's own sidebar substitutable.
353
+ */
354
+ openFor(owner) {
355
+ this._owner = owner;
356
+ }
357
+ /**
358
+ * Idempotent, and called from both `firstUpdated` and a later
359
+ * `connectedCallback`: `WithDisposable` throws the group away on disconnect
360
+ * while lit runs `firstUpdated` exactly once.
361
+ */
362
+ _wire() {
363
+ document.addEventListener('pointerdown', this._onDocumentPointerDown, true);
364
+ const host = this.std.host;
365
+ host.addEventListener('keydown', this._onHostKeydown, true);
366
+ host.addEventListener('wheel', this._onHostWheel, true);
367
+ this._disposables.add(() => {
368
+ document.removeEventListener('pointerdown', this._onDocumentPointerDown, true);
369
+ host.removeEventListener('keydown', this._onHostKeydown, true);
370
+ host.removeEventListener('wheel', this._onHostWheel, true);
371
+ });
372
+ }
373
+ connectedCallback() {
374
+ super.connectedCallback();
375
+ if (this.hasUpdated)
376
+ this._wire();
377
+ }
378
+ firstUpdated() {
379
+ this._wire();
380
+ }
381
+ /**
382
+ * On open: the panel takes the focus and the list starts at the top.
383
+ *
384
+ * The focus is what makes the panel reachable from a keyboard and audible to
385
+ * a screen reader — it carries the dialog's label, so the framework's name is
386
+ * read before the first artefact. `preventScroll` because the host is a
387
+ * zero-width box at the editor's origin and the browser would otherwise
388
+ * scroll the editor to "reveal" it.
389
+ *
390
+ * The scroll reset matters on the second open: a user who scrolled to the
391
+ * bottom of BPMN's twenty artefacts, closed, and opened the panel again for
392
+ * another framework would otherwise land mid-list with no idea what is above.
393
+ */
394
+ updated() {
395
+ const owner = this._owner;
396
+ if (owner === null || owner === this._scrolledFor) {
397
+ if (owner === null)
398
+ this._scrolledFor = null;
399
+ return;
400
+ }
401
+ const panel = this.shadowRoot?.querySelector('[data-testid="artefact-catalogue-panel"]');
402
+ if (!panel)
403
+ return;
404
+ this._scrolledFor = owner;
405
+ const body = this.shadowRoot?.querySelector('[data-testid="artefact-catalogue-body"]');
406
+ if (body)
407
+ body.scrollTop = 0;
408
+ panel.focus({ preventScroll: true });
409
+ }
410
+ /**
411
+ * The commands this panel draws: the owner's `'catalogue'` surface, minus the
412
+ * ones whose preconditions do not hold.
413
+ *
414
+ * Unavailable commands are DROPPED, not greyed out. A disabled row in a list
415
+ * of twenty is noise a reader has to step over on every pass, and the panel
416
+ * has no room to say why it is disabled; a command that comes back when the
417
+ * selection changes simply reappears.
418
+ */
419
+ _commands(owner) {
420
+ const { std } = this;
421
+ return getCommandsForSurface(std, owner, 'catalogue').filter(command => isCommandAvailable(std, command) && (!command.when || command.when(std)));
422
+ }
423
+ /**
424
+ * The chord this command answers to on this platform, as the user would type
425
+ * it — or `null` for the many commands that ship keyless (and stay bindable).
426
+ *
427
+ * The host's override table is consulted, so a rebound command shows what it
428
+ * is actually bound to rather than what it shipped with, and a `'disabled'`
429
+ * entry shows nothing at all.
430
+ */
431
+ _chord(command) {
432
+ const overrides = this.std.getOptional(ShortcutOverrideIdentifier) ?? {};
433
+ const override = overrides[command.id];
434
+ if (override === 'disabled')
435
+ return null;
436
+ const keys = normalizeLegacyCombo(override ?? (IS_MAC ? command.defaultKeys.mac : command.defaultKeys.other));
437
+ return keys.length ? formatChord(keys, IS_MAC) : null;
438
+ }
439
+ /**
440
+ * Run the command. The panel STAYS OPEN.
441
+ *
442
+ * `runCommand` is the one bottleneck (ADR 0008): the telemetry and the usage
443
+ * measure are emitted there, and `surface: 'catalogue'` is what makes this
444
+ * panel distinguishable from the sub-menu in the numbers.
445
+ *
446
+ * Staying open is the PO's call (recette, 27/08/2026), reversing the first
447
+ * default: a catalogue is where a user furnishes a diagram, and furnishing is
448
+ * several artefacts in a row — closing after each one turned that into
449
+ * open-click-reopen. The exits are unchanged and all one gesture: ×, Escape,
450
+ * or a click on the canvas.
451
+ */
452
+ _invoke(command) {
453
+ runCommand(this.std, command, {
454
+ surface: 'catalogue',
455
+ source: 'toolbar:general',
456
+ });
457
+ }
458
+ _groupLabel(group) {
459
+ const { category } = group;
460
+ if (category === null) {
461
+ return translateKey(this.std, 'com.labre.catalogue.other', 'Other');
462
+ }
463
+ return translateKey(this.std, `${CATALOGUE_CATEGORY_KEY_PREFIX}${category}`, humanizeCategory(category));
464
+ }
465
+ _renderEntry(command) {
466
+ const icon = getCommandIcon(this.std, command.iconKey);
467
+ const label = translateKey(this.std, command.labelKey, command.labelFallback);
468
+ const chord = this._chord(command);
469
+ return html `<button
470
+ class="artefact-catalogue-entry"
471
+ type="button"
472
+ data-testid="artefact-catalogue-entry"
473
+ data-command-id=${command.id}
474
+ @click=${() => this._invoke(command)}
475
+ >
476
+ <span class="artefact-catalogue-icon">${icon ?? nothing}</span>
477
+ <span class="artefact-catalogue-label">${label}</span>
478
+ ${chord
479
+ ? html `<span class="artefact-catalogue-chord">${chord}</span>`
480
+ : nothing}
481
+ </button>`;
482
+ }
483
+ render() {
484
+ const owner = this._owner;
485
+ if (owner === null)
486
+ return nothing;
487
+ const commands = this._commands(owner);
488
+ const groups = groupCommandsByCategory(commands);
489
+ // The head section: what THIS user reaches for, latest first — the
490
+ // sub-menu's arbitration re-consumed whole (PO recette, 27/08/2026).
491
+ // Absent entirely until something has been used: a "recent" list padded
492
+ // with the never-used would be a label that lies. The rows repeat below in
493
+ // their categories on purpose, the way every launcher does it — the head
494
+ // is a shortcut, not a re-filing.
495
+ //
496
+ // `commands` here is the whole CATALOGUE, deliberately: the eligibility
497
+ // ruling of 2026-08-28 narrowed the SUB-MENU to commands that declare
498
+ // `'senior-menu'`, because that row is a row of things you draw. This panel
499
+ // is the full-catalogue surface, so a board action a user really does reach
500
+ // for — `bpmn.exportXml` — belongs at its head. See `rankCommandsByUsage`.
501
+ //
502
+ // Seven rows at most (`CATALOGUE_HEAD_RANKED_SLOTS`, 4 recent + 3 used),
503
+ // NOT the sub-menu's thirteen: at 44px a row, thirteen would be ~604px of
504
+ // duplicated shortcuts and would push every category below the fold on a
505
+ // laptop. Same arbitration, its own magnitude.
506
+ const usage = this.std.getOptional(CommandUsageIdentifier);
507
+ const ranked = usage
508
+ ? rankCommandsByUsage(commands, id => usage.statsOf(id))
509
+ : [];
510
+ const rankedLabel = translateKey(this.std, 'com.labre.catalogue.ranked', 'Recent & frequent');
511
+ // A framework's own name, through the same key the senior button uses. The
512
+ // fallback is the owner id respelled — the library invents no framework
513
+ // prose, and a host with a catalogue always wins.
514
+ const frameworkLabel = translateKey(this.std, `com.labre.framework.${owner}`, humanizeCategory(owner));
515
+ const catalogueTitle = translateKey(this.std, 'com.labre.catalogue.title', 'Artefacts');
516
+ return html `<div
517
+ class="artefact-catalogue-panel"
518
+ role="dialog"
519
+ tabindex="-1"
520
+ aria-label=${`${frameworkLabel} — ${catalogueTitle}`}
521
+ data-testid="artefact-catalogue-panel"
522
+ data-owner=${owner}
523
+ @pointerdown=${this._swallow}
524
+ @pointerup=${this._swallow}
525
+ @click=${this._swallow}
526
+ >
527
+ <div class="artefact-catalogue-head">
528
+ <span class="artefact-catalogue-title">${frameworkLabel}</span>
529
+ <button
530
+ class="artefact-catalogue-close"
531
+ type="button"
532
+ data-testid="artefact-catalogue-close"
533
+ aria-label=${translateKey(this.std, 'com.labre.catalogue.close', 'Close')}
534
+ @click=${this.closePanel}
535
+ >
536
+ ×
537
+ </button>
538
+ </div>
539
+ <div
540
+ class="artefact-catalogue-body"
541
+ data-testid="artefact-catalogue-body"
542
+ >
543
+ ${ranked.length
544
+ ? html `<div
545
+ class="artefact-catalogue-group"
546
+ data-testid="artefact-catalogue-ranked"
547
+ role="group"
548
+ aria-label=${rankedLabel}
549
+ >
550
+ <div class="artefact-catalogue-group-label">${rankedLabel}</div>
551
+ ${ranked.map(command => this._renderEntry(command))}
552
+ </div>`
553
+ : nothing}
554
+ ${groups.map(group => html `<div
555
+ class="artefact-catalogue-group"
556
+ data-testid="artefact-catalogue-group"
557
+ data-category=${group.category ?? ''}
558
+ role="group"
559
+ aria-label=${this._groupLabel(group)}
560
+ >
561
+ <div class="artefact-catalogue-group-label">
562
+ ${this._groupLabel(group)}
563
+ </div>
564
+ ${group.commands.map(command => this._renderEntry(command))}
565
+ </div>`)}
566
+ </div>
567
+ </div>`;
568
+ }
569
+ };
570
+ })();
571
+ export { EdgelessArtefactCatalogueWidget };
572
+ export const edgelessArtefactCatalogueWidget = WidgetViewExtension('affine:page', EDGELESS_ARTEFACT_CATALOGUE_WIDGET, literal `${unsafeStatic(EDGELESS_ARTEFACT_CATALOGUE_WIDGET)}`);
@@ -0,0 +1,41 @@
1
+ import type { AnyCommandDescriptor } from '../../std/index.js';
2
+ /**
3
+ * The header key prefix and the header fallback, re-exported from `@labre/std`
4
+ * where they are declared.
5
+ *
6
+ * They moved there so a FRAMEWORK can derive its own catalogue-header keys for
7
+ * the translation manifest without depending on this widget (#183): in the
8
+ * bundled distribution core's command registry names no framework category, so
9
+ * every framework has to contribute its own. Re-exported rather than moved
10
+ * away, because the panel below is still the thing that renders them.
11
+ */
12
+ export { CATALOGUE_CATEGORY_KEY_PREFIX, humanizeCategory } from '../../std/index.js';
13
+ /**
14
+ * One section of the catalogue: a category and the commands declaring it.
15
+ *
16
+ * `category` is `null` for the trailing group of commands that declare none —
17
+ * see {@link groupCommandsByCategory}.
18
+ */
19
+ export interface CatalogueGroup {
20
+ category: string | null;
21
+ commands: AnyCommandDescriptor[];
22
+ }
23
+ /**
24
+ * Split a surface's commands into the sections the sidepanel draws.
25
+ *
26
+ * Two rules, and both exist to keep the panel's order the FRAMEWORK's order:
27
+ *
28
+ * - groups appear in the order their category is first met, not alphabetically.
29
+ * `getCommandsForSurface` has already sorted by `CommandDescriptor.order`, so
30
+ * a framework that declared backgrounds before nodes before connectors gets
31
+ * exactly that reading, and sorting the headers by name would quietly
32
+ * overrule it;
33
+ * - a command with no category joins ONE trailing group, and that group exists
34
+ * only when something lands in it. An "Other" header over an empty section —
35
+ * or over a framework whose commands are all uncategorised, where it would be
36
+ * the only header — says nothing a reader can use.
37
+ *
38
+ * Pure on purpose: this is the half of the panel worth unit-testing, and it
39
+ * knows nothing about lit, the DOM or the editor.
40
+ */
41
+ export declare function groupCommandsByCategory(commands: readonly AnyCommandDescriptor[]): CatalogueGroup[];
@@ -0,0 +1,49 @@
1
+ /**
2
+ * The header key prefix and the header fallback, re-exported from `@labre/std`
3
+ * where they are declared.
4
+ *
5
+ * They moved there so a FRAMEWORK can derive its own catalogue-header keys for
6
+ * the translation manifest without depending on this widget (#183): in the
7
+ * bundled distribution core's command registry names no framework category, so
8
+ * every framework has to contribute its own. Re-exported rather than moved
9
+ * away, because the panel below is still the thing that renders them.
10
+ */
11
+ export { CATALOGUE_CATEGORY_KEY_PREFIX, humanizeCategory } from '../../std/index.js';
12
+ /**
13
+ * Split a surface's commands into the sections the sidepanel draws.
14
+ *
15
+ * Two rules, and both exist to keep the panel's order the FRAMEWORK's order:
16
+ *
17
+ * - groups appear in the order their category is first met, not alphabetically.
18
+ * `getCommandsForSurface` has already sorted by `CommandDescriptor.order`, so
19
+ * a framework that declared backgrounds before nodes before connectors gets
20
+ * exactly that reading, and sorting the headers by name would quietly
21
+ * overrule it;
22
+ * - a command with no category joins ONE trailing group, and that group exists
23
+ * only when something lands in it. An "Other" header over an empty section —
24
+ * or over a framework whose commands are all uncategorised, where it would be
25
+ * the only header — says nothing a reader can use.
26
+ *
27
+ * Pure on purpose: this is the half of the panel worth unit-testing, and it
28
+ * knows nothing about lit, the DOM or the editor.
29
+ */
30
+ export function groupCommandsByCategory(commands) {
31
+ const byCategory = new Map();
32
+ const uncategorised = [];
33
+ for (const command of commands) {
34
+ const { category } = command;
35
+ if (!category) {
36
+ uncategorised.push(command);
37
+ continue;
38
+ }
39
+ const group = byCategory.get(category);
40
+ if (group)
41
+ group.push(command);
42
+ else
43
+ byCategory.set(category, [command]);
44
+ }
45
+ const groups = [...byCategory].map(([category, commands]) => ({ category, commands }));
46
+ if (uncategorised.length)
47
+ groups.push({ category: null, commands: uncategorised });
48
+ return groups;
49
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * A keystroke sequence (`ShortcutDescriptor.defaultKeys`) spelled the way the
3
+ * platform spells it: `⌘⇧Z` on a Mac, `Ctrl+Shift+Z` elsewhere, and a chord as
4
+ * its keystrokes separated by a space (`['w', 'c']` → `W C`).
5
+ *
6
+ * Symbols and `+` rather than words, because this line is NOT translated — the
7
+ * catalogue's rows carry it beside a label the host did translate, and a
8
+ * hard-coded "then" would be the one English word left in a French panel.
9
+ *
10
+ * `isMac` is a parameter rather than a read of `IS_MAC` so the spelling is
11
+ * testable on either platform from either platform.
12
+ */
13
+ export declare function formatChord(keys: readonly string[], isMac: boolean): string;