Skip to content

Commit 519acaf

Browse files
committed
Lexical: Added better selection display for collapisble blocks
1 parent 849bc4d commit 519acaf

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

resources/js/wysiwyg/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {modals} from "./ui/defaults/modals";
2020
import {CodeBlockDecorator} from "./ui/decorators/code-block";
2121
import {DiagramDecorator} from "./ui/decorators/diagram";
2222
import {registerMouseHandling} from "./services/mouse-handling";
23+
import {registerSelectionHandling} from "./services/selection-handling";
2324

2425
const theme = {
2526
text: {
@@ -53,6 +54,7 @@ export function createPageEditorInstance(container: HTMLElement, htmlContent: st
5354
registerShortcuts(context),
5455
registerKeyboardHandling(context),
5556
registerMouseHandling(context),
57+
registerSelectionHandling(context),
5658
registerTableResizer(editor, context.scrollDOM),
5759
registerTableSelectionHandler(editor),
5860
registerTaskListHandler(editor, context.editorDOM),
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import {EditorUiContext} from "../ui/framework/core";
2+
import {
3+
$getSelection,
4+
COMMAND_PRIORITY_LOW,
5+
SELECTION_CHANGE_COMMAND
6+
} from "lexical";
7+
import {$isDetailsNode} from "@lexical/rich-text/LexicalDetailsNode";
8+
9+
10+
const trackedDomNodes = new Set<HTMLElement>();
11+
12+
/**
13+
* Set a selection indicator on nodes which require it.
14+
* @param context
15+
*/
16+
function setSelectionIndicator(context: EditorUiContext): boolean {
17+
18+
for (const domNode of trackedDomNodes) {
19+
domNode.classList.remove('selected');
20+
trackedDomNodes.delete(domNode);
21+
}
22+
23+
const selection = $getSelection();
24+
const nodes = selection?.getNodes() || [];
25+
26+
if (nodes.length === 1) {
27+
if ($isDetailsNode(nodes[0])) {
28+
const domEl = context.editor.getElementByKey(nodes[0].getKey());
29+
if (domEl) {
30+
domEl.classList.add('selected');
31+
trackedDomNodes.add(domEl);
32+
}
33+
}
34+
}
35+
36+
return false;
37+
}
38+
39+
export function registerSelectionHandling(context: EditorUiContext): () => void {
40+
const unregisterSelectionChange = context.editor.registerCommand(SELECTION_CHANGE_COMMAND, (): boolean => {
41+
setSelectionIndicator(context);
42+
return false;
43+
}, COMMAND_PRIORITY_LOW);
44+
45+
46+
return () => {
47+
unregisterSelectionChange();
48+
};
49+
}

resources/sass/_editor.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,10 @@ body.editor-is-fullscreen {
447447
.editor-content-area details summary {
448448
caret-color: transparent;
449449
}
450+
.editor-content-area details.selected {
451+
outline: 1px dashed var(--editor-color-primary);
452+
outline-offset: 1px;
453+
}
450454

451455
.editor-table-marker {
452456
position: fixed;

0 commit comments

Comments
 (0)