@formicoidea/labre-core 0.41.0 → 0.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +384 -0
- package/dist/_pkgs/affine-block-bookmark/bookmark-block.js +2 -2
- package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/config.js +7 -1
- package/dist/_pkgs/affine-block-embed/embed-figma-block/embed-figma-block.js +2 -1
- package/dist/_pkgs/affine-block-embed/embed-github-block/embed-github-block.js +2 -1
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/consts.d.ts +2 -0
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/consts.js +5 -0
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/embed-iframe-block.d.ts +1 -0
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/embed-iframe-block.js +30 -8
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/utils.d.ts +8 -0
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/utils.js +19 -0
- package/dist/_pkgs/affine-block-embed/embed-loom-block/embed-loom-block.js +2 -1
- package/dist/_pkgs/affine-block-embed/embed-youtube-block/embed-youtube-block.js +2 -1
- package/dist/_pkgs/affine-block-frame/frame-manager.js +1 -1
- package/dist/_pkgs/affine-block-frame/frame-tool.js +1 -1
- package/dist/_pkgs/affine-block-frame/frame-toolbar.js +6 -1
- package/dist/_pkgs/affine-block-list/list-keymap.js +7 -0
- package/dist/_pkgs/affine-block-note/note-keymap.js +7 -1
- package/dist/_pkgs/affine-block-paragraph/paragraph-keymap.js +7 -1
- package/dist/_pkgs/affine-block-root/commands/pivot-commands.js +1 -8
- package/dist/_pkgs/affine-block-root/commands/tag-commands.js +1 -8
- package/dist/_pkgs/affine-block-root/edgeless/edgeless-keyboard.d.ts +9 -0
- package/dist/_pkgs/affine-block-root/edgeless/edgeless-keyboard.js +51 -0
- package/dist/_pkgs/affine-block-root/edgeless/edgeless-root-block.d.ts +22 -0
- package/dist/_pkgs/affine-block-root/edgeless/edgeless-root-block.js +46 -0
- package/dist/_pkgs/affine-block-root/edgeless/utils/pinch-zoom.d.ts +21 -0
- package/dist/_pkgs/affine-block-root/edgeless/utils/pinch-zoom.js +24 -0
- package/dist/_pkgs/affine-block-root/edgeless/utils/query.js +8 -0
- package/dist/_pkgs/affine-block-root/keyboard/keymap.js +1 -16
- package/dist/_pkgs/affine-block-surface/element-model/index.d.ts +21 -3
- package/dist/_pkgs/affine-block-surface/element-model/index.js +14 -2
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/command.d.ts +23 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/command.js +89 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/index.d.ts +7 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/index.js +5 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/render.d.ts +41 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/render.js +70 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/svg-context.d.ts +49 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/svg-context.js +257 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/tagged-path.d.ts +16 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/tagged-path.js +24 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/toolbar.d.ts +24 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/toolbar.js +66 -0
- package/dist/_pkgs/affine-block-surface/extensions/index.d.ts +4 -0
- package/dist/_pkgs/affine-block-surface/extensions/index.js +4 -0
- package/dist/_pkgs/affine-block-surface/extensions/interchange-import.d.ts +66 -4
- package/dist/_pkgs/affine-block-surface/extensions/interchange-import.js +241 -11
- package/dist/_pkgs/affine-block-surface/extensions/interchange.d.ts +18 -0
- package/dist/_pkgs/affine-block-surface/extensions/legend-toolbar.d.ts +81 -0
- package/dist/_pkgs/affine-block-surface/extensions/legend-toolbar.js +81 -0
- package/dist/_pkgs/affine-block-surface/extensions/legend.d.ts +136 -0
- package/dist/_pkgs/affine-block-surface/extensions/legend.js +439 -0
- package/dist/_pkgs/affine-block-surface/extensions/reading-widget.d.ts +17 -3
- package/dist/_pkgs/affine-block-surface/extensions/reading-widget.js +35 -13
- package/dist/_pkgs/affine-block-surface/extensions/reading.d.ts +61 -1
- package/dist/_pkgs/affine-block-surface/extensions/reading.js +85 -39
- package/dist/_pkgs/affine-block-surface/extensions/record-action.d.ts +66 -0
- package/dist/_pkgs/affine-block-surface/extensions/record-action.js +145 -0
- package/dist/_pkgs/affine-block-surface/extensions/validation.d.ts +253 -28
- package/dist/_pkgs/affine-block-surface/extensions/validation.js +489 -41
- package/dist/_pkgs/affine-block-surface/framework-background/background-view.d.ts +115 -0
- package/dist/_pkgs/affine-block-surface/framework-background/background-view.js +185 -0
- package/dist/_pkgs/affine-block-surface/framework-background/index.d.ts +1 -0
- package/dist/_pkgs/affine-block-surface/framework-background/index.js +1 -0
- package/dist/_pkgs/affine-block-surface/framework-background/labels.d.ts +16 -1
- package/dist/_pkgs/affine-block-surface/framework-background/labels.js +31 -21
- package/dist/_pkgs/affine-block-surface/framework-background/renderer.js +29 -5
- package/dist/_pkgs/affine-block-surface/framework-background/stacking.d.ts +6 -4
- package/dist/_pkgs/affine-block-surface/framework-background/stacking.js +56 -8
- package/dist/_pkgs/affine-block-surface/renderer/canvas-renderer.d.ts +12 -0
- package/dist/_pkgs/affine-block-surface/renderer/canvas-renderer.js +15 -0
- package/dist/_pkgs/affine-block-surface/view.js +8 -1
- package/dist/_pkgs/affine-block-surface-ref/configs/slash-menu.js +1 -1
- package/dist/_pkgs/affine-components/color-picker/button.d.ts +56 -1
- package/dist/_pkgs/affine-components/color-picker/button.js +168 -23
- package/dist/_pkgs/affine-components/color-picker/framework-palette.d.ts +106 -0
- package/dist/_pkgs/affine-components/color-picker/framework-palette.js +177 -0
- package/dist/_pkgs/affine-components/color-picker/index.d.ts +2 -0
- package/dist/_pkgs/affine-components/color-picker/index.js +2 -0
- package/dist/_pkgs/affine-components/color-picker/palette-carousel.d.ts +85 -0
- package/dist/_pkgs/affine-components/color-picker/palette-carousel.js +440 -0
- package/dist/_pkgs/affine-components/edgeless-shape-color-picker/color-picker.d.ts +31 -1
- package/dist/_pkgs/affine-components/edgeless-shape-color-picker/color-picker.js +189 -63
- package/dist/_pkgs/affine-components/resource/resource.js +29 -16
- package/dist/_pkgs/affine-components/translations.d.ts +8 -0
- package/dist/_pkgs/affine-components/translations.js +17 -0
- package/dist/_pkgs/affine-foundation/view.js +2 -1
- package/dist/_pkgs/affine-gfx-brush/element-renderer.js +2 -2
- package/dist/_pkgs/affine-gfx-brush/toolbar/configs/brush.js +6 -1
- package/dist/_pkgs/affine-gfx-brush/toolbar/configs/highlighter.js +6 -1
- package/dist/_pkgs/affine-gfx-connector/connector-manager.d.ts +9 -1
- package/dist/_pkgs/affine-gfx-connector/connector-manager.js +61 -0
- package/dist/_pkgs/affine-gfx-connector/element-renderer/connector-dom/index.d.ts +7 -1
- package/dist/_pkgs/affine-gfx-connector/element-renderer/connector-dom/index.js +87 -17
- package/dist/_pkgs/affine-gfx-connector/element-renderer/index.js +78 -17
- package/dist/_pkgs/affine-gfx-connector/element-renderer/utils.d.ts +24 -2
- package/dist/_pkgs/affine-gfx-connector/element-renderer/utils.js +31 -8
- package/dist/_pkgs/affine-gfx-connector/text/edgeless-connector-label-editor.d.ts +124 -3
- package/dist/_pkgs/affine-gfx-connector/text/edgeless-connector-label-editor.js +216 -54
- package/dist/_pkgs/affine-gfx-connector/text/text.d.ts +13 -4
- package/dist/_pkgs/affine-gfx-connector/text/text.js +13 -44
- package/dist/_pkgs/affine-gfx-connector/toolbar/config.d.ts +56 -0
- package/dist/_pkgs/affine-gfx-connector/toolbar/config.js +72 -4
- package/dist/_pkgs/affine-gfx-connector/toolbar/hollow-endpoint-icons.d.ts +8 -0
- package/dist/_pkgs/affine-gfx-connector/toolbar/hollow-endpoint-icons.js +118 -0
- package/dist/_pkgs/affine-gfx-connector/view/view.d.ts +37 -1
- package/dist/_pkgs/affine-gfx-connector/view/view.js +97 -8
- package/dist/_pkgs/affine-gfx-group/command/group-api.js +1 -1
- package/dist/_pkgs/affine-gfx-group/store.js +0 -2
- package/dist/_pkgs/affine-gfx-group/translations.d.ts +9 -10
- package/dist/_pkgs/affine-gfx-group/translations.js +9 -13
- package/dist/_pkgs/affine-gfx-mindmap/templates/index.js +1 -1
- package/dist/_pkgs/affine-gfx-mindmap/toolbar/basket-elements.js +1 -1
- package/dist/_pkgs/affine-gfx-mindmap/toolbar/utils/import-mindmap.js +2 -2
- package/dist/_pkgs/affine-gfx-mindmap/translations.d.ts +1 -1
- package/dist/_pkgs/affine-gfx-mindmap/translations.js +1 -1
- package/dist/_pkgs/affine-gfx-shape/element-renderer/highlighter.js +2 -2
- package/dist/_pkgs/affine-gfx-shape/overlay/polygon-drawing-overlay.d.ts +6 -0
- package/dist/_pkgs/affine-gfx-shape/overlay/polygon-drawing-overlay.js +30 -1
- package/dist/_pkgs/affine-gfx-shape/polygon-tool.d.ts +20 -1
- package/dist/_pkgs/affine-gfx-shape/polygon-tool.js +9 -1
- package/dist/_pkgs/affine-gfx-shape/toolbar/config.js +6 -1
- package/dist/_pkgs/affine-gfx-shape/toolbar/palette-color-action.js +11 -1
- package/dist/_pkgs/affine-gfx-template/builtin/other.js +1 -1
- package/dist/_pkgs/affine-gfx-template/snapshot-from-action.js +32 -119
- package/dist/_pkgs/affine-gfx-template/toolbar/template-type.d.ts +1 -1
- package/dist/_pkgs/affine-gfx-text/dblclick-add-edgeless-text.d.ts +13 -1
- package/dist/_pkgs/affine-gfx-text/dblclick-add-edgeless-text.js +19 -4
- package/dist/_pkgs/affine-gfx-text/edgeless-text-editor.d.ts +41 -0
- package/dist/_pkgs/affine-gfx-text/edgeless-text-editor.js +57 -2
- package/dist/_pkgs/affine-gfx-text/toolbar/actions.d.ts +8 -1
- package/dist/_pkgs/affine-gfx-text/toolbar/actions.js +12 -2
- package/dist/_pkgs/affine-gfx-text/translations.d.ts +1 -0
- package/dist/_pkgs/affine-gfx-text/translations.js +2 -1
- package/dist/_pkgs/affine-inline-preset/markdown.js +5 -1
- package/dist/_pkgs/affine-model/consts/connector.d.ts +28 -2
- package/dist/_pkgs/affine-model/consts/connector.js +26 -0
- package/dist/_pkgs/affine-model/elements/bpmn/pool.js +1 -1
- package/dist/_pkgs/affine-model/elements/brush/brush.js +1 -1
- package/dist/_pkgs/affine-model/elements/c4/board.js +1 -1
- package/dist/_pkgs/affine-model/elements/c4/boundary.js +1 -1
- package/dist/_pkgs/affine-model/elements/connector/connector.d.ts +135 -0
- package/dist/_pkgs/affine-model/elements/connector/connector.js +246 -5
- package/dist/_pkgs/affine-model/elements/connector/end-label.d.ts +83 -0
- package/dist/_pkgs/affine-model/elements/connector/end-label.js +119 -0
- package/dist/_pkgs/affine-model/elements/connector/index.d.ts +1 -0
- package/dist/_pkgs/affine-model/elements/connector/index.js +1 -0
- package/dist/_pkgs/affine-model/elements/context-map/context-map.js +1 -1
- package/dist/_pkgs/affine-model/elements/core-domain/core-domain.d.ts +28 -0
- package/dist/_pkgs/affine-model/elements/core-domain/core-domain.js +129 -2
- package/dist/_pkgs/affine-model/elements/cynefin/cynefin.d.ts +8 -0
- package/dist/_pkgs/affine-model/elements/cynefin/cynefin.js +45 -2
- package/dist/_pkgs/affine-model/elements/edgy/board.js +1 -1
- package/dist/_pkgs/affine-model/elements/edgy/facets.js +1 -1
- package/dist/_pkgs/affine-model/elements/estuarine/estuarine.d.ts +6 -0
- package/dist/_pkgs/affine-model/elements/estuarine/estuarine.js +36 -2
- package/dist/_pkgs/affine-model/elements/event-storming/event-storming.d.ts +18 -7
- package/dist/_pkgs/affine-model/elements/event-storming/event-storming.js +23 -8
- package/dist/_pkgs/affine-model/elements/framework-background/background.d.ts +16 -0
- package/dist/_pkgs/affine-model/elements/framework-background/background.js +18 -0
- package/dist/_pkgs/affine-model/elements/highlighter/highlighter.js +1 -1
- package/dist/_pkgs/affine-model/elements/index.d.ts +8 -0
- package/dist/_pkgs/affine-model/elements/index.js +1 -0
- package/dist/_pkgs/affine-model/elements/shape/shape.js +1 -1
- package/dist/_pkgs/affine-model/elements/text/text.js +1 -1
- package/dist/_pkgs/affine-model/elements/uml/band.d.ts +39 -0
- package/dist/_pkgs/affine-model/elements/uml/band.js +31 -0
- package/dist/_pkgs/affine-model/elements/uml/diagram.d.ts +158 -0
- package/dist/_pkgs/affine-model/elements/uml/diagram.js +229 -0
- package/dist/_pkgs/affine-model/elements/uml/fragment.d.ts +161 -0
- package/dist/_pkgs/affine-model/elements/uml/fragment.js +205 -0
- package/dist/_pkgs/affine-model/elements/uml/index.d.ts +8 -0
- package/dist/_pkgs/affine-model/elements/uml/index.js +8 -0
- package/dist/_pkgs/affine-model/elements/uml/lifeline.d.ts +77 -0
- package/dist/_pkgs/affine-model/elements/uml/lifeline.js +89 -0
- package/dist/_pkgs/affine-model/elements/uml/node.d.ts +142 -0
- package/dist/_pkgs/affine-model/elements/uml/node.js +190 -0
- package/dist/_pkgs/affine-model/elements/uml/partition.d.ts +106 -0
- package/dist/_pkgs/affine-model/elements/uml/partition.js +172 -0
- package/dist/_pkgs/affine-model/elements/uml/region.d.ts +75 -0
- package/dist/_pkgs/affine-model/elements/uml/region.js +150 -0
- package/dist/_pkgs/affine-model/elements/uml/subject.d.ts +37 -0
- package/dist/_pkgs/affine-model/elements/uml/subject.js +108 -0
- package/dist/_pkgs/affine-model/elements/wardley/wardley.js +1 -1
- package/dist/_pkgs/affine-shared/services/embed-iframe/embed-iframe-config.d.ts +1 -0
- package/dist/_pkgs/affine-shared/services/font-loader/config.d.ts +7 -0
- package/dist/_pkgs/affine-shared/services/font-loader/config.js +43 -0
- package/dist/_pkgs/affine-shared/services/pivot-materiality-publisher.js +1 -9
- package/dist/_pkgs/affine-shared/services/telemetry-service/document-damage-watcher.d.ts +53 -0
- package/dist/_pkgs/affine-shared/services/telemetry-service/document-damage-watcher.js +95 -0
- package/dist/_pkgs/affine-shared/services/telemetry-service/index.d.ts +1 -0
- package/dist/_pkgs/affine-shared/services/telemetry-service/index.js +1 -0
- package/dist/_pkgs/affine-shared/services/telemetry-service/lifecycle.d.ts +26 -1
- package/dist/_pkgs/affine-shared/services/telemetry-service/telemetry-service.d.ts +2 -2
- package/dist/_pkgs/affine-shared/services/toolbar-service/command-action.d.ts +34 -0
- package/dist/_pkgs/affine-shared/services/toolbar-service/command-action.js +63 -0
- package/dist/_pkgs/affine-shared/services/toolbar-service/index.d.ts +1 -0
- package/dist/_pkgs/affine-shared/services/toolbar-service/index.js +1 -0
- package/dist/_pkgs/affine-shared/services/translation-service/chrome.d.ts +77 -7
- package/dist/_pkgs/affine-shared/services/translation-service/chrome.js +97 -7
- package/dist/_pkgs/affine-shared/styles/index.d.ts +1 -0
- package/dist/_pkgs/affine-shared/styles/index.js +1 -0
- package/dist/_pkgs/affine-shared/styles/motion.d.ts +14 -0
- package/dist/_pkgs/affine-shared/styles/motion.js +38 -0
- package/dist/_pkgs/affine-shared/utils/event.d.ts +10 -0
- package/dist/_pkgs/affine-shared/utils/event.js +20 -0
- package/dist/_pkgs/affine-shared/utils/file/filesys.d.ts +16 -0
- package/dist/_pkgs/affine-shared/utils/file/filesys.js +25 -0
- package/dist/_pkgs/affine-shared/utils/index.d.ts +1 -0
- package/dist/_pkgs/affine-shared/utils/index.js +1 -0
- package/dist/_pkgs/affine-shared/utils/link-preview-refresh.d.ts +12 -0
- package/dist/_pkgs/affine-shared/utils/link-preview-refresh.js +13 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/artefact-catalogue-widget.d.ts +12 -4
- package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/artefact-catalogue-widget.js +27 -4
- package/dist/_pkgs/affine-widget-edgeless-toolbar/create-popper.js +13 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/index.d.ts +2 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/index.js +2 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/command-menu.d.ts +80 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/command-menu.js +270 -81
- package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/senior-menu-selection.d.ts +15 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/senior-menu-selection.js +15 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/panel/font-weight-and-style-panel.js +8 -1
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/artefact-ghost-overlay.d.ts +42 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/artefact-ghost-overlay.js +100 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/artefact-placement-tool.d.ts +100 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/artefact-placement-tool.js +274 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/index.d.ts +3 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/index.js +3 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/translate-created.d.ts +25 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/translate-created.js +67 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/view.js +5 -0
- package/dist/_pkgs/global/gfx/xywh.js +7 -0
- package/dist/_pkgs/std/extension/command-registry.d.ts +158 -1
- package/dist/_pkgs/std/extension/command-registry.js +22 -0
- package/dist/_pkgs/std/gfx/index.d.ts +1 -1
- package/dist/_pkgs/std/gfx/interactivity/gfx-view-event-handler.d.ts +12 -0
- package/dist/_pkgs/std/gfx/interactivity/gfx-view-event-handler.js +20 -1
- package/dist/_pkgs/std/gfx/interactivity/manager.d.ts +10 -0
- package/dist/_pkgs/std/gfx/interactivity/manager.js +12 -0
- package/dist/_pkgs/std/gfx/model/surface/element-model.js +12 -7
- package/dist/_pkgs/std/gfx/model/surface/surface-model.d.ts +56 -0
- package/dist/_pkgs/std/gfx/model/surface/surface-model.js +84 -3
- package/dist/_pkgs/std/gfx/view/view.d.ts +11 -2
- package/dist/_pkgs/std/gfx/view/view.js +16 -2
- package/dist/commands.d.ts +6 -0
- package/dist/commands.js +8 -1
- package/dist/frameworks.d.ts +9 -0
- package/dist/frameworks.js +19 -0
- package/dist/translations.js +16 -0
- package/package.json +9 -4
- package/dist/_pkgs/affine-gfx-group/group-watcher.d.ts +0 -1
- package/dist/_pkgs/affine-gfx-group/group-watcher.js +0 -20
|
@@ -37,9 +37,11 @@ import { TOUCH_TARGET_MIN_PX } from '../../affine-shared/consts/index.js';
|
|
|
37
37
|
import { CATALOGUE_OTHER, translateKey } from '../../affine-shared/services/index.js';
|
|
38
38
|
import { IS_MAC } from '../../global/env/index.js';
|
|
39
39
|
import { getCommandIcon, CommandUsageIdentifier, getCommandsForSurface, isCommandAvailable, normalizeLegacyCombo, rankCommandsByUsage, runCommand, ShortcutOverrideIdentifier, WidgetComponent, WidgetViewExtension, } from '../../std/index.js';
|
|
40
|
+
import { GfxControllerIdentifier } from '../../std/gfx/index.js';
|
|
40
41
|
import { css, html, nothing, unsafeCSS } from 'lit';
|
|
41
42
|
import { state } from 'lit/decorators.js';
|
|
42
43
|
import { literal, unsafeStatic } from 'lit/static-html.js';
|
|
44
|
+
import { armArtefact, armedArtefact, } from '../placement/artefact-placement-tool.js';
|
|
43
45
|
import { CATALOGUE_CATEGORY_KEY_PREFIX, groupCommandsByCategory, humanizeCategory, } from './catalogue-groups.js';
|
|
44
46
|
import { formatChord } from './chord-format.js';
|
|
45
47
|
export const EDGELESS_ARTEFACT_CATALOGUE_WIDGET = 'edgeless-artefact-catalogue-widget';
|
|
@@ -122,6 +124,15 @@ let EdgelessArtefactCatalogueWidget = (() => {
|
|
|
122
124
|
// it is in another tree, and its own click already landed.
|
|
123
125
|
if (event.composedPath().includes(this))
|
|
124
126
|
return;
|
|
127
|
+
// So does the click that PLACES the artefact this panel just armed. A row
|
|
128
|
+
// taps to arm since 2026-09-16, and the gesture that finishes it is a click
|
|
129
|
+
// on the canvas — which is also the click-away. Read literally, the panel
|
|
130
|
+
// would dismiss itself halfway through its own interaction, and furnishing
|
|
131
|
+
// a diagram would cost a re-open per artefact: exactly the open-click-reopen
|
|
132
|
+
// the PO reversed on 27/08/2026. The placement returns to the default tool,
|
|
133
|
+
// so the NEXT click outside puts the panel away as it always has.
|
|
134
|
+
if (armedArtefact(this.std.get(GfxControllerIdentifier)))
|
|
135
|
+
return;
|
|
125
136
|
this.closePanel();
|
|
126
137
|
};
|
|
127
138
|
/**
|
|
@@ -437,11 +448,19 @@ let EdgelessArtefactCatalogueWidget = (() => {
|
|
|
437
448
|
return keys.length ? formatChord(keys, IS_MAC) : null;
|
|
438
449
|
}
|
|
439
450
|
/**
|
|
440
|
-
*
|
|
451
|
+
* Arm an artefact, run anything else. The panel STAYS OPEN either way.
|
|
452
|
+
*
|
|
453
|
+
* An artefact row arms the placement tool exactly as the senior menu's does
|
|
454
|
+
* (PO decision, 2026-09-16): the ghost goes under the cursor and the click on
|
|
455
|
+
* the canvas says where. The panel is one gesture away from the board, so it
|
|
456
|
+
* can stay open behind the ghost.
|
|
441
457
|
*
|
|
442
|
-
* `runCommand` is the one bottleneck (ADR 0008): the
|
|
443
|
-
* measure are emitted there, and `surface:
|
|
444
|
-
* panel distinguishable from the sub-menu in
|
|
458
|
+
* For everything else `runCommand` is the one bottleneck (ADR 0008): the
|
|
459
|
+
* telemetry and the usage measure are emitted there, and `surface:
|
|
460
|
+
* 'catalogue'` is what makes this panel distinguishable from the sub-menu in
|
|
461
|
+
* the numbers. An armed artefact reports at PLACEMENT instead, through the
|
|
462
|
+
* tool, so its `surface` reads `'senior-menu'` — the row it belongs to,
|
|
463
|
+
* whichever surface offered it.
|
|
445
464
|
*
|
|
446
465
|
* Staying open is the PO's call (recette, 27/08/2026), reversing the first
|
|
447
466
|
* default: a catalogue is where a user furnishes a diagram, and furnishing is
|
|
@@ -450,6 +469,10 @@ let EdgelessArtefactCatalogueWidget = (() => {
|
|
|
450
469
|
* or a click on the canvas.
|
|
451
470
|
*/
|
|
452
471
|
_invoke(command) {
|
|
472
|
+
if (command.kind === 'artefact') {
|
|
473
|
+
armArtefact(this.std.get(GfxControllerIdentifier), command.owner, command);
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
453
476
|
runCommand(this.std, command, {
|
|
454
477
|
surface: 'catalogue',
|
|
455
478
|
source: 'toolbar:general',
|
|
@@ -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 {
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
+
}
|