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.
- package/LICENSE +21 -0
- package/README.md +113 -0
- package/bin/latex-stickies.js +36 -0
- package/build/icon.icns +0 -0
- package/build/icon.png +0 -0
- package/package.json +76 -0
- package/src/main.js +308 -0
- package/src/preload.js +27 -0
- package/src/renderer/editor.js +201 -0
- package/src/renderer/markdown.js +154 -0
- package/src/renderer/note.css +288 -0
- package/src/renderer/note.html +34 -0
- package/src/renderer/note.js +210 -0
- package/src/renderer/vendor/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Main-Bold.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Main-Italic.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Main-Regular.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Math-Italic.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Script-Regular.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/src/renderer/vendor/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/src/renderer/vendor/katex.min.css +1 -0
- package/src/renderer/vendor/katex.min.js +1 -0
- package/src/renderer/vendor/marked.js +80 -0
- package/src/renderer/vendor/prism.js +2009 -0
- package/src/renderer/vendor/purify.js +3 -0
- 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
|
+
});
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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}
|