omni-viewer-core 0.11.0 → 0.11.1
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/dist/i18n/catalog.en.js +0 -2
- package/dist/i18n/catalog.ja.js +0 -2
- package/dist/i18n/catalog.ko.js +0 -2
- package/dist/i18n/catalog.zh-cn.js +0 -2
- package/dist/parsers/latex/index.d.ts +5 -1
- package/dist/parsers/latex/index.js +22 -8
- package/dist/styles/latex.css +1 -1
- package/dist/viewers/latex/index.js +6 -4
- package/dist/viewers/latex/styles.d.ts +1 -1
- package/dist/viewers/latex/styles.js +1 -1
- package/package.json +1 -1
package/dist/i18n/catalog.en.js
CHANGED
|
@@ -136,7 +136,6 @@ export const CATALOG_EN = {
|
|
|
136
136
|
'latex.documentClass': 'Class: {name}', 'latex.sectionCount': '{count} section(s)',
|
|
137
137
|
'latex.unsupportedEnvironment': '{environment} — not rendered',
|
|
138
138
|
'latex.unresolvedInput': '\\{command} — external file not resolved',
|
|
139
|
-
'latex.floatCaptionOnly': '{environment} — caption only',
|
|
140
139
|
'latex.parseFailed': 'This file could not be read as a LaTeX document.',
|
|
141
140
|
'latex.mathNotInstalled': 'Math renderer not installed — formulas are shown as TeX',
|
|
142
141
|
'latex.mathFailed': 'This formula could not be rendered; its TeX source is shown.',
|
|
@@ -159,7 +158,6 @@ export const CATALOG_EN = {
|
|
|
159
158
|
'diag.latex.limit-exceeded': 'The LaTeX document exceeds a supported limit.',
|
|
160
159
|
'diag.latex.depth-exceeded': 'The LaTeX document nests deeper than the supported limit.',
|
|
161
160
|
'diag.latex.math-limit-exceeded': 'A formula exceeds the supported size and is shown as source.',
|
|
162
|
-
'diag.latex.float-caption-only': 'Only the caption of the {environment} environment is shown.',
|
|
163
161
|
'archive.title': 'Archive', 'archive.search': 'Search entries', 'archive.entries': '{count} entries',
|
|
164
162
|
'archive.previewUnavailable': 'Preview unavailable', 'archive.mediaUnsupported': 'Media preview is unsupported.',
|
|
165
163
|
'archive.encrypted': 'This archive is encrypted.', 'archive.encryptedEntries': 'This archive contains {count} encrypted entries.',
|
package/dist/i18n/catalog.ja.js
CHANGED
|
@@ -140,7 +140,6 @@ export const CATALOG_JA = {
|
|
|
140
140
|
'latex.documentClass': 'クラス: {name}', 'latex.sectionCount': 'セクション {count} 個',
|
|
141
141
|
'latex.unsupportedEnvironment': '{environment} — レンダーしません',
|
|
142
142
|
'latex.unresolvedInput': '\\{command} — 外部ファイルは解決しません',
|
|
143
|
-
'latex.floatCaptionOnly': '{environment} — キャプションのみ',
|
|
144
143
|
'latex.parseFailed': 'このファイルはLaTeX文書として読み取れませんでした。',
|
|
145
144
|
'latex.mathNotInstalled': '数式レンダラーが未インストールのため、数式をTeXソースで表示します',
|
|
146
145
|
'latex.mathFailed': 'この数式をレンダーできなかったため、TeXソースを表示します。',
|
|
@@ -163,7 +162,6 @@ export const CATALOG_JA = {
|
|
|
163
162
|
'diag.latex.limit-exceeded': 'LaTeX文書が対応上限を超えています。',
|
|
164
163
|
'diag.latex.depth-exceeded': 'LaTeX文書の入れ子が対応上限より深くなっています。',
|
|
165
164
|
'diag.latex.math-limit-exceeded': '数式が対応サイズを超えたため、ソースとして表示します。',
|
|
166
|
-
'diag.latex.float-caption-only': '{environment}環境はキャプションのみ表示します。',
|
|
167
165
|
'archive.title': 'アーカイブ', 'archive.search': '項目を検索', 'archive.entries': '{count}項目',
|
|
168
166
|
'archive.previewUnavailable': 'プレビューできません', 'archive.mediaUnsupported': 'メディアのプレビューには対応していません。',
|
|
169
167
|
'archive.encrypted': 'このアーカイブは暗号化されています。', 'archive.encryptedEntries': 'このアーカイブには暗号化された項目が{count}件あります。',
|
package/dist/i18n/catalog.ko.js
CHANGED
|
@@ -136,7 +136,6 @@ export const CATALOG_KO = {
|
|
|
136
136
|
'latex.documentClass': '클래스: {name}', 'latex.sectionCount': '절 {count}개',
|
|
137
137
|
'latex.unsupportedEnvironment': '{environment} — 렌더하지 않음',
|
|
138
138
|
'latex.unresolvedInput': '\\{command} — 외부 파일을 해석하지 않음',
|
|
139
|
-
'latex.floatCaptionOnly': '{environment} — 캡션만 표시',
|
|
140
139
|
'latex.parseFailed': 'LaTeX 문서로 읽을 수 없는 파일입니다.',
|
|
141
140
|
'latex.mathNotInstalled': '수식 렌더러가 설치되지 않아 수식을 TeX 원문으로 표시합니다',
|
|
142
141
|
'latex.mathFailed': '이 수식을 렌더하지 못해 TeX 원문을 표시합니다.',
|
|
@@ -159,7 +158,6 @@ export const CATALOG_KO = {
|
|
|
159
158
|
'diag.latex.limit-exceeded': 'LaTeX 문서가 지원 한도를 초과합니다.',
|
|
160
159
|
'diag.latex.depth-exceeded': 'LaTeX 문서의 중첩이 지원 한도보다 깊습니다.',
|
|
161
160
|
'diag.latex.math-limit-exceeded': '수식이 지원 크기를 초과하여 원문으로 표시합니다.',
|
|
162
|
-
'diag.latex.float-caption-only': '{environment} 환경은 캡션만 표시합니다.',
|
|
163
161
|
'archive.title': '압축 파일', 'archive.search': '항목 검색', 'archive.entries': '항목 {count}개',
|
|
164
162
|
'archive.previewUnavailable': '미리보기를 사용할 수 없음', 'archive.mediaUnsupported': '미디어 미리보기는 지원되지 않습니다.',
|
|
165
163
|
'archive.encrypted': '이 압축 파일은 암호화되어 있습니다.', 'archive.encryptedEntries': '이 압축 파일에는 암호화된 항목이 {count}개 있습니다.',
|
|
@@ -133,7 +133,6 @@ export const CATALOG_ZH_CN = {
|
|
|
133
133
|
'latex.documentClass': '文档类:{name}', 'latex.sectionCount': '{count} 个章节',
|
|
134
134
|
'latex.unsupportedEnvironment': '{environment} — 不渲染',
|
|
135
135
|
'latex.unresolvedInput': '\\{command} — 不解析外部文件',
|
|
136
|
-
'latex.floatCaptionOnly': '{environment} — 仅显示题注',
|
|
137
136
|
'latex.parseFailed': '无法将此文件作为 LaTeX 文档读取。',
|
|
138
137
|
'latex.mathNotInstalled': '未安装公式渲染器 — 公式以 TeX 源代码显示',
|
|
139
138
|
'latex.mathFailed': '无法渲染此公式,改为显示其 TeX 源代码。',
|
|
@@ -156,7 +155,6 @@ export const CATALOG_ZH_CN = {
|
|
|
156
155
|
'diag.latex.limit-exceeded': 'LaTeX 文档超过支持的限制。',
|
|
157
156
|
'diag.latex.depth-exceeded': 'LaTeX 文档的嵌套超过支持的深度限制。',
|
|
158
157
|
'diag.latex.math-limit-exceeded': '公式超过支持的大小,改为显示源代码。',
|
|
159
|
-
'diag.latex.float-caption-only': '{environment} 环境仅显示题注。',
|
|
160
158
|
'archive.title': '压缩包', 'archive.search': '搜索条目', 'archive.entries': '{count} 个条目',
|
|
161
159
|
'archive.previewUnavailable': '无法预览', 'archive.mediaUnsupported': '不支持媒体预览。',
|
|
162
160
|
'archive.encrypted': '此压缩包已加密。', 'archive.encryptedEntries': '此压缩包包含 {count} 个加密条目。',
|
|
@@ -107,10 +107,14 @@ export type LatexBlock = {
|
|
|
107
107
|
kind: 'verbatim';
|
|
108
108
|
source: string;
|
|
109
109
|
span: LatexSpan;
|
|
110
|
-
}
|
|
110
|
+
}
|
|
111
|
+
/** A `figure`/`table` float. Its body is scanned like any other content —
|
|
112
|
+
* the caption is lifted out for display, not used as a replacement for it. */
|
|
113
|
+
| {
|
|
111
114
|
kind: 'float';
|
|
112
115
|
environment: string;
|
|
113
116
|
caption?: LatexInline[];
|
|
117
|
+
blocks: LatexBlock[];
|
|
114
118
|
span: LatexSpan;
|
|
115
119
|
} | {
|
|
116
120
|
kind: 'unresolved';
|
|
@@ -629,15 +629,16 @@ function readEnvironment(ctx, name, start, contentStart, end, depth) {
|
|
|
629
629
|
};
|
|
630
630
|
}
|
|
631
631
|
if (FLOAT_ENVIRONMENTS.has(name)) {
|
|
632
|
-
//
|
|
633
|
-
//
|
|
634
|
-
//
|
|
632
|
+
// The caption is lifted out for display, but the body is scanned like
|
|
633
|
+
// any other content (L22). Extracting only the caption — the original
|
|
634
|
+
// L7 reading, from before tables rendered — discarded the `tabular` that
|
|
635
|
+
// is the whole point of a `table` float, and not even as source.
|
|
635
636
|
const caption = readCaption(ctx, inner, depth);
|
|
636
|
-
const
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
637
|
+
const blocks = scanBlocks(ctx, contentStart, closing.contentEnd, depth + 1);
|
|
638
|
+
return {
|
|
639
|
+
blocks: made(ctx, { kind: 'float', environment: name, ...(caption ? { caption } : {}), blocks, span }),
|
|
640
|
+
next: closing.after
|
|
641
|
+
};
|
|
641
642
|
}
|
|
642
643
|
addDiagnostic(ctx, 'warning', 'latex.unsupported-environment', 'diag.latex.unsupported-environment', { environment: name });
|
|
643
644
|
return { blocks: made(ctx, { kind: 'unsupported', environment: name, source: text.slice(start, closing.after), span }), next: closing.after };
|
|
@@ -1213,6 +1214,19 @@ function readInlineCommand(ctx, source, control, depth, out, flush) {
|
|
|
1213
1214
|
const group = readGroup(source, control.end, source.length);
|
|
1214
1215
|
return group ? group.end : control.end;
|
|
1215
1216
|
}
|
|
1217
|
+
// The float's caption is lifted out separately, so the copy in the body is
|
|
1218
|
+
// consumed here. `\caption*` and the optional short form both occur, which
|
|
1219
|
+
// is why this is not a plain entry in SILENT_COMMANDS.
|
|
1220
|
+
if (control.value === 'caption') {
|
|
1221
|
+
let cursor = control.end;
|
|
1222
|
+
if (source[cursor] === '*')
|
|
1223
|
+
cursor++;
|
|
1224
|
+
const optional = readOptional(source, cursor, source.length);
|
|
1225
|
+
if (optional)
|
|
1226
|
+
cursor = optional.end;
|
|
1227
|
+
const group = readGroup(source, skipSpace(source, cursor), source.length);
|
|
1228
|
+
return group ? group.end : cursor;
|
|
1229
|
+
}
|
|
1216
1230
|
// `\let\abs=\envert` — the `=` is optional, so a fixed argument count would
|
|
1217
1231
|
// leave part of it behind as prose.
|
|
1218
1232
|
if (control.value === 'let') {
|
package/dist/styles/latex.css
CHANGED
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
.omni-latex__theorem{margin:0 0 1em;padding:12px 14px;border-left:3px solid var(--tex-border);background:rgba(127,127,127,.06);border-radius:0 6px 6px 0}.omni-latex__theorem-title{margin-bottom:.5em;font-weight:600}.omni-latex__theorem-note{margin-left:6px;font-weight:400;color:var(--tex-muted)}.omni-latex__theorem-body{font-style:italic}.omni-latex__theorem-body p:last-child{margin-bottom:0}
|
|
39
39
|
.omni-latex__verbatim{margin:0 0 .9em;padding:12px 14px;border:1px solid var(--tex-border);border-radius:6px;background:rgba(127,127,127,.08);font:12px/1.5 var(--omni-mono,monospace);white-space:pre;overflow-x:auto}
|
|
40
40
|
.omni-latex__unsupported{margin:0 0 .9em;border:1px dashed var(--tex-border);border-radius:6px;background:rgba(127,127,127,.06);overflow:hidden}.omni-latex__badge{display:block;padding:6px 12px;border-bottom:1px dashed var(--tex-border);color:var(--omni-warning,#ffd98a);font-size:11px;font-weight:600;letter-spacing:.02em}.omni-latex__unsupported pre{margin:0;padding:12px 14px;font:12px/1.5 var(--omni-mono,monospace);white-space:pre-wrap;overflow-x:auto;color:var(--tex-muted)}.omni-latex__unsupported--inline{display:inline;border:0;background:none;padding:0 2px;color:var(--tex-muted);font:12px/1.5 var(--omni-mono,monospace)}
|
|
41
|
-
.omni-latex__float{margin:0 0
|
|
41
|
+
.omni-latex__float{margin:0 0 1em;padding:12px 14px;border:1px solid var(--tex-border);border-radius:6px}.omni-latex__float-body{display:flex;flex-direction:column;align-items:center}.omni-latex__float-body>*{max-width:100%}.omni-latex__float-caption{margin-top:.6em;color:var(--tex-muted);font-size:.94em;text-align:center}
|
|
42
42
|
.omni-latex__source{flex:1;width:100%;min-height:62vh;resize:none;border:0;outline:0;padding:16px;background:var(--omni-editor-bg,var(--omni-bg,#1e1e1e));color:inherit;font:13px/1.55 var(--omni-mono,monospace);tab-size:4}
|
|
43
43
|
.omni-latex__warning{padding:10px 12px;border:1px solid #b98b2f;border-radius:6px;background:rgba(185,139,47,.14);color:var(--omni-warning,#ffd98a);white-space:pre-wrap}.omni-latex__warning[hidden]{display:none}.omni-latex__message{padding:10px 12px;border:1px solid var(--omni-error,#f44747);border-radius:6px;color:var(--omni-error,#f44747);white-space:pre-wrap}.omni-latex__message[hidden]{display:none}
|
|
44
44
|
@media(max-width:900px){.omni-latex__workspace,.omni-latex__workspace.is-split{grid-template-columns:1fr}}
|
|
@@ -387,10 +387,12 @@ export async function mountLatexViewer(input, container, ctx, options = {}) {
|
|
|
387
387
|
continue;
|
|
388
388
|
}
|
|
389
389
|
if (block.kind === 'float') {
|
|
390
|
-
const float = el('
|
|
391
|
-
|
|
390
|
+
const float = el('figure', 'omni-latex__float');
|
|
391
|
+
const body = el('div', 'omni-latex__float-body');
|
|
392
|
+
renderBlocks(block.blocks, body);
|
|
393
|
+
float.append(body);
|
|
392
394
|
if (block.caption) {
|
|
393
|
-
const caption = el('
|
|
395
|
+
const caption = el('figcaption', 'omni-latex__float-caption');
|
|
394
396
|
renderInline(block.caption, caption);
|
|
395
397
|
float.append(caption);
|
|
396
398
|
}
|
|
@@ -682,7 +684,7 @@ function hasMath(blocks) {
|
|
|
682
684
|
|| (block.kind === 'theorem' && hasMath(block.body))
|
|
683
685
|
|| (block.kind === 'include' && hasMath(block.blocks))
|
|
684
686
|
|| (block.kind === 'table' && block.rows.some(row => row.some(cell => cell.content.some(node => node.kind === 'math'))))
|
|
685
|
-
|| (block.kind === 'float' && (block.caption ?? []).some(node => node.kind === 'math')));
|
|
687
|
+
|| (block.kind === 'float' && (hasMath(block.blocks) || (block.caption ?? []).some(node => node.kind === 'math'))));
|
|
686
688
|
}
|
|
687
689
|
/** Heading ids are core-generated (`heading-3`), so escaping only needs to
|
|
688
690
|
* cover the leading-digit case CSS selectors reject. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const latexViewerCss = "\n.omni-viewer--latex{box-sizing:border-box;min-height:100%;padding:18px;display:flex;flex-direction:column;gap:14px;color:var(--omni-fg,#d4d4d4);background:var(--omni-bg,#1e1e1e);font:var(--omni-font-size,13px)/1.5 var(--omni-font-family,system-ui,sans-serif);--tex-border:var(--omni-border,#454545);--tex-muted:var(--omni-muted,#aaa);--tex-panel:var(--omni-panel-bg,rgba(127,127,127,.05))}\n.omni-latex *{box-sizing:border-box}.omni-latex__header,.omni-latex__toolbar,.omni-latex__toolbar-group,.omni-latex__panel-header{display:flex;align-items:center;gap:10px}.omni-latex__header{align-items:flex-start;justify-content:space-between;gap:16px;flex-wrap:wrap}.omni-latex__title{font-size:16px;font-weight:600;margin-bottom:4px;word-break:break-word}.omni-latex__meta,.omni-latex__caption{color:var(--tex-muted);font-size:12px}\n.omni-latex__status{padding:7px 10px;border-radius:999px;border:1px solid var(--tex-border);background:rgba(79,193,255,.16);font-size:12px;font-weight:600;white-space:nowrap}.omni-latex__status.is-valid{background:rgba(46,160,67,.16);color:var(--omni-success,#3fb950)}.omni-latex__status.is-invalid{background:rgba(244,71,71,.14);color:var(--omni-error,#f44747)}\n.omni-latex__partial{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid #b98b2f;border-radius:999px;background:rgba(185,139,47,.14);color:var(--omni-warning,#ffd98a);font-size:12px;font-weight:600}\n.omni-latex__toolbar{flex-wrap:wrap}.omni-latex__toolbar-group{flex-wrap:wrap;padding:7px;border:1px solid var(--tex-border);border-radius:8px;background:var(--tex-panel)}.omni-latex__button{cursor:pointer;border:1px solid var(--tex-border);background:var(--omni-button-secondary-bg,rgba(127,127,127,.16));color:inherit;border-radius:6px;padding:7px 10px;font:inherit}.omni-latex__button:hover:not(:disabled){background:rgba(127,127,127,.26)}.omni-latex__button.is-active{border-color:var(--omni-focus,#007fd4);background:color-mix(in srgb,var(--omni-focus,#007fd4) 22%,transparent)}.omni-latex__button.is-dirty{border-color:var(--omni-warning,#cca700)}.omni-latex__button:disabled{cursor:default;opacity:.5}\n/* Reading views are outline + one pane; split drops the outline and gives the\n preview and the editor an equal half each. */\n.omni-latex__workspace{display:grid;grid-template-columns:minmax(200px,240px) minmax(320px,1fr);gap:14px;min-height:68vh}.omni-latex__workspace.is-split{grid-template-columns:minmax(280px,1fr) minmax(280px,1fr)}.omni-latex__panel{display:flex;flex-direction:column;min-height:0;border:1px solid var(--tex-border);border-radius:8px;background:var(--tex-panel);overflow:hidden}.omni-latex__panel[hidden]{display:none}.omni-latex__panel-header{justify-content:space-between;padding:12px 14px;border-bottom:1px solid var(--tex-border)}\n.omni-latex__outline{flex:1;min-height:0;overflow:auto;padding:8px;margin:0;list-style:none}.omni-latex__outline-item{margin:0}.omni-latex__outline-link{display:block;width:100%;text-align:left;cursor:pointer;border:0;background:transparent;color:inherit;font:inherit;padding:5px 8px;border-radius:5px;word-break:break-word}.omni-latex__outline-link:hover{background:rgba(127,127,127,.18)}.omni-latex__outline-link.is-active{background:color-mix(in srgb,var(--omni-focus,#007fd4) 24%,transparent)}.omni-latex__outline-link[data-level=\"2\"]{padding-left:20px}.omni-latex__outline-link[data-level=\"3\"]{padding-left:32px}.omni-latex__outline-link[data-level=\"4\"]{padding-left:44px}.omni-latex__outline-link[data-level=\"5\"]{padding-left:56px}.omni-latex__outline-link[data-level=\"6\"]{padding-left:68px}.omni-latex__outline-empty{padding:10px;color:var(--tex-muted)}\n.omni-latex__preview{flex:1;min-height:0;overflow:auto;padding:22px 26px;background:var(--omni-editor-bg,var(--omni-bg,#1e1e1e))}.omni-latex__preview h1,.omni-latex__preview h2,.omni-latex__preview h3,.omni-latex__preview h4,.omni-latex__preview h5,.omni-latex__preview h6{margin:1.4em 0 .5em;line-height:1.3;scroll-margin-top:12px}.omni-latex__preview h1{font-size:1.7em}.omni-latex__preview h2{font-size:1.45em}.omni-latex__preview h3{font-size:1.25em}.omni-latex__preview p{margin:0 0 .9em}.omni-latex__preview ul,.omni-latex__preview ol{margin:0 0 .9em;padding-left:1.6em}.omni-latex__preview li{margin:.25em 0}\n.omni-latex__math{display:block;margin:1em 0;padding:10px 12px;border-left:3px solid var(--omni-focus,#007fd4);background:rgba(127,127,127,.08);font:13px/1.5 var(--omni-mono,monospace);white-space:pre-wrap;overflow-x:auto}.omni-latex__math--inline{display:inline;margin:0;padding:1px 5px;border-left:0;border-radius:4px}\n/* Once rendered the slot is KaTeX's own layout, so the source-code framing is\n dropped. Two things matter here beyond looks:\n - overflow is 'auto hidden', never 'auto'. A formula that is a pixel too wide\n raises a horizontal scrollbar, which eats content-box height, which raises a\n vertical scrollbar, which narrows the box, which keeps the horizontal one \u2014\n a loop that puts both bars on a formula with room to spare.\n - line-height returns to normal. KaTeX sizes its own struts, and inheriting\n the body's 1.5 makes the rendered box taller than the line it sits on. */\n.omni-latex__math.is-rendered{padding:.4em .2em;border-left:0;background:none;font:inherit;line-height:normal;white-space:normal;text-align:center;overflow:auto hidden}\n.omni-latex__math--inline.is-rendered{padding:0;text-align:inherit;overflow:visible}.omni-latex__math.is-pending{opacity:.75}\n/* A formula the engine refused is TeX source, not broken output \u2014 it keeps the\n source framing (mono, left aligned, muted) with a red rule to mark the\n failure. Colouring the whole block red reads as \"this document is wrong\". */\n.omni-latex__math.is-invalid{border-left:3px solid var(--omni-error,#f44747);color:var(--tex-muted);text-align:left;font:12px/1.5 var(--omni-mono,monospace);white-space:pre-wrap;padding:10px 12px;background:rgba(244,71,71,.06)}\n.omni-latex__math--inline.is-invalid{border-left:0;padding:1px 5px;text-decoration:underline wavy var(--omni-error,#f44747)}\n/* Belt and braces for renderers that do not honour an errorColor option: KaTeX\n writes its error colour as an inline style, so overriding needs !important. */\n.omni-latex__math .katex-error{color:var(--omni-warning,#cca700)!important;text-decoration:underline dotted}\n.omni-latex__math .katex-display{margin:0;padding:0}.omni-latex__math .katex-display>.katex{max-width:100%}.omni-latex__math .katex{font-size:1.05em}\n.omni-latex__cite{padding:0 3px;border-radius:4px;background:rgba(127,127,127,.18);color:var(--tex-muted);font-size:.92em}\n.omni-latex__ref{padding:0 3px;border:0;border-radius:4px;background:rgba(127,127,127,.18);color:var(--tex-muted);font:inherit;font-size:.92em;cursor:pointer}.omni-latex__ref:hover{background:rgba(127,127,127,.3);color:var(--omni-fg,#d4d4d4)}\n.omni-latex__preview .is-target{outline:2px solid var(--omni-focus,#007fd4);outline-offset:3px;border-radius:4px;transition:outline-color .3s}\n.omni-latex__link{color:var(--omni-link,#4fc1ff);cursor:pointer;background:none;border:0;padding:0;font:inherit;text-decoration:underline}.omni-latex__link:disabled{cursor:default;text-decoration:none;color:inherit}\n.omni-latex__include{margin:0 0 1em;padding-left:12px;border-left:2px dashed var(--tex-border)}.omni-latex__include-label{margin-bottom:.6em;color:var(--tex-muted);font-size:11px;font-weight:600;letter-spacing:.02em}\n.omni-latex__table-wrap{margin:0 0 1em;overflow-x:auto}.omni-latex__table{border-collapse:collapse;min-width:min(100%,340px);font-size:.96em}.omni-latex__table th,.omni-latex__table td{border:1px solid var(--tex-border);padding:6px 10px;vertical-align:top}.omni-latex__table th{background:rgba(127,127,127,.12);font-weight:600;text-align:inherit}\n.omni-latex__theorem{margin:0 0 1em;padding:12px 14px;border-left:3px solid var(--tex-border);background:rgba(127,127,127,.06);border-radius:0 6px 6px 0}.omni-latex__theorem-title{margin-bottom:.5em;font-weight:600}.omni-latex__theorem-note{margin-left:6px;font-weight:400;color:var(--tex-muted)}.omni-latex__theorem-body{font-style:italic}.omni-latex__theorem-body p:last-child{margin-bottom:0}\n.omni-latex__verbatim{margin:0 0 .9em;padding:12px 14px;border:1px solid var(--tex-border);border-radius:6px;background:rgba(127,127,127,.08);font:12px/1.5 var(--omni-mono,monospace);white-space:pre;overflow-x:auto}\n.omni-latex__unsupported{margin:0 0 .9em;border:1px dashed var(--tex-border);border-radius:6px;background:rgba(127,127,127,.06);overflow:hidden}.omni-latex__badge{display:block;padding:6px 12px;border-bottom:1px dashed var(--tex-border);color:var(--omni-warning,#ffd98a);font-size:11px;font-weight:600;letter-spacing:.02em}.omni-latex__unsupported pre{margin:0;padding:12px 14px;font:12px/1.5 var(--omni-mono,monospace);white-space:pre-wrap;overflow-x:auto;color:var(--tex-muted)}.omni-latex__unsupported--inline{display:inline;border:0;background:none;padding:0 2px;color:var(--tex-muted);font:12px/1.5 var(--omni-mono,monospace)}\n.omni-latex__float{margin:0 0 .9em;padding:12px 14px;border:1px dashed var(--tex-border);border-radius:6px;text-align:center;color:var(--tex-muted)}.omni-latex__float-caption{color:var(--omni-fg,#d4d4d4)}\n.omni-latex__source{flex:1;width:100%;min-height:62vh;resize:none;border:0;outline:0;padding:16px;background:var(--omni-editor-bg,var(--omni-bg,#1e1e1e));color:inherit;font:13px/1.55 var(--omni-mono,monospace);tab-size:4}\n.omni-latex__warning{padding:10px 12px;border:1px solid #b98b2f;border-radius:6px;background:rgba(185,139,47,.14);color:var(--omni-warning,#ffd98a);white-space:pre-wrap}.omni-latex__warning[hidden]{display:none}.omni-latex__message{padding:10px 12px;border:1px solid var(--omni-error,#f44747);border-radius:6px;color:var(--omni-error,#f44747);white-space:pre-wrap}.omni-latex__message[hidden]{display:none}\n@media(max-width:900px){.omni-latex__workspace,.omni-latex__workspace.is-split{grid-template-columns:1fr}}\n";
|
|
1
|
+
export declare const latexViewerCss = "\n.omni-viewer--latex{box-sizing:border-box;min-height:100%;padding:18px;display:flex;flex-direction:column;gap:14px;color:var(--omni-fg,#d4d4d4);background:var(--omni-bg,#1e1e1e);font:var(--omni-font-size,13px)/1.5 var(--omni-font-family,system-ui,sans-serif);--tex-border:var(--omni-border,#454545);--tex-muted:var(--omni-muted,#aaa);--tex-panel:var(--omni-panel-bg,rgba(127,127,127,.05))}\n.omni-latex *{box-sizing:border-box}.omni-latex__header,.omni-latex__toolbar,.omni-latex__toolbar-group,.omni-latex__panel-header{display:flex;align-items:center;gap:10px}.omni-latex__header{align-items:flex-start;justify-content:space-between;gap:16px;flex-wrap:wrap}.omni-latex__title{font-size:16px;font-weight:600;margin-bottom:4px;word-break:break-word}.omni-latex__meta,.omni-latex__caption{color:var(--tex-muted);font-size:12px}\n.omni-latex__status{padding:7px 10px;border-radius:999px;border:1px solid var(--tex-border);background:rgba(79,193,255,.16);font-size:12px;font-weight:600;white-space:nowrap}.omni-latex__status.is-valid{background:rgba(46,160,67,.16);color:var(--omni-success,#3fb950)}.omni-latex__status.is-invalid{background:rgba(244,71,71,.14);color:var(--omni-error,#f44747)}\n.omni-latex__partial{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid #b98b2f;border-radius:999px;background:rgba(185,139,47,.14);color:var(--omni-warning,#ffd98a);font-size:12px;font-weight:600}\n.omni-latex__toolbar{flex-wrap:wrap}.omni-latex__toolbar-group{flex-wrap:wrap;padding:7px;border:1px solid var(--tex-border);border-radius:8px;background:var(--tex-panel)}.omni-latex__button{cursor:pointer;border:1px solid var(--tex-border);background:var(--omni-button-secondary-bg,rgba(127,127,127,.16));color:inherit;border-radius:6px;padding:7px 10px;font:inherit}.omni-latex__button:hover:not(:disabled){background:rgba(127,127,127,.26)}.omni-latex__button.is-active{border-color:var(--omni-focus,#007fd4);background:color-mix(in srgb,var(--omni-focus,#007fd4) 22%,transparent)}.omni-latex__button.is-dirty{border-color:var(--omni-warning,#cca700)}.omni-latex__button:disabled{cursor:default;opacity:.5}\n/* Reading views are outline + one pane; split drops the outline and gives the\n preview and the editor an equal half each. */\n.omni-latex__workspace{display:grid;grid-template-columns:minmax(200px,240px) minmax(320px,1fr);gap:14px;min-height:68vh}.omni-latex__workspace.is-split{grid-template-columns:minmax(280px,1fr) minmax(280px,1fr)}.omni-latex__panel{display:flex;flex-direction:column;min-height:0;border:1px solid var(--tex-border);border-radius:8px;background:var(--tex-panel);overflow:hidden}.omni-latex__panel[hidden]{display:none}.omni-latex__panel-header{justify-content:space-between;padding:12px 14px;border-bottom:1px solid var(--tex-border)}\n.omni-latex__outline{flex:1;min-height:0;overflow:auto;padding:8px;margin:0;list-style:none}.omni-latex__outline-item{margin:0}.omni-latex__outline-link{display:block;width:100%;text-align:left;cursor:pointer;border:0;background:transparent;color:inherit;font:inherit;padding:5px 8px;border-radius:5px;word-break:break-word}.omni-latex__outline-link:hover{background:rgba(127,127,127,.18)}.omni-latex__outline-link.is-active{background:color-mix(in srgb,var(--omni-focus,#007fd4) 24%,transparent)}.omni-latex__outline-link[data-level=\"2\"]{padding-left:20px}.omni-latex__outline-link[data-level=\"3\"]{padding-left:32px}.omni-latex__outline-link[data-level=\"4\"]{padding-left:44px}.omni-latex__outline-link[data-level=\"5\"]{padding-left:56px}.omni-latex__outline-link[data-level=\"6\"]{padding-left:68px}.omni-latex__outline-empty{padding:10px;color:var(--tex-muted)}\n.omni-latex__preview{flex:1;min-height:0;overflow:auto;padding:22px 26px;background:var(--omni-editor-bg,var(--omni-bg,#1e1e1e))}.omni-latex__preview h1,.omni-latex__preview h2,.omni-latex__preview h3,.omni-latex__preview h4,.omni-latex__preview h5,.omni-latex__preview h6{margin:1.4em 0 .5em;line-height:1.3;scroll-margin-top:12px}.omni-latex__preview h1{font-size:1.7em}.omni-latex__preview h2{font-size:1.45em}.omni-latex__preview h3{font-size:1.25em}.omni-latex__preview p{margin:0 0 .9em}.omni-latex__preview ul,.omni-latex__preview ol{margin:0 0 .9em;padding-left:1.6em}.omni-latex__preview li{margin:.25em 0}\n.omni-latex__math{display:block;margin:1em 0;padding:10px 12px;border-left:3px solid var(--omni-focus,#007fd4);background:rgba(127,127,127,.08);font:13px/1.5 var(--omni-mono,monospace);white-space:pre-wrap;overflow-x:auto}.omni-latex__math--inline{display:inline;margin:0;padding:1px 5px;border-left:0;border-radius:4px}\n/* Once rendered the slot is KaTeX's own layout, so the source-code framing is\n dropped. Two things matter here beyond looks:\n - overflow is 'auto hidden', never 'auto'. A formula that is a pixel too wide\n raises a horizontal scrollbar, which eats content-box height, which raises a\n vertical scrollbar, which narrows the box, which keeps the horizontal one \u2014\n a loop that puts both bars on a formula with room to spare.\n - line-height returns to normal. KaTeX sizes its own struts, and inheriting\n the body's 1.5 makes the rendered box taller than the line it sits on. */\n.omni-latex__math.is-rendered{padding:.4em .2em;border-left:0;background:none;font:inherit;line-height:normal;white-space:normal;text-align:center;overflow:auto hidden}\n.omni-latex__math--inline.is-rendered{padding:0;text-align:inherit;overflow:visible}.omni-latex__math.is-pending{opacity:.75}\n/* A formula the engine refused is TeX source, not broken output \u2014 it keeps the\n source framing (mono, left aligned, muted) with a red rule to mark the\n failure. Colouring the whole block red reads as \"this document is wrong\". */\n.omni-latex__math.is-invalid{border-left:3px solid var(--omni-error,#f44747);color:var(--tex-muted);text-align:left;font:12px/1.5 var(--omni-mono,monospace);white-space:pre-wrap;padding:10px 12px;background:rgba(244,71,71,.06)}\n.omni-latex__math--inline.is-invalid{border-left:0;padding:1px 5px;text-decoration:underline wavy var(--omni-error,#f44747)}\n/* Belt and braces for renderers that do not honour an errorColor option: KaTeX\n writes its error colour as an inline style, so overriding needs !important. */\n.omni-latex__math .katex-error{color:var(--omni-warning,#cca700)!important;text-decoration:underline dotted}\n.omni-latex__math .katex-display{margin:0;padding:0}.omni-latex__math .katex-display>.katex{max-width:100%}.omni-latex__math .katex{font-size:1.05em}\n.omni-latex__cite{padding:0 3px;border-radius:4px;background:rgba(127,127,127,.18);color:var(--tex-muted);font-size:.92em}\n.omni-latex__ref{padding:0 3px;border:0;border-radius:4px;background:rgba(127,127,127,.18);color:var(--tex-muted);font:inherit;font-size:.92em;cursor:pointer}.omni-latex__ref:hover{background:rgba(127,127,127,.3);color:var(--omni-fg,#d4d4d4)}\n.omni-latex__preview .is-target{outline:2px solid var(--omni-focus,#007fd4);outline-offset:3px;border-radius:4px;transition:outline-color .3s}\n.omni-latex__link{color:var(--omni-link,#4fc1ff);cursor:pointer;background:none;border:0;padding:0;font:inherit;text-decoration:underline}.omni-latex__link:disabled{cursor:default;text-decoration:none;color:inherit}\n.omni-latex__include{margin:0 0 1em;padding-left:12px;border-left:2px dashed var(--tex-border)}.omni-latex__include-label{margin-bottom:.6em;color:var(--tex-muted);font-size:11px;font-weight:600;letter-spacing:.02em}\n.omni-latex__table-wrap{margin:0 0 1em;overflow-x:auto}.omni-latex__table{border-collapse:collapse;min-width:min(100%,340px);font-size:.96em}.omni-latex__table th,.omni-latex__table td{border:1px solid var(--tex-border);padding:6px 10px;vertical-align:top}.omni-latex__table th{background:rgba(127,127,127,.12);font-weight:600;text-align:inherit}\n.omni-latex__theorem{margin:0 0 1em;padding:12px 14px;border-left:3px solid var(--tex-border);background:rgba(127,127,127,.06);border-radius:0 6px 6px 0}.omni-latex__theorem-title{margin-bottom:.5em;font-weight:600}.omni-latex__theorem-note{margin-left:6px;font-weight:400;color:var(--tex-muted)}.omni-latex__theorem-body{font-style:italic}.omni-latex__theorem-body p:last-child{margin-bottom:0}\n.omni-latex__verbatim{margin:0 0 .9em;padding:12px 14px;border:1px solid var(--tex-border);border-radius:6px;background:rgba(127,127,127,.08);font:12px/1.5 var(--omni-mono,monospace);white-space:pre;overflow-x:auto}\n.omni-latex__unsupported{margin:0 0 .9em;border:1px dashed var(--tex-border);border-radius:6px;background:rgba(127,127,127,.06);overflow:hidden}.omni-latex__badge{display:block;padding:6px 12px;border-bottom:1px dashed var(--tex-border);color:var(--omni-warning,#ffd98a);font-size:11px;font-weight:600;letter-spacing:.02em}.omni-latex__unsupported pre{margin:0;padding:12px 14px;font:12px/1.5 var(--omni-mono,monospace);white-space:pre-wrap;overflow-x:auto;color:var(--tex-muted)}.omni-latex__unsupported--inline{display:inline;border:0;background:none;padding:0 2px;color:var(--tex-muted);font:12px/1.5 var(--omni-mono,monospace)}\n.omni-latex__float{margin:0 0 1em;padding:12px 14px;border:1px solid var(--tex-border);border-radius:6px}.omni-latex__float-body{display:flex;flex-direction:column;align-items:center}.omni-latex__float-body>*{max-width:100%}.omni-latex__float-caption{margin-top:.6em;color:var(--tex-muted);font-size:.94em;text-align:center}\n.omni-latex__source{flex:1;width:100%;min-height:62vh;resize:none;border:0;outline:0;padding:16px;background:var(--omni-editor-bg,var(--omni-bg,#1e1e1e));color:inherit;font:13px/1.55 var(--omni-mono,monospace);tab-size:4}\n.omni-latex__warning{padding:10px 12px;border:1px solid #b98b2f;border-radius:6px;background:rgba(185,139,47,.14);color:var(--omni-warning,#ffd98a);white-space:pre-wrap}.omni-latex__warning[hidden]{display:none}.omni-latex__message{padding:10px 12px;border:1px solid var(--omni-error,#f44747);border-radius:6px;color:var(--omni-error,#f44747);white-space:pre-wrap}.omni-latex__message[hidden]{display:none}\n@media(max-width:900px){.omni-latex__workspace,.omni-latex__workspace.is-split{grid-template-columns:1fr}}\n";
|
|
@@ -38,7 +38,7 @@ export const latexViewerCss = `
|
|
|
38
38
|
.omni-latex__theorem{margin:0 0 1em;padding:12px 14px;border-left:3px solid var(--tex-border);background:rgba(127,127,127,.06);border-radius:0 6px 6px 0}.omni-latex__theorem-title{margin-bottom:.5em;font-weight:600}.omni-latex__theorem-note{margin-left:6px;font-weight:400;color:var(--tex-muted)}.omni-latex__theorem-body{font-style:italic}.omni-latex__theorem-body p:last-child{margin-bottom:0}
|
|
39
39
|
.omni-latex__verbatim{margin:0 0 .9em;padding:12px 14px;border:1px solid var(--tex-border);border-radius:6px;background:rgba(127,127,127,.08);font:12px/1.5 var(--omni-mono,monospace);white-space:pre;overflow-x:auto}
|
|
40
40
|
.omni-latex__unsupported{margin:0 0 .9em;border:1px dashed var(--tex-border);border-radius:6px;background:rgba(127,127,127,.06);overflow:hidden}.omni-latex__badge{display:block;padding:6px 12px;border-bottom:1px dashed var(--tex-border);color:var(--omni-warning,#ffd98a);font-size:11px;font-weight:600;letter-spacing:.02em}.omni-latex__unsupported pre{margin:0;padding:12px 14px;font:12px/1.5 var(--omni-mono,monospace);white-space:pre-wrap;overflow-x:auto;color:var(--tex-muted)}.omni-latex__unsupported--inline{display:inline;border:0;background:none;padding:0 2px;color:var(--tex-muted);font:12px/1.5 var(--omni-mono,monospace)}
|
|
41
|
-
.omni-latex__float{margin:0 0
|
|
41
|
+
.omni-latex__float{margin:0 0 1em;padding:12px 14px;border:1px solid var(--tex-border);border-radius:6px}.omni-latex__float-body{display:flex;flex-direction:column;align-items:center}.omni-latex__float-body>*{max-width:100%}.omni-latex__float-caption{margin-top:.6em;color:var(--tex-muted);font-size:.94em;text-align:center}
|
|
42
42
|
.omni-latex__source{flex:1;width:100%;min-height:62vh;resize:none;border:0;outline:0;padding:16px;background:var(--omni-editor-bg,var(--omni-bg,#1e1e1e));color:inherit;font:13px/1.55 var(--omni-mono,monospace);tab-size:4}
|
|
43
43
|
.omni-latex__warning{padding:10px 12px;border:1px solid #b98b2f;border-radius:6px;background:rgba(185,139,47,.14);color:var(--omni-warning,#ffd98a);white-space:pre-wrap}.omni-latex__warning[hidden]{display:none}.omni-latex__message{padding:10px 12px;border:1px solid var(--omni-error,#f44747);border-radius:6px;color:var(--omni-error,#f44747);white-space:pre-wrap}.omni-latex__message[hidden]{display:none}
|
|
44
44
|
@media(max-width:900px){.omni-latex__workspace,.omni-latex__workspace.is-split{grid-template-columns:1fr}}
|