latex-stickies 1.0.0

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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +113 -0
  3. package/bin/latex-stickies.js +36 -0
  4. package/build/icon.icns +0 -0
  5. package/build/icon.png +0 -0
  6. package/package.json +76 -0
  7. package/src/main.js +308 -0
  8. package/src/preload.js +27 -0
  9. package/src/renderer/editor.js +201 -0
  10. package/src/renderer/markdown.js +154 -0
  11. package/src/renderer/note.css +288 -0
  12. package/src/renderer/note.html +34 -0
  13. package/src/renderer/note.js +210 -0
  14. package/src/renderer/vendor/fonts/KaTeX_AMS-Regular.ttf +0 -0
  15. package/src/renderer/vendor/fonts/KaTeX_AMS-Regular.woff +0 -0
  16. package/src/renderer/vendor/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  17. package/src/renderer/vendor/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  18. package/src/renderer/vendor/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  19. package/src/renderer/vendor/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  20. package/src/renderer/vendor/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  21. package/src/renderer/vendor/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  22. package/src/renderer/vendor/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  23. package/src/renderer/vendor/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  24. package/src/renderer/vendor/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  25. package/src/renderer/vendor/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  26. package/src/renderer/vendor/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  27. package/src/renderer/vendor/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  28. package/src/renderer/vendor/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  29. package/src/renderer/vendor/fonts/KaTeX_Main-Bold.ttf +0 -0
  30. package/src/renderer/vendor/fonts/KaTeX_Main-Bold.woff +0 -0
  31. package/src/renderer/vendor/fonts/KaTeX_Main-Bold.woff2 +0 -0
  32. package/src/renderer/vendor/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  33. package/src/renderer/vendor/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  34. package/src/renderer/vendor/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  35. package/src/renderer/vendor/fonts/KaTeX_Main-Italic.ttf +0 -0
  36. package/src/renderer/vendor/fonts/KaTeX_Main-Italic.woff +0 -0
  37. package/src/renderer/vendor/fonts/KaTeX_Main-Italic.woff2 +0 -0
  38. package/src/renderer/vendor/fonts/KaTeX_Main-Regular.ttf +0 -0
  39. package/src/renderer/vendor/fonts/KaTeX_Main-Regular.woff +0 -0
  40. package/src/renderer/vendor/fonts/KaTeX_Main-Regular.woff2 +0 -0
  41. package/src/renderer/vendor/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  42. package/src/renderer/vendor/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  43. package/src/renderer/vendor/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  44. package/src/renderer/vendor/fonts/KaTeX_Math-Italic.ttf +0 -0
  45. package/src/renderer/vendor/fonts/KaTeX_Math-Italic.woff +0 -0
  46. package/src/renderer/vendor/fonts/KaTeX_Math-Italic.woff2 +0 -0
  47. package/src/renderer/vendor/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  48. package/src/renderer/vendor/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  49. package/src/renderer/vendor/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  50. package/src/renderer/vendor/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  51. package/src/renderer/vendor/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  52. package/src/renderer/vendor/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  53. package/src/renderer/vendor/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  54. package/src/renderer/vendor/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  55. package/src/renderer/vendor/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  56. package/src/renderer/vendor/fonts/KaTeX_Script-Regular.ttf +0 -0
  57. package/src/renderer/vendor/fonts/KaTeX_Script-Regular.woff +0 -0
  58. package/src/renderer/vendor/fonts/KaTeX_Script-Regular.woff2 +0 -0
  59. package/src/renderer/vendor/fonts/KaTeX_Size1-Regular.ttf +0 -0
  60. package/src/renderer/vendor/fonts/KaTeX_Size1-Regular.woff +0 -0
  61. package/src/renderer/vendor/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  62. package/src/renderer/vendor/fonts/KaTeX_Size2-Regular.ttf +0 -0
  63. package/src/renderer/vendor/fonts/KaTeX_Size2-Regular.woff +0 -0
  64. package/src/renderer/vendor/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  65. package/src/renderer/vendor/fonts/KaTeX_Size3-Regular.ttf +0 -0
  66. package/src/renderer/vendor/fonts/KaTeX_Size3-Regular.woff +0 -0
  67. package/src/renderer/vendor/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  68. package/src/renderer/vendor/fonts/KaTeX_Size4-Regular.ttf +0 -0
  69. package/src/renderer/vendor/fonts/KaTeX_Size4-Regular.woff +0 -0
  70. package/src/renderer/vendor/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  71. package/src/renderer/vendor/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  72. package/src/renderer/vendor/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  73. package/src/renderer/vendor/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  74. package/src/renderer/vendor/katex.min.css +1 -0
  75. package/src/renderer/vendor/katex.min.js +1 -0
  76. package/src/renderer/vendor/marked.js +80 -0
  77. package/src/renderer/vendor/prism.js +2009 -0
  78. package/src/renderer/vendor/purify.js +3 -0
  79. package/src/store.js +116 -0
