Craft-style block menu: Copy Link, Open as note, Remind Me #24
Open
opened 2026-09-14 09:24:29 +00:00 by kayg
·
7 comments
No Branch/Tag specified
dev
wave19/desktop-test
wave19/per-space-state
wave19/first-space-integration
wave19/first-space-draft-transfer
wave19/block-editor-craft
codex/wip/root-conflict-snapshot-20260914
wave12/first-space-draft-transfer
wave14/editor-overnight-combined
wave17/editor-diagnostics-3bbb
wave16/code-block-polish
wave16/image-controls
wave16/event-title-crash-control
wave16/image-preview-dispatch-repair
wave16/event-title-lifecycle-qa
wave16/editor-list-refinements
wave17/editor-layout-correction
wave16/event-edit-date
wave16/note-title-presentation
wave16/editor-final-combined
wave18/document-chrome-repair
wave17/cross-event-drop
wave16/editor-structural-combined
wave16/editor-hover-margins
wave16/editor-caret-relocation-perf
wave16/inspector-polish
wave16/image-preview-integration
wave16/english-transcription
wave16/document-background-edge
wave16/sidebar-live-layout
wave15/image-preview-ownership-repair
wave15/editor-handle-six-dot
wave15/titlebar-public-repair
wave15/sidebar-initial-restoration
wave15/editor-formatting-tooltips
wave15/editor-drag-mounted-repair
wave15/image-preview-foundation-isolated
wave15/editor-block-drag-feedback
wave15/sidebar-attachment-layout
wave14/editor-inline-plain-fastpath
wave14/editor-rendered-paste-replacement
wave14/clipboard-awaited-shutdown
wave14/editor-selectall-toolbar-perf
fix/clipboard-body-undo-group
diagnostic/clipboard-insertion-491
wave14/sidebar-unselected-drag-v2
diagnostic/sidebar-unselected-drag-trace
diagnostic/clipboard-phase-0225
wave14/sidebar-prime-access
wave14/nested-projection-handle-test-fix
wave14/sidebar-unselected-event-drag
fix/clipboard-task-ownership-6318
fix/editor-resource-url-invalidation
codex/wip/editor-handle-render-diagnostic-20260914
fix/central9c9-clipboard-crash
codex/wip/editor-handle-diagnostic-20260914
wave14/sidebar-event-runtime-repair
wave14/nested-projection-runtime-fix
wave14/sidebar-event-test-fixtures
wave14/sidebar-attachment-overlap
integration/rendered-image-clipboard
wave14/sidebar-event-preview-integration
wave14/editor-nested-list-integrate
wave14/editor-nested-list-projection
task/rendered-image-clipboard
wave14/sidebar-paste-preview-integration
wave14/sidebar-event-day-dnd
wave14/editor-preview-next
wave14/editor-list-handle-integrated
task/native-basic-paste
wave14/editor-list-keyboard-audit
task/native-clipboard-contract
codex/wip/editor-handle-geometry-20260914
wave14/editor-block-drag
wave14/editor-drag-integrated
wave14/editor-empty-marker-map-publication
wave14/editor-empty-marker-runtime-diag
wave14/editor-empty-marker-preview
wave14/editor-empty-marker-host-repro
wave14/editor-empty-marker-probe
codex/wip/editor-hr-leaf-fix-20260914
wave14/event-attachment-drop
wave14/editor-empty-marker-paint
wave14/editor-drop-list-preview
wave14/editor-finder-drop
wave14/editor-rule-caret
wave14/editor-list-enter-next
wave14/editor-image-qa
wave14/editor-mode-commands
wave13/editor-code-performance-preview
wave14/sidebar-overlap-repair
wave13/cross-day-compile-repair
wave13/spotlight-retry
wave13/editor-chrome-runtime-repair
wave13/editor-inline-fast-path
codex/wip/detached-87aa-20260914
wave12/editor-viewport-polish
wave12/craft-code-block-polish
wave12/editor-asset-return-preview
wave12/voice-polish-preview
wave12/editor-native-return-runtime-repair
wave12/editor-asset-focus
wave12/cross-day-reviewed-integration
wave12/optional-voice-provider-finish
wave12/event-move-descriptor-compile-fix
wave12/editor-image-geometry-preview
wave12/editor-native-return-undo-repair
wave12/image-native-geometry-fixture
wave12/editor-pattern-preview
wave12/editor-bullet-continuation
wave12/editor-top-chrome
wave12/voice-composer-restart
wave12/speech-variable-buffer-repair
wave12/editor-image-preview
wave12/event-move-descriptor-scale
wave12/editor-image-geometry
wave12/afternoon-ui-preview
wave12/sidebar-hosted-bounds-repair
wave12/sidebar-overlap-live
wave12/speech-e2e-verification
wave12/mentions-polish-finish
wave12/editor-structural-range-repair
wave12/sidebar-fade-desktop-preview
wave12/sidebar-design-ledger
wave12/voice-assets-physical-fixtures
wave12/native-event-marker-polish
wave12/sidebar-fade-undo-preview
wave12/event-move-fence-corrections
wave12/sidebar-fade-boundary-repair
wave12/parent-space-entry-integration
wave12/editor-undo-group-repair
wave12/native-event-row-performance
wave12/parent-swipe-integration
wave12/metadata-noteid-test-fix
wave12/space-composer-generation-fix
wave12/voice-lifecycle-clock-fixture
wave12/sidebar-child-binding
wave12/voice-provider-pool-preview
wave12/composer-recording-preview
wave12/event-cross-day-store-corrections
wave12/voice-async-test-locks
wave12/speech-buffer-lease-fix
wave12/composer-no-top-readouts
wave12/sidebar-child-target
wave12/space-required-composer
wave12/editor-correctness-preview
wave12/voice-provider-compile-corrected
wave12/event-move-integration
wave12/voice-assets-compile-fix
wave12/parakeet-compile-fix
wave12/note-metadata-flexibility
wave12/sidebar-event-drag-drop
wave12/editor-paste-source-guard
wave12/note-asset-import-safety-causal-tests
wave12/note-asset-import-safety
wave12/editor-readonly-command-guards
wave12/voice-provider-integration
wave12/editor-format-flexibility
wave12/hosted-sidebar-ui-sdk-fix
wave12/event-cross-day-store
wave12/voice-app-wiring
wave12/voice-parakeet-assets
wave12/voice-hosted-await-fix
wave12/event-edit-date-guard
wave12/event-cross-day-app
wave12/network-client-entitlement
wave12/sidebar-row-overlap
wave12/voice-settings-surface
wave12/parakeet-capture-adapter
wave12/task-marker-normalization
wave12/voice-polish-integration
wave12/voice-capture-hardening
wave12/voice-provider-settings-plan
wave12/copied-space-editor-io
wave12/hosted-background-sendability
wave12/voice-stop-nlp
wave12/voice-fixture-roots
wave12/voice-claim-collision
wave12/sidebar-add-swipe-plan
wave12/copied-space-app-wiring-plan
wave12/voice-fence-stat-compilefix
wave12/composer-dismiss-crash-hotfix
wave12/voice-retainer-defer-fix
wave12/overnight-recovery-space-preview
wave12/background-checkpoint-compilefix
wave12/copied-space-enumeration-fix
wave12/copied-space-local-state
wave12/voice-fence-fixture-fix
wave12/voice-manifest-fd-fix
wave12/voice-recovery-publication-proof
wave12/voice-retainer-bytecount-fix
wave12/overnight-navigation-background-compilefix
wave12/navigation-work-diagnostic
wave12/overnight-navigation-background-preview
wave12/background-import-bounds
wave12/overnight-voice-lifecycle-preview
wave12/voice-frozen-claim
wave12/voice-input-seam
wave12/voice-recovery-compile-fix
wave12/voice-terminal-cleanup-plan
wave12/voice-recovery-activation-plan-current
wave12/overnight-runtime-probe-preview
wave12/overnight-sandbox-startup-preview
wave12/startup-geometry-diagnostic
wave12/voice-source-sandbox-fix
wave12/image-root-sandbox-fix
wave12/perf-scroll-zero-args
wave12/overnight-document-geometry-preview
wave12/native-document-geometry-diagnostic
wave12/overnight-draft-root-preview
wave12/voice-recovery-c-session-fence
wave12/draft-root-direct-open
wave12/hosted-single-module-linkage
wave12/overnight-voice-recovery-preview
wave12/voice-recovery-checkpoint-a-finalization
wave12/copied-space-local-state-plan
wave12/overnight-refresh-hosted-preview
wave12/incremental-refresh-bounded-load
wave12/raw-source-reconciliation-test-fix
wave12/overnight-rendering-startup-preview
wave12/draft-root-diagnostic
wave12/day-event-bulk-load
wave12/speech-asset-install-test-preview
wave12/hr-material-contrast
wave12/height-clamp-followup
wave12/voice-recovery-checkpoint-a-corrections
wave12/overnight-cstore-caret-preview
wave12/voice-recovery-checkpoint-a
wave12/editor-adjacent-caret-boundary-v3
wave12/voice-recovery-index-query-fix
wave12/editor-adjacent-caret-boundary-v2
wave12/voice-recovery-index-query
wave12/startup-collector-empty-args
wave12/editor-adjacent-caret-boundary
wave12/overnight-hr-storage-preview
wave12/hr-native-diagnostic-followup
wave12/hr-native-diagnostic
wave12/overnight-storage-settings-preview
wave12/snapshot-native-move-followup
wave12/speech-local-fallback
wave12/settings-stream-test-compilefix
wave12/snapshot-path-identity-followup
wave12/corefrontmatter-join-fastpath
wave12/speech-fallback-plan
wave12/overnight-caret-control-registry
wave12/editor-registry-compilefix
wave12/voicea-test-compilefix
wave12/overnight-caret-control-ready
wave12/voicea-enum-compilefix
wave12/voice-recovery-phaseb
wave12/overnight-caret-control
wave12/overnight-polish-storage-preview
wave12/voicea-foundation-compilefix
wave12/snapshot-path-identity
wave12/overnight-native-polish-preview
wave12/hr-rule-geometry
wave12/speech-conversion-fixture
wave12/editor-deferred-caret
wave12/overnight-hosted-lifetime-preview
wave12/marker-glyph-clipping
wave12/voice-recovery-activation
wave12/overnight-package-fixture-preview
wave12/overnight-lifetime-voice-preview
wave12/app-tests-cleanup
wave12/snapshot-physical-fixtures
wave12/event-date-title-punctuation
wave12/overnight-lifetime-voice-plan
wave12/overnight-draw-before
wave12/overnight-picker-event-preview
wave12/settings-watcher
wave12/event-date-title-fix
wave12/note-background-picker-fix
wave12/editor-lifetime
wave12/overnight-draw-preview
wave12/snapshot-attribute-compile-fix
wave12/editor-accepted-draw-trace
wave12/overnight-runtime-preview
wave12/composer-test-concurrency-fix
wave12/editor-caret-performance
wave12/overnight-snapshot-correction
wave12/settings-model-callbacks
wave12/overnight-full-preview
wave12/overnight-store-preview
wave12/rendered-bullet-fix
wave12/settings-document-fixture-fix
wave12/composer-task-pill-ui
wave12/overnight-roadmap-preview
wave12/task-tag-readouts
wave12/event-snapshot-dependency
wave12/h1-strict-preview
wave12/settings-store-await-fix
wave12/settings-store-test-fix
wave12/overnight-pill-preview
wave12/composer-pill-accent-fix
wave12/composer-pill-final
wave11/sidebar-cold-index-prime
wave12/overnight-preview
wave11/voice-draft-recovery
wave11/voice-transcription-finish
wave11/note-save-rename
wave11/task-event-preview
wave11/settings-enabled-plugin-section
wave11/pill-fade-preview
wave11/sidebar-top-fade-regression
wave11/event-sidebar-preview
wave11/composer-pill-restore
wave11/settings-plugins-portability
wave11/composer-hash-semantics
wave11/event-composer-edit
wave11/sidebar-spacing-followup
wave11/editor-performance-evidence
wave11/voice-preview
wave11/voice-stop-repair
wave11/polish-verification
wave11/plugins-settings-ui
wave11/bullet-list-regression
wave11/sidebar-insert-stability
wave11/polish-preview
wave11/document-style-repair
wave11/composer-native-readouts
wave11/mentions-disclosure-motion
wave11/sidebar-swipe-compact
wave11/legacy-helper-path-fix
wave11/persistence-integration
wave11/capsule-instant-presentation
wave11/native-link-activation
wave11/desktop-integration
wave11/link-integration
wave11/synthetic-note-names
wave11/composer-overflow-actions
wave11/legacy-root-links
wave11/note-title-punctuation
wave11/note-title-metadata
wave11/spotlight-navigation
wave11/spotlight-trace-baseline
wave11/note-name-collisions
wave11/identity-query-indexes
wave11/note-heading-title
wave11/capsule-scroll-chrome
wave11/sidebar-context-menu
wave11/spotlight-metadata
wave11/rename-link-repair
wave11/analytics-native
wave11/sidebar-scroll-restoration
wave11/sidebar-bottom-spacing
wave11/capsule-optical-alignment
wave11/markdown-link-resolution
wave11/command-results-layout
wave11/capsule-outside-dismissal
wave11/events-folder
wave11/capsule-query-retention
wave11/capsule-snap-preview
wave11/composer-controls-preview
wave11/sidebar-fade-preview
wave11/selection-lookup
wave11/note-creation-routing
wave11/sidebar-header-spacing
wave11/block-editor
wave11/space-onboarding
wave11/space-terminology
wave4/voice
wave2/search
wave4/glur-probe
wave7/cli-integration
wave12/inspector-style
wave4/document-presentation
wave2/cli
wave2/sidebar
No results found.
Labels
Clear labels
No items
No labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
kayg/calternal-macos#24
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Request
Craft-style trailing block menu in the note editor (user spec 2026-09-14, with reference screenshots from Craft).
While the editor is not focused (or a block is hovered/selected), each block shows a trailing circled
⋯button aligned to the block's first line at the right edge of the reading column. Clicking it opens a nativeNSMenuanchored to the button:link.arrow.right.circleordoc.badge.plus.alarm.Delete / Turn Into… are not requested now.
Acceptance
⋯appears on hover of the block and while the block is selected; hidden otherwise; never draws a focus ring; respects Reduced Motion (no fade when reduced); VoiceOver exposes it as a button "Block actions" with the block text as value.NSMenuwith SF Symbols; keyboard reachable (Control-Return on a selected block opens it).Addendum from user (2026-09-14): once a block is selected, the editor's right-click context menu must offer the same items as the
⋯menu (Copy Link to Block, Open, Remind Me…). Merge with any existing context-menu items rather than duplicating (e.g. one Copy Link entry only, one source of truth for the item list shared by both menus).Chunks 3-4 on
wave19/block-editor-craft(pushed):55c60ffshared block actions menu (trailingellipsis.circleNSButton, one item builder for ⋯ and context menu, Control-Return presenter, Remind Me… disabled submenu with tooltip, single Copy Link to Block),d453228,7390f6dOpen as standalone note (NoteIdentity.preparingNoteDraft + frontmatter merge + coordinatedCreateIfAbsent no-replace loop; setOpenedNotePath after durable write; no day/event mutation),3e6b058,fd46365,63a011blist/task/heading marker normalisation for the title,11a870dhosted App test runner.VM evidence (build
63a011b, Space "Calternal Native Break86ccc9c", note "A0 Block Editor and Style QA"): selecting "populated bullet" shows the circled ⋯ at the right edge of the row; right-click menu contains Duplicate Block / Delete Block / Copy Link to Block / Open / Remind Me… (disabled) / Toggle Raw Markdown merged with the native text items, exactly one Copy Link entry. Open creatednotes/populated-bullet-8c0f4ee7.md(frontmatter title/slug/id,# populated bullet, empty body) and navigated to it; the source note's list is byte-identical. First attempt on the list block failed with "Start the note with a title…" — fixed in63a011b(hosted test covers list and task blocks).Hosted tests:
testBlockActionsMenuMatchesContextMenuItems1/1,EventAttachmentDropTests.testOpeningBlockAsNoteCreatesStandaloneNoteWithoutMutatingDay1/1 on agents@mbp. Reviewer pass in progress; delivery to kayg@mbp gated on chunk 1 (#4) acceptance.VM real-event verification (patched cua-driver), build
1763820onwave19/block-editor-craft, note "A0 Block Editor and Style QA" in the Overnight Perf QA fixture Space:.agents/evidence/block-editor/hover-grid.png(earlier grids). Note: the reading column is now 18 pt narrower everywhere; long titles wrap slightly earlier than on dev.notes/populated-checkbox-0faa52c9.mdand rewrote the source block to- [ ] [populated checkbox](<../notes/populated-checkbox-0faa52c9.md>)(checkbox preserved), then navigated to the new note.^fb62aaecappended to the source line) but the pasteboard is unchanged and no error surfaces; failure is downstream in Viewer→Shell.copyLink→CopyCoordinator. Under investigation.Verification script:
Scripts/vm/block_editor_check.py(hover geometry per row, clipboard, note/source diff). Menu items are activated via hover + Return because synthetic clicks on NSMenu items do not activate them through cua-driver.Status at end of session 2026-09-14 (paused on user request; further refinements under supervision tomorrow):
Branch
wave19/block-editor-craft@bc3ace0(pushed). Final reviewer round (agent findings) fixed in302d99a(old draw-time caret/hit-test offsets removed; Open revalidates the block after the await; scroll-snap flag; ID-less hover rebinding),ad73794(explicit-syntheticmode gate; navigation-generation guard restored; Open idempotent on an existing generated link; VaultSession copyNoteBlock unique-owner validation without the resolver re-entry deadlock),790eb00,bc3ace0.VM real-event verification of
bc3ace0withScripts/vm/block_editor_check.py(root checkout): hover 7/7 PASS (slide +36 px on hovered row, handle in vacated space, other rows untouched, reset on leave), Copy Link PASS (canonical calternal://…/block/ on the pasteboard, ~5 s latency — the copy awaits an index refresh; worth shortening), Open: on this run the app navigated to a stale index entry (a previously created-then-deleted "populated checkbox" note) instead of creating a new note — needs a look tomorrow (index entry for a deleted note file; Open should verify the file exists or create anew). Known follow-ups: reading column is 18 pt narrower everywhere (trailing reserve); ordered-list marker misalignment is pre-existing (#17); XCUITest scenarios in App/UITests/BlockEditorCraftUITests.swift still fail at launch/editor waits and are not part of the verification gate (VM script is).No build delivered to kayg@mbp beyond
63a011bdearlier today; next delivery after tomorrow's supervised round.Status at end of session 2026-09-14 (paused on user request; further refinements under supervision tomorrow):
Branch
wave19/block-editor-craft@bc3ace0(pushed). Final reviewer round (agent findings) fixed in302d99a(old draw-time caret/hit-test offsets removed; Open revalidates the block after the await; scroll-snap flag; ID-less hover rebinding),ad73794(explicit-syntheticmode gate; navigation-generation guard restored; Open idempotent on an existing generated link; VaultSession copyNoteBlock unique-owner validation without the resolver re-entry deadlock),790eb00,bc3ace0.VM real-event verification of
bc3ace0withScripts/vm/block_editor_check.py(root checkout): hover 7/7 PASS (slide +36 px on hovered row, handle in vacated space, other rows untouched, reset on leave), Copy Link PASS (canonical calternal://…/block/ on the pasteboard, ~5 s latency — the copy awaits an index refresh; worth shortening), Open: on this run the app navigated to a stale index entry (a previously created-then-deleted "populated checkbox" note) instead of creating a new note — needs a look tomorrow (index entry for a deleted note file; Open should verify the file exists or create anew). Known follow-ups: reading column is 18 pt narrower everywhere (trailing reserve); ordered-list marker misalignment is pre-existing (#17); XCUITest scenarios in App/UITests/BlockEditorCraftUITests.swift still fail at launch/editor waits and are not part of the verification gate (VM script is).No build delivered to kayg@mbp beyond
63a011bdearlier today; next delivery after tomorrow's supervised round.Worker BlockDrop owns worktree /home/kayg/Developer/calternal-apple/.worktrees/block-drop (branch wave19/block-drop). Starting implementation for the onto-block drop actions (make-note, swap, nest), portable per-Space setting, and mounted coverage. Next action: inspect existing editor/store writer seams, implement and verify scoped tests; parent Main owns VM lease/build sequencing.
DropFinish / wave19/block-drop /
d3fa4e52: completed the block-drop verification gate work. Added mounted behavior coverage for make-note, swap, and nest; fixed nest source-separator removal, stable hovered-handle gutter placement, task-control discovery/first-line geometry, and responder-copy action. Focused onto-action tests and caret/handle regressions pass. The complete class reaches two independently confirmed existing image crashes tracked in #11; both were verified in desktop-test and recorded there. App build is currently blocked before packaging by unrelatedVaultIndex.swift:2046strict-concurrency region-isolation compilation error, so no VM deployment/evidence exists yet.