@heycys/gallery 0.2.0 → 0.2.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/THIRD-PARTY-NOTICES.md +1 -1
- package/browser/editor/components/icon/page.mjs +6 -4
- package/browser/editor/components/icons.mjs +2 -2
- package/browser/editor/page/clipboard/import/read.mjs +20 -2
- package/browser/shared/document-copy.mjs +43 -0
- package/browser/shared/drafts.mjs +10 -3
- package/browser/shared/emoji/icon-value.mjs +2 -2
- package/browser/shared/extensions.mjs +83 -7
- package/browser/shared/i18n/en.mjs +10 -0
- package/browser/shared/outline-shape.mjs +6 -0
- package/browser/shared/outline.mjs +135 -10
- package/browser/shared/workspace-columns.mjs +11 -7
- package/dist/{chunk-QE5RG76S.mjs → chunk-2GKGEVMR.mjs} +11 -7
- package/dist/{chunk-HYMEEXKN.mjs → chunk-2RKIHJI2.mjs} +1 -1
- package/dist/{chunk-742D2WWJ.mjs → chunk-36FIRJIF.mjs} +2 -2
- package/dist/{chunk-EAIFITAV.mjs → chunk-3A5I2GJK.mjs} +1 -1
- package/dist/{chunk-7JDX4E65.mjs → chunk-3OFXMN6N.mjs} +1 -1
- package/dist/chunk-46ACXOU5.mjs +2 -0
- package/dist/{chunk-PUOQ65NC.mjs → chunk-4AMTKWDO.mjs} +1 -1
- package/dist/{chunk-HPOI4ZX7.mjs → chunk-4DNHHJSL.mjs} +1 -1
- package/dist/chunk-5DPABPBI.mjs +2 -0
- package/dist/{chunk-ALZ6ZENZ.mjs → chunk-5IIH335D.mjs} +1 -1
- package/dist/{chunk-EP25HDAJ.mjs → chunk-5L26JUYA.mjs} +1 -1
- package/dist/{chunk-FDMAXMQA.mjs → chunk-5MEXZ2UF.mjs} +1 -1
- package/dist/{chunk-ZHEHPMBK.mjs → chunk-6MPKCH3P.mjs} +1 -1
- package/dist/{chunk-C564NU2H.mjs → chunk-74RPP2M2.mjs} +1 -1
- package/dist/{chunk-YNAWBAYN.mjs → chunk-7M7UPWU6.mjs} +1 -1
- package/dist/{chunk-YROX2O22.mjs → chunk-7N2LPG33.mjs} +1 -1
- package/dist/{chunk-VS7JIGJW.mjs → chunk-7XDYK3UC.mjs} +1 -1
- package/dist/chunk-AEMVZYZQ.mjs +166 -0
- package/dist/{chunk-TR7TWGHB.mjs → chunk-AFGUR7SY.mjs} +1 -1
- package/dist/{chunk-K5XATEOO.mjs → chunk-AMDGVDNV.mjs} +1 -1
- package/dist/{chunk-JA7G53PC.mjs → chunk-ASAXY2DJ.mjs} +1 -1
- package/dist/{chunk-W7665ZEC.mjs → chunk-BYSF5UMM.mjs} +2 -2
- package/dist/{chunk-U3SSPL4K.mjs → chunk-CCSGFCLZ.mjs} +1 -1
- package/dist/{chunk-JLTZF4LA.mjs → chunk-CG3UHDKH.mjs} +1 -1
- package/dist/{chunk-YLPSMDIS.mjs → chunk-CPS4SRPF.mjs} +2 -2
- package/dist/{chunk-AHN3NFKJ.mjs → chunk-CZ5KJSGK.mjs} +1 -1
- package/dist/chunk-DAMVDXR3.mjs +2 -0
- package/dist/{chunk-WQDQWCX5.mjs → chunk-DH6GMDNN.mjs} +1 -1
- package/dist/{chunk-U5XL7D6A.mjs → chunk-DHB7UZ7F.mjs} +1 -1
- package/dist/{chunk-OEXWRJME.mjs → chunk-DKR7LFIY.mjs} +1 -1
- package/dist/chunk-DLFZJJEE.mjs +2 -0
- package/dist/{chunk-DJISHPUL.mjs → chunk-FCK6NXON.mjs} +1 -1
- package/dist/{chunk-IV64FFI4.mjs → chunk-FX42XU6J.mjs} +1 -1
- package/dist/{chunk-FETSREUN.mjs → chunk-FXQBADMN.mjs} +1 -1
- package/dist/{chunk-BFJGHSQN.mjs → chunk-G4YP7GVC.mjs} +1 -1
- package/dist/{chunk-V6XZ4VIR.mjs → chunk-GWOYMENX.mjs} +1 -1
- package/dist/chunk-HATA2W7X.mjs +2 -0
- package/dist/{chunk-YI43RG4P.mjs → chunk-HBAUKKQH.mjs} +1 -1
- package/dist/{chunk-MAFIGVXY.mjs → chunk-HM4E43VM.mjs} +1 -1
- package/dist/{chunk-OFHXGWOX.mjs → chunk-JI6T3A4Y.mjs} +1 -1
- package/dist/{chunk-5XA2ZBAE.mjs → chunk-JJNRIFND.mjs} +2 -2
- package/dist/chunk-JL6R4FG4.mjs +4 -0
- package/dist/{chunk-UMHUSOPJ.mjs → chunk-JXLSHVJ2.mjs} +1 -1
- package/dist/{chunk-VFX2KNHP.mjs → chunk-KFZBYDIS.mjs} +1 -1
- package/dist/{chunk-ZTHICSSF.mjs → chunk-KH24LWAT.mjs} +1 -1
- package/dist/{chunk-GHOYKMQ3.mjs → chunk-KUILYI7H.mjs} +1 -1
- package/dist/{chunk-5K44HLTZ.mjs → chunk-L7W624FD.mjs} +1 -1
- package/dist/{chunk-J5PUIV3Y.mjs → chunk-LE44MD3O.mjs} +1 -1
- package/dist/{chunk-4K5KC6V2.mjs → chunk-LV24RY2E.mjs} +1 -1
- package/dist/{chunk-43B75J5T.mjs → chunk-MKTX5PGV.mjs} +1 -1
- package/dist/{chunk-LKX55H76.mjs → chunk-NAGMRVW4.mjs} +1 -1
- package/dist/{chunk-DAZL73VK.mjs → chunk-NFABH3QW.mjs} +2 -2
- package/dist/{chunk-U7NZI6N4.mjs → chunk-NIW7F7LU.mjs} +2 -2
- package/dist/{chunk-PAREWQGB.mjs → chunk-NWRZXELO.mjs} +1 -1
- package/dist/{chunk-ZWWC4KLF.mjs → chunk-OU3S466R.mjs} +1 -1
- package/dist/{chunk-MN7BZL4R.mjs → chunk-PAFSFVYB.mjs} +1 -1
- package/dist/chunk-QCEATQC4.mjs +2 -0
- package/dist/{chunk-Y34NR5JL.mjs → chunk-QJ3TFJLQ.mjs} +1 -1
- package/dist/{chunk-IA4PSIMD.mjs → chunk-QK3VISCA.mjs} +1 -1
- package/dist/{chunk-7OG26PGF.mjs → chunk-QXVNUASA.mjs} +1 -1
- package/dist/{chunk-GRAXKKG4.mjs → chunk-QZ35UAB4.mjs} +1 -1
- package/dist/{chunk-AR5D57ZD.mjs → chunk-S2Y7VI4H.mjs} +2 -2
- package/dist/{chunk-HXG7EOPJ.mjs → chunk-SAHS56QM.mjs} +1 -1
- package/dist/{chunk-3MBRL2PM.mjs → chunk-SOD23RGL.mjs} +1 -1
- package/dist/chunk-TDWJKOLN.mjs +2 -0
- package/dist/{chunk-ITOH5EGO.mjs → chunk-TOE6DPLH.mjs} +1 -1
- package/dist/chunk-UGO5N3EI.mjs +15 -0
- package/dist/{chunk-4OKWZY5E.mjs → chunk-V5JRSGZF.mjs} +1 -1
- package/dist/{chunk-BZ5RAF7L.mjs → chunk-VA3KAQZD.mjs} +1 -1
- package/dist/{chunk-HDWTZ763.mjs → chunk-VG5JEIUQ.mjs} +1 -1
- package/dist/{chunk-POTA2FV4.mjs → chunk-VGTMLQWZ.mjs} +1 -1
- package/dist/{chunk-UYVCQK3H.mjs → chunk-VKSRM7EY.mjs} +1 -1
- package/dist/{chunk-ZDLPUOAG.mjs → chunk-VNUWREXU.mjs} +1 -1
- package/dist/{chunk-AGDILNWB.mjs → chunk-VPVOAJ7X.mjs} +1 -1
- package/dist/{chunk-CMA72MAG.mjs → chunk-WCWYNFDF.mjs} +1 -1
- package/dist/{chunk-ZQS6H473.mjs → chunk-WTEGUPFG.mjs} +1 -1
- package/dist/{chunk-R2ZDLJYT.mjs → chunk-XKOHV4H6.mjs} +1 -1
- package/dist/{chunk-MXUBKDRO.mjs → chunk-XMKHCUI6.mjs} +1 -1
- package/dist/{chunk-67N2QJYT.mjs → chunk-XQRUG4G3.mjs} +1 -1
- package/dist/{chunk-PGDE24N5.mjs → chunk-YBB5LWZK.mjs} +1 -1
- package/dist/{chunk-6N3PX4XX.mjs → chunk-YFJU3O7G.mjs} +1 -1
- package/dist/chunk-YPPJVDQI.mjs +2 -0
- package/dist/chunk-ZANMKAWS.mjs +2 -0
- package/dist/{chunk-6QBHU4DF.mjs → chunk-ZCP7BTOZ.mjs} +1 -1
- package/dist/{chunk-ERLAIBOA.mjs → chunk-ZEY2RLBT.mjs} +2 -2
- package/dist/{chunk-SQ6Y2ZMA.mjs → chunk-ZO7SFB2E.mjs} +2 -2
- package/dist/cli.mjs +1 -1
- package/dist/server.mjs +1 -1
- package/dist/worker.mjs +1 -1
- package/kit/math.js +1 -1
- package/kit/report.css +3 -3
- package/package.json +1 -1
- package/release.json +5 -5
- package/skill/SKILL.md +8 -7
- package/skill/references/extensions.md +11 -7
- package/web/assets/index-BHC5ZOMh.js +15 -0
- package/web/assets/index-xP0uw3a0.css +1 -0
- package/web/index.html +2 -2
- package/dist/chunk-6KBYRA2C.mjs +0 -2
- package/dist/chunk-F6HVDZR4.mjs +0 -2
- package/dist/chunk-J43Z6LSS.mjs +0 -2
- package/dist/chunk-JZT7I2OJ.mjs +0 -2
- package/dist/chunk-L2SUIS5S.mjs +0 -2
- package/dist/chunk-L7UP52JO.mjs +0 -2
- package/dist/chunk-LM4XFQHZ.mjs +0 -2
- package/dist/chunk-MTYYHM2G.mjs +0 -15
- package/dist/chunk-NAMN3RAF.mjs +0 -2
- package/dist/chunk-ORID3AE7.mjs +0 -166
- package/dist/chunk-SWUTTZCN.mjs +0 -2
- package/dist/chunk-UJQJKNGK.mjs +0 -2
- package/web/assets/index-BM_K-Auu.css +0 -1
- package/web/assets/index-DRslOBiv.js +0 -15
- /package/dist/{chunk-YEY3RSFQ.mjs → chunk-5MMN3N5J.mjs} +0 -0
- /package/dist/{chunk-UH4SIXTR.mjs → chunk-74UW7QSL.mjs} +0 -0
- /package/dist/{chunk-W7XHE4CT.mjs → chunk-EKGYYOSP.mjs} +0 -0
- /package/dist/{chunk-QAIHRH3I.mjs → chunk-KNZJT4ET.mjs} +0 -0
- /package/dist/{chunk-A55HN5OK.mjs → chunk-N3DSBH5S.mjs} +0 -0
- /package/dist/{chunk-QR6A54KJ.mjs → chunk-ZW2A6GBW.mjs} +0 -0
package/dist/chunk-ORID3AE7.mjs
DELETED
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
-
import{a as jn}from"./chunk-DR73Y2UJ.mjs";import{b as Cn}from"./chunk-JLTZF4LA.mjs";import{a as bn,i as En,j as On}from"./chunk-PUOQ65NC.mjs";import{a as $n,b as Sn}from"./chunk-7OG26PGF.mjs";import{k as Ge}from"./chunk-DJISHPUL.mjs";import{h as gn}from"./chunk-ZWWC4KLF.mjs";import{a as yn}from"./chunk-AHN3NFKJ.mjs";import{a as xn}from"./chunk-MTYYHM2G.mjs";import{a as kn,b as vn}from"./chunk-ALZ6ZENZ.mjs";import{a as wn}from"./chunk-2OHANJ6Q.mjs";import{a as fn,b as Ke,d as mn,e as un,f as pn,g as hn}from"./chunk-7M2BQQGZ.mjs";import{b as ft,e as Ht,g as mt,h as Gt,j as Kt,k as Jt}from"./chunk-UYVCQK3H.mjs";import{a as Dt,d as Lt,e as It,f as Nt,k as Mt,l as Wt,m as Ut,r as Bt,t as dt,u as zt}from"./chunk-J5PUIV3Y.mjs";import{b as nn,c as on,d as Oe,e as rn,f as an,g as He,i as sn,m as cn,p as ln,q as dn}from"./chunk-MXUBKDRO.mjs";import{d as en,e as Re,f as Be,g as ut,h as tn,k as ze}from"./chunk-6N3PX4XX.mjs";import{b as Yt,c as Xt}from"./chunk-PAREWQGB.mjs";import{i as Zt,j as Qt,k as qt}from"./chunk-BFJGHSQN.mjs";import{d as Vt}from"./chunk-U5XL7D6A.mjs";import{a as Ie}from"./chunk-VS7JIGJW.mjs";import{c as ct,g as re,j as Pt,k as Tt,p as Rt,q as Ft,v as At,w as lt}from"./chunk-HDWTZ763.mjs";import st from"node:fs";import is from"node:fs/promises";import cs from"node:http";import{editStateDirectory as ls,kitPublicDirectory as ds,release as fs,releaseFile as it,reportsDirectory as Pe,vendorDirectory as ms,workbenchDirectory as us}from"../browser/shared/paths.mjs";import{serve as Uo}from"../browser/shared/http.mjs";import{ensureWorkspace as ps,layoutOf as hs}from"../browser/shared/workspace.mjs";import ge from"node:fs/promises";import J from"node:path";import{assetFile as Ho,referencedFile as _n}from"../browser/shared/media.mjs";import{pageAssetAddress as Go}from"../browser/shared/pages.mjs";function pt(e,n){if(!/assets\//i.test(e))return e;let t=Qt(e,a=>_n(a)!==null);return Zt(e,qt(t,a=>{let s=_n(a.value);return Ho(s)?`${Go(n,s)}${/[?#].*$/.exec(a.value.trim())?.[0]??""}`:null}))}function Pn(e,{reportsDirectory:n,kit:t,slug:a=null}={}){let{html:s,packages:f}=an(a?pt(e,a):e,{reportsDirectory:n,kit:t,page:!0});return{html:s,packages:f}}import{Z as Ko}from"../browser/shared/layers.mjs";import{escapeMarkup as ht}from"../browser/shared/escape.mjs";import{layoutNotesScript as Jo}from"../browser/shared/qa-levels.mjs";var Je=30,Yo=`
|
|
3
|
-
[data-doc-dev].doc-checks { position: fixed; z-index: ${Ko.checks}; left: 12px; bottom: 12px; max-width: min(520px, calc(100vw - 24px));
|
|
4
|
-
font: 13px/1.5 system-ui, sans-serif; color: light-dark(#37352f, #e3e2e0); }
|
|
5
|
-
[data-doc-dev].doc-checks[hidden] { display: none; }
|
|
6
|
-
[data-doc-dev].doc-checks > summary { display: inline-flex; gap: 6px; align-items: center; padding: 4px 10px; border-radius: 999px; cursor: pointer;
|
|
7
|
-
list-style: none; color: light-dark(#a1352b, #f19c92); background: light-dark(#fce9e7, #3b2321);
|
|
8
|
-
box-shadow: 0 0 0 1px light-dark(rgb(161 53 43 / 18%), rgb(241 156 146 / 22%)); user-select: none; }
|
|
9
|
-
[data-doc-dev].doc-checks > summary::-webkit-details-marker { display: none; }
|
|
10
|
-
[data-doc-dev].doc-checks > div { margin-top: 6px; padding: 8px 12px; max-height: 50vh; overflow: auto; border-radius: 10px;
|
|
11
|
-
background: light-dark(#ffffff, #252525); box-shadow: 0 0 0 1px light-dark(rgb(42 28 0 / 7%), #383836), 0 20px 24px light-dark(rgb(25 25 25 / 5%), rgb(0 0 0 / 20%)); }
|
|
12
|
-
[data-doc-dev].doc-checks ul { margin: 0; padding-left: 18px; }
|
|
13
|
-
[data-doc-dev].doc-checks li { margin: 2px 0; overflow-wrap: anywhere; }
|
|
14
|
-
[data-doc-dev].doc-checks p { margin: 6px 0 0; color: light-dark(#787774, #9b9a97); }
|
|
15
|
-
[data-doc-dev].doc-checks .doc-checks-live:not(:first-child) { margin-top: 8px; }
|
|
16
|
-
@media print { [data-doc-dev].doc-checks { display: none; } }`,Xo=`(() => {
|
|
17
|
-
document.currentScript.remove();
|
|
18
|
-
${Jo()}
|
|
19
|
-
const panel = document.querySelector("details.doc-checks[data-doc-dev]");
|
|
20
|
-
if (!panel) return;
|
|
21
|
-
const failures = Number(panel.dataset.failures) || 0;
|
|
22
|
-
const live = panel.querySelector(".doc-checks-live ul");
|
|
23
|
-
// The note's words in the UI's language (the root's data-ge-language).
|
|
24
|
-
const english = document.documentElement.getAttribute("data-ge-language") === "en";
|
|
25
|
-
const WORDS = english
|
|
26
|
-
? { card: "Chart card", table: "Table", named: (kind, name) => kind + " \u201C" + name + "\u201D", first: (name) => "Table (first column \u201C" + name + "\u201D)", colon: ": ",
|
|
27
|
-
failing: (count) => "Checks failed \xB7 " + count, more: (count) => count + " more", all: (slug) => "gallery check " + slug + " runs every check (TypeScript too)." }
|
|
28
|
-
: { card: "\u56FE\u8868\u5361\u7247", table: "\u8868\u683C", named: (kind, name) => kind + "\u300C" + name + "\u300D", first: (name) => "\u8868\u683C\uFF08\u9996\u5217\u300C" + name + "\u300D\uFF09", colon: "\uFF1A",
|
|
29
|
-
failing: (count) => "\u68C0\u67E5\u672A\u901A\u8FC7 \xB7 " + count + " \u9879", more: (count) => "\u8FD8\u6709 " + count + " \u9879", all: (slug) => "gallery check " + slug + " \u8DD1\u5168\u90E8\u68C0\u67E5\uFF08\u542B TypeScript\uFF09\u3002" };
|
|
30
|
-
const more = panel.querySelector("[data-more]");
|
|
31
|
-
if (more) more.textContent = WORDS.more(more.dataset.more);
|
|
32
|
-
const all = panel.querySelector("[data-all]");
|
|
33
|
-
if (all) all.textContent = WORDS.all(all.dataset.all);
|
|
34
|
-
const tidy = (node) => (node?.textContent ?? "").replace(/\\s+/g, " ").trim().slice(0, 40);
|
|
35
|
-
const what = (host) => {
|
|
36
|
-
const card = host.closest("figure");
|
|
37
|
-
const title = card?.querySelector(":scope > h3, :scope > figcaption");
|
|
38
|
-
const table = host.closest(".doc-table-wrap, table");
|
|
39
|
-
const caption = table?.querySelector("caption");
|
|
40
|
-
const header = table?.querySelector("th");
|
|
41
|
-
return title ? WORDS.named(WORDS.card, tidy(title)) : card ? WORDS.card : caption && tidy(caption) ? WORDS.named(WORDS.table, tidy(caption)) : header ? WORDS.first(tidy(header)) : host.localName;
|
|
42
|
-
};
|
|
43
|
-
// A chart that drew nothing says why in its card (the kit's line, in the same language): that line, else the note in words.
|
|
44
|
-
const said = (host, name, note) => (name === "data-missing" && tidy(host.querySelector(".doc-chart-message"))) || noteInWords(note, { english });
|
|
45
|
-
let shown = "";
|
|
46
|
-
let frame = 0;
|
|
47
|
-
const draw = () => {
|
|
48
|
-
frame = 0;
|
|
49
|
-
const notes = [...document.querySelectorAll("[data-doc-layout]")].filter((host) => !host.closest("[data-doc-dev]"))
|
|
50
|
-
.flatMap((host) => layoutNotesOf(host.getAttribute("data-doc-layout"), document.documentElement.clientWidth)
|
|
51
|
-
.filter(({ level }) => level === "fail")
|
|
52
|
-
.map(({ note, name }) => ({ line: what(host) + WORDS.colon + said(host, name, note), note })));
|
|
53
|
-
const key = notes.map(({ line }) => line).join("\\n");
|
|
54
|
-
if (key === shown) return;
|
|
55
|
-
shown = key;
|
|
56
|
-
live.replaceChildren(...notes.map(({ line, note }) => Object.assign(document.createElement("li"), { textContent: line, title: note })));
|
|
57
|
-
live.parentElement.hidden = notes.length === 0;
|
|
58
|
-
const failing = failures + notes.length;
|
|
59
|
-
panel.querySelector("summary").textContent = failing ? WORDS.failing(failing) : "";
|
|
60
|
-
panel.hidden = failing === 0;
|
|
61
|
-
};
|
|
62
|
-
const later = (records) => {
|
|
63
|
-
if (!globalThis.document?.defaultView) return; // the page is gone
|
|
64
|
-
if (!frame && records.some((record) => !record.target.closest?.("[data-doc-dev]"))) frame = requestAnimationFrame(draw);
|
|
65
|
-
};
|
|
66
|
-
new MutationObserver(later).observe(document.documentElement, { subtree: true, childList: true, attributes: true, attributeFilter: ["data-doc-layout"] });
|
|
67
|
-
addEventListener("resize", () => { if (!frame) frame = requestAnimationFrame(draw); });
|
|
68
|
-
draw();
|
|
69
|
-
})();`;function Tn(e,n,t={},{directory:a}={}){let s=sn({slug:e,html:n,metadata:t,...a?{directory:a}:{}}),f=s.slice(0,Je).map(h=>`<li>${ht(h)}</li>`).join(""),r=s.length>Je?`<p data-more="${s.length-Je}">\u8FD8\u6709 ${s.length-Je} \u9879</p>`:"",m=s.length?`<ul>${f}</ul>${r}<p data-all="${ht(e)}">gallery check ${ht(e)} \u8DD1\u5168\u90E8\u68C0\u67E5\uFF08\u542B TypeScript\uFF09\u3002</p>`:"";return`<details class="doc-checks" data-doc-dev data-failures="${s.length}"${s.length?"":" hidden"}><summary>${s.length?`\u68C0\u67E5\u672A\u901A\u8FC7 \xB7 ${s.length} \u9879`:""}</summary><div>${m}<div class="doc-checks-live" hidden><ul></ul></div></div><style>${Yo}</style></details>
|
|
70
|
-
<script data-doc-dev>${Xo}</script>`}import{browserDirectory as wa,editStateDirectory as ya,kitSourceDirectory as Po,release as ka,reportsDirectory as D}from"../browser/shared/paths.mjs";import{FRAMED_BY as va,sendJson as go,serve as Ot,serveFound as Ae}from"../browser/shared/http.mjs";import{languageScript as wo}from"../browser/shared/i18n/index.mjs";import{announcePreviewServer as xa,galleryVersion as $a}from"../browser/shared/preview-server.mjs";import{registerQuietly as Sa}from"../browser/shared/workspace-registry.mjs";import{lookWord as yo}from"../browser/shared/document-look.mjs";import{documentLook as ko,ownLookAt as ba}from"../browser/shared/workspace-look.mjs";import{slugPattern as To}from"../browser/shared/reports.mjs";import{ATTRIBUTE as ot,PACKAGE_ID as Ea}from"../browser/shared/components/installed.mjs";import{COMPONENTS_FOLDER as vo,DOCUMENT_FOLDERS as xo,EXTENSIONS_FOLDER as Oa,PAGES_FOLDER as Ca,WORKSPACE_FILE as rt,documentDirectory as bt,documentFiles as ja,isDocumentFile as _a,isDocumentSource as $o,isSlugName as Ro,layoutOf as Pa}from"../browser/shared/workspace.mjs";import{PAGE_FILES as So,homeCardsNew as Ta,isBlankPage as Ra,isPageFile as Fa,pageFiles as bo,pageHintShown as Aa,pageMetaNow as Da,pageVersion as Eo}from"../browser/shared/pages.mjs";import{LINK_FILE as La}from"../browser/shared/web-links.mjs";import{SIDEBAR_FILE as Oo}from"../browser/shared/extension-sidebar.mjs";import{extensionColumnIds as Co}from"../browser/shared/extensions.mjs";import{isExtensionId as Ia}from"../browser/shared/outline-shape.mjs";import{createHash as lr,randomBytes as dr}from"node:crypto";import Q from"node:fs";import gt from"node:os";import he from"node:path";import{Transform as fr}from"node:stream";import{pipeline as mr}from"node:stream/promises";import{exportSourceOf as ur}from"../browser/shared/export-wrap.mjs";import{writeAtomic as wt}from"../browser/shared/files.mjs";import{sendJson as K}from"../browser/shared/http.mjs";import{said as yt,saying as pr}from"../browser/shared/i18n/index.mjs";import{IMPORT_LIMIT as Ln}from"../browser/shared/import-types.mjs";import{mediaUrl as hr}from"../browser/shared/media.mjs";import{fullAddress as gr}from"../browser/shared/page-address.mjs";import{documentLinks as In,slugPattern as Nn}from"../browser/shared/reports.mjs";import{documentDirectory as wr,documentFiles as Mn,newDocSlug as yr,pageSlug as kr}from"../browser/shared/workspace.mjs";import{readWritingPreferences as vr,saysAnything as xr,unshownLines as $r}from"../browser/shared/writing-preferences.mjs";import Rn from"node:fs/promises";import or from"node:path";import{Worker as Vo}from"node:worker_threads";import{refusal as Zo,said as Qo}from"../browser/shared/i18n/index.mjs";var qo=6e4,me=null,er=0,Ye=0,Ce=new Map;function tr(){me=new Vo(new URL("./worker.mjs",import.meta.url)),me.on("message",({id:n,result:t,error:a})=>{let s=Ce.get(n);s&&(Ce.delete(n),a?s.reject(Object.assign(new Error(a.message),a)):s.resolve(t),Ce.size===0&&(me?.unref(),nr()))});let e=n=>{for(let t of Ce.values())t.reject(n);Ce.clear(),me=null};me.on("error",e),me.on("exit",n=>e(Zo(Qo("\u8F6C\u6362\u8FDB\u7A0B\u610F\u5916\u9000\u51FA\uFF08{0}\uFF09",n))))}function nr(){clearTimeout(Ye),Ye=setTimeout(()=>{if(Ce.size===0&&me){let e=me;me=null,e.removeAllListeners("exit"),e.terminate()}},qo),Ye.unref?.()}function ve(e,n){clearTimeout(Ye),me||tr();let t=++er;return new Promise((a,s)=>{Ce.set(t,{resolve:a,reject:s}),me.ref(),me.postMessage({id:t,type:e,payload:n})})}import{pageLanguage as rr}from"../browser/shared/components/page.mjs";function Xe(e){return String(e??"").replace(/[\\/:*?"<>|\u0000-\u001f\u007f]/g," ").replace(/\s+/g," ").trim().slice(0,100).trim()||"Untitled"}function Ve(e,n){let t=e.lastIndexOf("."),[a,s]=t>0?[e.slice(0,t),e.slice(t)]:[e,""];for(let f=0;;f+=1){let r=f===0?e:`${a} ${f}${s}`;if(!n.has(r.toLowerCase()))return n.add(r.toLowerCase()),r}}function Ze(e,n){let t=e.split("/").slice(0,-1),a=n.split("/"),s=0;for(;s<t.length&&s<a.length-1&&t[s]===a[s];)s+=1;return[...t.slice(s).map(()=>".."),...a.slice(s)].map(r=>r===".."?r:encodeURIComponent(r).replace(/\(/g,"%28").replace(/\)/g,"%29")).join("/")}import{documentDirectory as ar,documentFiles as sr}from"../browser/shared/workspace.mjs";var Fn={markdown:"md",html:"html",pdf:"pdf"},ir={markdown:"text/markdown; charset=utf-8",html:"text/html; charset=utf-8",pdf:"application/pdf"},cr=e=>typeof e=="number"&&e>.1&&e<2;function An(e){let{format:n,content:t="everything",subpages:a=!1,folders:s=!0,paper:f="A4",scale:r=1}=e??{};return Object.hasOwn(Fn,n)&&["everything","no_files"].includes(t)&&typeof a=="boolean"&&typeof s=="boolean"&&["A4","A3","Letter","Legal","Tabloid"].includes(f)&&cr(r)}async function Dn(e,n,t){let{format:a,content:s="everything",subpages:f=!1,folders:r=!0,paper:m="A4",scale:l=1}=n,h=Fn[a],w=s==="everything",i=[],k=new Map,R=v=>k.get(v)??k.set(v,new Set).get(v),u=async(v,b)=>{let B=await t.titleOf(v),H=Ve(`${Xe(B)}.${h}`,R(b)),z=b?`${b}/${H}`:H,L=r?z.slice(0,-(h.length+1)):"";if(i.push({slug:v,title:B,file:z,folder:L,files:b?`${b}/assets`:"assets"}),f)for(let ae of await t.childrenOf(v))await u(ae,L)};await u(e,"");let{links:F}=await t.links(),S=(v,b)=>on(b,v.slug,B=>{let H=a==="pdf"?null:i.find(z=>z.slug===B)?.file??null;return H&&Ze(v.file,H)},{blocks:a!=="markdown",links:F}),x=[],Y=[];for(let v of i)if(a==="markdown"){await t.check(v.slug);let b=ar(v.slug,t.reportsDirectory),B=Oe(await Rn.readFile(sr(b).html,"utf8"),{slug:v.slug,mode:"words",reportsDirectory:t.reportsDirectory}),H=S(v,B),z=w&&!!bn(),{text:L,files:ae,charts:ne,charted:U}=await ve("markdown",{source:H,title:v.title,pictures:z}),G=L,ce=new Map;if(ae.forEach(({src:p,name:g},E)=>{ce.has(p)||(ce.set(p,`${v.files}/${Ve(Xe(g),R(v.files))}`),w&&Y.push({from:or.join(b,p),name:ce.get(p)}));let C=ce.get(p);G=G.replace(`\0F${E}\0`,()=>Ze(v.file,C))}),z&&ne>0&&G.includes("\0C")){let p=await On(await t.offline(v.slug,{files:!0})).catch(()=>[]);G=G.replace(/^.*\u0000C(\d+)\u0000.*$/gm,(g,E)=>{let C=p[Number(E)];if(!C)return"\0gone\0";let _=`${v.files}/${Ve(rr(H)==="en"?U[Number(E)]?"Chart.png":"Figure.png":U[Number(E)]?"\u56FE\u8868.png":"\u56FE.png",R(v.files))}`;return x.push({name:_,data:C,later:!0}),g.replace(`\0C${E}\0`,()=>Ze(v.file,_))}).replace(/\n*\u0000gone\u0000\n*/g,`
|
|
71
|
-
|
|
72
|
-
`).replace(/^\n+|\n+$/g,"")}x.push({name:v.file,data:G})}else a==="html"?x.push({name:v.file,data:S(v,await t.offline(v.slug,{files:w}))}):x.push({name:v.file,data:await En(S(v,await t.offline(v.slug,{files:w})),{paper:m,scale:l})});for(let v of Y){let b=await Rn.readFile(v.from).catch(()=>null);b&&x.push({name:v.name,data:b})}let W=[...x.filter(v=>!v.later&&i.some(b=>b.file===v.name)),...x.filter(v=>v.later||!i.some(b=>b.file===v.name))];return W.length===1?{name:W[0].name,type:ir[a],data:Buffer.isBuffer(W[0].data)?W[0].data:Buffer.from(W[0].data,"utf8")}:{name:`${Xe(i[0].title)}.zip`,type:"application/zip",data:wn(W)}}var Sr=3600*1e3,kt=new Set,Wn=!1,br=e=>{kt.add(e),!Wn&&(Wn=!0,process.once("exit",()=>{for(let n of kt)try{Q.rmSync(n,{recursive:!0,force:!0})}catch{}}))},Er=/^u-[a-f0-9]{16}$/;function Un({edits:e,workspace:n,reports:t,reportsDirectory:a,offline:s}){let f=null,r=()=>f??=Q.promises.mkdtemp(he.join(gt.tmpdir(),"gallery-uploads-")).then(p=>(br(p),p)),m=new Map,l=(p,g,E)=>[p,{ok:!1,reason:g,...pr(E)}],h=p=>Q.promises.access(p).then(()=>!0,()=>!1),w=p=>wr(p,a),i=p=>Mn(w(p)),k=async p=>{try{return JSON.parse(await Q.promises.readFile(i(p).json,"utf8")).title||p}catch{return p}};function R(p){if(p.method!=="POST")return[405,{ok:!1,reason:"method"}];let g=p.headers.host??"",E=p.socket.localPort;return g!==`127.0.0.1:${E}`&&g!==`localhost:${E}`?[403,{ok:!1,reason:"host"}]:p.headers.origin!==`http://${g}`?[403,{ok:!1,reason:"origin"}]:p.headers["x-gallery-token"]!==e.token?[403,{ok:!1,reason:"token"}]:/^application\/octet-stream\b/i.test(p.headers["content-type"]??"")?Number(p.headers["content-length"]??0)>Ln?l(413,"size","\u6587\u4EF6\u592A\u5927\uFF08\u6700\u591A 5GB\uFF09"):null:[415,{ok:!1,reason:"type"}]}async function u(){for(let[p,g]of m)Date.now()-g.at<Sr||(m.delete(p),await Q.promises.rm(g.file,{force:!0}).catch(()=>{}))}async function F(p,g){let E=R(p);if(E)return p.resume(),K(g,...E);let C=new URL(p.url,"http://localhost").searchParams.get("name")?.replace(/[\u0000-\u001f]/g,"").trim()??"";if(!C||C.length>255)return p.resume(),K(g,...l(400,"name","\u6587\u4EF6\u540D\u4E0D\u5BF9"));await u();let _=`u-${dr(8).toString("hex")}`,j=he.join(await r(),_),N=0,A=new fr({transform(I,Z,X){N+=I.length,X(N>Ln?Object.assign(new Error("too-large"),{reason:"size"}):null,I)}});try{await mr(p,A,Q.createWriteStream(j))}catch(I){return await Q.promises.rm(j,{force:!0}).catch(()=>{}),I.reason==="size"?K(g,...l(413,"size","\u6587\u4EF6\u592A\u5927\uFF08\u6700\u591A 5GB\uFF09")):K(g,...l(400,"body","\u6587\u4EF6\u6CA1\u6709\u4F20\u5B8C"))}return m.set(_,{file:j,name:C,at:Date.now()}),K(g,200,{ok:!0,id:_})}async function S(p,g){let E=await e.check(p);if(E.error)return K(g,...E.error);let{slug:C,options:_}=E.body??{};if(typeof C!="string"||!Nn.test(C)||!await h(i(C).html))return K(g,...l(404,"missing","\u627E\u4E0D\u5230\u8FD9\u4EFD\u6587\u6863"));if(!An(_))return K(g,...l(400,"options","\u5BFC\u51FA\u9009\u9879\u4E0D\u5BF9"));try{let j=await s(),N=new Map,A=P=>(N.has(P)||N.set(P,e.handIn(P,{reader:!0}).then(M=>{if(!M.ok)throw Object.assign(new Error(M.message??M.reason),{reason:M.reason});if(M.repeated.length)throw Object.assign(new Error("check"),{reason:"check",slug:P,failures:He(M.repeated)})})),N.get(P)),I=new Map,Z={reportsDirectory:a,titleOf:k,childrenOf:async P=>{let{children:M,links:se=[]}=await n.outline(),oe=we=>(M[we]??[]).flatMap(ye=>se.includes(ye)||ye.startsWith("~")?oe(ye):[ye]);return oe(P)},links:()=>In(a),offline:async(P,M)=>{await A(P);let se=await j(P,M),oe=_.format==="markdown"?null:ur(se);return oe&&I.set(P,oe),se},check:async P=>(await A(P),j.check(P))},{name:X,type:V,data:q}=await Dn(C,_,Z);I.size&&await(await Ge([...I.keys()])).keep([...I.keys()],I),g.writeHead(200,{"Content-Type":V,"Content-Length":q.length,"Content-Disposition":`attachment; filename*=UTF-8''${encodeURIComponent(X)}`,"X-File-Name":encodeURIComponent(X),"Cache-Control":"no-store"}),g.end(q)}catch(j){if(j.reason==="check"){let N=await k(j.slug),A=j.component?yt("\u300C{0}\u300D\u91CC\u7684\u7EC4\u4EF6 {1} \u6709\u9519\u8BEF\uFF0C\u6CA1\u6709\u751F\u6210\u6587\u4EF6\uFF1A\u53EF\u4EE5\u8BA9 AI \u68C0\u67E5\u8FD9\u4EFD\u6587\u6863\u5E76\u4FEE\u597D",N,j.component):j.failures.length>1?yt("\u300C{0}\u300D\u6CA1\u6709\u901A\u8FC7\u5BFC\u51FA\u524D\u7684\u68C0\u67E5\uFF0C\u6CA1\u6709\u751F\u6210\u6587\u4EF6\uFF1A{1}\uFF08\u5171 {2} \u5904\uFF1A\u53EF\u4EE5\u8BA9 AI \u68C0\u67E5\u8FD9\u4EFD\u6587\u6863\uFF0C\u5217\u51FA\u5168\u90E8\u5E76\u4FEE\u597D\uFF09",N,j.failures[0],j.failures.length):yt("\u300C{0}\u300D\u6CA1\u6709\u901A\u8FC7\u5BFC\u51FA\u524D\u7684\u68C0\u67E5\uFF0C\u6CA1\u6709\u751F\u6210\u6587\u4EF6\uFF1A{1}",N,j.failures[0]);return K(g,...l(422,"check",A))}K(g,...l(j.reason==="browser"?422:j.reason==="busy"?409:j.reason==="missing"?404:500,j.reason??"export",j))}}async function x(p,g){let E=await e.check(p);if(E.error)return K(g,...E.error);let{slug:C}=E.body??{},_=(await e.readTaken(C,{wait:0}))?.text??null;if(_===null)return K(g,...l(404,"missing","\u627E\u4E0D\u5230\u8FD9\u4EFD\u6587\u6863"));let j=`http://${p.headers.host}`,{named:N}=await In(a),A=nn(Oe(_,{slug:C,mode:"words",reportsDirectory:a}),C,V=>V.slug&&gr(j,V,N),N),{text:I,files:Z}=await ve("markdown",{source:A,title:await k(C),pictures:!1}),X=I.replace(/\u0000F(\d+)\u0000/g,(V,q)=>{let{src:P,kind:M}=Z[Number(q)];return encodeURI(`${j}${hr(M==="image"?"asset":"file",C,P)}`)});return K(g,200,{ok:!0,text:X})}let Y=async p=>{let g=await e.readTaken(p,{wait:0});return{source:g?.text??"",version:g?.version??null}},W=async(p,g=null)=>{let{source:E,version:C}=g??await Y(p),_="\u5199\u4F5C\u504F\u597D",{text:j,files:N}=await ve("markdown",{source:E,title:_,pictures:!1}),A=j.split(`
|
|
73
|
-
`).slice(1).join(`
|
|
74
|
-
`).replace(/^[\s>]*(?:```.*|\d+\.|- \[x\])/gm,"").replace(/<\/?aside>/g,"");if(!/[\p{L}\p{N}]|\u0000F\d+\u0000/u.test(A))return{markdown:`# ${_}
|
|
75
|
-
`,empty:!0,version:C};let I=he.relative(a,w(p)).split(he.sep).join("/");return{markdown:`${j.replace(/\u0000F(\d+)\u0000/g,(Z,X)=>encodeURI(`${I}/${N[Number(X)].src}`))}
|
|
76
|
-
`,empty:!1,version:C}},v=p=>i(p).json,b=async p=>{try{let g=JSON.parse(await Q.promises.readFile(v(p),"utf8"));return g&&typeof g=="object"?g:null}catch{return null}},B=p=>lr("sha256").update(p).digest("hex").slice(0,16);async function H(p,g,E,C){let _=await b(p);if(!_||E===null)return;let{synced:j,...N}=_,A={file:B(g),page:E,unshown:C},I=_.madeSame;j===void 0&&I?.file===A.file&&I?.page===A.page&&JSON.stringify(I?.unshown)===JSON.stringify(C)||await wt(v(p),`${JSON.stringify({...N,madeSame:A},null,2)}
|
|
77
|
-
`)}async function z(p,g){let E=await Q.promises.mkdtemp(he.join(gt.tmpdir(),"gallery-preferences-"));try{let _=(await ve("import",{uploads:[{file:g,name:"preferences.md"}],scratch:E})).pages[0]??{nodes:[],raws:[],files:[],icon:null,lang:null},j=w(p),N=await b(p)??{},A=Mn(j).html,I=await Q.promises.readFile(A,"utf8").catch(()=>""),Z=/<html\b[^>]*\slang="([^"]*)"/i.exec(I)?.[1]??null,{html:X}=await Xt(p,N.title||"\u5199\u4F5C\u504F\u597D",N.description||"",{blank:!0,lang:Z}),V=typeof N.icon=="string"&&N.icon?N.icon:null,q=await ve("fill",{source:X,nodes:_.nodes,icon:V,raws:_.raws,lang:_.lang});_.files.length&&await Q.promises.mkdir(he.join(j,"assets"),{recursive:!0});for(let{from:M,name:se}of _.files){let oe=he.join(j,"assets",se);await h(oe)||await Q.promises.copyFile(M,oe)}let P=await Q.promises.readFile(A,"utf8").catch(()=>null);P!==null&&e.keepVersion?.(p,P),await wt(A,ze(q))}finally{await Q.promises.rm(E,{recursive:!0,force:!0}).catch(()=>{})}}async function L(p,g){let E=await e.check(p);if(E.error)return K(g,...E.error);let C=E.body?.opening===!0,_=await kr(a);if(!_)return K(g,...l(404,"missing","\u8FD8\u6CA1\u6709\u5199\u4F5C\u504F\u597D"));let j=null,N=(A,I)=>[200,{ok:!0,path:he.resolve(j),remade:A,unshown:I}];return e.respond(async()=>{let A;({file:j,text:A}=await vr(a));let I=await Y(_),Z=(await b(_))?.madeSame??null,X=Z===null||Z.page===I.version,V=Z!==null&&X&&Z.file===B(A);if(C&&V&&Array.isArray(Z.unshown))return N(!1,Z.unshown);let[q,P,M,se]=[A,"",I.version,!1];if(C&&!X)await z(_,j),{markdown:P,version:M}=await W(_),se=!0;else{let we=await W(_,I),ye=A.trim()===we.markdown.trim()||we.empty&&!xr(A);P=we.markdown,C?!ye&&!V&&(await z(_,j),{markdown:P,version:M}=await W(_),se=!0):ye||(await wt(j,we.markdown),q=we.markdown)}let oe=$r(q,P);return await H(_,q,M,oe),N(se,oe)})(p,g)}async function ae(p,g){let E=await e.check(p);if(E.error)return K(g,...E.error);let{uploads:C,parent:_="",from:j,language:N}=E.body??{},A={said:typeof j=="string"&&j.includes("{0}")&&j.length<=60?j:"\u5BFC\u5165\u81EA {0}",lang:N==="en"?"en":null};if(!Array.isArray(C)||C.length===0||C.length>1e3||!C.every(P=>typeof P=="string"&&Er.test(P)))return K(g,...l(400,"body"));let I=C.map(P=>m.get(P)).filter(Boolean);if(I.length!==C.length)return K(g,...l(410,"gone","\u4E0A\u4F20\u7684\u6587\u4EF6\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u5BFC\u5165"));for(let P of C)m.delete(P);let Z=typeof _=="string"&&Nn.test(_)&&await h(he.join(a,_))?_:"",X=await Q.promises.mkdtemp(he.join(gt.tmpdir(),"gallery-import-")),V=()=>Promise.all([Q.promises.rm(X,{recursive:!0,force:!0}),...I.map(({file:P})=>Q.promises.rm(P,{force:!0}))]).catch(()=>{}),q;try{q=await ve("import",{uploads:I.map(({file:P,name:M})=>({file:P,name:M})),scratch:X})}catch(P){return await V(),K(g,...l(500,"convert",P))}return e.respond(async()=>{try{let{made:P,top:M}=await yn(q.pages,{create:t.create,slugOf:()=>yr(a),folderOf:w,fill:se=>ve("fill",se),place:n.place,under:Z,...A});return[200,{ok:!0,pages:P.length,reports:M,skipped:q.skipped,missing:ne(q.pages)}]}finally{await V()}})(p,g)}let ne=p=>[...new Set(p.flatMap(function g(E){return[...(E.notes??[]).filter(C=>C.kind==="picture-missing").map(C=>C.name),...E.children.flatMap(g)]}))],U={export:S,markdown:x,upload:F,import:ae,preferences:L};function G(p,g,E){return Object.hasOwn(U,E)?U[E](p,g).catch(C=>{g.headersSent||K(g,...l(500,"transfer",C))}):K(g,404,{ok:!1,reason:"unknown"})}async function ce(){let p=f;f=null,m.clear();let g=await p?.catch(()=>null);g&&(kt.delete(g),await Q.promises.rm(g,{recursive:!0,force:!0}).catch(()=>{}))}return{handle:G,close:ce}}import{FACT_KINDS as Na,QUERY_ROUTE as Ma,WORKSPACE_GLOBAL as Wa}from"../browser/shared/workspace-query.mjs";function Bn({settled:e,tell:n,delay:t=120,recheck:a=1e3}){let s=new Map,f=(r,m=t)=>{clearTimeout(s.get(r));let l=setTimeout(async()=>{let h=await e(r).catch(()=>({source:null,held:!1,wait:0}));if(s.get(r)===l){if(h.held)return f(r,Math.min(Math.max(h.wait,50),a));if(h.wait>0)return f(r,h.wait);await n(r,h)}},m);s.set(r,l)};return f}import Or from"node:fs/promises";import{packageScript as Cr}from"../browser/shared/export-wrap.mjs";import{serveFound as jr}from"../browser/shared/http.mjs";import{extensionOf as _r,mediaTypeOf as Pr}from"../browser/shared/media.mjs";var Tr="/__gallery/components/",Rr=/^\/__gallery\/components\/([a-z0-9][a-z0-9-]*\/[a-z0-9][a-z0-9-]*)\/(.+)$/,Fr={js:"text/javascript; charset=utf-8",mjs:"text/javascript; charset=utf-8",css:"text/css; charset=utf-8",wasm:"application/wasm"};async function zn(e,n,t,{root:a}){if(!e.startsWith(Tr))return!1;let[,s,f]=Rr.exec(e)??[],r=s?re(a).packages.get(s):null,m=r?.files.includes(f)?Rt(r,f):null,l=m?await Or.readFile(m).catch(()=>null):null,h=l&&f==="kit.js"?Buffer.from(Cr(l.toString("utf8").replace(/^\uFEFF/,""))):l,w=h&&n===r.stamp&&n===Ft(r);return jr(t,h,{type:h?Fr[_r(f)]??Pr(f):void 0,headers:{"X-Content-Type-Options":"nosniff","Cache-Control":w?"max-age=31536000, immutable":"no-store"}}),!0}import{BLOCK_ICON as Ar}from"../browser/editor/components/icons.mjs";import{LISTED_BLOCKS as Hn}from"../browser/editor/components/registry.mjs";import{PACKAGE_ID as Dr}from"../browser/shared/components/installed.mjs";import{netHostsOf as Gn}from"../browser/shared/net-policy.mjs";import{inLanguage as Kn,refusal as Qe,said as be}from"../browser/shared/i18n/index.mjs";function Jn({root:e,taken:n}){let t=()=>{let r=re(e);return{packages:At(r).map(m=>{let l=Nt(m.id)?It(m.id):null;return{...m,newer:l?Mt(e,l):null,...l?{addAs:l.pack===Dt?l.name:l.id}:{}}}),packs:dt(e,{settings:r.settings}),packageIcon:Ar,blocks:Hn.map(({id:m,name:l,icon:h,hideable:w})=>({id:m,name:{zh:Kn("zh",l),en:Kn("en",l)},icon:h,hidden:w&&r.settings.hidden.includes(m),hideable:w})),problem:Tt(r)}},a=({id:r,hidden:m,shown:l,disabled:h,unlisted:w,net:i})=>{if(![m,l,h,w,i].every(R=>R===void 0||typeof R=="boolean"))return be("\u5F00\u5173\u7684\u503C\u4E0D\u5BF9");let k=Hn.find(R=>R.id===r);return k?h!==void 0||l!==void 0||w!==void 0||i!==void 0?be("\u5185\u7F6E\u5757\u53EA\u80FD\u9690\u85CF\uFF0C\u4E0D\u80FD\u505C\u7528"):m&&!k.hideable?be("\u8FD9\u4E2A\u5757\u4E0D\u80FD\u9690\u85CF"):null:typeof r=="string"&&Dr.test(r)?i&&Gn(re(e).packages.get(r)?.needs).length===0?be("\u8FD9\u4E2A\u5757\u4E0D\u8054\u7F51"):null:be("\u6CA1\u6709\u8FD9\u4E2A\u7EC4\u4EF6")};return{read:t,write:async r=>{if(r?.pack!==void 0){let{pack:i,enabled:k}=r;if(typeof k!="boolean")throw Qe(be("\u5F00\u5173\u7684\u503C\u4E0D\u5BF9"));if(typeof i!="string"||!dt(e,{settings:re(e).settings}).some(({id:R})=>R===i))throw Qe(be("\u6CA1\u6709\u8FD9\u4E2A\u5757\u5305"));return await ct(e,{pack:i,enabled:k}),n(),t()}let m=a(r);if(m)throw Qe(m);let{net:l,...h}=r,w=l===void 0?void 0:l?Gn(re(e).packages.get(r.id)?.needs):[];return await ct(e,{...h,...w?{net:w}:{}}),n(),t()},install:({path:r,zip:m}={})=>{let l=typeof m=="string"?Sn(Buffer.from(m,"base64")):typeof r=="string"&&r.trim()?$n(r):null;if(!l)throw Qe(be("\u7C98\u8D34\u5757\u5305\u7684\u6587\u4EF6\u5939\u6216 zip \u7684\u8DEF\u5F84"),{code:"path"});let h=Bt(e,l);return n(),{...t(),installed:h}}}}import Lr from"node:path";import{exportsDirectory as Ir}from"../browser/shared/paths.mjs";async function Yn(e,n,{workspace:t=null}={}){let a=Lr.join(Ir,`${n}.html`),s=await Ge([n]),f=await e.handInReport(n,{reader:!0});if(!f.ok)return{problems:[],refused:{reason:f.reason,message:f.message},file:a};if(f.repeated.length)return{problems:He(f.repeated),file:a};let{exported:r,failures:m}=await dn([n],{workspace:t});return await s.keep(r.map(l=>l.slug)),{problems:m.get(n)??[],file:a}}import Xn from"node:fs/promises";import Vn from"node:path";import{MEDIA_ROUTES as Zn,assetFile as Nr,extensionOf as Mr,imageFile as Wr,mediaTypeOf as Ur}from"../browser/shared/media.mjs";import{serveFound as Qn}from"../browser/shared/http.mjs";import{slugPattern as qn}from"../browser/shared/reports.mjs";import{pageFiles as Br}from"../browser/shared/pages.mjs";import{documentDirectory as zr}from"../browser/shared/workspace.mjs";var vt={asset:e=>({"Content-Type":Ur(e),"Cache-Control":"no-cache"}),file:()=>({"Content-Type":"application/octet-stream","Content-Disposition":"attachment","X-Content-Type-Options":"nosniff","Cache-Control":"no-cache"}),embed:e=>/\.pdf$/i.test(e)?{"Content-Type":"application/pdf","X-Content-Type-Options":"nosniff","Cache-Control":"no-cache"}:{"Content-Type":"text/html; charset=utf-8","Content-Security-Policy":"sandbox allow-scripts allow-popups allow-forms allow-modals","X-Content-Type-Options":"nosniff","Cache-Control":"no-cache"}},Hr=new RegExp(`^/__gallery/edit/(${Object.keys(Zn).join("|")})/([^/]+)/(assets/[^/]+)$`);async function eo(e,n,{reportsDirectory:t}){let[,a,s,f]=Hr.exec(e)??[];if(!a)return!1;let r=qn.test(s)&&Zn[a](f)?await Xn.readFile(Vn.join(zr(s,t),f)).catch(()=>null):null;return Qn(n,r,{headers:vt[a](f)}),!0}var Gr={css:"text/css; charset=utf-8",js:"text/javascript; charset=utf-8",mjs:"text/javascript; charset=utf-8"},Kr=/^\/pages\/([^/]+)\/(assets\/[^/]+)$/;async function to(e,n,{reportsDirectory:t}){let[,a,s]=Kr.exec(e)??[];if(!a)return!1;let f=qn.test(a)&&Nr(s)?await Xn.readFile(Vn.join(Br(a,t).folder,s)).catch(()=>null):null,r=Gr[Mr(s??"")];return Qn(n,f,{headers:r?{"Content-Type":r,"X-Content-Type-Options":"nosniff","Cache-Control":"no-cache"}:(Wr(s)?vt.asset:vt.file)(s)}),!0}import Jr from"node:dns";import{sendJson as Fe}from"../browser/shared/http.mjs";import{createNetCache as Yr,dataOf as Xr}from"../browser/shared/net-cache.mjs";import{readKeys as Vr}from"../browser/shared/net-keys.mjs";import{addressKind as et,addressOf as lo,hostIn as no,keptHere as oo,keyIn as ro,mapsHere as Zr,netHostsOf as Qr,proxyHere as qr,withKey as ea}from"../browser/shared/net-policy.mjs";import{galleryVersion as ta}from"../browser/shared/preview-server.mjs";var qe=512*1024,na=6e4,ao=20,so=5,io=1e4,oa=16*1024,ra=new Set([301,302,303,307,308]),aa=/^(?:application\/(?:[\w.-]+\+)?json|text\/[\w.+-]+)$/i,xe=(e,n={})=>({ok:!1,code:e,...n}),te=(e,n={},t)=>Object.assign(new Error(e),{refusal:xe(e,n),...t===void 0?{}:{detail:t}});function sa(e,n){let t;try{t=new URL(e,n)}catch{return{code:"url",why:"a redirect to an address that does not parse"}}let a=lo(t.href);return a.code?{code:"url",why:`a redirect to ${t.host?`${t.protocol}//${t.host}`:t.protocol}: ${a.why}`}:a}function co(e,n){let t=[...new Set([n,encodeURIComponent(n)])].filter(Boolean),a=s=>typeof s=="string"?t.reduce((f,r)=>f.split(r).join("{key}"),s):s;return Object.fromEntries(Object.entries(e).map(([s,f])=>[s,a(f)]))}var ia=e=>Jr.promises.lookup(e,{all:!0,verbatim:!0}),xt=e=>URL.parse(e)?.host||"?",$t=e=>et(e)==="fake-ip"?"an address a fake-ip proxy's DNS gives":"an address of this computer or of a private network";async function ca(e,{resolve:n,proxy:t}){let a=e.hostname,s=qr(t),f=u=>{let F=et(u);return F==="public"||F==="fake-ip"&&s},r=a.replace(/^\[|\]$/g,"");if(et(r)!=="none"){if(f(r))return{address:r};throw te("private",{host:a,address:r,why:`${r} is ${$t(r)}`})}let m;try{m=(await n(a)).map(u=>typeof u=="string"?u:u.address)}catch(u){throw te("offline",{why:`${a} did not resolve (${u.code??u.message})`})}if(m.length===0)throw te("offline",{why:`${a} did not resolve`});let l=m.filter(u=>!f(u));if(l.length===0)return{address:m[0]};let h=l.filter(u=>!Zr(u)),w=h.length?h:l,i=w.find(u=>!u.includes(":"))??w[0],k=`${a} resolved to ${i}, ${$t(i)}`,R=oo(a)?"and its name is one kept for this computer (localhost)":t?s?e.protocol!=="https:"?"and an http address is never handed to a proxy by its name (no TLS to check the site)":h.length?"and a private network's address is never handed to a proxy by its name (that network's own machines are there)":null:"and the proxy it goes through is not on this computer":"and no proxy of this computer goes between to reach it by its name";if(R===null)return{address:null,resolved:i,said:k};throw te("private",{host:a,address:i,why:`${k}, ${R}`},s||!t||oo(a)?void 0:`${k}, and the proxy it goes through (${xt(t)}) is not on this computer`)}var la=({resolve:e=ia,proxyFor:n=fn,connect:t,ca:a}={})=>async(s,{headers:f,signal:r})=>{let m=await n(s.href),l=await ca(s,{resolve:e,proxy:m}),{address:h}=l,w={...t?{connect:t}:{},...a?{ca:a}:{}};try{return await Ke(s,{address:h,proxy:m,headers:f,signal:r,...w})}catch(i){if(!(m&&i.proxyFailed&&(h!==null||i.code==="ECONNREFUSED")))throw h===null&&!r?.aborted?te("offline",{why:`${l.said}, and no site the proxy of this computer reached by its name proved to be it`},`${l.said}, handed by its name to the proxy (${xt(m)}): ${i.code??i.message}`):i;let k=u=>`and the proxy of this computer that would reach it${u?` (${xt(m)})`:""} is not running`,R=h===null?l.said:`${s.hostname.replace(/^\[|\]$/g,"")===h?h:`${s.hostname} resolved to ${h}`}, ${$t(h)}`;if(h===null||et(h)!=="public")throw te("private",{host:s.hostname,address:h??l.resolved,why:`${R}, ${k(!1)}`},`${R}, ${k(!0)}`);return Ke(s,{address:h,proxy:null,headers:f,signal:r,...w})}},fo=e=>(n,{headers:t,signal:a})=>Ke(new URL(`http://127.0.0.1:${e}/${n.protocol.slice(0,-1)}/${n.host}${n.pathname}${n.search}`),{address:"127.0.0.1",headers:t,signal:a});async function da(e){let n=0,t=[];for await(let a of e){if(n+=a.length,n>oa)throw Object.assign(new Error("too-large"),{status:413});t.push(a)}return JSON.parse(Buffer.concat(t).toString("utf8"))}function fa(e,n){let t=/;\s*charset="?([^";]+)"?/i.exec(n)?.[1];try{return new TextDecoder(t||"utf-8").decode(e)}catch{return new TextDecoder("utf-8").decode(e)}}function mo({root:e,catalog:n=()=>re(e),hop:t=null,now:a=Date.now,cache:s=Yr(e),log:f=()=>{}}){let r=t??la(),m=new Map,l=u=>{let F=a(),S=(m.get(u)??[]).filter(x=>F-x<6e4);return S.length>=ao?(m.set(u,S),!1):(m.set(u,[...S,F]),!0)},h={accept:"application/json, text/plain;q=0.9, text/*;q=0.8","user-agent":`Gallery/${ta} (a custom block's card)`};async function w(u,{hosts:F,allowed:S,key:x}){let Y=AbortSignal.timeout(io),W=u;for(let v=0;;v++){let b;try{b=await r(x===void 0?W:new URL(ea(W.href,x)),{headers:h,signal:Y})}catch(L){throw L.refusal?L:te("offline",{why:Y.aborted?`no answer within ${io/1e3} s`:String(L.code??L.message)})}if(ra.has(b.status)&&b.headers.get("location")){if(b.body?.cancel().catch(()=>{}),v>=so)throw te("status",{status:b.status,why:`more than ${so} redirects`});let L=sa(b.headers.get("location"),W);if(L.code)throw te("url",{why:L.why});let ae=no(L.url.hostname,F);if(!ae)throw te("host",{host:L.url.hostname,why:`a redirect to ${L.url.hostname}, which the block's needs do not name`});if(!S.includes(ae))throw te("consent",{hosts:F.filter(ne=>!S.includes(ne))});W=L.url,x=ro(W.href)?x:void 0;continue}if(b.status<200||b.status>299)throw b.body?.cancel().catch(()=>{}),te("status",{status:b.status});let B=b.headers.get("content-type")??"",H=B.split(";")[0].trim();if(H&&!aa.test(H))throw b.body?.cancel().catch(()=>{}),te("type",{type:H});if(Number(b.headers.get("content-length"))>qe)throw b.body?.cancel().catch(()=>{}),te("too-large",{limit:qe});let z;try{z=b.body?await mn(b,qe):Buffer.alloc(0)}catch(L){throw te("offline",{why:String(L.code??L.message)})}if(z===null)throw te("too-large",{limit:qe});return{type:H||"text/plain",text:fa(z,B)}}}let i=(u,F,S)=>{let x=Xr(u,F);return x===void 0?xe("type",{why:"the answer is no JSON"}):{ok:!0,data:x,at:u.at,cached:S}};async function k(u){let{block:F,url:S,as:x="json",doc:Y=null}=u??{},W=typeof F=="string"?n().packages.get(F):null;if(!W)return xe("missing",{why:"no custom block of that id loads in this workspace"});let v=Qr(W.needs);if(x!=="json"&&x!=="text")return xe("url",{why:'as is "json" or "text"'});let b=lo(S);if(b.code)return xe("url",{why:b.why});let{url:B}=b,H=no(B.hostname,v);if(!H)return xe("host",{host:B.hostname,why:v.length?`its needs name ${v.join(", ")}`:"its needs name no host of the net"});let z=n().settings.net?.[F]??[];if(!z.includes(H))return xe("consent",{hosts:v.filter(U=>!z.includes(U))});let L;if(ro(B.href)){let U=Vr(e);if(L=U[B.hostname]??U[H],L===void 0)return xe("key",{host:B.hostname})}let ae=B.href,ne=s.get(ae);if(s.used(ae,Y,x),ne&&a()-Date.parse(ne.at)<na)return i(ne,x,!0);if(!l(F))return ne?i(ne,x,!0):xe("rate",{why:`more than ${ao} fetches in a minute`});try{let{type:U,text:G}=await w(B,{hosts:v,allowed:z,key:L});return i(s.put(ae,{type:U,text:G,at:new Date(a()).toISOString()}),x,!1)}catch(U){if(!U.refusal)throw U;if(ne&&U.refusal.code!=="consent")return i(ne,x,!0);let G=L===void 0?U.refusal:co(U.refusal,L),ce=U.detail===void 0?G.why:L===void 0?U.detail:co({why:U.detail},L).why;return(G.code!=="offline"||U.detail!==void 0)&&f(`${F}: ${B.hostname} refused (${G.code}${ce?`: ${ce}`:""})`),G}}async function R(u,F){if(u.method!=="POST")return Fe(F,405,{ok:!1,reason:"method"});if(u.headers.origin!==`http://${u.headers.host}`)return Fe(F,403,{ok:!1,reason:"origin"});if(!/^application\/json\b/i.test(u.headers["content-type"]??""))return Fe(F,415,{ok:!1,reason:"type"});let S;try{S=await da(u)}catch(x){return Fe(F,x.status??400,{ok:!1,reason:"body"})}try{return Fe(F,200,await k(S))}catch(x){return Fe(F,500,{ok:!1,code:"offline",why:x.message})}}return{handle:R,answer:k,cache:s}}function uo({max:e=20}={}){let n=new Map;return{get(t,a,s){let f=`${t} ${a}`,r=n.get(f);return!r||r.text!==s?null:(n.delete(f),n.set(f,r),r.page)},set(t,a,s,f){let r=`${t} ${a}`;for(n.delete(r),n.set(r,{slug:t,text:s,page:f});n.size>e;)n.delete(n.keys().next().value)},clear(){n.clear()},forget(t){for(let[a,s]of n)s.slug===t&&n.delete(a)},get size(){return n.size}}}import{createHash as ma}from"node:crypto";import{readFileSync as ua}from"node:fs";import po from"node:fs/promises";import pa from"node:path";import{release as ha,releaseFile as ga}from"../browser/shared/paths.mjs";async function tt(e){let n=await Promise.all(e.map(a=>po.stat(a).then(({mtimeMs:s,size:f})=>`${s} ${f}`,()=>"none"))),t=ma("sha256");return e.forEach((a,s)=>t.update(`${a}\0${n[s]}
|
|
78
|
-
`)),t.digest("hex").slice(0,16)}function ho(e,n){let t=null,a=async()=>(await Promise.all(e.map(async s=>(await po.readdir(s,{recursive:!0,withFileTypes:!0}).catch(()=>[])).filter(r=>r.isFile()).map(r=>pa.join(r.parentPath,r.name))))).flat().filter(n).sort();return{files:()=>t??=a(),changed:()=>{t=null}}}var St=ha?JSON.parse(ua(ga,"utf8")).stamps:null;var at=To.source.slice(1,-1),Ua=new RegExp(`^/generated/(${at})\\.html$`),Ba=new RegExp(`^/(${at})/(?:doc|report)\\.html$`),za=new RegExp(`^/pages/(${at})$`),Ha=new RegExp(`^/__gallery/pages/(${at})/(cards|library|hint)$`),Ct="/__gallery/events",je=wa,Fo=/^\/__gallery\/edit\/(v\/[a-f0-9]{16}\/)?src\/((?:shared(?:\/components|\/emoji|\/i18n)?\/|editor\/(?:page|components)(?:\/[a-z]+(?:-[a-z]+)*){0,2}\/(?!files?\.mjs))[a-z]+(?:-[a-z]+)*\.mjs)$/,Ga=/^\/__gallery\/edit\/(?:v\/[a-f0-9]{16}\/)?src\/(shared\/emoji\/data\/[a-z]+(?:-[a-z]+)*\.(json|bin))$/,nt=[J.join(je,"editor","page"),J.join(je,"editor","components"),J.join(je,"shared")],Ka=e=>Fo.test(`/__gallery/edit/src/${J.relative(je,e).split(J.sep).join("/")}`);var Ja=[Po,J.join(je,"shared","components")],Zc=[Po,...nt],Ne={"Cache-Control":"no-store"},jo={"Cache-Control":"max-age=31536000, immutable"},Et=(e,n,t)=>Ot(e,{type:n,headers:{...Ne,...va},body:t});function Ya(e){let n=e.headers?.host??"",t=e.socket?.localPort;return!!t&&(n===`127.0.0.1:${t}`||n===`localhost:${t}`)}function Xa(e){if(e.method!=="GET"&&e.method!=="HEAD")return null;let n=e.socket?.localPort;if(!n||e.headers?.host!==`localhost:${n}`)return null;let t=new URL(e.url||"/","http://localhost");return t.pathname==="/"||t.pathname==="/index.html"?`http://127.0.0.1:${n}${t.pathname}${t.search}`:null}var Ao=`window.addEventListener("doc-net-fetch", (event) => {
|
|
79
|
-
event.preventDefault();
|
|
80
|
-
event.detail.answer(fetch("/__gallery/net", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(event.detail.ask) }).then((response) => response.json()));
|
|
81
|
-
});`,Do=`let lost = false;
|
|
82
|
-
events.onerror = () => { lost = true; };
|
|
83
|
-
events.onopen = () => {
|
|
84
|
-
if (!lost) return;
|
|
85
|
-
lost = false;
|
|
86
|
-
for (const kind of ${JSON.stringify(Na)}) window.dispatchEvent(new CustomEvent("doc-workspace-change", { detail: kind }));
|
|
87
|
-
};`,Va=(e,n,t)=>`<script>
|
|
88
|
-
(() => {
|
|
89
|
-
document.currentScript.remove();
|
|
90
|
-
${Ao}
|
|
91
|
-
const solo = new URLSearchParams(location.search).has("solo");
|
|
92
|
-
let catalog = "${t}";
|
|
93
|
-
const holds = (ids) => document.querySelector(ids === undefined ? "[${ot}]" : ids.split(",").map((id) => '[${ot}="' + id + '"]').join());
|
|
94
|
-
const events = new EventSource("${Ct}?slug=${e}");
|
|
95
|
-
${Do}
|
|
96
|
-
events.onmessage = (event) => {
|
|
97
|
-
const [kind, next, ids, more, consents, unlisted, packs] = event.data.split(" ");
|
|
98
|
-
if (kind === "notes") return void window.dispatchEvent(new CustomEvent("doc-annotations-changed", { detail: { version: next ?? "" } }));
|
|
99
|
-
if (kind === "changes") return void window.dispatchEvent(new CustomEvent("doc-changes-changed", { detail: { stamp: next ?? "" } }));
|
|
100
|
-
if (kind === "look") return void window.dispatchEvent(new CustomEvent("doc-look-request", { detail: { look: Object.fromEntries(new URLSearchParams(next ?? "")), from: "file" } }));
|
|
101
|
-
if (kind === "settings") return void window.dispatchEvent(new CustomEvent("doc-settings-changed", { detail: { hidden: next ? next.split(",") : [], disabled: ids ? ids.split(",") : [], shown: more ? more.split(",") : [], net: consents ? consents.split(",") : [], unlisted: unlisted ? unlisted.split(",") : [], packsOff: packs ? packs.split(",") : [] } }));
|
|
102
|
-
if (kind === "data") return void window.dispatchEvent(new CustomEvent("doc-workspace-change", { detail: next ?? "" }));
|
|
103
|
-
if (kind !== "report" && kind !== "assets" && kind !== "components") return;
|
|
104
|
-
if (kind === "components") {
|
|
105
|
-
if (document.readyState === "loading") return void document.addEventListener("DOMContentLoaded", () => events.onmessage(event), { once: true });
|
|
106
|
-
if (solo || next === catalog) return;
|
|
107
|
-
catalog = next;
|
|
108
|
-
if (!holds(ids)) return void window.dispatchEvent(new CustomEvent("doc-catalog-changed", { detail: { ids: ids === undefined ? null : ids.split(",").filter(Boolean) } }));
|
|
109
|
-
}
|
|
110
|
-
if (window.__galleryEditBusy) {
|
|
111
|
-
window.dispatchEvent(new CustomEvent({ report: "doc-source-changed", assets: "doc-assets-changed", components: "doc-components-changed" }[kind], { detail: { version: next ?? null } }));
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
if (kind === "report" && next === "${n}") return;
|
|
115
|
-
if (window.__galleryEditReload) return window.__galleryEditReload(); // in a workbench: swapped in, no reload seen
|
|
116
|
-
location.reload();
|
|
117
|
-
};
|
|
118
|
-
})();
|
|
119
|
-
</script>`,Za=(e,n,t)=>`<script>
|
|
120
|
-
(() => {
|
|
121
|
-
document.currentScript.remove();
|
|
122
|
-
${Ao}
|
|
123
|
-
let catalog = "${t}";
|
|
124
|
-
const holds = (ids) => {
|
|
125
|
-
const named = ids === undefined ? "[${ot}]" : ids.split(",").filter(Boolean).map((id) => '[${ot}="' + id + '"]').join() || ":not(*)";
|
|
126
|
-
return Boolean(document.querySelector(named)) || [...document.querySelectorAll("template[data-ge-held]")].some((held) => held.content.querySelector(named));
|
|
127
|
-
};
|
|
128
|
-
const again = () => (window.__galleryEditReload ? window.__galleryEditReload() : location.reload());
|
|
129
|
-
const events = new EventSource("${Ct}?page=${e}");
|
|
130
|
-
${Do}
|
|
131
|
-
events.onmessage = (event) => {
|
|
132
|
-
const [kind, next, ids, more, consents, unlisted, packs] = event.data.split(" ");
|
|
133
|
-
if (kind === "page") return void (window.__galleryPageChanged ? window.__galleryPageChanged(next) : next !== "${n}" && again());
|
|
134
|
-
if (kind === "assets") return void again();
|
|
135
|
-
if (kind === "settings") return void window.dispatchEvent(new CustomEvent("doc-settings-changed", { detail: { hidden: next ? next.split(",") : [], disabled: ids ? ids.split(",") : [], shown: more ? more.split(",") : [], net: consents ? consents.split(",") : [], unlisted: unlisted ? unlisted.split(",") : [], packsOff: packs ? packs.split(",") : [] } }));
|
|
136
|
-
if (kind === "data") return void window.dispatchEvent(new CustomEvent("doc-workspace-change", { detail: next ?? "" }));
|
|
137
|
-
if (kind !== "components") return;
|
|
138
|
-
if (document.readyState === "loading") return void document.addEventListener("DOMContentLoaded", () => events.onmessage(event), { once: true });
|
|
139
|
-
if (next === catalog) return;
|
|
140
|
-
catalog = next;
|
|
141
|
-
if (holds(ids)) again();
|
|
142
|
-
};
|
|
143
|
-
})();
|
|
144
|
-
</script>`;function Qa(e,n){let t=J.relative(e,n).split(J.sep);if(t[0]===".."||J.isAbsolute(t[0])||t[0]==="")return null;if(t.length===1&&t[0]===rt)return{slug:null,name:rt,packages:!0};let a=l=>process.platform==="win32"?l.toLowerCase():l;if(a(t[0])===Oa&&t.length>=2&&Ia(t[1])&&!xo.includes(t[1])){let l=t.slice(2);return l.some(h=>h.startsWith("."))?null:{extension:t[1],name:l.length===1?l[0]:null}}if(a(t[0])===Ca&&t.length>=2&&Ro(t[1])&&!xo.includes(t[1])){let l=t.slice(2);return l.some(h=>h.startsWith("."))?null:{page:t[1],name:l.length===1?l[0]:null}}let s=t[0]===".gallery"&&t[1]==="pages"&&t.length>=3,[f,...r]=s?t.slice(2):t,m=!s&&a(f)===vo;return!(m||To.test(f))||f==="exports"||r.some(l=>l.startsWith("."))?null:{slug:m?vo:f,name:r.length===1?r[0]:null,...m?{packages:m}:{}}}function jt(e){let n=i=>process.platform==="win32"?J.resolve(i).toLowerCase():J.resolve(i),{gallery:t,preferencesPage:a,exports:s,extensions:f}=Pa(e),[r,m,l,h]=[n(t),n(a),n(s),n(f)],w=(i,k)=>i===k||i.startsWith(k+J.sep);return i=>{let k=n(i);return w(k,h)&&k!==h&&k.slice(h.length+1).split(J.sep).some((R,u)=>u>0&&(R==="node_modules"||R===".git"))?!0:w(k,r)&&k!==r&&!w(k,m)||w(k,l)}}var _o=`<script data-doc-dev>document.currentScript.remove(); globalThis.${Wa} = ${JSON.stringify(Ma)};</script>`,ue=(e,n,t)=>new RegExp(`</${n}>`,"i").test(e)?e.replace(new RegExp(`</${n}>`,"i"),()=>` ${t}
|
|
145
|
-
</${n}>`):`${e}
|
|
146
|
-
${t}`;function Lo({stateDirectory:e=ya,logger:n=console,kind:t="dev",workbenchPage:a=null,closeServer:s=async()=>{},exit:f=()=>process.exit(0)}={}){let r=new Set,m=(o,c="",d="report")=>{for(let O of r)(!o||O.slug===o)&&O.response.write(`data: ${o?`${d} ${c}`:"assets"}
|
|
147
|
-
|
|
148
|
-
`)},l=(o,c)=>{for(let d of r)d.page===o&&d.response.write(`data: page ${c}
|
|
149
|
-
|
|
150
|
-
`)},h=!1,w=o=>{h||=o,A("workspace",()=>{let c=h;h=!1;for(let d of r)d.workspace&&(c||!d.ownOnly)&&d.response.write(`data: workspace ${Date.now()}
|
|
151
|
-
|
|
152
|
-
`)})},i=()=>w(!0),k=()=>w(!1),R=o=>m(o,String(Date.now()),"changes"),u=gn({stateDirectory:e,finish:ze,log:o=>n.info?.(`[gallery] ${o}`),onChanges:R}),F=(o,c,d,{lang:O=null,page:T=!1}={})=>Yt(o,c,d,{blank:!0,lang:O,page:T}),S=e?jn({file:J.join(e,"activity.json")}):null,x=vn({root:D,read:kn(u),activity:S,draw:(o,c)=>Oe(o,{slug:c,mode:"words",reportsDirectory:D})}),Y=new Set,W=o=>{for(let c of o)Y.add(c);Y.size!==0&&A("data",()=>{let c=[...Y];Y.clear();for(let d of r)if(d.slug||d.page)for(let O of c)d.response.write(`data: data ${O}
|
|
153
|
-
|
|
154
|
-
`)})},v=o=>J.resolve(J.dirname(bt(o,D)))===J.resolve(D),b=null,B=null,H=()=>B??=(async()=>{for(let o of r)o.response.end();r.clear(),await Promise.race([s().catch(()=>{}),new Promise(o=>setTimeout(o,3e3))]),await S?.close(),await b?.().catch(()=>{}),await L.close(),z.close(),f()})(),z=xn({server:{kind:t,version:$a,stop:H},edits:u,reports:{create:F,export:o=>Yn(u,o,{workspace:c=>x.snapshot(c)}),words:(o,c)=>Oe(o,{slug:c,mode:"words",reportsDirectory:D})},components:Jn({root:D,taken:()=>V.taken()}),changed:i,relayed:k,index:x,web:{frameable:un,title:pn,icon:o=>hn(o)}}),L=Un({edits:u,workspace:z,reports:{create:F},reportsDirectory:D,offline:o=>ln({...o,workspace:c=>x.snapshot(c)})}),ae=mo({root:D,hop:process.env.GALLERY_TEST_NET?fo(Number(process.env.GALLERY_TEST_NET)):null,log:o=>n.info?.(`[gallery] ${o}`)}),ne=Gt({root:D,edits:u,stateDirectory:e,catalogTaken:()=>V.taken(),log:o=>n.info?.(`[gallery] ${o}`),shown:pt}),U=(o,c,{present:d=!1,editorModule:O,kit:T}={})=>{let y=c,ie="",ee="",fe=!0;try{d||({html:y,snippet:ie,head:ee}=u.preview(o,c,{editor:O,kitTags:le=>tn(le,T)}))}catch(le){fe=!1,n.warn(`[gallery] text editing unavailable for ${o}: ${le.message}`)}if({html:y}=rn(y,{slug:o,mode:"preview",kit:T}),y=ue(y,"head",Va(o,Ie(c),re(D).stamp)),y=ue(y,"head",`<script data-doc-dev>${wo()}</script>`),y=ue(y,"head",_o),ee&&(y=ue(y,"head",ee)),d)return{html:ue(y,"head",`<style data-doc-present>.doc-display { display: none !important; }</style>
|
|
155
|
-
<script type="module" src="/__gallery/edit/src/editor/page/present-links.mjs" data-doc-dev></script>`),whole:fe};let ke="";try{ke=Tn(o,c)}catch(le){fe=!1,n.warn(`[gallery] checks unavailable for ${o}: ${le.message}`)}return ke&&(y=ue(y,"body",ke)),{html:ie?ue(y,"body",ie):y,whole:fe}},G=uo(),ce=ho(nt,Ka),p=o=>{let c=bt(o,D);return[c,J.join(c,"assets")]},g=()=>St?.editor??ce.files().then(tt),E=o=>St?.kit?.[o.id]??tt([ut(o)]),C=async(o,c,{present:d})=>{let[O,T,y]=await Promise.all([d?"":g(),Promise.all(Re.map(E)),tt(p(o))]),ie=[d?"present":O,...T,y,re(D).stamp,`look:${yo(ko(o,D))}`].join(" "),ee=G.get(o,ie,c);if(ee!==null)return d||u.opened(c),ee;let fe=new Map(Re.map((pe,Ee)=>[pe,T[Ee]])),ke=d?void 0:`/__gallery/edit/v/${O}/src/editor/page/editor.mjs`,{html:le,whole:de}=U(o,c,{present:d,editorModule:ke,kit:pe=>`${Be(pe)}?v=${fe.get(pe)}`});return de&&G.set(o,ie,c,le),le},_=async o=>{let c=bo(o,D),[d,O]=await Promise.all([ge.readFile(c.html,"utf8").catch(()=>null),ge.readFile(c.json,"utf8").catch(()=>"")]);if(d===null)return null;let[T,y]=await Promise.all([g(),Promise.all(Re.map(E))]),ie=new Map(Re.map(($,Se)=>[$,y[Se]])),ee=re(D),fe=Eo(d,O),ke=Ht(d,{blockOf:$=>mt(ee,$)}),le=Object.fromEntries([...new Set(ft(d).cards.map(({block:$})=>$).filter(Boolean))].map($=>[$,mt(ee,$)])),{html:de}=Pn(ke,{reportsDirectory:D,slug:o,kit:$=>`${Be($)}?v=${ie.get($)}`}),pe=Da(o,D),Ee=Aa(o,D),Te=pe?.defaultCards===!0,We=Ra(d),Ue=$=>ee.packages.get($)?.name??Lt().find(Se=>Se.id===$)?.title??null,$e=Te?Ta(D,ft(d).cards.map(({block:$})=>$)).map($=>({block:$,name:Ue($)})):[],Le=JSON.stringify({slug:o,title:pe?.title??o,token:u.token,version:fe,blocks:le,...Ee?{hint:Ee}:{},...Te?{defaults:Te}:{},...$e.length?{news:$e}:{},...We?{blank:We}:{}}).replace(/</g,"\\u003c");return de=ue(de,"head",`<script type="application/json" data-ge-page data-doc-dev>${Le}</script>`),de=ue(de,"head",Za(o,fe,ee.stamp)),de=ue(de,"head",`<script data-doc-dev>${wo()}</script>`),de=ue(de,"head",_o),ue(de,"head",`<script type="module" src="/__gallery/edit/v/${T}/src/editor/page/custom-page.mjs" data-doc-dev></script>`)};async function j(o,c,d){try{if(!Ya(o))return go(c,403,{ok:!1,reason:"host"});let O=Xa(o);if(O)return Ot(c,{status:302,headers:{Location:O,...Ne}});let T=new URL(o.url||"/","http://localhost"),y=decodeURI(T.pathname);if(y===Ct){c.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-store",Connection:"keep-alive"}),c.write(`retry: 3000
|
|
156
|
-
|
|
157
|
-
`);let $={slug:T.searchParams.get("slug"),page:T.searchParams.get("page"),workspace:T.searchParams.has("workspace"),ownOnly:T.searchParams.get("workspace")==="own",response:c};r.add($);let{stamp:Se,settings:zo}=re(D);c.write(`data: components ${Se}
|
|
158
|
-
|
|
159
|
-
`),c.write(`data: ${lt(zo)}
|
|
160
|
-
|
|
161
|
-
`),o.on("close",()=>r.delete($));return}if(y==="/__gallery/net")return ae.handle(o,c);if(y==="/__gallery/edit/commit")return u.commit(o,c);if(y==="/__gallery/edit/reverted")return u.reverted(o,c);if(y==="/__gallery/edit/hand-in")return u.handInRequest(o,c);if(y==="/__gallery/edit/settle")return u.settleRequest(o,c);if(y==="/__gallery/edit/round")return u.roundRequest(o,c);if(y==="/__gallery/edit/upload")return u.upload(o,c);if(y==="/__gallery/edit/unfurl")return u.unfurl(o,c);if(y==="/__gallery/edit/emoji-library"){if(o.method==="POST")return u.addEmoji(o,c);let[$,Se]=await u.listEmojis();return go(c,$,Se)}if(y==="/__gallery/edit/icon"){let $=Vt({value:T.searchParams.get("value")??"",slug:T.searchParams.get("slug"),tab:T.searchParams.has("tab")});return Ae(c,$?.body,{type:$?.type,headers:{"Cache-Control":"max-age=31536000, immutable"}})}if(await eo(y,c,{reportsDirectory:D})||await to(y,c,{reportsDirectory:D})||await zn(y,T.searchParams.get("v"),c,{root:D}))return;let ie=y.match(/^\/__gallery\/edit\/emoji-library\/([^/]+)$/)?.[1];if(ie){let $=await u.readEmoji(ie);return Ae(c,$?.body,{type:$?.type,headers:{"Cache-Control":"no-cache"}})}if(y==="/__gallery/edit/frameable")return u.frameable(o,c);if(y==="/__gallery/edit/annotations")return u.annotations(o,c);if(y==="/__gallery/edit/changes")return u.changes(o,c);let ee=y.match(/^\/__gallery\/transfer\/([a-z]+)$/)?.[1];if(ee)return L.handle(o,c,ee);let[,fe,ke]=y.match(Ha)??[];if(fe)return ne.handle(o,c,fe,ke);let le=y.match(/^\/__gallery\/workspace\/([a-z]+(?:-[a-z]+)*)$/)?.[1];if(le)return z.handle(o,c,le);let[,de,pe]=y.match(Fo)??[];if(pe){let $=await ge.readFile(J.join(je,pe),"utf8").catch(()=>null);return Ae(c,$,{type:"text/javascript; charset=utf-8",headers:de?jo:Ne})}let Ee=T.searchParams.has("v")&&Re.find($=>Be($)===y);if(Ee){let $=await ge.readFile(ut(Ee)).catch(()=>null);return Ae(c,$,{type:y.endsWith(".css")?"text/css; charset=utf-8":"text/javascript; charset=utf-8",headers:jo})}if(y==="/__gallery/edit/mhchem.js"){let $=await ge.readFile(en).catch(()=>null);return Ae(c,$,{type:"text/javascript; charset=utf-8",headers:Ne})}let[,Te,We]=y.match(Ga)??[];if(Te){let $=await ge.readFile(J.join(je,Te)).catch(()=>null);return Ae(c,$,{type:We==="json"?"application/json; charset=utf-8":"application/octet-stream",headers:{"Cache-Control":"max-age=86400"}})}if(a&&(y==="/"||y==="/index.html"))return Et(c,"text/html; charset=utf-8",await a(T.pathname,o));let Ue=y.match(za)?.[1];if(Ue){let $=await _(Ue);return $===null?d():Et(c,"text/html; charset=utf-8",$)}let $e=y.match(Ua)?.[1];if(!$e){let $=y.match(Ba)?.[1];return Ro($)&&await ge.access(ja(bt($,D)).html).then(()=>!0,()=>!1)?Ot(c,{status:302,headers:{Location:`/generated/${$}.html${T.search}`,...Ne}}):d()}let Le=await u.readTaken($e);if(Le===null)return d();T.searchParams.has("present")||u.noteTaken($e,Le.source).then($=>$&&R($e),()=>{}),Et(c,"text/html; charset=utf-8",await C($e,Le.text,{present:T.searchParams.has("present")}))}catch(O){d(O)}}let N=new Map,A=(o,c)=>{clearTimeout(N.get(o)),N.set(o,setTimeout(c,120))},I=o=>{ba(o,D).reads&&m(o,yo(ko(o,D)),"look")},Z=Bn({settled:u.settled,async tell(o,c){let d=await u.read(o,c.source).catch(O=>(n.error(`[gallery] ${o}: ${O.message}`),{version:Ie(c.source??"")}));if(m(o,d?.version??Ie("")),v(o)){let O=u.writerOf(o,c.source)??"agent";x.changed(o,{source:c.source??null,text:d?.text??null,by:O}).then(W,T=>n.error(`[gallery] ${o}: its facts not read: ${T.message}`))}u.noteTaken(o,c.source).then(O=>O&&R(o),O=>n.error(`[gallery] ${o}: the Agent's changes not kept: ${O.message}`)),u.checkAnnotations(o).catch(O=>n.error(`[gallery] ${o}: annotations not checked: ${O.message}`))}}),X=({id:o,problem:c,off:d})=>d||n.warn(`[gallery] custom block ${o} does not load: ${Pt("en",c)}`),V=Cn({root:D,tell({stamp:o,problems:c,settings:d},O){for(let T of O)c.has(T)&&X(c.get(T));for(let{response:T}of r)T.write(`data: components ${o} ${O.filter(y=>Ea.test(y)).join(",")}
|
|
162
|
-
|
|
163
|
-
`),T.write(`data: ${lt(d)}
|
|
164
|
-
|
|
165
|
-
`)}});for(let o of re(D).problems.values())X(o);x.start().then(o=>o>0&&W(["activity"]));let q=jt(D),P=Co(D).then(o=>o.join("/"),()=>""),M=!1,se=o=>{M||=o===Oo,A("extensions",async()=>{let c=M;M=!1;let d=await P;P=Co(D).then(O=>O.join("/"),()=>d),(c||await P!==d)&&i()})},oe=(o,c)=>!ka&&c.some(d=>o.startsWith(d+J.sep));function we(o,c){if(o==="reset"){G.clear(),ce.changed(),V.changed(),i();return}if(q(c))return;let d=Qa(D,c);if(d?.page){let{page:O,name:T}=d;T&&Fa(T)&&A(`page:${O}`,async()=>{let y=bo(O,D),[ie,ee]=await Promise.all([ge.readFile(y.html,"utf8").catch(()=>null),ge.readFile(y.json,"utf8").catch(()=>"")]);ie!==null&&l(O,Eo(ie,ee))}),(T===So.json||T===So.html&&/^(add|unlink)$/.test(o)||T===null&&/^(add|unlink)Dir$/.test(o))&&i();return}if(d?.extension){(d.name===Oo||d.name===null)&&se(d.name);return}if(d?.packages&&V.changed(),d?.name===rt&&d.slug===null&&A("look:*",()=>new Set([...r].map(({slug:O})=>O).filter(Boolean)).forEach(I)),d?.name===rt&&d.slug===null&&i(),d?.slug&&!(d.name&&_a(d.name))&&G.forget(d.slug),d&&(/^(doc|report)\.json$/.test(d.name??"")||/^(add|unlink)Dir$/.test(o)&&d.name===null)&&G.clear(),d?.slug&&!d.packages&&d.name===null&&/^(add|unlink)Dir$/.test(o)&&v(d.slug)&&(x.forget(d.slug),W(["todos","recent","stats"])),d?.slug&&!(d.packages&&d.name===null)&&(/^(doc|report)\.json$/.test(d.name??"")||/^(add|unlink)Dir$/.test(o)&&d.name===null||/^(add|unlink)$/.test(o)&&$o(d.name??""))&&i(),d?.slug&&!d.packages&&d.name===La&&i(),/^(add|unlink)(Dir)?$/.test(o)&&oe(c,nt)&&ce.changed(),d?.name&&($o(d.name)||/^(doc|report)\.json$/.test(d.name))){if(Z(d.slug),/^(doc|report)\.json$/.test(d.name)){let{slug:O}=d;A(`look:${O}`,()=>I(O))}}else if(d?.name==="annotations.json"){let{slug:O}=d;A(`notes:${O}`,async()=>{let T=await ge.readFile(c,"utf8").catch(()=>null);m(O,T===null?"":Ie(T),"notes")})}else oe(c,Ja)?A("kit",async()=>{try{await cn({fresh:!0}),m()}catch(O){n.error(`[gallery] shared kit rebuild failed: ${O.message}`)}}):oe(c,nt)&&A("editor",()=>m())}async function ye(o){b=await xa({reportsDirectory:D,port:o,token:u.token,kind:t}),await Sa(D)}async function Bo(){for(let o of N.values())clearTimeout(o);V.close(),await S?.close(),await b?.().catch(()=>{}),b=null,await L.close(),z.close()}return{handle:j,changed:we,listening:ye,close:Bo,stop:H,edits:u,get listeners(){return r.size}}}import qa from"node:fs/promises";import De from"node:path";import{FRAMED_BY as es,serve as Io}from"../browser/shared/http.mjs";var ts={".html":"text/html; charset=utf-8",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".json":"application/json; charset=utf-8",".map":"application/json; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".ico":"image/x-icon",".woff2":"font/woff2",".woff":"font/woff",".ttf":"font/ttf",".txt":"text/plain; charset=utf-8"},ns=e=>ts[De.extname(e).toLowerCase()]??"application/octet-stream";function os(e,n){if(/%(?:2f|5c|00)/i.test(n)||/[\\\0]/.test(n))return null;let t;try{t=decodeURIComponent(n)}catch{return null}let a=t.split("/");if(a.some(r=>r===""||r==="."||r===".."||/[\\\0:]/.test(r)))return null;let s=De.resolve(e,...a),f=De.relative(e,s);return f&&!f.startsWith("..")&&!De.isAbsolute(f)?s:null}async function No(e,n,{web:t,kit:a,vendor:s}){if(e.method!=="GET"&&e.method!=="HEAD")return!1;let f=new URL(e.url||"/","http://localhost").pathname,r=null,m=null;if(f==="/"||f==="/index.html"){if(!t)return!1;[r,m]=[De.join(t,"index.html"),{"Cache-Control":"no-store",...es}]}else{let w=[["/assets/",t&&De.join(t,"assets"),"max-age=31536000, immutable"],["/kit/",a,"no-cache"],["/vendor/",s,"no-cache"]].find(([i,k])=>k&&f.startsWith(i));if(!w)return!1;r=os(w[1],f.slice(w[0].length)),m={"Cache-Control":w[2]}}let l=r?await qa.readFile(r).catch(()=>null):null;return l?(Io(n,{type:ns(r),headers:{...m,"X-Content-Type-Options":"nosniff"},body:e.method==="HEAD"?void 0:l}),!0):(Io(n,{status:404}),!0)}import _e from"node:fs";import Me from"node:path";import{isExtensionId as rs}from"../browser/shared/outline-shape.mjs";import{DOCUMENT_FOLDERS as Mo,isSlugName as _t,layoutOf as as}from"../browser/shared/workspace.mjs";function ss(e){let{components:n,gallery:t,preferencesPage:a,customPages:s,extensions:f}=as(e),r=(i,k)=>{try{return _e.readdirSync(i,{withFileTypes:!0}).filter(R=>R.isDirectory()&&k(R.name)).map(R=>Me.join(i,R.name))}catch{return[]}},m=[...r(e,i=>_t(i)),...r(a,i=>_t(i))],l=i=>[i,...r(i,k=>!k.startsWith(".")).flatMap(l)],h=r(s,i=>_t(i)&&!Mo.includes(i)),w=r(f,i=>rs(i)&&!Mo.includes(i));return[...new Set([e,...[t,a,s,f].filter(i=>_e.existsSync(i)),...h,...w,...m,...m.map(i=>Me.join(i,"assets")).filter(i=>_e.existsSync(i)),..._e.existsSync(n)?l(n):[]])]}function Wo(e,n,{folders:t=process.platform==="linux"}={}){let a=jt(e),s=(w,i)=>{a(i)||Me.basename(i).startsWith(".")||_e.stat(i,(k,R)=>{if(k)return n(k.code==="ENOENT"?"unlink":"change",i);let u=R.isDirectory();n(w==="rename"?u?"addDir":"add":u?"addDir":"change",i)})},f=()=>{};if(!t)try{let w=_e.watch(e,{recursive:!0},(i,k)=>k?s(i,Me.join(e,k.toString())):n("reset",e));return w.on("error",f),{close:()=>w.close()}}catch(w){if(w.code!=="ERR_FEATURE_UNAVAILABLE_ON_PLATFORM")throw w}let r=new Map,m=null,l=()=>{let w=new Set(ss(e));for(let[i,k]of r)w.has(i)||(k.close(),r.delete(i));for(let i of w)if(!r.has(i))try{let k=_e.watch(i,(R,u)=>{if(!u)return n("reset",i);R==="rename"&&h(),s(R,Me.join(i,u.toString()))});k.on("error",f),r.set(i,k)}catch{}},h=()=>{m??=setTimeout(()=>{m=null,l()},50)};return l(),{close(){clearTimeout(m);for(let w of r.values())w.close();r.clear()},get folders(){return[...r.keys()]}}}async function xl({port:e,web:n=us,kind:t=process.env.GALLERY_SERVER_KIND==="dev"?"dev":"cli",stateDirectory:a=ls,exit:s=(l=0)=>process.exit(l),watch:f=!0,signals:r=!0,log:m=console}={}){await ps(Pe),await zt(Pe,{log:S=>m.log(`[gallery] ${new Date().toISOString()} ${S}`)}),Ut(Pe,S=>m.log(`[gallery] ${new Date().toISOString()} ${S}`)),Wt(Pe);let l=await Kt(Pe,{stateDirectory:a});l.did==="made"?m.log(`[gallery] ${new Date().toISOString()} the default home page made: ${l.file} (${l.cards.length} cards)`):l.did==="failed"&&m.warn(`[gallery] ${new Date().toISOString()} ${Jt(l)}`);let h=null,w=null,i=null,k=hs(Pe),R=async()=>{w?.close(),i&&st.unwatchFile(it,i),await is.writeFile(k.lastPortFile,`${e}
|
|
166
|
-
`).catch(()=>{}),await new Promise(S=>{h.close(()=>S()),h.closeAllConnections()})},F=Lo({stateDirectory:a,logger:{info:S=>m.log(S),warn:S=>m.warn(S),error:S=>m.error(S)},kind:t,closeServer:R,exit:()=>s(0)});if(h=cs.createServer((S,x)=>{F.handle(S,x,async Y=>{if(Y){m.error(`[gallery] ${S.method} ${S.url}: ${Y.stack??Y.message}`),x.headersSent?x.end():Uo(x,{status:500});return}try{if(await No(S,x,{web:n,kit:ds,vendor:ms}))return}catch(W){m.error(`[gallery] ${S.url}: ${W.message}`)}x.headersSent||Uo(x,{status:404})})}),h.keepAliveTimeout=5e3,await new Promise((S,x)=>{h.once("error",x),h.listen(e,"127.0.0.1",()=>{h.off("error",x),S()})}),e=h.address().port,await F.listening(e),f&&(w=Wo(Pe,F.changed)),fs){let S=st.readFileSync(it,"utf8");i=()=>{let x=null;try{x=st.readFileSync(it,"utf8")}catch{}x!==S&&(m.log("[gallery] The package was replaced (another version installed): this server stops; the next gallery command starts the new one."),F.stop())},st.watchFile(it,{interval:3e3,persistent:!1},i)}if(r)for(let S of["SIGINT","SIGTERM","SIGHUP"])process.once(S,()=>F.stop());return{server:h,port:e,routes:F,async close(){await R(),await F.close()}}}export{xl as a};
|
package/dist/chunk-SWUTTZCN.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
-
import{a,b,c,d,e,f,g}from"./chunk-67N2QJYT.mjs";import"./chunk-ZWWC4KLF.mjs";import"./chunk-IA4PSIMD.mjs";import"./chunk-F4ZA6JRZ.mjs";import"./chunk-7M2BQQGZ.mjs";import"./chunk-ITOH5EGO.mjs";import"./chunk-ZQS6H473.mjs";import"./chunk-MXUBKDRO.mjs";import"./chunk-HXG7EOPJ.mjs";import"./chunk-ZTHICSSF.mjs";import"./chunk-6N3PX4XX.mjs";import"./chunk-PAREWQGB.mjs";import"./chunk-BFJGHSQN.mjs";import"./chunk-U5XL7D6A.mjs";import"./chunk-HYMEEXKN.mjs";import"./chunk-UMHUSOPJ.mjs";import"./chunk-R2ZDLJYT.mjs";import"./chunk-VFX2KNHP.mjs";import"./chunk-VS7JIGJW.mjs";import"./chunk-HDWTZ763.mjs";import"./chunk-A55HN5OK.mjs";import"./chunk-5L7RYZCL.mjs";export{a as handInReports,e as idLines,f as inStepLines,d as noteNew,b as previewSettled,g as rereadLine,c as roundBegins};
|
package/dist/chunk-UJQJKNGK.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
-
import{a,b,c,d,e,f,g,h}from"./chunk-EP25HDAJ.mjs";import"./chunk-AR5D57ZD.mjs";import"./chunk-5XA2ZBAE.mjs";import"./chunk-JEUK3ZO7.mjs";import"./chunk-7OG26PGF.mjs";import"./chunk-2OHANJ6Q.mjs";import"./chunk-QE5RG76S.mjs";import"./chunk-UYVCQK3H.mjs";import"./chunk-J5PUIV3Y.mjs";import"./chunk-4OZWXZE5.mjs";import"./chunk-HXG7EOPJ.mjs";import"./chunk-6N3PX4XX.mjs";import"./chunk-HYMEEXKN.mjs";import"./chunk-VS7JIGJW.mjs";import"./chunk-HDWTZ763.mjs";import"./chunk-A55HN5OK.mjs";import"./chunk-5L7RYZCL.mjs";export{c as HOME_NOT_MADE,g as emptyRequiredOf,d as missingPageSaid,a as pageAddressOf,b as pageAloneOf,h as run,e as setsOf,f as settingsGiven};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{--font:ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI Variable Display", "Segoe UI", Helvetica, "PingFang SC", "Microsoft YaHei", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--mono:"SFMono-Regular", Menlo, Consolas, "PT Mono", "Liberation Mono", Courier, monospace;--sb-w:270px;--dur:.2s;--texPri:#2c2c2b;--texSec:#7d7a75;--texTer:#a19e99;--texAcc:#5f5e59;--texDis:#bcbab6;--icoPri:#5c5a55;--icoSec:#8e8b86;--sidIco:#91918e;--borPri:#e6e5e3;--borSec:#f0efed;--borPriTra:#1c13011c;--borStrTra:#1b150030;--crumbSep:#d4d3cf;--bacPri:#fff;--bacSec:#f9f8f7;--bacEle:#fff;--popBac:#fff;--sidBac:#f3f2ef;--pageBac:#fff;--galleryPageBac:#fff;--bacIntTra:#211b170d;--bacTerTra:#2a1c0012;--inputBac:#f2f1ee99;--codeBg:#f9f8f7;--blue:#2383e2;--blueLine:#2383e291;--blueBg:#2383e224;--bluBacIntTra:#0079e413;--select:#2383e224;--red:#eb5757;--star:#cb912f;--btnPriBg:#2383e224;--btnPriBgHi:#2383e238;--btnPriTex:#1a69bd;--btnDanBg:#eb575724;--btnDanBgHi:#eb575738;--btnDanTex:#c4403c;--overlay:#0f0f0f99;--tipBg:#0f0f0f;--tipTex:#f0efed;--tipSub:#a19e99;--scrollThumb:#2a1c0024;--shaOutLg:0px 20px 24px 0px #1919190d, 0px 5px 8px 0px #19191907, 0px 0px 0px 1px #2a1c0012;--gra-tx:#7d7a75;--gra-sw:#f0efed;--gra-bg:#2a1c0012;--gra-bd:#1c13011c;--bro-tx:#9f765a;--bro-sw:#f5ede9;--bro-bg:#8b2e0016;--bro-bd:#7f330028;--ora-tx:#d27b2d;--ora-sw:#fbebde;--ora-bg:#e0650121;--ora-bd:#c4580034;--yel-tx:#cb9434;--yel-sw:#f9f3dc;--yel-bg:#d3a80023;--yel-bd:#d19c0048;--gre-tx:#50946e;--gre-sw:#e8f1ec;--gre-bg:#00642d17;--gre-bd:#00602628;--blu-tx:#387dc9;--blu-sw:#e5f2fc;--blu-bg:#007cd718;--blu-bd:#0076d934;--pur-tx:#9a6bb4;--pur-sw:#f3ebf9;--pur-bg:#6600b214;--pur-bd:#5c00a324;--pin-tx:#c14c8a;--pin-sw:#fae9f1;--pin-bg:#c5005d16;--pin-bd:#b7004e27;--red-tx:#cf5148;--red-sw:#fce9e7;--red-bg:#df160018;--red-bd:#ce18002a;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--texPri:#f0efed;--texSec:#ada9a3;--texTer:#7d7a75;--texAcc:#bcbab6;--texDis:#5f5e59;--icoPri:#a9a69e;--icoSec:#ada9a3;--sidIco:#9b9b9b;--borPri:#383836;--borSec:#2c2c2b;--borPriTra:#ffffeb1a;--borStrTra:#fffceb4e;--crumbSep:#383836;--bacPri:#191919;--bacSec:#202020;--bacEle:#202020;--popBac:#252525;--sidBac:#141413;--pageBac:#181818;--galleryPageBac:#191919;--bacIntTra:#ffffff0e;--bacTerTra:#fffff315;--bluBacIntTra:#4499ff1e;--inputBac:#ffffff0e;--codeBg:#ffffff08;--star:#d99e35;--overlay:#0f0f0fcc;--btnPriBg:#439bff3d;--btnPriBgHi:#439bff57;--btnPriTex:#7ab8ff;--btnDanBg:#ff685c3d;--btnDanBgHi:#ff685c57;--btnDanTex:#ff9a90;--tipBg:#2f2f2f;--tipTex:#f0efed;--tipSub:#9b9b9b;--scrollThumb:#fffff324;--shaOutLg:0px 0px 0px 1px #383836, 0px 14px 28px -6px #19191933, 0px 2px 4px -1px #1919191e;--gra-sw:#383836;--gra-bg:#ffffeb1a;--gra-bd:#ffffeb1a;--bro-sw:#45362d;--bro-bg:#ffb18131;--bro-bd:#ffb18131;--ora-sw:#53361f;--ora-bg:#ff934b47;--ora-bd:#ff934b47;--yel-sw:#504425;--yel-bg:#ffcd4b3d;--yel-bd:#ffcd4b3d;--gre-sw:#263d30;--gre-bg:#6cffac28;--gre-bd:#6cffac28;--blu-sw:#233850;--blu-bg:#439bff3d;--blu-bd:#439bff3d;--pur-sw:#3c2d47;--pur-bg:#c87dff33;--pur-bd:#c87dff33;--pin-sw:#4e2b3c;--pin-bg:#ff67b13b;--pin-bd:#ff67b13b;--red-sw:#502c29;--red-bg:#ff685c3d;--red-bd:#ff685c3d;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}:root[data-theme=dark]{--texPri:#f0efed;--texSec:#ada9a3;--texTer:#7d7a75;--texAcc:#bcbab6;--texDis:#5f5e59;--icoPri:#a9a69e;--icoSec:#ada9a3;--sidIco:#9b9b9b;--borPri:#383836;--borSec:#2c2c2b;--borPriTra:#ffffeb1a;--borStrTra:#fffceb4e;--crumbSep:#383836;--bacPri:#191919;--bacSec:#202020;--bacEle:#202020;--popBac:#252525;--sidBac:#141413;--pageBac:#181818;--galleryPageBac:#191919;--bacIntTra:#ffffff0e;--bacTerTra:#fffff315;--bluBacIntTra:#4499ff1e;--inputBac:#ffffff0e;--codeBg:#ffffff08;--star:#d99e35;--overlay:#0f0f0fcc;--btnPriBg:#439bff3d;--btnPriBgHi:#439bff57;--btnPriTex:#7ab8ff;--btnDanBg:#ff685c3d;--btnDanBgHi:#ff685c57;--btnDanTex:#ff9a90;--tipBg:#2f2f2f;--tipTex:#f0efed;--tipSub:#9b9b9b;--scrollThumb:#fffff324;--shaOutLg:0px 0px 0px 1px #383836, 0px 14px 28px -6px #19191933, 0px 2px 4px -1px #1919191e;--gra-sw:#383836;--gra-bg:#ffffeb1a;--gra-bd:#ffffeb1a;--bro-sw:#45362d;--bro-bg:#ffb18131;--bro-bd:#ffb18131;--ora-sw:#53361f;--ora-bg:#ff934b47;--ora-bd:#ff934b47;--yel-sw:#504425;--yel-bg:#ffcd4b3d;--yel-bd:#ffcd4b3d;--gre-sw:#263d30;--gre-bg:#6cffac28;--gre-bd:#6cffac28;--blu-sw:#233850;--blu-bg:#439bff3d;--blu-bd:#439bff3d;--pur-sw:#3c2d47;--pur-bg:#c87dff33;--pur-bd:#c87dff33;--pin-sw:#4e2b3c;--pin-bg:#ff67b13b;--pin-bd:#ff67b13b;--red-sw:#502c29;--red-bg:#ff685c3d;--red-bd:#ff685c3d;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}html{scrollbar-color:var(--scrollThumb) transparent}body{font-family:var(--font);background:var(--bacPri);color:var(--texPri);-webkit-font-smoothing:antialiased;font-size:16px;line-height:1.5;overflow:hidden}button{font:inherit;color:inherit;cursor:pointer;text-align:inherit;background:0 0;border:0;margin:0;padding:0}svg{fill:none;stroke:currentColor;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round;width:100%;height:100%;display:block}svg.fill{fill:currentColor;stroke:none}svg.solid{fill:currentColor}svg.lu{stroke-width:1.75px}.ic{display:contents}body.preload *{transition:none!important}@keyframes pop-in{0%{opacity:0;transform:translateY(-2px)}}.app{height:100dvh;font-size:14px;display:flex}.main{background:var(--bacPri);flex-direction:column;flex:1;min-width:0;font-size:16px;display:flex;position:relative}.icon-btn{width:28px;height:28px;color:var(--icoSec);border-radius:6px;flex:none;justify-content:center;align-items:center;transition:background 20ms ease-in;display:inline-flex}.icon-btn svg{width:20px;height:20px}.icon-btn svg.lu{width:18px;height:18px}.icon-btn:hover{background:var(--bacIntTra)}.ghost-btn{height:28px;color:var(--texTer);white-space:nowrap;border-radius:6px;align-items:center;gap:6px;padding:0 8px;font-size:14px;display:inline-flex}.ghost-btn svg{width:16px;height:16px}.ghost-btn:hover{background:var(--bacIntTra)}.ghost-btn.sm{height:24px}.row-act{width:20px;height:20px;color:var(--icoSec);border-radius:4px;flex:none;justify-content:center;align-items:center;display:flex}.row-act svg{width:16px;height:16px}.row-act:hover{background:var(--bacTerTra)}.pg-icon{width:20px;height:20px;color:var(--sidIco);flex:none;justify-content:center;align-items:center;font-size:16px;line-height:1;display:inline-flex}.pg-icon svg.lu{width:18px;height:18px}.pg-icon .page-icon{object-fit:cover;border-radius:3px;width:18px;height:18px;display:block}.pg-icon .page-icon.site-icon{object-fit:contain;border-radius:3px;width:16px;height:16px}.pg-icon .glyph-icon{background:currentColor;width:18px;height:18px;display:block;-webkit-mask:none 50%/contain no-repeat;mask:none 50%/contain no-repeat}.glyph-icon[data-icon$=_gray\.svg]{color:var(--lightningcss-light,#55534e)var(--lightningcss-dark,#d3d3d3)}.glyph-icon[data-icon$=_lightgray\.svg]{color:var(--lightningcss-light,#a6a299)var(--lightningcss-dark,#7f7f7f)}.glyph-icon[data-icon$=_brown\.svg]{color:var(--lightningcss-light,#9f6b53)var(--lightningcss-dark,#aa755f)}.glyph-icon[data-icon$=_yellow\.svg]{color:var(--lightningcss-light,#cb912f)var(--lightningcss-dark,#ca8e1b)}.glyph-icon[data-icon$=_orange\.svg]{color:var(--lightningcss-light,#d9730d)var(--lightningcss-dark,#d87620)}.glyph-icon[data-icon$=_green\.svg]{color:var(--lightningcss-light,#448361)var(--lightningcss-dark,#2d9964)}.glyph-icon[data-icon$=_blue\.svg]{color:var(--lightningcss-light,#337ea9)var(--lightningcss-dark,#2e7cd1)}.glyph-icon[data-icon$=_purple\.svg]{color:var(--lightningcss-light,#9065b0)var(--lightningcss-dark,#8d5bc1)}.glyph-icon[data-icon$=_pink\.svg]{color:var(--lightningcss-light,#c14c8a)var(--lightningcss-dark,#c94079)}.glyph-icon[data-icon$=_red\.svg]{color:var(--lightningcss-light,#d44c47)var(--lightningcss-dark,#cd4945)}.menu{z-index:1000;background:var(--popBac);min-width:240px;max-width:320px;box-shadow:var(--shaOutLg);-webkit-user-select:none;user-select:none;border-radius:10px;outline:none;padding:6px 0;font-size:14px;line-height:1.2;animation:.12s ease-out pop-in;position:fixed;top:0;left:0}.menu-head{color:var(--texSec);padding:6px 12px;font-size:12px;font-weight:500;line-height:14px}.menu-item{cursor:pointer;height:28px;color:var(--texPri);border-radius:6px;align-items:center;gap:8px;margin:0 4px 1px;padding:0 8px;display:flex}.menu:not(.controlled) .menu-item:hover,.menu-item.active{background:var(--bacIntTra)}.menu-item.danger:hover,.menu-item.danger.active{color:var(--red)}.menu-item.off,.menu-item.off:hover,.menu-item.off .mi-icon,.menu-item.off:hover .mi-icon{color:var(--texDis);cursor:default}.menu:not(.controlled) .menu-item.off:hover{background:0 0}.menu-item.danger:not(.off):hover .mi-icon,.menu-item.danger:not(.off).active .mi-icon{color:var(--red)}.mi-icon{width:20px;height:20px;color:var(--icoPri);flex:none;justify-content:center;align-items:center;display:flex}.mi-icon svg{width:18px;height:18px}.mi-icon svg.lu{width:16px;height:16px}.mi-label{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.mi-line{text-overflow:ellipsis;display:block;overflow:hidden}.mi-detail{color:var(--texTer);margin-top:2px;font-size:12px}.mi-kbd{max-width:45%;color:var(--texTer);white-space:nowrap;text-overflow:ellipsis;flex:none;margin-left:8px;font-size:12px;overflow:hidden}.mi-kbd:empty{display:none}.mi-arrow{width:16px;height:16px;color:var(--texTer);flex:none}.mi-arrow svg{stroke-width:1.6px}.mi-check{width:16px;height:16px;color:var(--texPri);flex:none}.mi-check svg{stroke-width:1.8px}.mi-switch{box-sizing:border-box;background:#8783784d;border-radius:44px;flex:none;align-items:center;width:28px;height:16px;margin-left:8px;padding:2px;transition:background .2s;display:flex;position:relative}.mi-switch.on{background:var(--blue)}.mi-switch>span{background:#fff;border-radius:50%;flex:none;width:12px;height:12px;transition:transform .2s ease-out;box-shadow:0 1px 2px #0f0f0f33}.mi-switch.on>span{transform:translate(12px)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .mi-switch:not(.on){background:#caccce4d}}:root[data-theme=dark] .mi-switch:not(.on){background:#caccce4d}.menu-sep{background:var(--bacTerTra);height:1px;margin:3px 12px 4px}.menu-foot{color:var(--texTer);padding:4px 12px 2px;font-size:12px;line-height:1.6}.menu-note{color:var(--texSec);padding:4px 12px 8px;font-size:13px;line-height:1.6}.menu-empty{color:var(--texTer);padding:8px 12px;font-size:13px}.menu-sub{min-width:180px}.menu-wide{width:320px}.pop-search{padding:2px 8px 6px}.pop-input{border:1px solid var(--borPriTra);background:var(--inputBac);width:100%;height:28px;color:var(--texPri);font:inherit;border-radius:6px;outline:none;padding:0 8px;font-size:14px}.pop-input:focus{border-color:var(--blue);box-shadow:0 0 0 1px var(--blue)}.pop-list{max-height:320px;overflow-y:auto}.trash-item{border-radius:6px;align-items:center;gap:8px;height:30px;margin:0 4px;padding:0 4px 0 8px;display:flex}.trash-item:hover{background:var(--bacIntTra)}.trash-item .t{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.tip{z-index:3000;pointer-events:none;background:var(--tipBg);max-width:260px;color:var(--tipTex);box-shadow:var(--shaOutLg);overflow-wrap:anywhere;opacity:0;border-radius:6px;padding:4px 8px;font-size:12px;font-weight:500;line-height:1.45;transition:opacity .1s;position:fixed;top:0;left:0}.tip.show{opacity:1}.tip .sub{color:var(--tipSub);font-weight:400}.toast{z-index:2500;background:var(--tipBg);width:fit-content;max-width:min(640px,100vw - 32px);color:var(--tipTex);box-shadow:var(--shaOutLg);opacity:0;pointer-events:none;border-radius:8px;align-items:center;gap:10px;margin:0 auto;padding:8px 14px;font-size:14px;transition:opacity .18s,transform .18s;display:flex;position:fixed;bottom:24px;left:0;right:0;transform:translateY(10px)}.toast.show{opacity:1;transform:none}.toast.show button{pointer-events:auto}.toast.error:before{content:"";background:#ff6b6b;border-radius:50%;flex:none;width:6px;height:6px}.toast button{white-space:nowrap;color:#5ea8f2;border-radius:4px;flex:none;margin-right:-6px;padding:2px 6px;font-weight:500}.toast button:hover{background:#ffffff14}.dialog-overlay{align-items:flex-start;padding-top:18vh}.dialog{background:var(--popBac);width:min(420px,100%);box-shadow:var(--shaOutLg);border-radius:12px;padding:20px 20px 16px;animation:.12s ease-out pop-in}.dialog-title{color:var(--texPri);font-size:16px;font-weight:600;line-height:1.4}.dialog-message{color:var(--texSec);margin-top:8px;font-size:14px;line-height:1.6}.dialog-actions{justify-content:flex-end;gap:8px;margin-top:18px;display:flex}.dialog-btn{height:32px;color:var(--texPri);white-space:nowrap;border-radius:6px;padding:0 14px;font-size:14px;transition:background 20ms ease-in}.dialog-btn:hover:not(:disabled){background:var(--bacIntTra)}.dialog-btn:focus-visible{background:var(--bacTerTra);outline:none}.dialog-btn.primary{background:var(--btnPriBg);color:var(--btnPriTex);font-weight:500}.dialog-btn.primary:hover:not(:disabled),.dialog-btn.primary:focus-visible{background:var(--btnPriBgHi)}.dialog-btn.danger.primary{background:var(--btnDanBg);color:var(--btnDanTex)}.dialog-btn.danger.primary:hover:not(:disabled),.dialog-btn.danger.primary:focus-visible{background:var(--btnDanBgHi)}.dialog-btn:disabled{opacity:.5;cursor:default}.modal{z-index:1500;background:var(--overlay);justify-content:center;align-items:flex-start;padding:12vh 16px 0;display:flex;position:fixed;inset:0}.search-panel{background:var(--popBac);width:min(620px,100%);box-shadow:var(--shaOutLg);border-radius:12px;animation:.12s ease-out pop-in;overflow:hidden}.search-bar{border-bottom:1px solid var(--borSec);align-items:center;gap:10px;height:52px;padding:0 16px;display:flex}.search-bar svg{width:20px;height:20px;color:var(--icoSec);flex:none}.search-bar input{min-width:0;color:var(--texPri);font:inherit;background:0 0;border:0;outline:0;flex:1;font-size:16px}.search-bar input::placeholder{color:var(--texTer)}.search-list{max-height:60vh;padding:4px 0 8px;overflow-y:auto}.search-item{cursor:pointer;border-radius:6px;align-items:center;gap:10px;height:36px;margin:0 6px;padding:0 10px;display:flex}.search-item.active{background:var(--bacIntTra)}.search-item .t{white-space:nowrap;text-overflow:ellipsis;flex:none;max-width:60%;overflow:hidden}.search-item .path{text-align:right;min-width:0;color:var(--texTer);white-space:nowrap;text-overflow:ellipsis;flex:1;font-size:12px;overflow:hidden}.search-main{flex-direction:column;flex:1;gap:1px;min-width:0;display:flex}.search-line{align-items:center;gap:10px;min-width:0;display:flex}.search-item.with-hit{align-items:flex-start;height:auto;min-height:36px;padding-top:6px;padding-bottom:6px}.search-item.with-hit .pg-icon{margin-top:1px}.search-snippet{min-width:0;color:var(--texSec);white-space:nowrap;text-overflow:ellipsis;font-size:13px;line-height:18px;overflow:hidden}.search-item.more{align-items:center;height:28px;min-height:0;padding:0 10px 0 40px}.search-item mark{color:var(--texPri);background:0 0;font-weight:600}.search-note{color:var(--texTer);padding:6px 16px 2px;font-size:12px}.link-view{background:var(--pageBac);flex:1;min-height:0;position:relative}.link-view.off,.link-pane.off{display:none}.link-pane{display:flex;position:absolute;inset:0}.link-frame{background:#fff;border:0;flex:1;width:100%;height:100%;display:block}.link-refused{flex:1}.link-refused-icon{width:36px;height:36px;color:var(--texTer);margin-bottom:6px}.link-refused-icon svg{width:36px;height:36px}.link-refused-url{word-break:break-all;max-width:min(560px,90%)!important;color:var(--texTer)!important;font-size:13px!important}.report-view{flex:1;min-height:0;position:relative}.report-frame{background:var(--pageBac);border:0;width:100%;height:100%;display:block}body.dragging iframe,body.resizing iframe{pointer-events:none}.report-state{text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:6px;min-height:0;padding:24px;display:flex}.report-state h2{margin:0;font-size:20px;font-weight:600}.report-state p{max-width:460px;color:var(--texSec);margin:0;font-size:14px;line-height:1.6}.report-state .muted{color:var(--texTer)}.report-state-actions{gap:8px;margin-top:10px;display:flex}.report-frame[data-pending]{opacity:0;pointer-events:none;position:absolute;inset:0}.card-underlay{z-index:900;background:var(--overlay);animation:.16s ease-out card-underlay-fade;position:fixed;inset:0}body.card-open .sb-resizer,body.card-open .sb-edge{pointer-events:none}@keyframes card-underlay-fade{0%{opacity:0}}@media (prefers-reduced-motion:reduce){.card-underlay{animation:none}}.report-view.off{display:none}.xf-overlay{z-index:1500;background:var(--overlay);justify-content:center;align-items:center;padding:16px;display:flex;position:fixed;inset:0}.xf-export,.xf-import{background:var(--popBac);box-shadow:var(--shaOutLg);color:var(--texPri);border-radius:12px;animation:.12s ease-out pop-in}.xf-export{width:320px;max-width:100%;padding:24px;font-size:14px}.xf-row{justify-content:space-between;align-items:center;height:28px;display:flex}.xf-label{color:var(--texTer);white-space:nowrap;margin-inline-end:auto;line-height:21px}.xf-select{white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;height:28px;color:var(--texPri);border-radius:6px;align-items:center;gap:6px;margin-inline-end:-6px;padding:0 8px;line-height:1.2;transition:background 20ms ease-in;display:flex}.xf-select:hover,.xf-select.open{background:var(--bacIntTra)}.xf-select svg{width:14px;height:14px;color:var(--icoSec);stroke-width:1.6px}.xf-select:focus-visible,.xf-btn:focus-visible,.xf-choose:focus-visible{background:var(--bacTerTra);outline:none}.xf-switch:focus-visible{box-shadow:0 0 0 3px var(--blueBg);outline:none}.xf-scale-row{height:32px}.xf-scale{background:var(--inputBac);width:60px;height:28px;box-shadow:0 0 0 1px var(--borPriTra);color:var(--texPri);font:inherit;text-align:end;border:none;border-radius:6px;outline:none;padding:4px 10px;font-size:14px}.xf-scale:focus{box-shadow:0 0 0 1px var(--blue) inset, 0 0 0 1px var(--blue)}.xf-error{min-height:32px;color:var(--red);align-items:center;padding:4px 0;font-size:12px;line-height:16px;display:flex}.xf-switch-row{height:32px}.xf-switch-row .xf-label{line-height:20px}.xf-switch{box-sizing:content-box;cursor:pointer;background:#8783784d;border-radius:44px;flex-shrink:0;width:26px;height:14px;padding:2px;transition:background .2s,box-shadow .2s;display:flex;position:relative}.xf-switch.on{background:var(--blue)}.xf-switch>span{background:#fff;border-radius:44px;width:14px;height:14px;transition:transform .2s ease-out,background .2s ease-out}.xf-switch.on>span{transform:translate(12px)}.xf-switch.disabled{opacity:.4;cursor:default}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .xf-switch:not(.on){background:#caccce4d}}:root[data-theme=dark] .xf-switch:not(.on){background:#caccce4d}.xf-actions{justify-content:flex-end;align-items:center;gap:8px;margin-top:16px;display:flex}.xf-btn{white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;justify-content:center;align-items:center;height:28px;padding:0 8px;font-size:14px;line-height:1.2;transition:background 20ms ease-in;display:inline-flex}.xf-btn.gray{color:var(--texSec)}.xf-btn.gray:hover{background:var(--bacIntTra)}.xf-btn.blue{background:var(--btnPriBg);color:var(--btnPriTex);font-weight:500}.xf-btn.blue:hover,.xf-btn.blue:focus-visible{background:var(--btnPriBgHi)}.xf-btn[aria-disabled=true]{opacity:.4;pointer-events:none}.menu.menu-select{z-index:1600;width:180px;min-width:180px}.menu-select .mi-icon:empty{display:none}.xf-import{flex-direction:column;gap:14px;width:min(460px,100vw - 32px);padding:20px 20px 18px;font-size:14px;display:flex}.xf-import-head{flex-direction:column;gap:2px;min-width:0;display:flex}.xf-import-title{font-size:16px;font-weight:600;line-height:1.4}.xf-import-where{color:var(--texSec);white-space:nowrap;text-overflow:ellipsis;font-size:13px;line-height:1.5;overflow:hidden}.xf-drop{border:1px dashed var(--borStrTra);color:var(--texPri);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:10px;flex-direction:column;align-items:center;gap:6px;padding:30px 16px 26px;transition:background .12s,border-color .12s;display:flex}.xf-drop:hover{background:var(--bacIntTra)}.xf-drop.dragging{border-color:var(--blue);background:var(--bluBacIntTra)}.xf-drop:focus-visible{background:var(--bacTerTra);outline:none}.xf-drop svg{width:28px;height:28px;color:var(--icoSec);stroke-width:1.4px;margin-bottom:4px;transition:color .12s}.xf-drop.dragging svg{color:var(--blue)}.xf-drop-main{line-height:20px}.xf-choose{color:var(--blue);margin-inline-start:2px}.xf-drop-kinds,.xf-import-note{color:var(--texTer);font-size:12px;line-height:16px}.pref-overlay{z-index:1500;background:var(--overlay);justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.pref-dialog{background:var(--bacPri);width:min(880px,100%);height:min(86vh,900px);box-shadow:var(--shaOutLg);border-radius:12px;flex-direction:column;animation:.12s ease-out pop-in;display:flex;overflow:hidden}.pref-head{border-bottom:1px solid var(--borSec);flex:none;align-items:center;gap:10px;height:48px;padding:0 12px 0 20px;display:flex}.pref-title{color:var(--texPri);flex:none;font-size:14px;font-weight:600}.pref-sub{white-space:nowrap;text-overflow:ellipsis;min-width:0;color:var(--texSec);flex:1;font-size:13px;overflow:hidden}.pref-actions{flex:none;align-items:center;gap:4px;display:flex}.pref-save{height:28px;color:var(--btnPriTex);background:var(--btnPriBg);white-space:nowrap;border-radius:6px;flex:none;padding:0 10px;font-size:14px;font-weight:500}.pref-save:hover:not(:disabled),.pref-save:focus-visible{background:var(--btnPriBgHi);outline:none}.pref-save:disabled{opacity:.5;cursor:default}.pref-note{border-bottom:1px solid var(--borSec);background:var(--bacSec);color:var(--texSec);overflow-wrap:anywhere;flex:none;padding:8px 20px;font-size:13px;line-height:1.5}.pref-body{background:var(--bacPri);flex:1;min-height:0;position:relative}.pref-frame{background:var(--pageBac);border:0;width:100%;height:100%;position:absolute;inset:0}.pref-frame[data-pending]{opacity:0;pointer-events:none}.pref-loading{opacity:0;height:2px;animation:.2s ease-out .3s forwards pref-loading-in;position:absolute;top:0;left:0;right:0;overflow:hidden}.pref-loading:before{content:"";background:var(--borStrTra);border-radius:1px;width:24%;animation:1.6s ease-in-out infinite pref-loading-pass;position:absolute;top:0;bottom:0;left:0}@keyframes pref-loading-in{to{opacity:1}}@keyframes pref-loading-pass{0%{transform:translate(-100%)}to{transform:translate(417%)}}@media (prefers-reduced-motion:reduce){.pref-loading:before{width:100%;animation:none}}.comp-dialog{width:min(640px,100%);height:min(86vh,720px)}.comp-body{flex:1;min-height:0;padding:4px 20px 20px;overflow-y:auto}.comp-group{color:var(--texPri);margin:16px 0 4px;font-size:14px;font-weight:600}.comp-lead,.comp-empty{color:var(--texSec);padding:4px 0 8px;font-size:13px;line-height:1.5}.comp-problem{color:var(--texPri);margin-top:12px;font-size:13px;line-height:1.5}.comp-row{border-top:1px solid var(--borSec);align-items:center;gap:16px;padding:8px 0;display:flex}.comp-row.comp-block{gap:8px;padding:6px 0}.comp-icon{width:20px;height:20px;color:var(--icoPri);flex:none;justify-content:center;align-items:center;display:flex}.comp-icon svg{stroke-width:1.25px;width:20px;height:20px}.comp-name{min-width:0;color:var(--texPri);overflow-wrap:anywhere;flex:1;font-size:14px;line-height:20px}.comp-row.comp-pkg{padding:0;display:block}.comp-line{border-radius:6px;align-items:center;gap:8px;margin:0 -8px;padding:2px 8px;display:flex}.comp-line:hover{background:var(--bacIntTra)}.comp-head{text-align:left;min-width:0;min-height:28px;font:inherit;color:inherit;cursor:pointer;background:0 0;flex:1;align-items:center;gap:8px;padding:0;display:flex}.comp-head .comp-name{flex:0 auto}.comp-chev{width:14px;height:14px;color:var(--texTer);flex:none}.comp-chev svg{stroke-width:1.6px;transition:transform .15s ease-out}.comp-row[data-open] .comp-chev svg{transform:rotate(90deg)}.comp-tag{color:var(--texTer);flex:none;margin-left:auto;padding-left:8px;font-size:12px}.comp-detail{flex-direction:column;gap:2px;padding:0 0 10px 28px;display:flex}.comp-meta{max-width:100%;color:var(--texTer);overflow-wrap:anywhere;font-size:12px;line-height:18px;display:block}.comp-note{color:var(--texSec);overflow-wrap:anywhere;font-size:13px;line-height:18px}.comp-state{color:var(--texTer)}.comp-opts{flex-direction:column;margin-top:6px;display:flex}.comp-opt{text-align:left;font:inherit;color:inherit;cursor:pointer;background:0 0;border-radius:6px;align-items:center;gap:16px;margin:0 -8px;padding:6px 8px;display:flex}.comp-opt:hover{background:var(--bacIntTra)}.comp-opt-text{flex-direction:column;flex:1;gap:1px;min-width:0;display:flex}.comp-opt .comp-toggle-name{color:var(--texPri);font-size:14px;line-height:20px}.comp-opt-hint{color:var(--texSec);overflow-wrap:anywhere;font-size:13px;line-height:18px}.comp-opt .mi-switch{margin:0}.comp-opt[aria-disabled=true]{cursor:default;opacity:.5}.comp-opt[aria-disabled=true]:hover{background:0 0}.comp-packs{grid-template-columns:repeat(auto-fill,minmax(176px,1fr));gap:8px;margin:4px 0 8px;display:grid}.comp-pack{background:var(--bacIntTra);border-radius:10px;align-items:center;gap:8px;min-height:64px;padding:0 12px 0 0;display:flex;position:relative}.comp-pack:hover{background:var(--bacTerTra)}.comp-pack-open{text-align:left;min-width:0;font:inherit;color:inherit;cursor:pointer;background:0 0;border-radius:10px 0 0 10px;flex:1;align-self:stretch;align-items:center;gap:10px;padding:10px 0 10px 12px;display:flex}.comp-pack-open:focus-visible,.comp-pack-add:focus-visible{outline:2px solid var(--blue);outline-offset:-2px}.comp-pack-icon{background:var(--bacPri);width:32px;height:32px;color:var(--icoPri);border-radius:8px;flex:none;justify-content:center;align-items:center;font-size:18px;line-height:1;display:flex}.comp-pack-icon svg{stroke-width:1.25px;width:18px;height:18px}.comp-pack-words{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.comp-pack-name{color:var(--texPri);white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:500;line-height:20px;overflow:hidden}.comp-pack-meta{min-width:0;color:var(--texTer);white-space:nowrap;text-overflow:ellipsis;gap:8px;font-size:12px;line-height:16px;display:flex;overflow:hidden}.comp-pack-author{text-overflow:ellipsis;min-width:0;overflow:hidden}.comp-pack[data-off] .comp-pack-name{color:var(--texSec)}.comp-pack-add{font:inherit;color:var(--texSec);cursor:pointer;justify-content:center;padding:0 12px}.comp-pack-add .comp-pack-icon{width:20px;height:20px;color:var(--texSec);background:0 0}.comp-pack-add .comp-pack-icon svg{stroke-width:1.6px;width:16px;height:16px}.comp-pack-add .comp-pack-name{color:var(--texSec);flex:none;font-weight:400}.comp-pack-add[aria-expanded=true]{background:var(--bacTerTra)}.comp-import{flex-direction:column;align-items:flex-start;gap:4px;margin:0 0 8px;display:flex}.comp-import-row{align-items:center;gap:8px;width:100%;display:flex}.comp-import-row .pop-input{flex:1;min-width:0}.comp-import-row .dialog-btn{flex:none;height:28px;padding:0 12px;font-size:13px}.comp-import-pick{height:24px;font:inherit;color:var(--texSec);cursor:pointer;background:0 0;border-radius:6px;margin:0 -6px;padding:0 6px;font-size:13px}.comp-import-pick:hover:not(:disabled){background:var(--bacIntTra)}.comp-import-error{color:var(--red);overflow-wrap:anywhere;font-size:13px;line-height:1.5}.comp-back{height:26px;font:inherit;color:var(--texSec);cursor:pointer;background:0 0;border-radius:6px;align-items:center;gap:4px;margin:0 0 6px -6px;padding:0 8px 0 6px;font-size:13px;display:inline-flex}.comp-back:hover{background:var(--bacIntTra)}.comp-pack-head{align-items:center;gap:10px;padding:2px 0 6px;display:flex}.comp-pack-view>.comp-note{margin-bottom:6px}.comp-pack-view .comp-lead{padding-top:6px}.comp-toggle{cursor:pointer;background:0 0;flex:none;align-items:center;height:24px;padding:0;display:flex}.comp-toggle .mi-switch{margin:0}.comp-toggle[aria-disabled=true]{cursor:default;opacity:.5}.present{z-index:2000;background:var(--bacPri);position:fixed;inset:0}.present-frame{background:var(--pageBac);transform-origin:0 0;border:0;width:100%;height:100%;position:absolute;top:0;left:0}.present-ink{pointer-events:none;touch-action:none;width:100%;height:100%;position:absolute;inset:0}.present:is([data-tool=laser],[data-tool=pen],[data-tool=marker],[data-tool=eraser]) .present-ink{pointer-events:auto}.present[data-tool=laser] .present-ink{cursor:none}.present[data-tool=pen] .present-ink{cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16'%3E%3Ccircle cx='8' cy='8' r='4' fill='%23e03e3e' stroke='white' stroke-width='1.5'/%3E%3C/svg%3E") 8 8,crosshair}.present[data-tool=marker] .present-ink{cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22'%3E%3Crect x='3' y='3' width='16' height='16' rx='5' fill='rgba(255,204,0,.55)' stroke='rgba(120,90,0,.55)' stroke-width='1'/%3E%3C/svg%3E") 11 11,crosshair}.present[data-tool=eraser] .present-ink{cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Ccircle cx='12' cy='12' r='10' fill='rgba(140,140,140,.28)' stroke='rgba(110,110,110,.9)' stroke-width='1.5'/%3E%3C/svg%3E") 12 12,default}.present-notice{background:var(--tipBg);color:var(--tipTex);box-shadow:var(--shaOutLg);white-space:nowrap;pointer-events:none;border-radius:8px;padding:8px 14px;font-size:14px;position:absolute;bottom:24px;left:50%;transform:translate(-50%)}.present-bar{background:var(--popBac);box-shadow:var(--shaOutLg);border-radius:10px;align-items:center;gap:2px;padding:4px;transition:opacity .3s;display:flex;position:absolute;bottom:16px;left:16px}.present-bar.idle{opacity:.25}.present-btn{width:32px;height:32px;color:var(--icoPri);border-radius:6px;justify-content:center;align-items:center;display:flex}.present-btn:hover{background:var(--bacIntTra)}.present-btn[aria-pressed=true]{background:var(--bacTerTra);color:var(--texPri)}.present-btn:disabled{opacity:.35;pointer-events:none}.present-btn svg{width:18px;height:18px}.present-sep{background:var(--borSec);flex:none;width:1px;height:18px;margin:0 4px}.present-zoom{min-width:48px;height:32px;color:var(--texPri);font-variant-numeric:tabular-nums;text-align:center;border-radius:6px;flex:none;padding:0 4px;font-size:13px}.present-zoom:hover{background:var(--bacIntTra)}.present-ink{mix-blend-mode:multiply}:root[data-theme=dark] .present-ink{mix-blend-mode:screen}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .present-ink{mix-blend-mode:screen}}body:has(.present) .toast{display:none}.sb-container{z-index:20;width:var(--sb-w);background:var(--sidBac);transition:width var(--dur) ease;flex:none;position:relative}.sb-container.collapsed{width:0}.sb-anchor{z-index:9;width:0;position:absolute;top:0;bottom:0;left:0}.sidebar{width:var(--sb-w);height:100%;transition-property:width,opacity,transform,visibility;transition-duration:var(--dur);flex-direction:column;transition-timing-function:ease;display:flex;position:relative}.sidebar .float-bg{z-index:-1;background:var(--sidBac);box-shadow:var(--shaOutLg);border-radius:0 14px 14px 0;display:none;position:absolute;inset:0}.sb-inner{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.sidebar.floating{height:calc(100vh - 91px);transform:translateX(calc(20px - var(--sb-w))) translateY(59px);opacity:0;visibility:hidden;pointer-events:none}.sidebar.floating .float-bg{display:block}.sidebar.floating .sb-inner{border-radius:0 14px 14px 0}.sidebar.floating:before{content:"";height:15px;position:absolute;top:-15px;left:0;right:0}.sidebar.floating.peek{opacity:1;visibility:visible;pointer-events:auto;transform:translate(0)translateY(59px)}.sidebar.mobile{height:auto;width:min(var(--sb-w), 86vw);visibility:hidden;pointer-events:none;position:fixed;top:0;bottom:0;left:0;transform:translate(-100%)}.sidebar.mobile .float-bg{display:block}.sidebar.mobile .sb-inner{border-radius:0 14px 14px 0}.sidebar.mobile.mobile-open{visibility:visible;pointer-events:auto;transform:none}.sb-backdrop{z-index:1;background:var(--overlay);display:none;position:fixed;inset:0}.sb-backdrop.show{display:block}.sb-edge{z-index:8;width:32px;display:none;position:fixed;top:44px;bottom:0;left:0}.app.peekable .sb-edge{display:block}.sb-resizer{cursor:col-resize;z-index:10;width:12px;position:absolute;top:0;bottom:0;right:-11px}.sb-resizer:after{content:"";background:0 0;width:2px;transition:background .15s;position:absolute;top:0;bottom:0;left:-1px}.sb-resizer:hover:after,body.resizing .sb-resizer:after{background:var(--borStrTra)}body.resizing,body.resizing *{cursor:col-resize!important;-webkit-user-select:none!important;user-select:none!important}body.resizing .sb-container,body.resizing .sidebar{transition:none!important}.sb-head{flex-direction:column;flex:none;gap:1px;padding:8px 8px 4px;transition:box-shadow .15s;display:flex}.sb-head.scrolled{box-shadow:0 1px 0 var(--borSec)}.sb-top{align-items:center;gap:5px;height:28px;margin-bottom:7px;padding-left:5px;display:flex}.sidebar.floating .sb-top{display:none}.sb-brand{white-space:nowrap;min-width:0;color:var(--texPri);cursor:default;-webkit-user-select:none;user-select:none;font-family:Iowan Old Style,Palatino Linotype,Palatino,Book Antiqua,Georgia,serif;font-size:19px;font-weight:400;line-height:28px;overflow:hidden}.sb-act{min-width:0;height:30px;color:var(--texSec);text-align:left;border-radius:6px;align-items:center;gap:8px;padding:0 8px;font-size:14px;font-weight:500;transition:background 20ms ease-in;display:flex}.sb-act:hover{background:var(--bacIntTra)}.sb-act-icon{width:22px;height:20px;color:var(--sidIco);flex:none;justify-content:center;align-items:center;display:flex}.sb-act-icon svg{width:18px;height:18px}.sb-act-label{white-space:nowrap;text-overflow:ellipsis;min-width:0;overflow:hidden}.sb-brand.home{cursor:pointer}.sb-rows{flex-direction:column;gap:1px;display:flex;position:relative}.sb-page{cursor:pointer;-webkit-user-select:none;user-select:none;outline:none}.sb-act.selected{background:var(--bacIntTra);color:var(--texPri)}.sb-act.selected:hover,.sb-act.menu-open,.sb-page:focus-visible{background:var(--bacTerTra)}.sb-page .pg-icon{justify-content:center;align-items:center;width:20px;height:20px;display:flex}.sb-page.renaming{cursor:default}.sb-page .sb-page-actions{margin-right:-2px;padding-right:0}.sb-page:hover .sb-page-actions,.sb-page.menu-open .sb-page-actions{display:flex}.sb-act.drag-src{opacity:.4}body.dragging .sb-act:not(.selected):hover{background:0 0}body.dragging .sb-page-actions{display:none!important}.sb-page .row-rename{margin:0 -2px 0 -6px;font-weight:400}.sb-scroll{scrollbar-width:thin;scrollbar-color:var(--scrollThumb) transparent;flex:1;min-height:0;padding:6px 0 12px;position:relative;overflow:hidden auto}.section{margin:0 8px 4px}.section.expanded{padding-bottom:12px}.sec-head{-webkit-user-select:none;user-select:none;align-items:center;height:30px;padding:0 2px;display:flex}.sec-toggle{border-radius:6px;flex:0 auto;align-items:center;gap:2px;min-width:0;height:22px;padding:0 4px 0 6px;display:inline-flex}.sec-text{white-space:nowrap;text-overflow:ellipsis;min-width:0;line-height:16px;overflow:hidden}.sec-toggle:hover,.sec-head.menu-open .sec-toggle{background:var(--bacIntTra)}.sec-label{color:var(--texTer);font-size:12px;font-weight:500;line-height:16px}.sec-chev{width:12px;height:12px;color:var(--texTer);opacity:0;flex:none;transition:opacity .1s}.sec-chev svg{stroke-width:1.8px;transition:transform .2s ease-out}.section.expanded .sec-chev svg{transform:rotate(90deg)}.sec-toggle:hover .sec-chev,.sec-head.menu-open .sec-chev{opacity:1}.tree{margin-top:1px}.row{height:30px;padding:5px 8px 5px calc(8px + var(--depth,0) * 8px);cursor:pointer;-webkit-user-select:none;user-select:none;color:var(--texAcc);border-radius:6px;align-items:center;margin-bottom:1px;font-size:14px;display:flex;position:relative}.row:hover,.row.menu-open{background:var(--bacIntTra)}.row.selected{background:var(--bacIntTra);color:var(--texPri)}.row.selected:hover,.row.selected.menu-open{background:var(--bacTerTra)}.row-icon{flex:none;justify-content:center;align-items:center;width:22px;height:20px;margin-right:8px;display:flex;position:relative}.row-chevron{width:20px;height:20px;color:var(--texTer);opacity:0;border-radius:4px;justify-content:center;align-items:center;display:flex;position:absolute;top:0;left:1px}.row-chevron svg{stroke-width:1.8px;width:12px;height:12px;transition:transform .2s ease-out}.node.open>.row .row-chevron svg{transform:rotate(90deg)}.row.has-kids:hover .row-chevron{opacity:1}.row.has-kids:hover .pg-icon{opacity:0}.row-chevron:hover{background:var(--bacTerTra)}.row-title{white-space:nowrap;text-overflow:ellipsis;flex:0 auto;min-width:0;line-height:21px;overflow:hidden}.row-actions{flex:none;align-items:center;gap:2px;margin-left:auto;padding-left:4px;display:none}.row:hover .row-actions,.row.menu-open .row-actions{display:flex}.row.renaming{cursor:default}.row.renaming .row-actions{display:none}.row-rename{background:var(--inputBac);min-width:0;height:24px;color:var(--texPri);font:inherit;box-shadow:inset 0 0 0 1px var(--blueLine), 0 0 0 2px var(--blueBg);border:0;border-radius:4px;outline:none;flex:1;margin:0 -2px 0 -6px;padding:0 6px;font-size:14px}@media (hover:none){.row.has-kids .row-chevron{opacity:1}.row.has-kids .pg-icon{opacity:0}}body.dragging,body.dragging *{cursor:grabbing!important;-webkit-user-select:none!important;user-select:none!important}body.dragging .row:not(.selected):hover{background:0 0}body.dragging .row-actions{display:none!important}body.dragging .row:hover .row-chevron{opacity:0}body.dragging .row:hover .pg-icon{opacity:1}.row.drag-src{opacity:.4}.row.drop-inside{background:var(--blueBg)!important}.drop-line{background:var(--blueLine);pointer-events:none;z-index:5;border-radius:2px;height:3px;display:none;position:absolute}.drop-line.show{display:block}.drag-ghost{z-index:3000;pointer-events:none;background:var(--popBac);height:30px;color:var(--texPri);box-shadow:var(--shaOutLg);opacity:.9;white-space:nowrap;border-radius:6px;align-items:center;gap:8px;padding:0 10px 0 8px;font-size:14px;display:flex;position:fixed;top:0;left:0;overflow:hidden}.drag-ghost .t{text-overflow:ellipsis;overflow:hidden}.sb-foot{flex:none;align-items:center;gap:4px;height:44px;padding:0 8px;display:flex}.ws-btn{min-width:0;height:28px;color:var(--texSec);text-align:left;border-radius:6px;flex:1;align-items:center;gap:8px;padding:0 6px 0 8px;font-size:14px;font-weight:500;display:flex}.ws-btn svg{width:18px;height:18px;color:var(--sidIco);flex:none}.ws-btn:hover,.ws-btn.menu-open{background:var(--bacIntTra)}.ws-name{white-space:nowrap;text-overflow:ellipsis;min-width:0;overflow:hidden}@media (width<=768px){.sb-resizer{display:none}}.sb-note{color:var(--texTer);margin:4px 16px;font-size:13px}.sb-note.inset{margin:2px 8px 4px;padding-left:8px}.ws-dot{background:var(--texDis);border-radius:50%;flex:none;width:7px;height:7px}.ws-dot.ready{background:var(--gre-tx)}.ws-dot.loading{background:var(--yel-tx)}.ws-dot.offline,.ws-dot.error{background:var(--red-tx)}.sec-head{position:relative}.sec-actions{flex:none;align-items:center;gap:2px;margin-left:auto;padding-left:4px;padding-right:6px;display:none}.sec-head:hover .sec-actions,.sec-head.menu-open .sec-actions{display:flex}.sec-head .row-rename{flex:none;width:calc(100% - 8px);height:24px;margin:0 4px;font-size:12px}body.dragging .sec-actions{display:none!important}.section.drag-src{opacity:.4}.sb-empty{height:26px;margin:2px 0 4px;padding:0 8px 0 38px;line-height:26px}.sb-ext-note{overflow-wrap:anywhere;line-height:1.5}.row-tag{min-width:0;color:var(--texTer);white-space:nowrap;text-align:right;text-overflow:ellipsis;flex:1 1 0;padding-left:6px;font-size:12px;overflow:hidden}.row:hover .row-tag,.row.menu-open .row-tag{display:none}.link-form{padding:0 0 2px}.link-field{padding:2px 12px 6px;display:block}.link-label{color:var(--texSec);margin-bottom:4px;font-size:12px;display:block}.link-error{color:var(--red);margin:0 12px 6px;font-size:13px;line-height:1.5}.link-actions{justify-content:flex-end;gap:8px;padding:6px 12px 4px;display:flex}.link-actions .dialog-btn{height:28px;padding:0 12px;font-size:13px}.row.missing .row-title,.row.missing .pg-icon{color:var(--texTer);opacity:.7}.sec-above{color:var(--texTer);margin-left:4px;font-size:12px;font-weight:400;line-height:16px}.project-form{padding:0 0 2px}.project-path{align-items:center;gap:8px;padding:2px 12px 8px;display:flex}.project-path .pop-input{flex:1;min-width:0}.project-path .dialog-btn{flex:none;height:28px;padding:0 12px;font-size:13px}.project-list{border-top:1px solid var(--borSec);scrollbar-width:thin;scrollbar-color:var(--scrollThumb) transparent;max-height:300px;padding:4px 6px;overflow-y:auto}.project-row{height:30px;padding:5px 8px 5px calc(4px + var(--depth,0) * 8px);cursor:pointer;-webkit-user-select:none;user-select:none;color:var(--texAcc);border-radius:6px;align-items:center;gap:8px;margin-bottom:1px;font-size:14px;display:flex}.project-row:hover{background:var(--bacIntTra)}.project-row.selected{background:var(--bacIntTra);color:var(--texPri)}.project-row.selected:hover{background:var(--bacTerTra)}.project-toggle{width:20px;height:20px;color:var(--texTer);border-radius:4px;flex:none;justify-content:center;align-items:center;display:flex}.project-toggle:hover:not(:disabled){background:var(--bacTerTra)}.project-toggle svg{stroke-width:1.8px;width:12px;height:12px;transition:transform .2s ease-out}.project-toggle[aria-expanded=true] svg{transform:rotate(90deg)}.project-toggle:disabled{visibility:hidden}.project-row .mi-icon{color:var(--sidIco)}.project-document{padding-left:calc(4px + 28px + var(--depth,0) * 8px)}.project-above{color:var(--texTer);margin-left:6px;font-size:12px;font-weight:400}.project-count{color:var(--texTer);flex:none;font-size:12px}.tb-right .icon-btn.annot-open,.tb-right .icon-btn.annot-open:hover{background:var(--bacTerTra)}.menu.annot-list{width:320px;margin-top:4px}.annot-list .menu-scroll{max-height:384px;overflow-y:auto}.annot-list .menu-scroll .menu-item{height:44px}.annot-list .menu-scroll .mi-icon{display:none}.topbar{background:var(--bacPri);z-index:5;flex:none;align-items:center;gap:8px;height:44px;padding:0 12px;display:flex;position:relative}.topbar.tb-page{background:var(--galleryPageBac)}.tb-left{flex:1;align-items:center;min-width:0;display:flex}.tb-menu{color:var(--icoPri);margin:0 4px 0 1px;display:none}.app.sb-collapsed .tb-menu{display:inline-flex}.crumbs{align-items:center;min-width:0;display:flex;overflow:hidden}.crumb-wrap{display:contents}.crumb{white-space:nowrap;min-width:0;max-width:220px;height:24px;color:var(--texPri);border-radius:6px;align-items:center;gap:6px;padding:2px 6px;font-size:14px;display:inline-flex}.crumb:hover{background:var(--bacIntTra)}.crumb .t{text-overflow:ellipsis;overflow:hidden}.crumb .emoji{font-size:14px;line-height:1}.crumb.crumb-rename{width:220px;padding:0}.crumb-rename .row-rename{margin:0}.crumb-sep{color:var(--crumbSep);-webkit-user-select:none;user-select:none;flex:none;margin:0 1px;font-size:13px}.crumb-pop{z-index:1000;background:var(--popBac);width:180px;max-height:calc(100vh - 16px);box-shadow:var(--shaOutLg);-webkit-user-select:none;user-select:none;scrollbar-width:thin;scrollbar-color:var(--scrollThumb) transparent;border-radius:10px;flex-direction:column;gap:1px;padding:4px;font-size:14px;line-height:1.2;display:flex;position:fixed;top:0;left:0;overflow-y:auto}.crumb-pop-head{color:var(--texSec);white-space:nowrap;flex:none;margin:6px 0 8px;padding:0 8px;font-size:12px;font-weight:500}.crumb-pop-item{cursor:pointer;height:28px;color:var(--texPri);border-radius:6px;flex:none;align-items:center;gap:8px;padding:0 8px;display:flex}.crumb-pop-item:hover,.crumb-pop-item.open,.crumb-pop-item.trigger{background:var(--bacIntTra)}.crumb-pop-item.current{background:var(--bluBacIntTra)}.crumb-pop-item .t{white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.crumb-pop-item.more{color:var(--texSec)}.crumb-pop-arrow{width:16px;height:16px;color:var(--texDis);flex:none}.crumb-pop-arrow svg{stroke-width:1.8px}.tb-right{flex:none;align-items:center;gap:2px;display:flex}.tb-right .icon-btn{color:var(--icoPri)}.tb-right .icon-btn.on{color:var(--star)}.tb-right .icon-btn.menu-open{background:var(--bacIntTra)}.edited{color:var(--texTer);white-space:nowrap;margin-right:8px;font-size:14px}@media (width<=1000px){.edited{display:none}}.session-badge{white-space:nowrap;border-radius:10px;flex:none;margin-left:8px;padding:1px 8px;font-size:12px;line-height:20px}.session-badge.muted{color:var(--texTer)}.session-badge.warn{color:var(--ora-tx);background:var(--ora-bg)}.session-badge.danger{color:var(--red-tx);background:var(--red-bg)}.menu.look-menu{width:224px;max-width:none;padding-bottom:8px}.look-fonts,.look-row{gap:4px;padding:0 8px;display:flex}.look-fonts{margin-bottom:4px}.look-font,.look-option{min-width:0;color:var(--texPri);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:1 1 0;transition:background 20ms ease-in}.look-font{flex-direction:column;align-items:center;padding:8px 4px 6px;display:flex}.look-glyph{white-space:nowrap;height:30px;font-size:24px;line-height:30px}.look-caption{color:var(--texSec);white-space:nowrap;text-overflow:ellipsis;max-width:100%;margin-top:2px;font-size:12px;line-height:16px;overflow:hidden}.look-option{white-space:nowrap;justify-content:center;align-items:center;height:28px;padding:0 4px;font-size:14px;display:flex}.look-font:hover,.look-option:hover{background:var(--bacIntTra)}.look-row.look-off .look-option{opacity:.45}.look-font.on .look-glyph,.look-option.on{color:var(--blue)}.look-font:focus-visible,.look-option:focus-visible{background:var(--bacTerTra);outline:none}.look-menu .menu-sep{margin:8px 12px 4px}.link-crumb{cursor:default}.link-crumb:hover{background:0 0}.link-crumb .pg-icon{flex:none;justify-content:center;align-items:center;width:18px;height:18px;display:flex}.link-crumb .pg-icon svg,.link-crumb .pg-icon img{width:16px;height:16px}.tb-open{color:var(--texSec);margin-right:2px}
|