@@ -0,0 +1,210 @@
1
+ const COLORS = ['yellow', 'blue', 'green', 'pink', 'purple', 'gray'];
2
+ const SWATCH = {
3
+ yellow: '#fdf3a8', blue: '#cfe6fb', green: '#d3f2c8',
4
+ pink: '#fbd2e2', purple: '#e2d6fb', gray: '#e6e6e6',
5
+ };
6
+
7
+ const editor = document.getElementById('editor');
8
+ const preview = document.getElementById('preview');
9
+ const pin = document.getElementById('pin');
10
+
11
+ let note = null;
12
+
13
+ /* ---------- rendering ---------- */
14
+
15
+ // renderMarkdown() comes from markdown.js (marked + KaTeX + DOMPurify).
16
+ function render(src) {
17
+ if (!src.trim()) {
18
+ preview.innerHTML = '<span class="placeholder">Empty note \u2014 click to write.</span>';
19
+ return;
20
+ }
21
+ renderInto(preview, src);
22
+ decorateCodeBlocks();
23
+ }
24
+
25
+ /**
26
+ * Adds the language label and copy button to each code block.
27
+ *
28
+ * This runs after the HTML is in the DOM rather than inside the markdown
29
+ * renderer on purpose: the sanitizer still forbids <button>, so text typed into
30
+ * a note can never fake one. These are built with createElement, so they can
31
+ * only ever come from here.
32
+ */
33
+ function decorateCodeBlocks() {
34
+ preview.querySelectorAll('pre').forEach((pre) => {
35
+ // The <pre> scrolls its own long lines, so an absolutely positioned label
36
+ // inside it would scroll out of view. The wrapper is the anchor instead.
37
+ const block = document.createElement('div');
38
+ block.className = 'code-block';
39
+ pre.parentNode.insertBefore(block, pre);
40
+ block.appendChild(pre);
41
+
42
+ const lang = pre.dataset.lang;
43
+ if (lang) {
44
+ const label = document.createElement('span');
45
+ label.className = 'code-lang';
46
+ label.textContent = lang;
47
+ block.appendChild(label);
48
+ }
49
+
50
+ const button = document.createElement('button');
51
+ button.className = 'code-copy';
52
+ button.textContent = 'Copy';
53
+ button.title = 'Copy to clipboard';
54
+ block.appendChild(button);
55
+ });
56
+ }
57
+
58
+ let copyResetTimer = null;
59
+
60
+ // Delegated so it keeps working across re-renders, which replace these nodes.
61
+ preview.addEventListener('mousedown', (e) => {
62
+ // Stop the paper's own handler below from flipping the note into edit mode.
63
+ if (e.target.closest('.code-copy')) e.stopPropagation();
64
+ }, true);
65
+
66
+ preview.addEventListener('click', (e) => {
67
+ const button = e.target.closest('.code-copy');
68
+ if (!button) return;
69
+ e.preventDefault();
70
+ e.stopPropagation();
71
+
72
+ const code = button.closest('.code-block').querySelector('code');
73
+ window.sticky.copy(code.textContent);
74
+
75
+ button.textContent = 'Copied';
76
+ button.classList.add('done');
77
+ clearTimeout(copyResetTimer);
78
+ copyResetTimer = setTimeout(() => {
79
+ button.textContent = 'Copy';
80
+ button.classList.remove('done');
81
+ }, 1200);
82
+ });
83
+
84
+ /* ---------- state ---------- */
85
+
86
+ let saveTimer = null;
87
+ function scheduleSave() {
88
+ clearTimeout(saveTimer);
89
+ saveTimer = setTimeout(() => window.sticky.update({ body: note.body }), 250);
90
+ }
91
+
92
+ // Typing is saved on a 250ms debounce, which Cmd+W would otherwise outrun: the
93
+ // window is closed from the main process, so the textarea never blurs and the
94
+ // pending timer dies with the renderer, losing the last few words typed.
95
+ // beforeunload is the last point where the renderer can still be heard.
96
+ window.addEventListener('beforeunload', () => {
97
+ if (!note) return;
98
+ clearTimeout(saveTimer);
99
+ if (document.body.classList.contains('editing')) note.body = editor.value;
100
+ window.sticky.flush(note.body);
101
+ });
102
+
103
+ function setEditing(on) {
104
+ document.body.classList.toggle('editing', on);
105
+ if (on) {
106
+ editor.focus();
107
+ } else {
108
+ render(note.body);
109
+ clearTimeout(saveTimer);
110
+ window.sticky.update({ body: note.body });
111
+ }
112
+ }
113
+
114
+ function setColor(color) {
115
+ note.color = color;
116
+ document.body.dataset.color = color;
117
+ document.querySelectorAll('#swatches span').forEach((el) => {
118
+ el.classList.toggle('active', el.dataset.color === color);
119
+ });
120
+ window.sticky.update({ color });
121
+ }
122
+
123
+ function setFontSize(size) {
124
+ note.fontSize = Math.max(11, Math.min(30, size));
125
+ document.documentElement.style.setProperty('--fs', `${note.fontSize}px`);
126
+ window.sticky.update({ fontSize: note.fontSize });
127
+ }
128
+
129
+ function setPinned(on) {
130
+ note.alwaysOnTop = on;
131
+ pin.classList.toggle('on', on);
132
+ window.sticky.update({ alwaysOnTop: on });
133
+ }
134
+
135
+ /* ---------- wiring ---------- */
136
+
137
+ const swatches = document.getElementById('swatches');
138
+ COLORS.forEach((color) => {
139
+ const el = document.createElement('span');
140
+ el.dataset.color = color;
141
+ el.style.background = SWATCH[color];
142
+ el.title = color;
143
+ el.addEventListener('click', () => setColor(color));
144
+ swatches.appendChild(el);
145
+ });
146
+
147
+ attachEditorBehaviors(editor);
148
+
149
+ editor.addEventListener('input', () => {
150
+ note.body = editor.value;
151
+ scheduleSave();
152
+ });
153
+ editor.addEventListener('blur', () => setEditing(false));
154
+
155
+ // Clicking the paper enters editing, but links and checkboxes act first.
156
+ preview.addEventListener('mousedown', (e) => {
157
+ if (e.target.closest('a')) return;
158
+ e.preventDefault();
159
+ setEditing(true);
160
+ });
161
+
162
+ // Links open in the real browser rather than navigating the sticky itself.
163
+ preview.addEventListener('click', (e) => {
164
+ const link = e.target.closest('a');
165
+ if (!link) return;
166
+ e.preventDefault();
167
+ window.sticky.openExternal(link.href);
168
+ });
169
+
170
+ document.getElementById('add').addEventListener('click', () => window.sticky.create());
171
+ document.getElementById('close').addEventListener('click', () => window.sticky.close());
172
+ pin.addEventListener('click', () => {
173
+ const next = !note.alwaysOnTop;
174
+ window.sticky.setAlwaysOnTop(next);
175
+ setPinned(next);
176
+ });
177
+
178
+ // Keeps the toolbar up whenever this note is the focused window. The title bar
179
+ // is a drag region and swallows mouse events, so CSS :hover alone would hide
180
+ // the controls just as the cursor reached them.
181
+ function setFocused(on) {
182
+ document.body.classList.toggle('focused', on);
183
+ }
184
+ window.addEventListener('focus', () => setFocused(true));
185
+ window.addEventListener('blur', () => setFocused(false));
186
+ setFocused(document.hasFocus());
187
+
188
+ document.addEventListener('keydown', (e) => {
189
+ if (e.key === 'Escape' && document.body.classList.contains('editing')) setEditing(false);
190
+ });
191
+
192
+ window.sticky.on('toggle-edit', () =>
193
+ setEditing(!document.body.classList.contains('editing')));
194
+ window.sticky.on('font-size', (delta) => setFontSize(note.fontSize + delta));
195
+ window.sticky.on('always-on-top-changed', (v) => setPinned(v));
196
+ window.sticky.on('request-delete', () => {
197
+ if (!note.body.trim() || confirm('Delete this note? This cannot be undone.')) {
198
+ window.sticky.remove();
199
+ }
200
+ });
201
+
202
+ window.sticky.get().then((loaded) => {
203
+ note = loaded || { body: '', color: 'yellow', fontSize: 15, alwaysOnTop: false };
204
+ editor.value = note.body;
205
+ setColor(note.color);
206
+ setFontSize(note.fontSize || 15);
207
+ setPinned(!!note.alwaysOnTop);
208
+ render(note.body);
209
+ if (!note.body) setEditing(true);
210
+ });
@@ -0,0 +1 @@
1
+ @font-face{font-display:block;font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-display:block;font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-display:block;font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype")}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;position:relative;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.16.47"}.katex .katex-mathml{border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .mathsfit,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .smash{display:inline;line-height:0}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.2777777778em;margin-right:-.5555555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex svg{fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo}