@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.
Files changed (179) hide show
  1. package/custom-elements.json +662 -144
  2. package/dist/components/actions/icon-button/icon-button.d.ts +2 -2
  3. package/dist/components/actions/icon-button/icon-button.d.ts.map +1 -1
  4. package/dist/components/actions/icon-button/icon-button.js +3 -3
  5. package/dist/components/actions/icon-button/icon-button.js.map +1 -1
  6. package/dist/components/components.js +1263 -273
  7. package/dist/components/content/avatar/avatar.d.ts +6 -6
  8. package/dist/components/content/avatar/avatar.d.ts.map +1 -1
  9. package/dist/components/content/avatar/avatar.js +9 -9
  10. package/dist/components/content/avatar/avatar.js.map +1 -1
  11. package/dist/components/content/icon/icon-aliases.d.ts.map +1 -1
  12. package/dist/components/content/icon/icon-aliases.js +4 -0
  13. package/dist/components/content/icon/icon-aliases.js.map +1 -1
  14. package/dist/components/content/icon/icon-gallery-status.d.ts.map +1 -1
  15. package/dist/components/content/icon/icon-gallery-status.js +3 -26
  16. package/dist/components/content/icon/icon-gallery-status.js.map +1 -1
  17. package/dist/components/content/icon/icon-registry.d.ts.map +1 -1
  18. package/dist/components/content/icon/icon-registry.js +2 -0
  19. package/dist/components/content/icon/icon-registry.js.map +1 -1
  20. package/dist/components/content/icon/icon.d.ts +2 -2
  21. package/dist/components/content/icon/icon.d.ts.map +1 -1
  22. package/dist/components/content/icon/icon.js +3 -3
  23. package/dist/components/content/icon/icon.js.map +1 -1
  24. package/dist/components/content/icon/icon.styles.d.ts.map +1 -1
  25. package/dist/components/content/icon/icon.styles.js +8 -2
  26. package/dist/components/content/icon/icon.styles.js.map +1 -1
  27. package/dist/components/content/rich-text/rich-text.d.ts +7 -6
  28. package/dist/components/content/rich-text/rich-text.d.ts.map +1 -1
  29. package/dist/components/content/rich-text/rich-text.js +8 -7
  30. package/dist/components/content/rich-text/rich-text.js.map +1 -1
  31. package/dist/components/content/text/text.d.ts +2 -2
  32. package/dist/components/content/text/text.js +3 -3
  33. package/dist/components/content/title/title.d.ts +5 -5
  34. package/dist/components/content/title/title.d.ts.map +1 -1
  35. package/dist/components/content/title/title.js +6 -6
  36. package/dist/components/content/title/title.js.map +1 -1
  37. package/dist/components/content/tooltip/tooltip.d.ts +2 -2
  38. package/dist/components/content/tooltip/tooltip.d.ts.map +1 -1
  39. package/dist/components/content/tooltip/tooltip.js +4 -4
  40. package/dist/components/content/tooltip/tooltip.js.map +1 -1
  41. package/dist/components/{dist-C09E9-dJ.js → dist-B_Mnmrj4.js} +1 -1
  42. package/dist/components/{dist-CjaG8dOI.js → dist-ByH8hQze.js} +2 -2
  43. package/dist/components/{dist-BB7TxeMK.js → dist-CRwuSgMM.js} +2 -2
  44. package/dist/components/{dist-la_b3ZSq.js → dist-CSrO_mYe.js} +1 -1
  45. package/dist/components/{dist-762GHPyH.js → dist-CX3DK4i7.js} +3 -3
  46. package/dist/components/{dist-DZoFKUO-.js → dist-CbCO0WCd.js} +1 -1
  47. package/dist/components/{dist-B_3OW7pC.js → dist-CgDuh26K.js} +1 -1
  48. package/dist/components/{dist-DaavuU6W.js → dist-DXZ-cFAl.js} +2 -2
  49. package/dist/components/{dist-CRsR6ckU.js → dist-LX8LuMac.js} +1 -1
  50. package/dist/components/{dist-BJI4-6iQ.js → dist-eVFegyjM.js} +1 -1
  51. package/dist/components/{dist-C6gnorjP.js → dist-fIxe0l7k.js} +9 -1
  52. package/dist/components/{icon-Cd4BloIM.js → icon-C_zwJZ_g.js} +14 -4
  53. package/dist/components/{icon-button-CXN0yaVx.js → icon-button-CEz4MB9H.js} +10 -10
  54. package/dist/components/inputs/code-editor/code-editor.styles.js +2 -2
  55. package/dist/components/inputs/text-editor/text-editor.annotation-sentinels.d.ts +3 -5
  56. package/dist/components/inputs/text-editor/text-editor.annotation-sentinels.d.ts.map +1 -1
  57. package/dist/components/inputs/text-editor/text-editor.annotation-sentinels.js +30 -44
  58. package/dist/components/inputs/text-editor/text-editor.annotation-sentinels.js.map +1 -1
  59. package/dist/components/inputs/text-editor/text-editor.annotations.d.ts.map +1 -1
  60. package/dist/components/inputs/text-editor/text-editor.annotations.js +31 -5
  61. package/dist/components/inputs/text-editor/text-editor.annotations.js.map +1 -1
  62. package/dist/components/inputs/text-editor/text-editor.commands.d.ts +14 -2
  63. package/dist/components/inputs/text-editor/text-editor.commands.d.ts.map +1 -1
  64. package/dist/components/inputs/text-editor/text-editor.commands.js +115 -36
  65. package/dist/components/inputs/text-editor/text-editor.commands.js.map +1 -1
  66. package/dist/components/inputs/text-editor/text-editor.cursor.d.ts +7 -0
  67. package/dist/components/inputs/text-editor/text-editor.cursor.d.ts.map +1 -0
  68. package/dist/components/inputs/text-editor/text-editor.cursor.js +207 -0
  69. package/dist/components/inputs/text-editor/text-editor.cursor.js.map +1 -0
  70. package/dist/components/inputs/text-editor/text-editor.d.ts +65 -13
  71. package/dist/components/inputs/text-editor/text-editor.d.ts.map +1 -1
  72. package/dist/components/inputs/text-editor/text-editor.emphasis.d.ts +32 -0
  73. package/dist/components/inputs/text-editor/text-editor.emphasis.d.ts.map +1 -0
  74. package/dist/components/inputs/text-editor/text-editor.emphasis.js +229 -0
  75. package/dist/components/inputs/text-editor/text-editor.emphasis.js.map +1 -0
  76. package/dist/components/inputs/text-editor/text-editor.js +177 -18
  77. package/dist/components/inputs/text-editor/text-editor.js.map +1 -1
  78. package/dist/components/inputs/text-editor/text-editor.links.d.ts +8 -0
  79. package/dist/components/inputs/text-editor/text-editor.links.d.ts.map +1 -1
  80. package/dist/components/inputs/text-editor/text-editor.links.js +30 -4
  81. package/dist/components/inputs/text-editor/text-editor.links.js.map +1 -1
  82. package/dist/components/inputs/text-editor/text-editor.markdown.d.ts.map +1 -1
  83. package/dist/components/inputs/text-editor/text-editor.markdown.js +52 -18
  84. package/dist/components/inputs/text-editor/text-editor.markdown.js.map +1 -1
  85. package/dist/components/inputs/text-editor/text-editor.mentions.d.ts +78 -11
  86. package/dist/components/inputs/text-editor/text-editor.mentions.d.ts.map +1 -1
  87. package/dist/components/inputs/text-editor/text-editor.mentions.js +190 -41
  88. package/dist/components/inputs/text-editor/text-editor.mentions.js.map +1 -1
  89. package/dist/components/inputs/text-editor/text-editor.ordered-list.d.ts +0 -2
  90. package/dist/components/inputs/text-editor/text-editor.ordered-list.d.ts.map +1 -1
  91. package/dist/components/inputs/text-editor/text-editor.ordered-list.js +21 -1
  92. package/dist/components/inputs/text-editor/text-editor.ordered-list.js.map +1 -1
  93. package/dist/components/inputs/text-editor/text-editor.styles.d.ts.map +1 -1
  94. package/dist/components/inputs/text-editor/text-editor.styles.js +11 -10
  95. package/dist/components/inputs/text-editor/text-editor.styles.js.map +1 -1
  96. package/dist/components/inputs/text-editor/text-editor.syntax.d.ts +9 -0
  97. package/dist/components/inputs/text-editor/text-editor.syntax.d.ts.map +1 -0
  98. package/dist/components/inputs/text-editor/text-editor.syntax.js +20 -0
  99. package/dist/components/inputs/text-editor/text-editor.syntax.js.map +1 -0
  100. package/dist/components/layout/page/page.d.ts +23 -5
  101. package/dist/components/layout/page/page.d.ts.map +1 -1
  102. package/dist/components/layout/page/page.js +39 -34
  103. package/dist/components/layout/page/page.js.map +1 -1
  104. package/dist/components/layout/page/page.styles.d.ts.map +1 -1
  105. package/dist/components/layout/page/page.styles.js +2 -0
  106. package/dist/components/layout/page/page.styles.js.map +1 -1
  107. package/dist/components/layout/page-sections/page-section-controls.d.ts +0 -70
  108. package/dist/components/layout/page-sections/page-section-controls.d.ts.map +1 -1
  109. package/dist/components/layout/page-sections/page-section-controls.js +0 -3
  110. package/dist/components/layout/page-sections/page-section-controls.js.map +1 -1
  111. package/dist/components/layout/sheet/sheet.d.ts +3 -7
  112. package/dist/components/layout/sheet/sheet.d.ts.map +1 -1
  113. package/dist/components/layout/sheet/sheet.js +4 -18
  114. package/dist/components/layout/sheet/sheet.js.map +1 -1
  115. package/dist/components/layout/sheet/sheet.styles.d.ts.map +1 -1
  116. package/dist/components/layout/sheet/sheet.styles.js +0 -4
  117. package/dist/components/layout/sheet/sheet.styles.js.map +1 -1
  118. package/dist/components/layout/sheet/sheet.template.d.ts.map +1 -1
  119. package/dist/components/layout/sheet/sheet.template.js +5 -2
  120. package/dist/components/layout/sheet/sheet.template.js.map +1 -1
  121. package/dist/components/layout/window/window.d.ts +2 -4
  122. package/dist/components/layout/window/window.d.ts.map +1 -1
  123. package/dist/components/layout/window/window.js +4 -14
  124. package/dist/components/layout/window/window.js.map +1 -1
  125. package/dist/components/layout/window/window.template.d.ts.map +1 -1
  126. package/dist/components/layout/window/window.template.js +5 -2
  127. package/dist/components/layout/window/window.template.js.map +1 -1
  128. package/dist/components/lists-and-tables/cells/icon-cell/icon-cell.d.ts +2 -2
  129. package/dist/components/lists-and-tables/cells/icon-cell/icon-cell.js +3 -3
  130. package/dist/components/lists-and-tables/cells/text-cell/text-cell.d.ts +2 -2
  131. package/dist/components/lists-and-tables/cells/text-cell/text-cell.js +3 -3
  132. package/dist/components/lists-and-tables/cells/title-cell/title-cell.d.ts +2 -2
  133. package/dist/components/lists-and-tables/cells/title-cell/title-cell.js +3 -3
  134. package/dist/components/lists-and-tables/list/list.d.ts +4 -2
  135. package/dist/components/lists-and-tables/list/list.d.ts.map +1 -1
  136. package/dist/components/lists-and-tables/list/list.js +23 -5
  137. package/dist/components/lists-and-tables/list/list.js.map +1 -1
  138. package/dist/components/navigation/document-tab-bar/document-tab-bar.template.js +1 -1
  139. package/dist/components/navigation/document-tab-bar/document-tab-bar.template.js.map +1 -1
  140. package/dist/components/navigation/link/link.d.ts +2 -2
  141. package/dist/components/navigation/link/link.d.ts.map +1 -1
  142. package/dist/components/navigation/link/link.js +3 -2
  143. package/dist/components/navigation/link/link.js.map +1 -1
  144. package/dist/components/navigation/menu-bar/menu-bar.d.ts +4 -2
  145. package/dist/components/navigation/menu-bar/menu-bar.d.ts.map +1 -1
  146. package/dist/components/navigation/menu-bar/menu-bar.js +4 -2
  147. package/dist/components/navigation/menu-bar/menu-bar.js.map +1 -1
  148. package/dist/components/status-and-feedback/activity-indicator/activity-indicator.d.ts +3 -3
  149. package/dist/components/status-and-feedback/activity-indicator/activity-indicator.d.ts.map +1 -1
  150. package/dist/components/status-and-feedback/activity-indicator/activity-indicator.js +4 -4
  151. package/dist/components/status-and-feedback/activity-indicator/activity-indicator.js.map +1 -1
  152. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.d.ts +8 -0
  153. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.d.ts.map +1 -1
  154. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.js +14 -0
  155. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.js.map +1 -1
  156. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.styles.d.ts.map +1 -1
  157. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.styles.js +22 -1
  158. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.styles.js.map +1 -1
  159. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.template.d.ts.map +1 -1
  160. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.template.js +6 -2
  161. package/dist/components/status-and-feedback/inline-dialog/inline-dialog.template.js.map +1 -1
  162. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.d.ts +3 -1
  163. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.d.ts.map +1 -1
  164. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.js +5 -0
  165. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.js.map +1 -1
  166. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.template.d.ts.map +1 -1
  167. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.template.js +4 -0
  168. package/dist/components/status-and-feedback/modal-dialog/modal-dialog.template.js.map +1 -1
  169. package/dist/components/status-and-feedback/notification/notification-region.d.ts.map +1 -1
  170. package/dist/components/status-and-feedback/notification/notification-region.js +74 -1
  171. package/dist/components/status-and-feedback/notification/notification-region.js.map +1 -1
  172. package/dist/components/status-and-feedback/notification/notification.d.ts +11 -0
  173. package/dist/components/status-and-feedback/notification/notification.d.ts.map +1 -1
  174. package/dist/components/status-and-feedback/notification/notification.js +13 -0
  175. package/dist/components/status-and-feedback/notification/notification.js.map +1 -1
  176. package/dist/favicon.svg +8 -2
  177. package/dist/nldd.min.js +536 -496
  178. package/dist/types/vue.d.ts +33 -25
  179. 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
- const MENTION_QUERY = /@[\w.-]*$/;
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.label.replace(/[[\]\\]/g, (c) => '\\' + c);
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 completionSource(getSource, onInsert) {
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 match = context.matchBefore(/@[\w.-]*/);
37
- if (!match || (match.from === match.to && !context.explicit))
38
- return null;
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
- const candidates = await source(match.text.slice(1));
43
- if (!candidates?.length)
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 consumer's source already filtered against the query.
164
+ // The sources already filtered against the query.
48
165
  filter: false,
49
- options: candidates.map((candidate) => ({
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
- * @-mention typeahead. `getSource` is called with the text typed after `@` and
130
- * returns (a promise of) candidates; selecting one inserts the token and calls
131
- * `onInsert`. Without a source it is inert.
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
- // CodeMirror only opens completion while typing, not on deletion. When a
134
- // backspace brings the query back into a matching state ("@anb" → "@an"),
135
- // re-open the popup right away instead of waiting for the next character.
136
- const reopenOnDelete = EditorView.updateListener.of((update) => {
137
- if (!update.docChanged || completionStatus(update.state) !== null)
138
- return;
139
- if (!update.transactions.some((tr) => tr.isUserEvent('delete')))
140
- return;
141
- const { head } = update.state.selection.main;
142
- const before = update.state.sliceDoc(update.state.doc.lineAt(head).from, head);
143
- if (MENTION_QUERY.test(before))
144
- startCompletion(update.view);
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({ override: [completionSource(getSource, onInsert)], icons: false }),
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":"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"}
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;AAED;qFACqF;AACrF,eAAO,MAAM,mBAAmB,uCAK9B,CAAC"}
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":"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"}
1
+ {"version":3,"file":"text-editor.ordered-list.js","sourceRoot":"","sources":["../../../../src/components/inputs/text-editor/text-editor.ordered-list.ts"],"names":[],"mappings":"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"}
@@ -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,yBA+kB5B,CAAC"}
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
- --__caret-width: var(--primitives-border-width-regular);
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
- --_padding-inline: 0px;
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(--__caret-width);
153
- /* A thin surface-colored halo, like the drop cursor, so the caret stays legible
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(--primitives-border-width-thin) var(--semantics-surfaces-base-background-color);
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmE/B,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4gBrB,CAAC"}
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. A ResizeObserver on the header
8
- * sets padding-top on the scroll wrapper (only when not scrolled).
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;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,eAAe,CAA+B;IACtD,OAAO,CAAC,cAAc,CAA+B;IACrD,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;IAYpB,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;IAYxB;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IA6B3B,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,oBAAoB;IAa5B,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"}
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"}