Skip to content

Commit 647ebb8

Browse files
committed
feat(ew): comment markers in layout-mode iframe
1 parent 4ce7f37 commit 647ebb8

6 files changed

Lines changed: 1178 additions & 2 deletions

File tree

nx/public/plugins/quick-edit/quick-edit.css

Lines changed: 142 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,4 +335,145 @@ da-palette .da-palette-field {
335335
flex-shrink: 0;
336336
background-color: currentcolor;
337337
mask: url("/nx/img/icons/S2_Icon_Select_20_N.svg") no-repeat center / contain;
338-
}
338+
}
339+
340+
.qe-comment-overlay {
341+
--comment-highlight-bg: light-dark(#fbf198, rgb(255 200 50 / 24%));
342+
--comment-highlight-bg-active: light-dark(#f8d904, rgb(255 220 90 / 38%));
343+
--comment-highlight-border: light-dark(#f8d904, rgb(255 210 70 / 90%));
344+
--comment-highlight-border-active: light-dark(#e8c600, rgb(255 238 130));
345+
346+
position: absolute;
347+
top: 0;
348+
left: 0;
349+
pointer-events: none;
350+
z-index: 9998;
351+
}
352+
353+
.qe-comment-box {
354+
position: absolute;
355+
margin: 0;
356+
padding: 0;
357+
border: none;
358+
pointer-events: auto;
359+
cursor: pointer;
360+
box-sizing: border-box;
361+
}
362+
363+
.qe-comment-box-text {
364+
--da-comment-bg: var(--comment-highlight-bg);
365+
--da-comment-border-color: var(--comment-highlight-border);
366+
367+
/* Visual only: let clicks fall through to the editable text underneath. */
368+
pointer-events: none;
369+
background: light-dark(
370+
color-mix(in srgb, var(--da-comment-bg) 42%, transparent),
371+
color-mix(in srgb, var(--da-comment-bg) 55%, transparent)
372+
);
373+
border-bottom: 2px solid var(--da-comment-border-color);
374+
z-index: 2;
375+
}
376+
377+
.qe-comment-box.is-active {
378+
--da-comment-bg: var(--comment-highlight-bg-active);
379+
--da-comment-border-color: var(--comment-highlight-border-active);
380+
}
381+
382+
.qe-comment-box-text.is-active {
383+
background: light-dark(
384+
color-mix(in srgb, var(--da-comment-bg) 55%, transparent),
385+
color-mix(in srgb, var(--da-comment-bg) 65%, transparent)
386+
);
387+
border-bottom-color: var(--da-comment-border-color);
388+
}
389+
390+
/* Per-author color, toned down. Overrides the yellow theme when a color is set. */
391+
.qe-comment-box-text.is-authored {
392+
background: color-mix(in srgb, var(--da-comment-color) 20%, transparent);
393+
border-bottom-color: var(--da-comment-color);
394+
}
395+
396+
.qe-comment-box-text.is-authored.is-active {
397+
background: color-mix(in srgb, var(--da-comment-color) 34%, transparent);
398+
}
399+
400+
.qe-comment-box-anchor-block {
401+
pointer-events: none;
402+
z-index: 1;
403+
background: transparent !important;
404+
405+
/* Only rendered while the thread is selected (see drawAnchorMarker). */
406+
outline: 2px solid var(--comment-highlight-border-active);
407+
outline-offset: 3px;
408+
}
409+
410+
.qe-comment-box-anchor-block.is-authored {
411+
outline-color: var(--da-comment-color);
412+
}
413+
414+
.qe-comment-marker {
415+
position: absolute;
416+
width: 14px;
417+
height: 14px;
418+
padding: 0;
419+
border: none;
420+
border-radius: 50% 50% 50% 2px;
421+
background: var(--comment-highlight-border);
422+
pointer-events: auto;
423+
cursor: pointer;
424+
z-index: 9999;
425+
}
426+
427+
.qe-comment-marker.is-top-right {
428+
border-radius: 50% 50% 2px;
429+
}
430+
431+
.qe-comment-marker.is-active {
432+
background: var(--comment-highlight-border-active);
433+
}
434+
435+
.qe-comment-marker:hover {
436+
filter: brightness(0.95);
437+
}
438+
439+
.qe-comment-bubble {
440+
position: absolute;
441+
box-sizing: content-box;
442+
display: flex;
443+
align-items: center;
444+
justify-content: center;
445+
width: 32px;
446+
height: 32px;
447+
padding: 0;
448+
margin: 0;
449+
border: 2px solid #fff;
450+
451+
/* Teardrop: pointy bottom-left corner, mirroring the anchor marker. */
452+
border-radius: 50% 50% 50% 2px;
453+
background: var(--da-comment-color, var(--comment-highlight-border));
454+
color: #fff;
455+
font-family: inherit;
456+
font-size: 12px;
457+
font-weight: 600;
458+
line-height: 1;
459+
filter:
460+
drop-shadow(0 2px 8px rgb(0 0 0 / 8%))
461+
drop-shadow(0 1px 4px rgb(0 0 0 / 4%))
462+
drop-shadow(0 0 1px rgb(0 0 0 / 8%));
463+
pointer-events: auto;
464+
cursor: pointer;
465+
z-index: 9999;
466+
}
467+
468+
.qe-comment-bubble.is-active {
469+
outline: 2px solid var(--da-comment-color, var(--comment-highlight-border-active));
470+
outline-offset: 1px;
471+
}
472+
473+
.qe-comment-bubble:hover {
474+
filter:
475+
drop-shadow(0 4px 12px rgb(0 0 0 / 8%))
476+
drop-shadow(0 2px 6px rgb(0 0 0 / 4%))
477+
drop-shadow(0 0 2px rgb(0 0 0 / 12%));
478+
}
479+

nx/public/plugins/quick-edit/quick-edit.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import { setCursors } from './src/cursors.js';
44
import { pollConnection, setupActions } from './src/utils.js';
55
import { MESSAGE_TYPES } from '../../../utils/message-types.js';
66
import { restoreBlockIndices } from './src/dom-index.js';
7+
import {
8+
setCommentMarkers,
9+
applyCommentMarkers,
10+
setupCommentShortcut,
11+
} from './src/comments.js';
712
import {
813
setupNodeSelection,
914
setSelectedNode,
@@ -28,6 +33,7 @@ async function setBody(body, ctx) {
2833
document.body.innerHTML = doc.body.innerHTML;
2934
await ctx.loadPage();
3035
restoreBlockIndices(doc, document);
36+
applyCommentMarkers(ctx);
3137
setupNodeSelection(ctx);
3238
setSelectedNode(getSelectedNode());
3339
setupContentEditableListeners(ctx);
@@ -68,6 +74,8 @@ function onMessage(e, ctx) {
6874
const { newSrc, originalSrc } = data;
6975
updateImageSrc(originalSrc, newSrc);
7076
}
77+
} else if (data.type === MESSAGE_TYPES.SET_COMMENT_MARKERS) {
78+
setCommentMarkers(data, ctx);
7179
} else if (data.type === MESSAGE_TYPES.SET_SELECTED_NODE) {
7280
setSelectedNode(data.node, document, { scrollIntoView: data.scrollIntoView });
7381
}
@@ -92,6 +100,7 @@ function setupParentController(loadPage) {
92100
// @deprecated flat `ready` — prefer `type: MESSAGE_TYPES.READY` (added alongside for
93101
// callers that already migrated their ack check).
94102
port.postMessage({ [MESSAGE_TYPES.READY]: true, type: MESSAGE_TYPES.READY });
103+
setupCommentShortcut(ctx);
95104

96105
window.removeEventListener('message', listener);
97106
};

0 commit comments

Comments
 (0)