@nldd/design-system 0.8.86 → 0.8.88
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/custom-elements.json +662 -144
- package/dist/components/actions/icon-button/icon-button.d.ts +2 -2
- package/dist/components/actions/icon-button/icon-button.d.ts.map +1 -1
- package/dist/components/actions/icon-button/icon-button.js +3 -3
- package/dist/components/actions/icon-button/icon-button.js.map +1 -1
- package/dist/components/components.js +1263 -273
- package/dist/components/content/avatar/avatar.d.ts +6 -6
- package/dist/components/content/avatar/avatar.d.ts.map +1 -1
- package/dist/components/content/avatar/avatar.js +9 -9
- package/dist/components/content/avatar/avatar.js.map +1 -1
- package/dist/components/content/icon/icon-aliases.d.ts.map +1 -1
- package/dist/components/content/icon/icon-aliases.js +4 -0
- package/dist/components/content/icon/icon-aliases.js.map +1 -1
- package/dist/components/content/icon/icon-gallery-status.d.ts.map +1 -1
- package/dist/components/content/icon/icon-gallery-status.js +3 -26
- package/dist/components/content/icon/icon-gallery-status.js.map +1 -1
- package/dist/components/content/icon/icon-registry.d.ts.map +1 -1
- package/dist/components/content/icon/icon-registry.js +2 -0
- package/dist/components/content/icon/icon-registry.js.map +1 -1
- package/dist/components/content/icon/icon.d.ts +2 -2
- package/dist/components/content/icon/icon.d.ts.map +1 -1
- package/dist/components/content/icon/icon.js +3 -3
- package/dist/components/content/icon/icon.js.map +1 -1
- package/dist/components/content/icon/icon.styles.d.ts.map +1 -1
- package/dist/components/content/icon/icon.styles.js +8 -2
- package/dist/components/content/icon/icon.styles.js.map +1 -1
- package/dist/components/content/rich-text/rich-text.d.ts +7 -6
- package/dist/components/content/rich-text/rich-text.d.ts.map +1 -1
- package/dist/components/content/rich-text/rich-text.js +8 -7
- package/dist/components/content/rich-text/rich-text.js.map +1 -1
- package/dist/components/content/text/text.d.ts +2 -2
- package/dist/components/content/text/text.js +3 -3
- package/dist/components/content/title/title.d.ts +5 -5
- package/dist/components/content/title/title.d.ts.map +1 -1
- package/dist/components/content/title/title.js +6 -6
- package/dist/components/content/title/title.js.map +1 -1
- package/dist/components/content/tooltip/tooltip.d.ts +2 -2
- package/dist/components/content/tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/content/tooltip/tooltip.js +4 -4
- package/dist/components/content/tooltip/tooltip.js.map +1 -1
- package/dist/components/{dist-C09E9-dJ.js → dist-B_Mnmrj4.js} +1 -1
- package/dist/components/{dist-CjaG8dOI.js → dist-ByH8hQze.js} +2 -2
- package/dist/components/{dist-BB7TxeMK.js → dist-CRwuSgMM.js} +2 -2
- package/dist/components/{dist-la_b3ZSq.js → dist-CSrO_mYe.js} +1 -1
- package/dist/components/{dist-762GHPyH.js → dist-CX3DK4i7.js} +3 -3
- package/dist/components/{dist-DZoFKUO-.js → dist-CbCO0WCd.js} +1 -1
- package/dist/components/{dist-B_3OW7pC.js → dist-CgDuh26K.js} +1 -1
- package/dist/components/{dist-DaavuU6W.js → dist-DXZ-cFAl.js} +2 -2
- package/dist/components/{dist-CRsR6ckU.js → dist-LX8LuMac.js} +1 -1
- package/dist/components/{dist-BJI4-6iQ.js → dist-eVFegyjM.js} +1 -1
- package/dist/components/{dist-C6gnorjP.js → dist-fIxe0l7k.js} +9 -1
- package/dist/components/{icon-Cd4BloIM.js → icon-C_zwJZ_g.js} +14 -4
- package/dist/components/{icon-button-CXN0yaVx.js → icon-button-CEz4MB9H.js} +10 -10
- package/dist/components/inputs/code-editor/code-editor.styles.js +2 -2
- package/dist/components/inputs/text-editor/text-editor.annotation-sentinels.d.ts +3 -5
- package/dist/components/inputs/text-editor/text-editor.annotation-sentinels.d.ts.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.annotation-sentinels.js +30 -44
- package/dist/components/inputs/text-editor/text-editor.annotation-sentinels.js.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.annotations.d.ts.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.annotations.js +31 -5
- package/dist/components/inputs/text-editor/text-editor.annotations.js.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.commands.d.ts +14 -2
- package/dist/components/inputs/text-editor/text-editor.commands.d.ts.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.commands.js +115 -36
- package/dist/components/inputs/text-editor/text-editor.commands.js.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.cursor.d.ts +7 -0
- package/dist/components/inputs/text-editor/text-editor.cursor.d.ts.map +1 -0
- package/dist/components/inputs/text-editor/text-editor.cursor.js +207 -0
- package/dist/components/inputs/text-editor/text-editor.cursor.js.map +1 -0
- package/dist/components/inputs/text-editor/text-editor.d.ts +65 -13
- package/dist/components/inputs/text-editor/text-editor.d.ts.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.emphasis.d.ts +32 -0
- package/dist/components/inputs/text-editor/text-editor.emphasis.d.ts.map +1 -0
- package/dist/components/inputs/text-editor/text-editor.emphasis.js +229 -0
- package/dist/components/inputs/text-editor/text-editor.emphasis.js.map +1 -0
- package/dist/components/inputs/text-editor/text-editor.js +177 -18
- package/dist/components/inputs/text-editor/text-editor.js.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.links.d.ts +8 -0
- package/dist/components/inputs/text-editor/text-editor.links.d.ts.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.links.js +30 -4
- package/dist/components/inputs/text-editor/text-editor.links.js.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.markdown.d.ts.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.markdown.js +52 -18
- package/dist/components/inputs/text-editor/text-editor.markdown.js.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.mentions.d.ts +78 -11
- package/dist/components/inputs/text-editor/text-editor.mentions.d.ts.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.mentions.js +190 -41
- package/dist/components/inputs/text-editor/text-editor.mentions.js.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.ordered-list.d.ts +0 -2
- package/dist/components/inputs/text-editor/text-editor.ordered-list.d.ts.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.ordered-list.js +21 -1
- package/dist/components/inputs/text-editor/text-editor.ordered-list.js.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.styles.d.ts.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.styles.js +11 -10
- package/dist/components/inputs/text-editor/text-editor.styles.js.map +1 -1
- package/dist/components/inputs/text-editor/text-editor.syntax.d.ts +9 -0
- package/dist/components/inputs/text-editor/text-editor.syntax.d.ts.map +1 -0
- package/dist/components/inputs/text-editor/text-editor.syntax.js +20 -0
- package/dist/components/inputs/text-editor/text-editor.syntax.js.map +1 -0
- package/dist/components/layout/page/page.d.ts +23 -5
- package/dist/components/layout/page/page.d.ts.map +1 -1
- package/dist/components/layout/page/page.js +39 -34
- package/dist/components/layout/page/page.js.map +1 -1
- package/dist/components/layout/page/page.styles.d.ts.map +1 -1
- package/dist/components/layout/page/page.styles.js +2 -0
- package/dist/components/layout/page/page.styles.js.map +1 -1
- package/dist/components/layout/page-sections/page-section-controls.d.ts +0 -70
- package/dist/components/layout/page-sections/page-section-controls.d.ts.map +1 -1
- package/dist/components/layout/page-sections/page-section-controls.js +0 -3
- package/dist/components/layout/page-sections/page-section-controls.js.map +1 -1
- package/dist/components/layout/sheet/sheet.d.ts +3 -7
- package/dist/components/layout/sheet/sheet.d.ts.map +1 -1
- package/dist/components/layout/sheet/sheet.js +4 -18
- package/dist/components/layout/sheet/sheet.js.map +1 -1
- package/dist/components/layout/sheet/sheet.styles.d.ts.map +1 -1
- package/dist/components/layout/sheet/sheet.styles.js +0 -4
- package/dist/components/layout/sheet/sheet.styles.js.map +1 -1
- package/dist/components/layout/sheet/sheet.template.d.ts.map +1 -1
- package/dist/components/layout/sheet/sheet.template.js +5 -2
- package/dist/components/layout/sheet/sheet.template.js.map +1 -1
- package/dist/components/layout/window/window.d.ts +2 -4
- package/dist/components/layout/window/window.d.ts.map +1 -1
- package/dist/components/layout/window/window.js +4 -14
- package/dist/components/layout/window/window.js.map +1 -1
- package/dist/components/layout/window/window.template.d.ts.map +1 -1
- package/dist/components/layout/window/window.template.js +5 -2
- package/dist/components/layout/window/window.template.js.map +1 -1
- package/dist/components/lists-and-tables/cells/icon-cell/icon-cell.d.ts +2 -2
- package/dist/components/lists-and-tables/cells/icon-cell/icon-cell.js +3 -3
- package/dist/components/lists-and-tables/cells/text-cell/text-cell.d.ts +2 -2
- package/dist/components/lists-and-tables/cells/text-cell/text-cell.js +3 -3
- package/dist/components/lists-and-tables/cells/title-cell/title-cell.d.ts +2 -2
- package/dist/components/lists-and-tables/cells/title-cell/title-cell.js +3 -3
- package/dist/components/lists-and-tables/list/list.d.ts +4 -2
- package/dist/components/lists-and-tables/list/list.d.ts.map +1 -1
- package/dist/components/lists-and-tables/list/list.js +23 -5
- package/dist/components/lists-and-tables/list/list.js.map +1 -1
- package/dist/components/navigation/document-tab-bar/document-tab-bar.template.js +1 -1
- package/dist/components/navigation/document-tab-bar/document-tab-bar.template.js.map +1 -1
- package/dist/components/navigation/link/link.d.ts +2 -2
- package/dist/components/navigation/link/link.d.ts.map +1 -1
- package/dist/components/navigation/link/link.js +3 -2
- package/dist/components/navigation/link/link.js.map +1 -1
- package/dist/components/navigation/menu-bar/menu-bar.d.ts +4 -2
- package/dist/components/navigation/menu-bar/menu-bar.d.ts.map +1 -1
- package/dist/components/navigation/menu-bar/menu-bar.js +4 -2
- package/dist/components/navigation/menu-bar/menu-bar.js.map +1 -1
- package/dist/components/status-and-feedback/activity-indicator/activity-indicator.d.ts +3 -3
- package/dist/components/status-and-feedback/activity-indicator/activity-indicator.d.ts.map +1 -1
- package/dist/components/status-and-feedback/activity-indicator/activity-indicator.js +4 -4
- package/dist/components/status-and-feedback/activity-indicator/activity-indicator.js.map +1 -1
- package/dist/components/status-and-feedback/inline-dialog/inline-dialog.d.ts +8 -0
- package/dist/components/status-and-feedback/inline-dialog/inline-dialog.d.ts.map +1 -1
- package/dist/components/status-and-feedback/inline-dialog/inline-dialog.js +14 -0
- package/dist/components/status-and-feedback/inline-dialog/inline-dialog.js.map +1 -1
- package/dist/components/status-and-feedback/inline-dialog/inline-dialog.styles.d.ts.map +1 -1
- package/dist/components/status-and-feedback/inline-dialog/inline-dialog.styles.js +22 -1
- package/dist/components/status-and-feedback/inline-dialog/inline-dialog.styles.js.map +1 -1
- package/dist/components/status-and-feedback/inline-dialog/inline-dialog.template.d.ts.map +1 -1
- package/dist/components/status-and-feedback/inline-dialog/inline-dialog.template.js +6 -2
- package/dist/components/status-and-feedback/inline-dialog/inline-dialog.template.js.map +1 -1
- package/dist/components/status-and-feedback/modal-dialog/modal-dialog.d.ts +3 -1
- package/dist/components/status-and-feedback/modal-dialog/modal-dialog.d.ts.map +1 -1
- package/dist/components/status-and-feedback/modal-dialog/modal-dialog.js +5 -0
- package/dist/components/status-and-feedback/modal-dialog/modal-dialog.js.map +1 -1
- package/dist/components/status-and-feedback/modal-dialog/modal-dialog.template.d.ts.map +1 -1
- package/dist/components/status-and-feedback/modal-dialog/modal-dialog.template.js +4 -0
- package/dist/components/status-and-feedback/modal-dialog/modal-dialog.template.js.map +1 -1
- package/dist/components/status-and-feedback/notification/notification-region.d.ts.map +1 -1
- package/dist/components/status-and-feedback/notification/notification-region.js +74 -1
- package/dist/components/status-and-feedback/notification/notification-region.js.map +1 -1
- package/dist/components/status-and-feedback/notification/notification.d.ts +11 -0
- package/dist/components/status-and-feedback/notification/notification.d.ts.map +1 -1
- package/dist/components/status-and-feedback/notification/notification.js +13 -0
- package/dist/components/status-and-feedback/notification/notification.js.map +1 -1
- package/dist/favicon.svg +8 -2
- package/dist/nldd.min.js +536 -496
- package/dist/types/vue.d.ts +33 -25
- package/package.json +1 -1
|
@@ -1,6 +1,57 @@
|
|
|
1
1
|
import { autocompletion, completionStatus, startCompletion, } from '@codemirror/autocomplete';
|
|
2
2
|
import { EditorView } from '@codemirror/view';
|
|
3
|
-
|
|
3
|
+
import { enclosingNamed } from './text-editor.syntax.js';
|
|
4
|
+
import '../../content/avatar/avatar.js';
|
|
5
|
+
import '../../content/icon/icon.js';
|
|
6
|
+
/* Typeaheads: a trigger character opens a list of candidates the consumer
|
|
7
|
+
* supplies, and choosing one writes something in place of the trigger and the
|
|
8
|
+
* query. The editor is headless and knows no users, channels or emoji; it owns
|
|
9
|
+
* the interaction (the popup, the keys, the accessibility) and the consumer
|
|
10
|
+
* owns the data and, if it wants, what gets inserted (#200, #204).
|
|
11
|
+
*
|
|
12
|
+
* The @-mention is the built-in one: it inserts a markdown-compatible token
|
|
13
|
+
* that degrades to a plain link outside the editor, and the token rendering
|
|
14
|
+
* lives in the markdown decoration layer. */
|
|
15
|
+
/** The query being typed: a trigger at the start of the line or after
|
|
16
|
+
* whitespace, followed by name characters, up to the caret. Anchored that way
|
|
17
|
+
* so a trigger inside a word (an e-mail address, `piet@sam`) stays a plain
|
|
18
|
+
* character. The name class is ASCII for now; widening it changes what a
|
|
19
|
+
* source receives and is its own change. */
|
|
20
|
+
const queryPatterns = new Map();
|
|
21
|
+
function queryPattern(triggers) {
|
|
22
|
+
const chars = Array.from(new Set(triggers.filter((t) => t.length === 1 && !/[\s\w]/.test(t)))).sort().join('');
|
|
23
|
+
if (!chars)
|
|
24
|
+
return null;
|
|
25
|
+
let pattern = queryPatterns.get(chars);
|
|
26
|
+
if (!pattern) {
|
|
27
|
+
pattern = new RegExp(`(^|\\s)([${chars.replace(/[\\\]^-]/g, '\\$&')}])([\\w.-]*)$`);
|
|
28
|
+
queryPatterns.set(chars, pattern);
|
|
29
|
+
}
|
|
30
|
+
return pattern;
|
|
31
|
+
}
|
|
32
|
+
/** Code is quoted verbatim, so a trigger in a fenced block, an indented block
|
|
33
|
+
* or a backtick span is not a typeahead and must not open the list. */
|
|
34
|
+
const CODE_NODES = new Set(['FencedCode', 'CodeBlock', 'InlineCode']);
|
|
35
|
+
function inCode(state, pos) {
|
|
36
|
+
return enclosingNamed(state, pos, 1, CODE_NODES) !== null;
|
|
37
|
+
}
|
|
38
|
+
/** The typeahead query at `pos` for one of `triggers`, or null when the text
|
|
39
|
+
* before the caret is not one. `from` is the trigger, `query` the typed text
|
|
40
|
+
* without it. Both the completion source and the reopen-on-delete path go
|
|
41
|
+
* through this, so they cannot disagree about what counts as a query. */
|
|
42
|
+
export function typeaheadQueryAt(state, pos, triggers) {
|
|
43
|
+
const pattern = queryPattern(triggers);
|
|
44
|
+
if (!pattern)
|
|
45
|
+
return null;
|
|
46
|
+
const line = state.doc.lineAt(pos);
|
|
47
|
+
const match = pattern.exec(state.sliceDoc(line.from, pos));
|
|
48
|
+
if (!match)
|
|
49
|
+
return null;
|
|
50
|
+
const from = line.from + match.index + match[1].length;
|
|
51
|
+
if (inCode(state, from))
|
|
52
|
+
return null;
|
|
53
|
+
return { from, to: pos, query: match[3], trigger: match[2] };
|
|
54
|
+
}
|
|
4
55
|
/** Href prefix that marks a markdown link as a mention. */
|
|
5
56
|
export const MENTION_HREF_PREFIX = 'user:';
|
|
6
57
|
/** The markdown-compatible token stored for a mention (degrades to a plain link).
|
|
@@ -10,13 +61,17 @@ export const MENTION_HREF_PREFIX = 'user:';
|
|
|
10
61
|
* `]` or `)` would otherwise start a second, attacker-shaped link. The render
|
|
11
62
|
* layer reverses both via `unescapeMentionLabel` / `decodeMentionId`. */
|
|
12
63
|
export function mentionToken(candidate) {
|
|
13
|
-
const label = candidate.
|
|
64
|
+
const label = candidate.text.replace(/[[\]\\]/g, (c) => '\\' + c);
|
|
14
65
|
// encodeURIComponent leaves ( ) < > ! * ' . - _ ~ intact, but ")" closes a
|
|
15
66
|
// markdown link destination — encode the parens and angle brackets on top of it
|
|
16
67
|
// (decodeURIComponent reverses all of it).
|
|
17
68
|
const id = encodeURIComponent(candidate.id).replace(/[()<>]/g, (c) => '%' + c.charCodeAt(0).toString(16).toUpperCase());
|
|
18
69
|
return `[@${label}](${MENTION_HREF_PREFIX}${id})`;
|
|
19
70
|
}
|
|
71
|
+
/** What the built-in mention writes: the token and a space to go on typing. */
|
|
72
|
+
export function mentionInsert(candidate) {
|
|
73
|
+
return `${mentionToken(candidate)} `;
|
|
74
|
+
}
|
|
20
75
|
/** Reverse `mentionToken`'s label escaping for display. */
|
|
21
76
|
export function unescapeMentionLabel(label) {
|
|
22
77
|
return label.replace(/\\([[\]\\])/g, '$1');
|
|
@@ -31,33 +86,84 @@ export function decodeMentionId(id) {
|
|
|
31
86
|
return id;
|
|
32
87
|
}
|
|
33
88
|
}
|
|
34
|
-
function
|
|
89
|
+
function defaultInsert(trigger) {
|
|
90
|
+
return (candidate) => `${trigger}${candidate.text} `;
|
|
91
|
+
}
|
|
92
|
+
/** The avatar, icon or symbol in front of a row, or nothing. A decorative
|
|
93
|
+
* avatar: the name stands beside it as the row's text. The icon is the size of
|
|
94
|
+
* a menu item's, and the symbol takes the same box, so a list that mixes them
|
|
95
|
+
* lines up. */
|
|
96
|
+
function renderLead(completion) {
|
|
97
|
+
const { candidate } = completion;
|
|
98
|
+
if (candidate.avatar) {
|
|
99
|
+
const avatar = document.createElement('nldd-avatar');
|
|
100
|
+
avatar.setAttribute('name', candidate.text);
|
|
101
|
+
avatar.setAttribute('size', '32');
|
|
102
|
+
avatar.setAttribute('decorative', '');
|
|
103
|
+
if (candidate.avatar.src)
|
|
104
|
+
avatar.setAttribute('src', candidate.avatar.src);
|
|
105
|
+
if (candidate.avatar.type)
|
|
106
|
+
avatar.setAttribute('type', candidate.avatar.type);
|
|
107
|
+
return avatar;
|
|
108
|
+
}
|
|
109
|
+
if (candidate.icon) {
|
|
110
|
+
const icon = document.createElement('nldd-icon');
|
|
111
|
+
icon.setAttribute('name', candidate.icon);
|
|
112
|
+
icon.setAttribute('size', '20');
|
|
113
|
+
icon.setAttribute('aria-hidden', 'true');
|
|
114
|
+
return icon;
|
|
115
|
+
}
|
|
116
|
+
if (candidate.symbol) {
|
|
117
|
+
const symbol = document.createElement('span');
|
|
118
|
+
symbol.className = 'cm-nldd-symbol';
|
|
119
|
+
symbol.textContent = candidate.symbol;
|
|
120
|
+
symbol.setAttribute('aria-hidden', 'true');
|
|
121
|
+
return symbol;
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
/** A row with an avatar takes two lines: the text above, the supporting text
|
|
126
|
+
* under it, like a title cell. */
|
|
127
|
+
function rowClass(completion) {
|
|
128
|
+
return completion.candidate.avatar ? 'cm-nldd-row-avatar' : '';
|
|
129
|
+
}
|
|
130
|
+
function completionSource(getTypeaheads, onChoose) {
|
|
35
131
|
return async (context) => {
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const source = getSource();
|
|
40
|
-
if (!source)
|
|
132
|
+
const lists = getTypeaheads();
|
|
133
|
+
const match = typeaheadQueryAt(context.state, context.pos, lists.map((t) => t.trigger));
|
|
134
|
+
if (!match)
|
|
41
135
|
return null;
|
|
42
|
-
|
|
43
|
-
|
|
136
|
+
// Every list on this trigger contributes, in the order they were given.
|
|
137
|
+
const onTrigger = lists.filter((t) => t.trigger === match.trigger);
|
|
138
|
+
const results = await Promise.all(onTrigger.map((t) => t.source(match.query)));
|
|
139
|
+
const options = [];
|
|
140
|
+
results.forEach((candidates, index) => {
|
|
141
|
+
const typeahead = onTrigger[index];
|
|
142
|
+
const insert = typeahead.insert ?? defaultInsert(match.trigger);
|
|
143
|
+
for (const candidate of candidates ?? []) {
|
|
144
|
+
options.push({
|
|
145
|
+
label: `${match.trigger}${candidate.text}`,
|
|
146
|
+
detail: candidate.supportingText,
|
|
147
|
+
candidate,
|
|
148
|
+
apply: (view, _completion, from, to) => {
|
|
149
|
+
const text = insert(candidate);
|
|
150
|
+
view.dispatch({
|
|
151
|
+
changes: { from, to, insert: text },
|
|
152
|
+
selection: { anchor: from + text.length },
|
|
153
|
+
userEvent: 'input.complete',
|
|
154
|
+
});
|
|
155
|
+
onChoose({ typeahead, trigger: match.trigger, candidate, from, to: from + text.length });
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
if (!options.length)
|
|
44
161
|
return null;
|
|
45
162
|
return {
|
|
46
163
|
from: match.from,
|
|
47
|
-
// The
|
|
164
|
+
// The sources already filtered against the query.
|
|
48
165
|
filter: false,
|
|
49
|
-
options
|
|
50
|
-
label: `@${candidate.label}`,
|
|
51
|
-
detail: candidate.detail,
|
|
52
|
-
apply: (view, _completion, from, to) => {
|
|
53
|
-
const token = mentionToken(candidate);
|
|
54
|
-
view.dispatch({
|
|
55
|
-
changes: { from, to, insert: `${token} ` },
|
|
56
|
-
selection: { anchor: from + token.length + 1 },
|
|
57
|
-
});
|
|
58
|
-
onInsert({ id: candidate.id, label: candidate.label, from, to: from + token.length });
|
|
59
|
-
},
|
|
60
|
-
})),
|
|
166
|
+
options,
|
|
61
167
|
};
|
|
62
168
|
};
|
|
63
169
|
}
|
|
@@ -76,6 +182,10 @@ const popupTheme = EditorView.theme({
|
|
|
76
182
|
fontFamily: 'var(--primitives-font-family-body)',
|
|
77
183
|
// Match the editor body (and the inserted token), not a smaller popup size.
|
|
78
184
|
fontSize: 'var(--primitives-font-size-100)',
|
|
185
|
+
// The minimum of nldd-menu, so a short list of names is not a narrow strip
|
|
186
|
+
// that changes width as you type.
|
|
187
|
+
minWidth: 'var(--primitives-area-280)',
|
|
188
|
+
boxSizing: 'border-box',
|
|
79
189
|
maxHeight: '14em',
|
|
80
190
|
// A small inset around the items, like nldd-menu.
|
|
81
191
|
margin: '0',
|
|
@@ -96,6 +206,40 @@ const popupTheme = EditorView.theme({
|
|
|
96
206
|
color: 'var(--semantics-content-color)',
|
|
97
207
|
cursor: 'default',
|
|
98
208
|
},
|
|
209
|
+
'.cm-tooltip.cm-tooltip-autocomplete > ul > li > :is(nldd-avatar, nldd-icon, .cm-nldd-symbol)': {
|
|
210
|
+
flex: 'none',
|
|
211
|
+
},
|
|
212
|
+
// The symbol takes the icon's box, so a list that mixes them lines up.
|
|
213
|
+
'.cm-nldd-symbol': {
|
|
214
|
+
display: 'inline-flex',
|
|
215
|
+
justifyContent: 'center',
|
|
216
|
+
inlineSize: '20px',
|
|
217
|
+
},
|
|
218
|
+
// Two lines next to the avatar: the text, and the supporting text under it.
|
|
219
|
+
// The avatar spans both and sits centered on them.
|
|
220
|
+
'.cm-tooltip.cm-tooltip-autocomplete > ul > li.cm-nldd-row-avatar': {
|
|
221
|
+
display: 'grid',
|
|
222
|
+
gridTemplateColumns: 'auto minmax(0, 1fr)',
|
|
223
|
+
alignContent: 'center',
|
|
224
|
+
// The row's gap is for the columns; the two lines sit right on each other.
|
|
225
|
+
rowGap: '0',
|
|
226
|
+
minHeight: 'var(--semantics-controls-md-min-size)',
|
|
227
|
+
},
|
|
228
|
+
'.cm-tooltip.cm-tooltip-autocomplete > ul > li.cm-nldd-row-avatar > nldd-avatar': {
|
|
229
|
+
gridRow: 'span 2',
|
|
230
|
+
alignSelf: 'center',
|
|
231
|
+
},
|
|
232
|
+
// Tight line heights on both lines, like a title cell: with the editor's own
|
|
233
|
+
// loose line height the row grows well past a list row.
|
|
234
|
+
'.cm-tooltip.cm-tooltip-autocomplete > ul > li.cm-nldd-row-avatar > .cm-completionLabel': {
|
|
235
|
+
gridColumn: '2',
|
|
236
|
+
font: 'var(--primitives-font-body-md-regular-tight)',
|
|
237
|
+
},
|
|
238
|
+
'.cm-tooltip.cm-tooltip-autocomplete > ul > li.cm-nldd-row-avatar > .cm-completionDetail': {
|
|
239
|
+
gridColumn: '2',
|
|
240
|
+
marginLeft: '0',
|
|
241
|
+
font: 'var(--primitives-font-body-sm-regular-tight)',
|
|
242
|
+
},
|
|
99
243
|
'.cm-tooltip.cm-tooltip-autocomplete > ul > li[aria-selected]': {
|
|
100
244
|
backgroundColor: 'var(--components-menu-item-is-highlighted-background-color)',
|
|
101
245
|
color: 'var(--components-menu-item-is-highlighted-content-color)',
|
|
@@ -126,26 +270,31 @@ const popupTheme = EditorView.theme({
|
|
|
126
270
|
},
|
|
127
271
|
});
|
|
128
272
|
/**
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
* `
|
|
273
|
+
* The typeaheads. `getTypeaheads` is read on every keystroke, so the editor can
|
|
274
|
+
* hand over its current lists; choosing a candidate writes what the list's
|
|
275
|
+
* `insert` says and calls `onChoose`. Without lists it is inert.
|
|
132
276
|
*/
|
|
133
|
-
|
|
134
|
-
//
|
|
135
|
-
//
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
});
|
|
146
|
-
export function mentions(getSource, onInsert) {
|
|
277
|
+
export function typeaheads(getTypeaheads, onChoose) {
|
|
278
|
+
// CodeMirror only opens completion while typing, not on deletion. When a
|
|
279
|
+
// backspace brings the query back into a matching state ("@anb" → "@an"),
|
|
280
|
+
// re-open the popup right away instead of waiting for the next character.
|
|
281
|
+
const reopenOnDelete = EditorView.updateListener.of((update) => {
|
|
282
|
+
if (!update.docChanged || completionStatus(update.state) !== null)
|
|
283
|
+
return;
|
|
284
|
+
if (!update.transactions.some((tr) => tr.isUserEvent('delete')))
|
|
285
|
+
return;
|
|
286
|
+
const triggers = getTypeaheads().map((t) => t.trigger);
|
|
287
|
+
if (typeaheadQueryAt(update.state, update.state.selection.main.head, triggers))
|
|
288
|
+
startCompletion(update.view);
|
|
289
|
+
});
|
|
147
290
|
return [
|
|
148
|
-
autocompletion({
|
|
291
|
+
autocompletion({
|
|
292
|
+
override: [completionSource(getTypeaheads, onChoose)],
|
|
293
|
+
icons: false,
|
|
294
|
+
// Before the row's text (50): its avatar, icon or symbol.
|
|
295
|
+
addToOptions: [{ position: 20, render: renderLead }],
|
|
296
|
+
optionClass: rowClass,
|
|
297
|
+
}),
|
|
149
298
|
reopenOnDelete,
|
|
150
299
|
popupTheme,
|
|
151
300
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-editor.mentions.js","sourceRoot":"","sources":["../../../../src/components/inputs/text-editor/text-editor.mentions.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,cAAc,EACd,gBAAgB,EAChB,eAAe,GAIf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"text-editor.mentions.js","sourceRoot":"","sources":["../../../../src/components/inputs/text-editor/text-editor.mentions.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,5 @@ export interface RenumberChange {
|
|
|
6
6
|
/** Minimal digit-only changes that renumber every ordered list in `doc` so its
|
|
7
7
|
* items run in sequence. Empty when everything is already in order. */
|
|
8
8
|
export declare function renumberOrderedLists(doc: string): RenumberChange[];
|
|
9
|
-
/** Renumbers ordered lists in the same transaction as the edit that disturbed them,
|
|
10
|
-
* so it's one atomic (single-undo) step and the caret/selection maps through it. */
|
|
11
9
|
export declare const orderedListRenumber: import("@codemirror/state").Extension;
|
|
12
10
|
//# sourceMappingURL=text-editor.ordered-list.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-editor.ordered-list.d.ts","sourceRoot":"","sources":["../../../../src/components/inputs/text-editor/text-editor.ordered-list.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CACf;AAED;wEACwE;AACxE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,EAAE,CAoElE;
|
|
1
|
+
{"version":3,"file":"text-editor.ordered-list.d.ts","sourceRoot":"","sources":["../../../../src/components/inputs/text-editor/text-editor.ordered-list.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CACf;AAED;wEACwE;AACxE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,EAAE,CAoElE;AAuBD,eAAO,MAAM,mBAAmB,uCAK9B,CAAC"}
|
|
@@ -95,8 +95,28 @@ export function renumberOrderedLists(doc) {
|
|
|
95
95
|
}
|
|
96
96
|
/** Renumbers ordered lists in the same transaction as the edit that disturbed them,
|
|
97
97
|
* so it's one atomic (single-undo) step and the caret/selection maps through it. */
|
|
98
|
+
/** Whether this change can have disturbed any numbering. It can when it adds or
|
|
99
|
+
* removes a line break, or when a line it touches is (or was) an ordered item.
|
|
100
|
+
* Typing inside a paragraph cannot, and that is the common case: without this
|
|
101
|
+
* test every keystroke read the whole document out and walked every line. */
|
|
102
|
+
function mayRenumber(tr) {
|
|
103
|
+
let may = false;
|
|
104
|
+
tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {
|
|
105
|
+
if (may)
|
|
106
|
+
return;
|
|
107
|
+
const before = tr.startState.doc;
|
|
108
|
+
if (inserted.lines > 1 || before.lineAt(fromA).number !== before.lineAt(toA).number) {
|
|
109
|
+
may = true; // a line break came or went, so items may have moved between lists
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const ordered = (text) => ORDERED_RE.test(text.slice(BQ_PREFIX_RE.exec(text)[0].length));
|
|
113
|
+
if (ordered(before.lineAt(fromA).text) || ordered(tr.newDoc.lineAt(fromB).text) || ordered(tr.newDoc.lineAt(toB).text))
|
|
114
|
+
may = true;
|
|
115
|
+
});
|
|
116
|
+
return may;
|
|
117
|
+
}
|
|
98
118
|
export const orderedListRenumber = EditorState.transactionFilter.of((tr) => {
|
|
99
|
-
if (!tr.docChanged)
|
|
119
|
+
if (!tr.docChanged || !mayRenumber(tr))
|
|
100
120
|
return tr;
|
|
101
121
|
const changes = renumberOrderedLists(tr.newDoc.toString());
|
|
102
122
|
if (changes.length === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-editor.ordered-list.js","sourceRoot":"","sources":["../../../../src/components/inputs/text-editor/text-editor.ordered-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"text-editor.ordered-list.js","sourceRoot":"","sources":["../../../../src/components/inputs/text-editor/text-editor.ordered-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAC;AAElE;;;;;;;;;;;;+DAY+D;AAE/D,mFAAmF;AACnF,mFAAmF;AACnF,qFAAqF;AACrF,8DAA8D;AAC9D,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAC7C,sFAAsF;AACtF,sFAAsF;AACtF,sEAAsE;AACtE,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAC3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC;AACnC,kFAAkF;AAClF,uFAAuF;AACvF,MAAM,OAAO,GAAG,IAAI,CAAC;AAQrB;wEACwE;AACxE,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC/C,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,oFAAoF;IACpF,mFAAmF;IACnF,kFAAkF;IAClF,MAAM,MAAM,GAAuC,EAAE,CAAC;IACtD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,yDAAyD;IAEzE,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,MAAM,CAAC;QACzB,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,YAAY;QAEvC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,GAAG,CAAC,OAAO,CAAC;YACnB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,oCAAoC;YACvD,MAAM,GAAG,CAAC,CAAC;YACX,SAAS;QACV,CAAC;QACD,IAAI,OAAO;YAAE,SAAS;QAEtB,iFAAiF;QACjF,mFAAmF;QACnF,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAEpD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,4EAA4E;YAC5E,+EAA+E;YAC/E,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC3B,IAAI,EAAE,MAAM,IAAI,CAAC;oBAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBACrC,SAAS;YACV,CAAC;YACD,MAAM,GAAG,CAAC,CAAC;YACX,yEAAyE;YACzE,MAAM,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACnE,OAAO,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM;gBAAE,MAAM,CAAC,GAAG,EAAE,CAAC;YACjF,SAAS;QACV,CAAC;QAED,MAAM,GAAG,CAAC,CAAC;QACX,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,aAAa,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM;YAAE,MAAM,CAAC,GAAG,EAAE,CAAC;QAEhF,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,MAAc,CAAC;QACnB,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC;YAClB,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;QACf,CAAC;aAAM,CAAC;YACP,iEAAiE;YACjE,MAAM,GAAG,CAAC,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,aAAa,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAClF,CAAC;IACF,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;qFACqF;AACrF;;;8EAG8E;AAC9E,SAAS,WAAW,CAAC,EAAe;IACnC,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;QAC3D,IAAI,GAAG;YAAE,OAAO;QAChB,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QACjC,IAAI,QAAQ,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YACrF,GAAG,GAAG,IAAI,CAAC,CAAC,mEAAmE;YAC/E,OAAO;QACR,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3G,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YAAE,GAAG,GAAG,IAAI,CAAC;IACpI,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE;IAC1E,IAAI,CAAC,EAAE,CAAC,UAAU,IAAI,CAAC,WAAW,CAAC,EAAiB,CAAC;QAAE,OAAO,EAAE,CAAC;IACjE,MAAM,OAAO,GAAG,oBAAoB,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-editor.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/inputs/text-editor/text-editor.styles.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"text-editor.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/inputs/text-editor/text-editor.styles.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,yBAglB5B,CAAC"}
|
|
@@ -6,13 +6,16 @@ export const textEditorStyles = css `
|
|
|
6
6
|
/* # Host */
|
|
7
7
|
|
|
8
8
|
:host {
|
|
9
|
-
--
|
|
9
|
+
--_caret-width: var(--primitives-border-width-regular);
|
|
10
|
+
--_caret-ring-width: var(--primitives-border-width-thin);
|
|
10
11
|
--_corner-radius: 0;
|
|
11
12
|
--_background-color: transparent;
|
|
12
13
|
--_highlight-border-color: transparent;
|
|
13
14
|
--_highlight-border-shadow: none;
|
|
14
15
|
--_padding-block: 0px;
|
|
15
|
-
|
|
16
|
+
/* Room for the caret's own ink at the first and last position of a line:
|
|
17
|
+
its width plus its ring. Without it the edge carets are clipped. */
|
|
18
|
+
--_padding-inline: calc(var(--_caret-width) + var(--_caret-ring-width));
|
|
16
19
|
--_content-color: var(--semantics-content-color);
|
|
17
20
|
--_text-font: var(--primitives-font-body-md-regular-snug);
|
|
18
21
|
--_code-font: var(--primitives-font-monospace-md-regular-snug);
|
|
@@ -149,16 +152,14 @@ export const textEditorStyles = css `
|
|
|
149
152
|
surfaces in light and dark (accent-600 fell just short on white), so the
|
|
150
153
|
caret stays clearly visible without washing out. */
|
|
151
154
|
border-left-color: var(--primitives-color-accent-700);
|
|
152
|
-
border-left-width: var(--
|
|
153
|
-
/*
|
|
155
|
+
border-left-width: var(--_caret-width);
|
|
156
|
+
/* CodeMirror centers its own 1.2px caret with a -0.6px margin. Ours is wider,
|
|
157
|
+
so recenter it on the insertion point from its own width. */
|
|
158
|
+
margin-left: calc(var(--_caret-width) / -2);
|
|
159
|
+
/* A thin surface-colored ring, like the drop cursor, so the caret stays legible
|
|
154
160
|
even over a tinted token (annotation, inline code) where the accent alone can
|
|
155
161
|
blend in. Blinks with the caret (opacity covers the shadow too). */
|
|
156
|
-
box-shadow: 0 0 0 var(--
|
|
157
|
-
/* CodeMirror draws the caret ~0.6px left of the text position. At a line start
|
|
158
|
-
with no inline padding (the simple variant) that overhangs the scroller's
|
|
159
|
-
overflow edge, so the left of the 2px gets clipped and the caret looks thinner
|
|
160
|
-
there than mid-line. Nudge it right so the full width stays inside the content. */
|
|
161
|
-
transform: translateX(0.6px);
|
|
162
|
+
box-shadow: 0 0 0 var(--_caret-ring-width) var(--semantics-surfaces-base-background-color);
|
|
162
163
|
}
|
|
163
164
|
|
|
164
165
|
:host .cm-scroller {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-editor.styles.js","sourceRoot":"","sources":["../../../../src/components/inputs/text-editor/text-editor.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"text-editor.styles.js","sourceRoot":"","sources":["../../../../src/components/inputs/text-editor/text-editor.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAsE/B,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0gBrB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EditorState } from '@codemirror/state';
|
|
2
|
+
import type { SyntaxNode } from '@lezer/common';
|
|
3
|
+
/** The innermost node at `pos` that `match` accepts, looking outward from there.
|
|
4
|
+
* `side` decides which node a position between two of them belongs to: -1 the
|
|
5
|
+
* one that ends there, 1 the one that starts there. Null when none matches. */
|
|
6
|
+
export declare function enclosingNode(state: EditorState, pos: number, side: -1 | 0 | 1, match: (node: SyntaxNode) => boolean): SyntaxNode | null;
|
|
7
|
+
/** `enclosingNode` for the common case: a node that goes by one of these names. */
|
|
8
|
+
export declare function enclosingNamed(state: EditorState, pos: number, side: -1 | 0 | 1, names: string | ReadonlySet<string>): SyntaxNode | null;
|
|
9
|
+
//# sourceMappingURL=text-editor.syntax.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-editor.syntax.d.ts","sourceRoot":"","sources":["../../../../src/components/inputs/text-editor/text-editor.syntax.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAOhD;;gFAEgF;AAChF,wBAAgB,aAAa,CAC5B,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAChB,KAAK,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,GAClC,UAAU,GAAG,IAAI,CAKnB;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAC7B,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAChB,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,GACjC,UAAU,GAAG,IAAI,CAEnB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { syntaxTree } from '@codemirror/language';
|
|
2
|
+
/* One question the editor asks the markdown tree everywhere: what is the caret
|
|
3
|
+
* standing in? Is it a link, a code block, an emphasis, a mention. The answer is
|
|
4
|
+
* always the same walk, from the innermost node at the position outward to the
|
|
5
|
+
* root, and it used to be written out at every call site. */
|
|
6
|
+
/** The innermost node at `pos` that `match` accepts, looking outward from there.
|
|
7
|
+
* `side` decides which node a position between two of them belongs to: -1 the
|
|
8
|
+
* one that ends there, 1 the one that starts there. Null when none matches. */
|
|
9
|
+
export function enclosingNode(state, pos, side, match) {
|
|
10
|
+
for (let node = syntaxTree(state).resolveInner(pos, side); node; node = node.parent) {
|
|
11
|
+
if (match(node))
|
|
12
|
+
return node;
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
/** `enclosingNode` for the common case: a node that goes by one of these names. */
|
|
17
|
+
export function enclosingNamed(state, pos, side, names) {
|
|
18
|
+
return enclosingNode(state, pos, side, typeof names === 'string' ? (node) => node.name === names : (node) => names.has(node.name));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=text-editor.syntax.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-editor.syntax.js","sourceRoot":"","sources":["../../../../src/components/inputs/text-editor/text-editor.syntax.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlD;;;6DAG6D;AAE7D;;gFAEgF;AAChF,MAAM,UAAU,aAAa,CAC5B,KAAkB,EAClB,GAAW,EACX,IAAgB,EAChB,KAAoC;IAEpC,KAAK,IAAI,IAAI,GAAsB,UAAU,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACxG,IAAI,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAC7B,KAAkB,EAClB,GAAW,EACX,IAAgB,EAChB,KAAmC;IAEnC,OAAO,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACpI,CAAC"}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* A page layout with optional sticky header and footer.
|
|
5
5
|
* Without sticky-header, the host is the scroll container and the header
|
|
6
6
|
* is in normal flow. With sticky-header, the header becomes absolute and
|
|
7
|
-
* .page__scroll takes over scrolling
|
|
8
|
-
*
|
|
7
|
+
* .page__scroll takes over scrolling, padded by the measured header height.
|
|
8
|
+
* That padding freezes once you scroll, so a collapsing bar cannot drag the
|
|
9
|
+
* content up under the cursor.
|
|
9
10
|
*
|
|
10
11
|
* In root-scroll mode (--context-scroll-mode: root, derived upstream by
|
|
11
12
|
* nldd-app-view) the page stops owning a scroller: the document scrolls and the
|
|
@@ -42,8 +43,8 @@ export declare class NLDDPage extends LitElement implements ScrollModeConsumer {
|
|
|
42
43
|
private _scrollMode;
|
|
43
44
|
private _scrollTarget;
|
|
44
45
|
private _scrollProvider;
|
|
45
|
-
private _headerObserver;
|
|
46
46
|
private _insetObserver;
|
|
47
|
+
private _headerFullHeight;
|
|
47
48
|
private _mainSlot;
|
|
48
49
|
private _resizeRaf;
|
|
49
50
|
private get _isRoot();
|
|
@@ -82,13 +83,30 @@ export declare class NLDDPage extends LitElement implements ScrollModeConsumer {
|
|
|
82
83
|
* its anchor, and a consumer that had written the number down would be wrong
|
|
83
84
|
* from that moment on. A bar that is not sticky scrolls away and adds
|
|
84
85
|
* nothing, so it stays at zero.
|
|
86
|
+
*
|
|
87
|
+
* It also measures the padding the scroll wrapper reserves for an absolute
|
|
88
|
+
* sticky header. One observer owns both, because two of them writing styles
|
|
89
|
+
* that resize what the other watches is what leaves ResizeObserver
|
|
90
|
+
* notifications undelivered.
|
|
85
91
|
*/
|
|
86
92
|
private _setupInsetObserver;
|
|
87
93
|
private _teardownInsetObserver;
|
|
94
|
+
/**
|
|
95
|
+
* Writes a published variable only when it changes. These values size the
|
|
96
|
+
* elements the observer watches, so a rewrite feeds the callback its own
|
|
97
|
+
* next notification, which is what Chromium reports as "ResizeObserver
|
|
98
|
+
* loop completed with undelivered notifications".
|
|
99
|
+
*/
|
|
100
|
+
private _publish;
|
|
101
|
+
/**
|
|
102
|
+
* The header at its full height: the last measurement taken at scroll top.
|
|
103
|
+
* A top title bar shrinks as you pass its anchor, and the space reserved for
|
|
104
|
+
* it must not shrink along, or the content it starts under is dragged up
|
|
105
|
+
* from under the cursor. Which mode reserves that space is the CSS's call.
|
|
106
|
+
*/
|
|
107
|
+
private _measureHeaderFullHeight;
|
|
88
108
|
private _setupScrollListener;
|
|
89
109
|
private _teardownScrollListener;
|
|
90
|
-
private _setupHeaderObserver;
|
|
91
|
-
private _teardownHeaderObserver;
|
|
92
110
|
private _onScroll;
|
|
93
111
|
private _setupMainSlotListener;
|
|
94
112
|
private _teardownMainSlotListener;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../src/components/layout/page/page.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../src/components/layout/page/page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAGjD,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAsB,MAAM,8CAA8C,CAAC;AAIvH,qBACa,QAAS,SAAQ,UAAW,YAAW,kBAAkB;IACrE,OAAgB,MAAM,0BAAc;IAGpC,YAAY,UAAS;IAGrB,YAAY,UAAS;IAGrB,UAAU,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAa;IAGtD,SAAS,UAAS;IAElB,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,UAAU,CAAK;IAEvB,OAAO,KAAK,OAAO,GAElB;IAED,IAAI,YAAY,IAAI,WAAW,CAG9B;IAED;;;;;;;;;OASG;IACH,IAAI,iBAAiB,IAAI,WAAW,CAGnC;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,SAAS,GAEpB;IAEQ,iBAAiB;IA6BjB,oBAAoB;IAWpB,YAAY;IAQZ,OAAO,CAAC,OAAO,EAAE,cAAc;IAIxC;;;OAGG;IACH,cAAc,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAQvC,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,SAAS,CAMf;IAGF,OAAO,CAAC,gBAAgB;IAQxB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,mBAAmB;IAwB3B,OAAO,CAAC,sBAAsB;IAO9B;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAKhB;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;IAMhC,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,SAAS,CAIf;IAOF,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,yBAAyB;IAOjC,OAAO,CAAC,gBAAgB,CAOtB;IAEO,MAAM;CAGf;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,WAAW,EAAE,QAAQ,CAAC;KACtB;CACD"}
|