@heycys/gallery 0.2.1 → 0.2.3
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/page/annotate/index.mjs +3 -2
- package/browser/editor/page/board/index.mjs +2 -1
- package/browser/editor/page/board/settings.mjs +2 -1
- package/browser/editor/page/core.mjs +3 -2
- package/browser/editor/page/custom-page.mjs +4 -3
- package/browser/editor/page/editor.mjs +13 -7
- package/browser/editor/page/emoji-picker/support.mjs +3 -2
- package/browser/editor/page/links/index.mjs +1 -12
- package/browser/editor/page/links/pages.mjs +3 -2
- package/browser/editor/page/outline/folds.mjs +3 -0
- package/browser/editor/page/post.mjs +2 -1
- package/browser/editor/page/present-links.mjs +4 -3
- package/browser/editor/page/present-shell.mjs +3 -58
- package/browser/editor/page/session.mjs +3 -37
- package/browser/editor/page/storage.mjs +5 -5
- package/browser/shared/component-catalog.mjs +2 -2
- package/browser/shared/drafts.mjs +26 -51
- package/browser/shared/emoji/icon-value.mjs +2 -1
- package/browser/shared/extension-manifest.mjs +90 -0
- package/browser/shared/extensions.mjs +26 -16
- package/browser/shared/http.mjs +1 -1
- package/browser/shared/i18n/en.mjs +46 -15
- package/browser/shared/media.mjs +2 -1
- package/browser/shared/outline.mjs +11 -51
- package/browser/shared/page-address.mjs +8 -15
- package/browser/shared/paths.mjs +2 -1
- package/browser/shared/preferences.mjs +3 -1
- package/browser/shared/preview-server.mjs +51 -63
- package/browser/shared/service-location.mjs +18 -0
- package/browser/shared/session.mjs +3 -6
- package/browser/shared/workspace-address.mjs +22 -0
- package/browser/shared/workspace-columns.mjs +1 -2
- package/browser/shared/workspace-registry.mjs +6 -40
- package/browser/shared/workspace.mjs +3 -6
- package/browser/shared/writing-preferences.mjs +6 -4
- package/dist/{chunk-5MEXZ2UF.mjs → chunk-225ALKYI.mjs} +1 -1
- package/dist/{chunk-7N2LPG33.mjs → chunk-2HS7ZBPU.mjs} +1 -1
- package/dist/chunk-3F57LEN5.mjs +2 -0
- package/dist/{chunk-MKTX5PGV.mjs → chunk-43B75J5T.mjs} +1 -1
- package/dist/{chunk-VKSRM7EY.mjs → chunk-4B2TB5K2.mjs} +1 -1
- package/dist/{chunk-LV24RY2E.mjs → chunk-4K5KC6V2.mjs} +1 -1
- package/dist/chunk-5GK7HS62.mjs +2 -0
- package/dist/chunk-6GV3CBB2.mjs +2 -0
- package/dist/{chunk-TOE6DPLH.mjs → chunk-6NLXUKAY.mjs} +1 -1
- package/dist/{chunk-ZCP7BTOZ.mjs → chunk-6QBHU4DF.mjs} +1 -1
- package/dist/{chunk-QXVNUASA.mjs → chunk-6QWQXHAV.mjs} +1 -1
- package/dist/chunk-6XD6U3QA.mjs +5 -0
- package/dist/{chunk-DKR7LFIY.mjs → chunk-6Y3HYOBM.mjs} +1 -1
- package/dist/{chunk-36FIRJIF.mjs → chunk-742D2WWJ.mjs} +2 -2
- package/dist/{chunk-7M7UPWU6.mjs → chunk-7EFHNQ5B.mjs} +1 -1
- package/dist/{chunk-2GKGEVMR.mjs → chunk-7UZUQQ7Q.mjs} +25 -24
- package/dist/{chunk-VPVOAJ7X.mjs → chunk-AGDILNWB.mjs} +1 -1
- package/dist/{chunk-5IIH335D.mjs → chunk-ALZ6ZENZ.mjs} +1 -1
- package/dist/{chunk-G4YP7GVC.mjs → chunk-BFJGHSQN.mjs} +1 -1
- package/dist/{chunk-AMDGVDNV.mjs → chunk-BQNTTFPL.mjs} +1 -1
- package/dist/chunk-BX5AKINW.mjs +15 -0
- package/dist/{chunk-PAFSFVYB.mjs → chunk-BYNPEUDS.mjs} +1 -1
- package/dist/{chunk-74RPP2M2.mjs → chunk-C564NU2H.mjs} +1 -1
- package/dist/{chunk-DH6GMDNN.mjs → chunk-CRDG6EF2.mjs} +1 -1
- package/dist/{chunk-7XDYK3UC.mjs → chunk-E7656LR7.mjs} +1 -1
- package/dist/{chunk-KFZBYDIS.mjs → chunk-ECZBLQKK.mjs} +1 -1
- package/dist/{chunk-ZEY2RLBT.mjs → chunk-ERLAIBOA.mjs} +2 -2
- package/dist/{chunk-YFJU3O7G.mjs → chunk-FJLM7YE7.mjs} +1 -1
- package/dist/{chunk-AFGUR7SY.mjs → chunk-FNCCVGKX.mjs} +1 -1
- package/dist/{chunk-VNUWREXU.mjs → chunk-FOJ3K5Z3.mjs} +1 -1
- package/dist/{chunk-WCWYNFDF.mjs → chunk-FQ72LZHB.mjs} +1 -1
- package/dist/chunk-G7N7YFVD.mjs +2 -0
- package/dist/chunk-GIRXJBGC.mjs +2 -0
- package/dist/{chunk-VA3KAQZD.mjs → chunk-GKOBB6DH.mjs} +1 -1
- package/dist/chunk-GMJD7ID3.mjs +2 -0
- package/dist/chunk-GQJMVSSN.mjs +2 -0
- package/dist/{chunk-QZ35UAB4.mjs → chunk-GRAXKKG4.mjs} +1 -1
- package/dist/{chunk-SAHS56QM.mjs → chunk-HX4DLE3J.mjs} +1 -1
- package/dist/{chunk-2RKIHJI2.mjs → chunk-HYMEEXKN.mjs} +1 -1
- package/dist/{chunk-QK3VISCA.mjs → chunk-IA4PSIMD.mjs} +1 -1
- package/dist/chunk-IS7N3N6Q.mjs +168 -0
- package/dist/{chunk-CZ5KJSGK.mjs → chunk-JJNHKGTD.mjs} +1 -1
- package/dist/chunk-JPG2LBQM.mjs +11 -0
- package/dist/chunk-JYK5WJPM.mjs +2 -0
- package/dist/{chunk-LE44MD3O.mjs → chunk-KLQP46Y3.mjs} +1 -1
- package/dist/chunk-L55NOXBE.mjs +4 -0
- package/dist/{chunk-FXQBADMN.mjs → chunk-LCB6MARS.mjs} +1 -1
- package/dist/{chunk-SOD23RGL.mjs → chunk-LJLVCU6W.mjs} +8 -8
- package/dist/{chunk-NAGMRVW4.mjs → chunk-LKX55H76.mjs} +1 -1
- package/dist/chunk-LMUZQK5O.mjs +2 -0
- package/dist/{chunk-CG3UHDKH.mjs → chunk-M4NRDYI5.mjs} +1 -1
- package/dist/{chunk-HM4E43VM.mjs → chunk-MAFIGVXY.mjs} +1 -1
- package/dist/chunk-NLDF35P5.mjs +2 -0
- package/dist/{chunk-3OFXMN6N.mjs → chunk-NMF3IPYA.mjs} +1 -1
- package/dist/chunk-ONKC4BCC.mjs +2 -0
- package/dist/{chunk-CPS4SRPF.mjs → chunk-OU6ZZVBX.mjs} +2 -2
- package/dist/{chunk-NWRZXELO.mjs → chunk-PAREWQGB.mjs} +1 -1
- package/dist/{chunk-BYSF5UMM.mjs → chunk-PKVK6WFC.mjs} +2 -2
- package/dist/{chunk-4AMTKWDO.mjs → chunk-PUOQ65NC.mjs} +1 -1
- package/dist/{chunk-L7W624FD.mjs → chunk-QJAVCTY7.mjs} +1 -1
- package/dist/{chunk-6MPKCH3P.mjs → chunk-QNECWMGR.mjs} +1 -1
- package/dist/{chunk-HBAUKKQH.mjs → chunk-QP7BOHE4.mjs} +1 -1
- package/dist/chunk-QVGOPHOF.mjs +2 -0
- package/dist/{chunk-NFABH3QW.mjs → chunk-RRKJMHNX.mjs} +2 -2
- package/dist/chunk-S3SX3COT.mjs +20 -0
- package/dist/chunk-SQ3FQCCN.mjs +8 -0
- package/dist/{chunk-ZO7SFB2E.mjs → chunk-SQ6Y2ZMA.mjs} +2 -2
- package/dist/{chunk-3A5I2GJK.mjs → chunk-T4Y2ZSVX.mjs} +1 -1
- package/dist/{chunk-VG5JEIUQ.mjs → chunk-TKWEX4FD.mjs} +2 -2
- package/dist/{chunk-CCSGFCLZ.mjs → chunk-U3SSPL4K.mjs} +1 -1
- package/dist/{chunk-DHB7UZ7F.mjs → chunk-U5XL7D6A.mjs} +1 -1
- package/dist/{chunk-JXLSHVJ2.mjs → chunk-UMHUSOPJ.mjs} +1 -1
- package/dist/chunk-UTF7GBQU.mjs +4 -0
- package/dist/chunk-UTMAY3WK.mjs +2 -0
- package/dist/{chunk-S2Y7VI4H.mjs → chunk-V4ZHRALW.mjs} +2 -2
- package/dist/{chunk-GWOYMENX.mjs → chunk-V6XZ4VIR.mjs} +1 -1
- package/dist/{chunk-WTEGUPFG.mjs → chunk-VRPVVMRB.mjs} +1 -1
- package/dist/{chunk-XKOHV4H6.mjs → chunk-W5NPH5UA.mjs} +1 -1
- package/dist/{chunk-VGTMLQWZ.mjs → chunk-WD4U6XXT.mjs} +1 -1
- package/dist/{chunk-4DNHHJSL.mjs → chunk-XBNFXWAW.mjs} +1 -1
- package/dist/chunk-XZV72SQ4.mjs +2 -0
- package/dist/{chunk-QJ3TFJLQ.mjs → chunk-Y34NR5JL.mjs} +1 -1
- package/dist/{chunk-YBB5LWZK.mjs → chunk-YFJB534W.mjs} +1 -1
- package/dist/{chunk-V5JRSGZF.mjs → chunk-YN37ZDLW.mjs} +1 -1
- package/dist/chunk-Z6OKLRHC.mjs +2 -0
- package/dist/chunk-ZLS2FRS6.mjs +3 -0
- package/dist/{chunk-JI6T3A4Y.mjs → chunk-ZMHUDYLV.mjs} +1 -1
- package/dist/{chunk-KH24LWAT.mjs → chunk-ZTHICSSF.mjs} +1 -1
- 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/runtime.js +13 -2
- package/kit/state.js +2 -0
- package/kit/ui.js +5 -1
- package/package.json +1 -1
- package/release.json +7 -7
- package/skill/SKILL.md +13 -13
- package/skill/references/building-blocks.md +1 -1
- package/skill/references/extensions.md +45 -9
- package/web/assets/index-D8P8uhDW.js +15 -0
- package/web/assets/{index-xP0uw3a0.css → index-FLb9jCfl.css} +1 -1
- package/web/index.html +2 -2
- package/dist/chunk-46ACXOU5.mjs +0 -2
- package/dist/chunk-5DPABPBI.mjs +0 -2
- package/dist/chunk-5L26JUYA.mjs +0 -2
- package/dist/chunk-AEMVZYZQ.mjs +0 -166
- package/dist/chunk-ASAXY2DJ.mjs +0 -2
- package/dist/chunk-DAMVDXR3.mjs +0 -2
- package/dist/chunk-DLFZJJEE.mjs +0 -2
- package/dist/chunk-EKNHM3P4.mjs +0 -2
- package/dist/chunk-FCK6NXON.mjs +0 -3
- package/dist/chunk-FX42XU6J.mjs +0 -2
- package/dist/chunk-HATA2W7X.mjs +0 -2
- package/dist/chunk-JJNRIFND.mjs +0 -8
- package/dist/chunk-JL6R4FG4.mjs +0 -4
- package/dist/chunk-KUILYI7H.mjs +0 -4
- package/dist/chunk-NIW7F7LU.mjs +0 -4
- package/dist/chunk-OU3S466R.mjs +0 -20
- package/dist/chunk-QCEATQC4.mjs +0 -2
- package/dist/chunk-TDWJKOLN.mjs +0 -2
- package/dist/chunk-UGO5N3EI.mjs +0 -15
- package/dist/chunk-XMKHCUI6.mjs +0 -15
- package/dist/chunk-XQRUG4G3.mjs +0 -2
- package/dist/chunk-YPPJVDQI.mjs +0 -2
- package/dist/chunk-ZANMKAWS.mjs +0 -2
- package/web/assets/index-BHC5ZOMh.js +0 -15
- /package/dist/{chunk-N3DSBH5S.mjs → chunk-A55HN5OK.mjs} +0 -0
- /package/dist/{chunk-KNZJT4ET.mjs → chunk-QAIHRH3I.mjs} +0 -0
- /package/dist/{chunk-ZW2A6GBW.mjs → chunk-QR6A54KJ.mjs} +0 -0
- /package/dist/{chunk-74UW7QSL.mjs → chunk-UH4SIXTR.mjs} +0 -0
- /package/dist/{chunk-EKGYYOSP.mjs → chunk-W7XHE4CT.mjs} +0 -0
- /package/dist/{chunk-5MMN3N5J.mjs → chunk-YEY3RSFQ.mjs} +0 -0
|
@@ -1 +1 @@
|
|
|
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;--floatOutline:#2a1c0012;--shaOutLg:0px 20px 24px 0px #1919190d, 0px 5px 8px 0px #19191907, 0px 0px 0px 1px var(--floatOutline);--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;--floatOutline:#383836;--shaOutLg:0px 0px 0px 1px var(--floatOutline), 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;--floatOutline:#383836;--shaOutLg:0px 0px 0px 1px var(--floatOutline), 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 svg.page-outline{width:16px;height:16px}.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}.trash-head{justify-content:space-between;align-items:center;gap:16px;display:flex}.trash-head .trash-clear{border:0;height:26px;padding:0 8px;font-size:12px}.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-web-button{z-index:10;background:var(--sidBac);width:36px;height:36px;color:var(--sidIco);box-shadow:0 0 0 1px var(--floatOutline), 0 2px 8px #00000024;touch-action:none;-webkit-user-select:none;user-select:none;cursor:grab;transition:transform var(--dur) ease;border:0;border-radius:50%;justify-content:center;align-items:center;display:flex;position:fixed;top:0;left:0}.sb-web-button svg{pointer-events:none;width:18px;height:18px}.sb-web-button:focus-visible{outline:2px solid var(--blue);outline-offset:2px}.sb-web-button.dragging{cursor:grabbing;transition:none}.sb-web-drag-cover{z-index:8;cursor:grabbing;position:fixed;inset:0}@media (prefers-reduced-motion:reduce){.sb-web-button{transition:none}}.sb-resizer{cursor:col-resize;z-index:10;width:4px;position:absolute;top:0;bottom:0;right:-2px}.sb-resizer:after{content:"";background:0 0;width:2px;transition:background .15s;position:absolute;top:0;bottom:0;left:0}.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:6px;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}
|
|
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;--floatOutline:#2a1c0012;--shaOutLg:0px 20px 24px 0px #1919190d, 0px 5px 8px 0px #19191907, 0px 0px 0px 1px var(--floatOutline);--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;--floatOutline:#383836;--shaOutLg:0px 0px 0px 1px var(--floatOutline), 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;--floatOutline:#383836;--shaOutLg:0px 0px 0px 1px var(--floatOutline), 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 svg.page-outline{width:16px;height:16px}.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}.trash-head{justify-content:space-between;align-items:center;gap:16px;display:flex}.trash-head .trash-clear{border:0;height:26px;padding:0 8px;font-size:12px}.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}.gallery-extension-anchor:empty{display:none}.gallery-extension-anchor:has(>.gallery-extension-slot:empty){display:none}.gallery-extension-slot.topbar-end{align-items:center;gap:6px;display:flex}.gallery-extension-slot.sidebar-footer{flex-direction:column;display:flex}.extension-setting{justify-content:space-between;align-items:center;gap:16px;padding:16px 0;display:flex}.extension-setting p{margin:6px 0}.extension-setting small{overflow-wrap:anywhere;opacity:.65}.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-web-button{z-index:10;background:var(--sidBac);width:36px;height:36px;color:var(--sidIco);box-shadow:0 0 0 1px var(--floatOutline), 0 2px 8px #00000024;touch-action:none;-webkit-user-select:none;user-select:none;cursor:grab;transition:transform var(--dur) ease;border:0;border-radius:50%;justify-content:center;align-items:center;display:flex;position:fixed;top:0;left:0}.sb-web-button svg{pointer-events:none;width:18px;height:18px}.sb-web-button:focus-visible{outline:2px solid var(--blue);outline-offset:2px}.sb-web-button.dragging{cursor:grabbing;transition:none}.sb-web-drag-cover{z-index:8;cursor:grabbing;position:fixed;inset:0}@media (prefers-reduced-motion:reduce){.sb-web-button{transition:none}}.sb-resizer{cursor:col-resize;z-index:10;width:4px;position:absolute;top:0;bottom:0;right:-2px}.sb-resizer:after{content:"";background:0 0;width:2px;transition:background .15s;position:absolute;top:0;bottom:0;left:0}.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:6px;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}
|
package/web/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
6
|
<title>Gallery</title>
|
|
7
7
|
<link rel="icon" href="data:," />
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-D8P8uhDW.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-FLb9jCfl.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body class="preload">
|
|
12
12
|
<div id="root"></div>
|
package/dist/chunk-46ACXOU5.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}from"./chunk-FX42XU6J.mjs";import"./chunk-KUILYI7H.mjs";import"./chunk-2GKGEVMR.mjs";import"./chunk-VKSRM7EY.mjs";import"./chunk-LE44MD3O.mjs";import"./chunk-4OZWXZE5.mjs";import"./chunk-7XDYK3UC.mjs";import"./chunk-VG5JEIUQ.mjs";import"./chunk-N3DSBH5S.mjs";import"./chunk-5L7RYZCL.mjs";export{a as copiedLines,b as run};
|
package/dist/chunk-5DPABPBI.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}from"./chunk-DKR7LFIY.mjs";import"./chunk-3A5I2GJK.mjs";import"./chunk-XQRUG4G3.mjs";import"./chunk-OU3S466R.mjs";import"./chunk-QK3VISCA.mjs";import"./chunk-F4ZA6JRZ.mjs";import"./chunk-7M2BQQGZ.mjs";import"./chunk-TOE6DPLH.mjs";import"./chunk-WTEGUPFG.mjs";import"./chunk-4OZWXZE5.mjs";import"./chunk-XMKHCUI6.mjs";import"./chunk-SAHS56QM.mjs";import"./chunk-KH24LWAT.mjs";import"./chunk-YFJU3O7G.mjs";import"./chunk-NWRZXELO.mjs";import"./chunk-G4YP7GVC.mjs";import"./chunk-DHB7UZ7F.mjs";import"./chunk-2RKIHJI2.mjs";import"./chunk-JXLSHVJ2.mjs";import"./chunk-XKOHV4H6.mjs";import"./chunk-KFZBYDIS.mjs";import"./chunk-7XDYK3UC.mjs";import"./chunk-VG5JEIUQ.mjs";import"./chunk-N3DSBH5S.mjs";import"./chunk-5L7RYZCL.mjs";export{a as noDocuments,b as run};
|
package/dist/chunk-5L26JUYA.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{g as v,h as X}from"./chunk-S2Y7VI4H.mjs";import{a as C,b as B,d as z,g as W,i as J,j as K}from"./chunk-JJNRIFND.mjs";import{a as w}from"./chunk-JEUK3ZO7.mjs";import{f as G}from"./chunk-2GKGEVMR.mjs";import{h as F,i as H}from"./chunk-VKSRM7EY.mjs";import{a as R,e as P,f as Y}from"./chunk-LE44MD3O.mjs";import{a as U,b as d,f as q}from"./chunk-4OZWXZE5.mjs";import{f as L}from"./chunk-VG5JEIUQ.mjs";import{editStateDirectory as re,reportsDirectory as Z}from"../browser/shared/paths.mjs";import{FIRST_BOARD as le,HOME as D,createPage as ce,listPages as de,pageExists as ee,pageFiles as O,pageSlugRefused as te,pagesSettings as he,readPageMeta as ge}from"../browser/shared/pages.mjs";import{findPreviewServer as se}from"../browser/shared/preview-server.mjs";var M=(e,t)=>`${W(e)}#@${t}`,pe=(e,t)=>`http://127.0.0.1:${e}/pages/${t}`,fe="The default home page (\u9996\u9875, slug home) is not made yet: Gallery makes it, with its own cards, when its server first starts in this workspace. gallery open --no-browser starts it: run that once, then gallery page list again.";async function oe(e){return H()||ee(D,e)||he(e).homeMade||await te(D,e)?null:fe}async function ne(e,t){return(e===D?await oe(t):null)??`No custom page "${e}": ${w(O(e,t).html)} does not exist (gallery page list lists those there are).`}async function ae(e){return(await se({reportsDirectory:e,answering:!0,timeout:2e3}))?.port??null}async function we(e,[t,o,...i]){if(!t||!o?.trim()||i.length)throw new d("Name the slug and the title, the title quoted when it has spaces.");let n=await te(t,e);n&&(console.error(n),process.exit(1));let s=await ce(t,o,{root:e});console.log(`Created ${w(s.html)} and page.json`),console.log(`It is listed in the workbench's sidebar, last among the rows under \u65B0\u5EFA and \u641C\u7D22 (the user may drag it elsewhere), and shows one empty board (data-board-id="main"): use it, or write the page as you like.`);let a=await ae(e),r=`write page.html: a board of cards (each <section class="gallery-card" data-card-id="\u2026" data-x data-y data-w data-h> around one custom block's instance; gallery page add places one), or any HTML, CSS and script of your own (references/pages-and-data.md)`,c="at the end tell them where it is in the sidebar (under \u65B0\u5EFA and \u641C\u7D22, its title)";a?(console.log(`Next: send the user the address on the last line now, in a message of its own (the page is theirs to watch as its cards arrive); ${r}; ${c}.`),console.log(`${C}${M(a,t)}`)):console.log(`Next: run gallery page open ${t} --no-browser now (it starts the server) and send the user the address on its \u4EA4\u7ED9\u7528\u6237 line, in a message of its own, before you write any card (the page is theirs to watch as its cards arrive); then ${r}; ${c}.`)}async function me(e,t){if(t.length)throw new d("gallery page list takes nothing else.");let o=await de(e);console.log(`\u5DE5\u4F5C\u533A\uFF1A${w(e)}`);let i=await oe(e);o.length===0&&!i?console.log('No custom pages yet: gallery page new <slug> "<\u6807\u9898>" makes one.'):o.length>0&&console.log(`Custom pages, in the sidebar's order (${o.length}):`);let n=o.length?await ae(e):null;for(let{slug:s,title:a,icon:r}of o)console.log(`- ${s} ${r?`${r} `:""}${a}`),console.log(` \u5730\u5740\uFF1A${n?M(n,s):`/#@${s}`} ${w(O(s,e).html)}`);i&&console.log(i)}async function ue(e,[t,...o],i){if(!t||o.length)throw new d("gallery page open takes one page's slug.");await ge(t,e)||(console.error(await ne(t,e)),process.exit(1)),console.log(`\u5DE5\u4F5C\u533A\uFF1A${w(e)}`);let s=await J({command:`gallery page open ${t}`});s.ok||(console.error(s.message),process.exit(1));let a=[K(s),`${B}${pe(s.port,t)}`,`${C}${M(s.port,t)}`];for(let r of a)console.log(r);console.log(await z(a,i))}async function Q(e,t,o){let i=`127.0.0.1:${e.port}`;try{let n=await fetch(`http://${i}/__gallery/pages/${t}/cards`,{method:"POST",headers:{"Content-Type":"application/json",Origin:`http://${i}`,"X-Gallery-Token":e.token},body:JSON.stringify({...o,workspace:Z}),signal:AbortSignal.timeout(3e4)}),s=await n.json().catch(()=>null);return!s||["elsewhere","token","host","origin","unknown","method"].includes(s.reason)?null:[n.status,s]}catch{return null}}var $e=8e3,b={places:e=>`${e} is a block of documents (its manifest's places has no "page"): it does not go on a custom page.`,disabled:e=>`${e} is turned off (\u8BBE\u7F6E \u203A \u7EC4\u4EF6\u5217\u8868 \u505C\u7528): nothing of it loads, on a page or in a document.`,missing:e=>`No custom block ${e} in this workspace: gallery block list lists them.`,template:e=>`${e} has no template.html a new card can be made of (gallery block check ${e} says why).`,board:(e,t)=>`No board "${t}" on this page: its <div class="gallery-board" data-board-id="\u2026">s are the ones there are.`,cells:()=>"--x, --y, --w and --h are whole numbers (x and y from 0, w and h from 1).",busy:()=>"page.html was written again and again meanwhile: run this again.",size:()=>"page.html would grow past 1,000,000 bytes.",values:(e,t,o)=>`${e}'s setting ${o?`"${o}" `:""}does not take that value (a text of 10,000 characters at most, a number, a date, one of a select's options, a switch's true or false).`,settings:e=>`${e} has no settings, or a card of it no settings part: --set goes with a block whose manifest has some.`};function ye(e){let t=e.indexOf("--"),o=[],i=[];for(let n=0;n<e.length;n++){let s=e[n];if(t!==-1&&n>=t)i.push(s);else if(s==="--set"||s.startsWith("--set=")){let a=s==="--set"?e[n+1]:s.slice(6);s==="--set"&&(n+=1);let r=a?.indexOf("=")??-1;if(a===void 0||r<1)throw new d("--set takes a setting's key and its value: --set <key>=<value> (--set city=\u4E0A\u6D77).");o.push([a.slice(0,r),a.slice(r+1)])}else i.push(s)}return{argv:i,given:o}}var V=new Map([["true",!0],["yes",!0],["on",!0],["1",!0],["false",!1],["no",!1],["off",!1],["0",!1]]);function be(e,t){let o=t.settings??[],i=()=>o.length?`its settings are ${o.map(({key:s,label:a})=>`${s} (${a?.en??a?.zh??s})`).join(", ")}`:"it has no settings",n={};for(let[s,a]of e){let r=o.find(c=>c.key===s);if(!r)throw new d(`${t.id} has no setting "${s}": ${i()}.`);if(Object.hasOwn(n,s))throw new d(`--set ${s} is given twice.`);if(r.type==="number"){if(a.trim()!==""&&!Number.isFinite(Number(a)))throw new d(`The setting ${s} of ${t.id} is a number: --set ${s}=<number>, or --set ${s}= for none.`);n[s]=a.trim()===""?null:Number(a)}else if(r.type==="switch"){if(!V.has(a.trim().toLowerCase()))throw new d(`The setting ${s} of ${t.id} is a switch: --set ${s}=true or --set ${s}=false.`);n[s]=V.get(a.trim().toLowerCase())}else if(r.type==="select"){if(!r.options.includes(a))throw new d(`The setting ${s} of ${t.id} is one of ${r.options.join(", ")}: --set ${s}=<one of them>.`);n[s]=a}else if(r.type==="date"){if(a!==""&&!/^\d{4}-\d{2}-\d{2}$/.test(a))throw new d(`The setting ${s} of ${t.id} is a date, written YYYY-MM-DD: --set ${s}=2027-02-06.`);n[s]=a}else n[s]=a}return n}function ke(e,t){let o=t&&typeof t=="object"&&!Array.isArray(t)?t:{};return(e.settings??[]).filter(i=>i.required&&i.type!=="switch").filter(({key:i,default:n})=>{let s=Object.hasOwn(o,i)?o[i]:n;return s==null||typeof s=="string"&&s.trim()===""}).map(({key:i,label:n})=>({key:i,label:n?.en??n?.zh??i,zh:n?.zh??null}))}async function xe(e,[t,o,...i],n,s,a,r=[]){if(!t||!o||i.length)throw new d("gallery page add takes a page's slug and a block's id (gallery block list lists them).");let c={};for(let l of["x","y","w","h"]){let g=s.get(`--${l}`);if(g!==void 0){if(!/^\d+$/.test(g)||(l==="w"||l==="h")&&Number(g)<1)throw new d(b.cells());c[l]=Number(g)}}if(c.x===void 0!=(c.y===void 0))throw new d("--x and --y go together: a place is both.");ee(t,e)||(console.error(await ne(t,e)),process.exit(1));let k=o.includes("/")?null:P(o),h=o.includes("/")?o:k?k.id:o,m=L(e),u=m.packages.get(h);if(!u){let l=Y(h)?P(h):null;m.settings.disabled.includes(h)?console.error(b.disabled(h)):console.error(l?`${h} is one of Gallery's own blocks, not yet in this workspace: gallery block add ${l.pack===R?l.name:l.id} puts it in; then run this again.`:m.problems.has(h)?`${h} does not load (gallery block check ${h} says why).`:b.missing(h)),process.exit(1)}u.places.includes("page")||(console.error(b.places(h)),process.exit(1));let p=s.get("--board"),y=r.length?be(r,u):null,N={op:"add",block:h,...p?{board:p}:{},...c,...y?{settings:y}:{},agent:!0},j=await se({reportsDirectory:e}),x=j?await Q(j,t,N):null;for(let l=0;x?.[1]?.reason==="missing"&&l<$e/250;l++)await new Promise(g=>setTimeout(g,250)),x=await Q(j,t,N);let[ie,f]=x??await F({root:e,stateDirectory:re,catalog:()=>m}).apply(t,N);if(!f?.ok){let l=f?.reason;console.error(b[l]?.(h,p??le,f?.message)??`Not added (${ie}: ${l??"no answer"}${f?.message?`: ${f.message}`:""}).`),process.exit(1)}let $=f.cards.find(l=>l.id===f.card),I=(f.pushed??[]).map(l=>f.cards.find(g=>g.id===l)).filter(Boolean);console.log(`Added a card of ${h} to ${w(O(t,e).html)}${x?" (through the workspace's running server: an open page shows it at once)":""}:`),console.log(` data-card-id="${$.id}" on board ${$.board}: x ${$.x}, y ${$.y}, w ${$.w}, h ${$.h}${f.measure?" (its block gives no height: 2 cells, --h sets another)":""}`),I.length&&console.log(` Pushed down under it, as it met them: ${I.map(l=>`${l.id} (y ${l.y})`).join(", ")}; no card moved up.`),y&&console.log(` Settings written with it: ${Object.entries(y).map(([l,g])=>`${l}=${JSON.stringify(g)}`).join(", ")}`),console.log(y?"The rest of its data is as the block's template writes it, in the card's instance: write it there if it is to hold something else, leaving every other card as it is.":"Its data is as the block's template writes it, in the card's instance: write it there if it is to hold something else, leaving every other card as it is.");let S=ke(u,{...y??{}});if(S.length){let l=S.map(({key:g,label:T,zh:E})=>`${g} (${E&&E!==T?`${T}, ${E}`:T})`).join(", ");console.log(`${h} needs its setting ${l} before the card shows anything, and this card has none: ask the user for it, or take it from what the workspace says (\u5199\u4F5C\u504F\u597D, the documents) and tell them in the handoff which you did. Give it with the add (${S.map(({key:g})=>`--set ${g}=<value>`).join(" ")}); for this card, write it in its settings part of ${w(O(t,e).html)} (the <script type="application/json"> of data-card-id="${$.id}": {"${S[0].key}":"\u2026"}), re-reading the page right before, or the user fills it in on the card (the grip at its top right \u203A \u8BBE\u7F6E\u2026).`)}}var _={new:we,list:me,open:ue,add:xe,try:async(e,t,o,i,n)=>(await import("./chunk-HATA2W7X.mjs")).pageTryCommand(e,{named:t,values:i,seconds:n,keep:o.has("--keep"),replace:o.has("--replace")}),check:async(e,t)=>(await import("./chunk-CPS4SRPF.mjs")).pageCheckCommand(e,t)},A=["--board","--x","--y","--w","--h"];async function Ie(e){try{return await Se(e)}catch(t){throw t instanceof d&&e.find(o=>!U(o))==="try"&&(t.synopsis=G),t}}async function Se(e){let{argv:t,seconds:o}=X(e),{argv:i,given:n}=ye(t),{positional:s,options:a,values:r}=q({options:["--no-browser","--keep","--replace"],values:[...A,...v],argv:i}),[c,...k]=s,h=Object.keys(_).join(", ");if(!c)throw new d(`Say what to do: ${h}.`);if(!Object.hasOwn(_,c))throw new d(`No such page command: ${c} (${h}).`);if(a.has("--no-browser")&&c!=="open")throw new d(`--no-browser goes with open, not ${c}.`);let m=[...v.filter(p=>r.has(p)),...Object.keys(o).filter(p=>!r.has(p)),...a.has("--keep")?["--keep"]:[],...a.has("--replace")?["--replace"]:[]];if(m.length&&c!=="try")throw new d(`${m[0]} goes with try, not ${c}.`);let u=A.filter(p=>r.has(p));if(u.length&&c!=="add")throw new d(`${u.join(", ")} go with add, not ${c}.`);if(n.length&&c!=="add")throw new d(`--set goes with add, not ${c}.`);return _[c](Z,k,a,new Map([...r].filter(([p])=>c==="try"?v.includes(p):A.includes(p))),o,n)}export{M as a,pe as b,fe as c,ne as d,ye as e,be as f,ke as g,Ie as h};
|
package/dist/chunk-AEMVZYZQ.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 Rn}from"./chunk-DR73Y2UJ.mjs";import{b as Tn}from"./chunk-CG3UHDKH.mjs";import{a as jn,i as _n,j as Pn}from"./chunk-4AMTKWDO.mjs";import{a as On,b as Cn}from"./chunk-QXVNUASA.mjs";import{k as Ge}from"./chunk-FCK6NXON.mjs";import{h as vn}from"./chunk-OU3S466R.mjs";import{a as $n}from"./chunk-CZ5KJSGK.mjs";import{a as En}from"./chunk-UGO5N3EI.mjs";import{a as Sn,b as bn}from"./chunk-5IIH335D.mjs";import{a as xn}from"./chunk-2OHANJ6Q.mjs";import{a as hn,b as Ke,d as gn,e as wn,f as yn,g as kn}from"./chunk-7M2BQQGZ.mjs";import{b as pt,e as Yt,g as ht,h as Xt,j as Vt,k as Zt}from"./chunk-VKSRM7EY.mjs";import{a as Wt,d as Mt,e as Ut,f as Bt,k as zt,l as Ht,m as Gt,r as Kt,t as ut,u as Jt}from"./chunk-LE44MD3O.mjs";import{b as sn,c as cn,d as je,e as ln,f as dn,g as He,i as fn,m as mn,p as un,q as pn}from"./chunk-XMKHCUI6.mjs";import{d as rn,e as Fe,f as Be,g as gt,h as an,k as ze}from"./chunk-YFJU3O7G.mjs";import{b as Qt,c as qt}from"./chunk-NWRZXELO.mjs";import{i as tn,j as nn,k as on}from"./chunk-G4YP7GVC.mjs";import{d as en}from"./chunk-DHB7UZ7F.mjs";import{a as Ne}from"./chunk-7XDYK3UC.mjs";import{c as ft,g as ae,j as At,k as Dt,p as Lt,q as It,v as Nt,w as mt}from"./chunk-VG5JEIUQ.mjs";import ct from"node:fs";import ms from"node:fs/promises";import us from"node:http";import{editStateDirectory as ps,kitPublicDirectory as hs,release as gs,releaseFile as lt,reportsDirectory as Te,vendorDirectory as ws,workbenchDirectory as ys}from"../browser/shared/paths.mjs";import{serve as Go}from"../browser/shared/http.mjs";import{ensureWorkspace as ks,layoutOf as vs}from"../browser/shared/workspace.mjs";import ge from"node:fs/promises";import H from"node:path";import{assetFile as Vo,referencedFile as Fn}from"../browser/shared/media.mjs";import{pageAssetAddress as Zo}from"../browser/shared/pages.mjs";function wt(e,n){if(!/assets\//i.test(e))return e;let t=nn(e,r=>Fn(r)!==null);return tn(e,on(t,r=>{let s=Fn(r.value);return Vo(s)?`${Zo(n,s)}${/[?#].*$/.exec(r.value.trim())?.[0]??""}`:null}))}function An(e,{reportsDirectory:n,kit:t,slug:r=null}={}){let{html:s,packages:f}=dn(r?wt(e,r):e,{reportsDirectory:n,kit:t,page:!0});return{html:s,packages:f}}import{Z as Qo}from"../browser/shared/layers.mjs";import{escapeMarkup as yt}from"../browser/shared/escape.mjs";import{layoutNotesScript as qo}from"../browser/shared/qa-levels.mjs";var Je=30,er=`
|
|
3
|
-
[data-doc-dev].doc-checks { position: fixed; z-index: ${Qo.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; } }`,tr=`(() => {
|
|
17
|
-
document.currentScript.remove();
|
|
18
|
-
${qo()}
|
|
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 Dn(e,n,t={},{directory:r}={}){let s=fn({slug:e,html:n,metadata:t,...r?{directory:r}:{}}),f=s.slice(0,Je).map(p=>`<li>${yt(p)}</li>`).join(""),a=s.length>Je?`<p data-more="${s.length-Je}">\u8FD8\u6709 ${s.length-Je} \u9879</p>`:"",m=s.length?`<ul>${f}</ul>${a}<p data-all="${yt(e)}">gallery check ${yt(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>${er}</style></details>
|
|
70
|
-
<script data-doc-dev>${tr}</script>`}import{browserDirectory as Ea,editStateDirectory as Oa,kitSourceDirectory as Lo,release as Ca,reportsDirectory as D}from"../browser/shared/paths.mjs";import{FRAMED_BY as ja,sendJson as $o,serve as Tt,serveFound as De}from"../browser/shared/http.mjs";import{languageScript as So}from"../browser/shared/i18n/index.mjs";import{announcePreviewServer as _a,galleryVersion as Pa,sameDirectory as Ta}from"../browser/shared/preview-server.mjs";import{registerQuietly as Ra}from"../browser/shared/workspace-registry.mjs";import{lookWord as bo}from"../browser/shared/document-look.mjs";import{documentLook as Eo,ownLookAt as Fa}from"../browser/shared/workspace-look.mjs";import{slugPattern as Io}from"../browser/shared/reports.mjs";import{ATTRIBUTE as at,PACKAGE_ID as Aa}from"../browser/shared/components/installed.mjs";import{COMPONENTS_FOLDER as Oo,DOCUMENT_FOLDERS as Co,EXTENSIONS_FOLDER as Da,PAGES_FOLDER as La,WORKSPACE_FILE as st,defaultWorkspace as Ia,documentDirectory as _t,documentFiles as Na,isDocumentFile as Wa,isDocumentSource as jo,isSlugName as No,layoutOf as Rt}from"../browser/shared/workspace.mjs";import{PAGE_FILES as _o,homeCardsNew as Ma,isBlankPage as Ua,isPageFile as Ba,pageFiles as Po,pageHintShown as za,pageMetaNow as Ha,pageVersion as To}from"../browser/shared/pages.mjs";import{LINK_FILE as Ga}from"../browser/shared/web-links.mjs";import{SIDEBAR_FILE as ot}from"../browser/shared/extension-sidebar.mjs";import{extensionColumnIds as Ro}from"../browser/shared/extensions.mjs";import{isExtensionId as Ka}from"../browser/shared/outline-shape.mjs";import{createHash as hr,randomBytes as gr}from"node:crypto";import Q from"node:fs";import kt from"node:os";import he from"node:path";import{Transform as wr}from"node:stream";import{pipeline as yr}from"node:stream/promises";import{exportSourceOf as kr}from"../browser/shared/export-wrap.mjs";import{writeAtomic as vt}from"../browser/shared/files.mjs";import{sendJson as J}from"../browser/shared/http.mjs";import{said as xt,saying as vr}from"../browser/shared/i18n/index.mjs";import{IMPORT_LIMIT as Mn}from"../browser/shared/import-types.mjs";import{mediaUrl as xr}from"../browser/shared/media.mjs";import{fullAddress as $r}from"../browser/shared/page-address.mjs";import{documentLinks as Un,slugPattern as Bn}from"../browser/shared/reports.mjs";import{documentDirectory as Sr,documentFiles as zn,newDocSlug as br,pageSlug as Er}from"../browser/shared/workspace.mjs";import{readWritingPreferences as Or,saysAnything as Cr,unshownLines as jr}from"../browser/shared/writing-preferences.mjs";import Ln from"node:fs/promises";import lr from"node:path";import{Worker as nr}from"node:worker_threads";import{refusal as or,said as rr}from"../browser/shared/i18n/index.mjs";var ar=6e4,me=null,sr=0,Ye=0,_e=new Map;function ir(){me=new nr(new URL("./worker.mjs",import.meta.url)),me.on("message",({id:n,result:t,error:r})=>{let s=_e.get(n);s&&(_e.delete(n),r?s.reject(Object.assign(new Error(r.message),r)):s.resolve(t),_e.size===0&&(me?.unref(),cr()))});let e=n=>{for(let t of _e.values())t.reject(n);_e.clear(),me=null};me.on("error",e),me.on("exit",n=>e(or(rr("\u8F6C\u6362\u8FDB\u7A0B\u610F\u5916\u9000\u51FA\uFF08{0}\uFF09",n))))}function cr(){clearTimeout(Ye),Ye=setTimeout(()=>{if(_e.size===0&&me){let e=me;me=null,e.removeAllListeners("exit"),e.terminate()}},ar),Ye.unref?.()}function ve(e,n){clearTimeout(Ye),me||ir();let t=++sr;return new Promise((r,s)=>{_e.set(t,{resolve:r,reject:s}),me.ref(),me.postMessage({id:t,type:e,payload:n})})}import{pageLanguage as dr}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("."),[r,s]=t>0?[e.slice(0,t),e.slice(t)]:[e,""];for(let f=0;;f+=1){let a=f===0?e:`${r} ${f}${s}`;if(!n.has(a.toLowerCase()))return n.add(a.toLowerCase()),a}}function Ze(e,n){let t=e.split("/").slice(0,-1),r=n.split("/"),s=0;for(;s<t.length&&s<r.length-1&&t[s]===r[s];)s+=1;return[...t.slice(s).map(()=>".."),...r.slice(s)].map(a=>a===".."?a:encodeURIComponent(a).replace(/\(/g,"%28").replace(/\)/g,"%29")).join("/")}import{documentDirectory as fr,documentFiles as mr}from"../browser/shared/workspace.mjs";var In={markdown:"md",html:"html",pdf:"pdf"},ur={markdown:"text/markdown; charset=utf-8",html:"text/html; charset=utf-8",pdf:"application/pdf"},pr=e=>typeof e=="number"&&e>.1&&e<2;function Nn(e){let{format:n,content:t="everything",subpages:r=!1,folders:s=!0,paper:f="A4",scale:a=1}=e??{};return Object.hasOwn(In,n)&&["everything","no_files"].includes(t)&&typeof r=="boolean"&&typeof s=="boolean"&&["A4","A3","Letter","Legal","Tabloid"].includes(f)&&pr(a)}async function Wn(e,n,t){let{format:r,content:s="everything",subpages:f=!1,folders:a=!0,paper:m="A4",scale:c=1}=n,p=In[r],b=s==="everything",w=[],v=new Map,u=x=>v.get(x)??v.set(x,new Set).get(x),d=async(x,C)=>{let B=await t.titleOf(x),G=Ve(`${Xe(B)}.${p}`,u(C)),z=C?`${C}/${G}`:G,L=a?z.slice(0,-(p.length+1)):"";if(w.push({slug:x,title:B,file:z,folder:L,files:C?`${C}/assets`:"assets"}),f)for(let se of await t.childrenOf(x))await d(se,L)};await d(e,"");let{links:E}=await t.links(),$=(x,C)=>cn(C,x.slug,B=>{let G=r==="pdf"?null:w.find(z=>z.slug===B)?.file??null;return G&&Ze(x.file,G)},{blocks:r!=="markdown",links:E}),k=[],Y=[];for(let x of w)if(r==="markdown"){await t.check(x.slug);let C=fr(x.slug,t.reportsDirectory),B=je(await Ln.readFile(mr(C).html,"utf8"),{slug:x.slug,mode:"words",reportsDirectory:t.reportsDirectory}),G=$(x,B),z=b&&!!jn(),{text:L,files:se,charts:re,charted:U}=await ve("markdown",{source:G,title:x.title,pictures:z}),K=L,ce=new Map;if(se.forEach(({src:h,name:g},j)=>{ce.has(h)||(ce.set(h,`${x.files}/${Ve(Xe(g),u(x.files))}`),b&&Y.push({from:lr.join(C,h),name:ce.get(h)}));let _=ce.get(h);K=K.replace(`\0F${j}\0`,()=>Ze(x.file,_))}),z&&re>0&&K.includes("\0C")){let h=await Pn(await t.offline(x.slug,{files:!0})).catch(()=>[]);K=K.replace(/^.*\u0000C(\d+)\u0000.*$/gm,(g,j)=>{let _=h[Number(j)];if(!_)return"\0gone\0";let T=`${x.files}/${Ve(dr(G)==="en"?U[Number(j)]?"Chart.png":"Figure.png":U[Number(j)]?"\u56FE\u8868.png":"\u56FE.png",u(x.files))}`;return k.push({name:T,data:_,later:!0}),g.replace(`\0C${j}\0`,()=>Ze(x.file,T))}).replace(/\n*\u0000gone\u0000\n*/g,`
|
|
71
|
-
|
|
72
|
-
`).replace(/^\n+|\n+$/g,"")}k.push({name:x.file,data:K})}else r==="html"?k.push({name:x.file,data:$(x,await t.offline(x.slug,{files:b}))}):k.push({name:x.file,data:await _n($(x,await t.offline(x.slug,{files:b})),{paper:m,scale:c})});for(let x of Y){let C=await Ln.readFile(x.from).catch(()=>null);C&&k.push({name:x.name,data:C})}let M=[...k.filter(x=>!x.later&&w.some(C=>C.file===x.name)),...k.filter(x=>x.later||!w.some(C=>C.file===x.name))];return M.length===1?{name:M[0].name,type:ur[r],data:Buffer.isBuffer(M[0].data)?M[0].data:Buffer.from(M[0].data,"utf8")}:{name:`${Xe(w[0].title)}.zip`,type:"application/zip",data:xn(M)}}var _r=3600*1e3,$t=new Set,Hn=!1,Pr=e=>{$t.add(e),!Hn&&(Hn=!0,process.once("exit",()=>{for(let n of $t)try{Q.rmSync(n,{recursive:!0,force:!0})}catch{}}))},Tr=/^u-[a-f0-9]{16}$/;function Gn({edits:e,workspace:n,reports:t,reportsDirectory:r,offline:s}){let f=null,a=()=>f??=Q.promises.mkdtemp(he.join(kt.tmpdir(),"gallery-uploads-")).then(h=>(Pr(h),h)),m=new Map,c=(h,g,j)=>[h,{ok:!1,reason:g,...vr(j)}],p=h=>Q.promises.access(h).then(()=>!0,()=>!1),b=h=>Sr(h,r),w=h=>zn(b(h)),v=async h=>{try{return JSON.parse(await Q.promises.readFile(w(h).json,"utf8")).title||h}catch{return h}};function u(h){if(h.method!=="POST")return[405,{ok:!1,reason:"method"}];let g=h.headers.host??"",j=h.socket.localPort;return g!==`127.0.0.1:${j}`&&g!==`localhost:${j}`?[403,{ok:!1,reason:"host"}]:h.headers.origin!==`http://${g}`?[403,{ok:!1,reason:"origin"}]:h.headers["x-gallery-token"]!==e.token?[403,{ok:!1,reason:"token"}]:/^application\/octet-stream\b/i.test(h.headers["content-type"]??"")?Number(h.headers["content-length"]??0)>Mn?c(413,"size","\u6587\u4EF6\u592A\u5927\uFF08\u6700\u591A 5GB\uFF09"):null:[415,{ok:!1,reason:"type"}]}async function d(){for(let[h,g]of m)Date.now()-g.at<_r||(m.delete(h),await Q.promises.rm(g.file,{force:!0}).catch(()=>{}))}async function E(h,g){let j=u(h);if(j)return h.resume(),J(g,...j);let _=new URL(h.url,"http://localhost").searchParams.get("name")?.replace(/[\u0000-\u001f]/g,"").trim()??"";if(!_||_.length>255)return h.resume(),J(g,...c(400,"name","\u6587\u4EF6\u540D\u4E0D\u5BF9"));await d();let T=`u-${gr(8).toString("hex")}`,P=he.join(await a(),T),N=0,A=new wr({transform(I,Z,X){N+=I.length,X(N>Mn?Object.assign(new Error("too-large"),{reason:"size"}):null,I)}});try{await yr(h,A,Q.createWriteStream(P))}catch(I){return await Q.promises.rm(P,{force:!0}).catch(()=>{}),I.reason==="size"?J(g,...c(413,"size","\u6587\u4EF6\u592A\u5927\uFF08\u6700\u591A 5GB\uFF09")):J(g,...c(400,"body","\u6587\u4EF6\u6CA1\u6709\u4F20\u5B8C"))}return m.set(T,{file:P,name:_,at:Date.now()}),J(g,200,{ok:!0,id:T})}async function $(h,g){let j=await e.check(h);if(j.error)return J(g,...j.error);let{slug:_,options:T}=j.body??{};if(typeof _!="string"||!Bn.test(_)||!await p(w(_).html))return J(g,...c(404,"missing","\u627E\u4E0D\u5230\u8FD9\u4EFD\u6587\u6863"));if(!Nn(T))return J(g,...c(400,"options","\u5BFC\u51FA\u9009\u9879\u4E0D\u5BF9"));try{let P=await s(),N=new Map,A=R=>(N.has(R)||N.set(R,e.handIn(R,{reader:!0}).then(W=>{if(!W.ok)throw Object.assign(new Error(W.message??W.reason),{reason:W.reason});if(W.repeated.length)throw Object.assign(new Error("check"),{reason:"check",slug:R,failures:He(W.repeated)})})),N.get(R)),I=new Map,Z={reportsDirectory:r,titleOf:v,childrenOf:async R=>{let{children:W,links:ee=[]}=await n.outline(),te=we=>(W[we]??[]).flatMap(ye=>ee.includes(ye)||ye.startsWith("~")?te(ye):[ye]);return te(R)},links:()=>Un(r),offline:async(R,W)=>{await A(R);let ee=await P(R,W),te=T.format==="markdown"?null:kr(ee);return te&&I.set(R,te),ee},check:async R=>(await A(R),P.check(R))},{name:X,type:V,data:q}=await Wn(_,T,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(P){if(P.reason==="check"){let N=await v(P.slug),A=P.component?xt("\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,P.component):P.failures.length>1?xt("\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,P.failures[0],P.failures.length):xt("\u300C{0}\u300D\u6CA1\u6709\u901A\u8FC7\u5BFC\u51FA\u524D\u7684\u68C0\u67E5\uFF0C\u6CA1\u6709\u751F\u6210\u6587\u4EF6\uFF1A{1}",N,P.failures[0]);return J(g,...c(422,"check",A))}J(g,...c(P.reason==="browser"?422:P.reason==="busy"?409:P.reason==="missing"?404:500,P.reason??"export",P))}}async function k(h,g){let j=await e.check(h);if(j.error)return J(g,...j.error);let{slug:_}=j.body??{},T=(await e.readTaken(_,{wait:0}))?.text??null;if(T===null)return J(g,...c(404,"missing","\u627E\u4E0D\u5230\u8FD9\u4EFD\u6587\u6863"));let P=`http://${h.headers.host}`,{named:N}=await Un(r),A=sn(je(T,{slug:_,mode:"words",reportsDirectory:r}),_,V=>V.slug&&$r(P,V,N),N),{text:I,files:Z}=await ve("markdown",{source:A,title:await v(_),pictures:!1}),X=I.replace(/\u0000F(\d+)\u0000/g,(V,q)=>{let{src:R,kind:W}=Z[Number(q)];return encodeURI(`${P}${xr(W==="image"?"asset":"file",_,R)}`)});return J(g,200,{ok:!0,text:X})}let Y=async h=>{let g=await e.readTaken(h,{wait:0});return{source:g?.text??"",version:g?.version??null}},M=async(h,g=null)=>{let{source:j,version:_}=g??await Y(h),T="\u5199\u4F5C\u504F\u597D",{text:P,files:N}=await ve("markdown",{source:j,title:T,pictures:!1}),A=P.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:`# ${T}
|
|
75
|
-
`,empty:!0,version:_};let I=he.relative(r,b(h)).split(he.sep).join("/");return{markdown:`${P.replace(/\u0000F(\d+)\u0000/g,(Z,X)=>encodeURI(`${I}/${N[Number(X)].src}`))}
|
|
76
|
-
`,empty:!1,version:_}},x=h=>w(h).json,C=async h=>{try{let g=JSON.parse(await Q.promises.readFile(x(h),"utf8"));return g&&typeof g=="object"?g:null}catch{return null}},B=h=>hr("sha256").update(h).digest("hex").slice(0,16);async function G(h,g,j,_){let T=await C(h);if(!T||j===null)return;let{synced:P,...N}=T,A={file:B(g),page:j,unshown:_},I=T.madeSame;P===void 0&&I?.file===A.file&&I?.page===A.page&&JSON.stringify(I?.unshown)===JSON.stringify(_)||await vt(x(h),`${JSON.stringify({...N,madeSame:A},null,2)}
|
|
77
|
-
`)}async function z(h,g){let j=await Q.promises.mkdtemp(he.join(kt.tmpdir(),"gallery-preferences-"));try{let T=(await ve("import",{uploads:[{file:g,name:"preferences.md"}],scratch:j})).pages[0]??{nodes:[],raws:[],files:[],icon:null,lang:null},P=b(h),N=await C(h)??{},A=zn(P).html,I=await Q.promises.readFile(A,"utf8").catch(()=>""),Z=/<html\b[^>]*\slang="([^"]*)"/i.exec(I)?.[1]??null,{html:X}=await qt(h,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:T.nodes,icon:V,raws:T.raws,lang:T.lang});T.files.length&&await Q.promises.mkdir(he.join(P,"assets"),{recursive:!0});for(let{from:W,name:ee}of T.files){let te=he.join(P,"assets",ee);await p(te)||await Q.promises.copyFile(W,te)}let R=await Q.promises.readFile(A,"utf8").catch(()=>null);R!==null&&e.keepVersion?.(h,R),await vt(A,ze(q))}finally{await Q.promises.rm(j,{recursive:!0,force:!0}).catch(()=>{})}}async function L(h,g){let j=await e.check(h);if(j.error)return J(g,...j.error);let _=j.body?.opening===!0,T=await Er(r);if(!T)return J(g,...c(404,"missing","\u8FD8\u6CA1\u6709\u5199\u4F5C\u504F\u597D"));let P=null,N=(A,I)=>[200,{ok:!0,path:he.resolve(P),remade:A,unshown:I}];return e.respond(async()=>{let A;({file:P,text:A}=await Or(r));let I=await Y(T),Z=(await C(T))?.madeSame??null,X=Z===null||Z.page===I.version,V=Z!==null&&X&&Z.file===B(A);if(_&&V&&Array.isArray(Z.unshown))return N(!1,Z.unshown);let[q,R,W,ee]=[A,"",I.version,!1];if(_&&!X)await z(T,P),{markdown:R,version:W}=await M(T),ee=!0;else{let we=await M(T,I),ye=A.trim()===we.markdown.trim()||we.empty&&!Cr(A);R=we.markdown,_?!ye&&!V&&(await z(T,P),{markdown:R,version:W}=await M(T),ee=!0):ye||(await vt(P,we.markdown),q=we.markdown)}let te=jr(q,R);return await G(T,q,W,te),N(ee,te)})(h,g)}async function se(h,g){let j=await e.check(h);if(j.error)return J(g,...j.error);let{uploads:_,parent:T="",from:P,language:N}=j.body??{},A={said:typeof P=="string"&&P.includes("{0}")&&P.length<=60?P:"\u5BFC\u5165\u81EA {0}",lang:N==="en"?"en":null};if(!Array.isArray(_)||_.length===0||_.length>1e3||!_.every(R=>typeof R=="string"&&Tr.test(R)))return J(g,...c(400,"body"));let I=_.map(R=>m.get(R)).filter(Boolean);if(I.length!==_.length)return J(g,...c(410,"gone","\u4E0A\u4F20\u7684\u6587\u4EF6\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u5BFC\u5165"));for(let R of _)m.delete(R);let Z=typeof T=="string"&&Bn.test(T)&&await p(he.join(r,T))?T:"",X=await Q.promises.mkdtemp(he.join(kt.tmpdir(),"gallery-import-")),V=()=>Promise.all([Q.promises.rm(X,{recursive:!0,force:!0}),...I.map(({file:R})=>Q.promises.rm(R,{force:!0}))]).catch(()=>{}),q;try{q=await ve("import",{uploads:I.map(({file:R,name:W})=>({file:R,name:W})),scratch:X})}catch(R){return await V(),J(g,...c(500,"convert",R))}return e.respond(async()=>{try{let{made:R,top:W}=await $n(q.pages,{create:t.create,slugOf:()=>br(r),folderOf:b,fill:ee=>ve("fill",ee),place:n.place,under:Z,...A});return[200,{ok:!0,pages:R.length,reports:W,skipped:q.skipped,missing:re(q.pages)}]}finally{await V()}})(h,g)}let re=h=>[...new Set(h.flatMap(function g(j){return[...(j.notes??[]).filter(_=>_.kind==="picture-missing").map(_=>_.name),...j.children.flatMap(g)]}))],U={export:$,markdown:k,upload:E,import:se,preferences:L};function K(h,g,j){return Object.hasOwn(U,j)?U[j](h,g).catch(_=>{g.headersSent||J(g,...c(500,"transfer",_))}):J(g,404,{ok:!1,reason:"unknown"})}async function ce(){let h=f;f=null,m.clear();let g=await h?.catch(()=>null);g&&($t.delete(g),await Q.promises.rm(g,{recursive:!0,force:!0}).catch(()=>{}))}return{handle:K,close:ce}}import{FACT_KINDS as Ja,QUERY_ROUTE as Ya,WORKSPACE_GLOBAL as Xa}from"../browser/shared/workspace-query.mjs";function Kn({settled:e,tell:n,delay:t=120,recheck:r=1e3}){let s=new Map,f=(a,m=t)=>{clearTimeout(s.get(a));let c=setTimeout(async()=>{let p=await e(a).catch(()=>({source:null,held:!1,wait:0}));if(s.get(a)===c){if(p.held)return f(a,Math.min(Math.max(p.wait,50),r));if(p.wait>0)return f(a,p.wait);await n(a,p)}},m);s.set(a,c)};return f}import xe from"node:fs";import Ee from"node:path";import{isExtensionId as Rr}from"../browser/shared/outline-shape.mjs";import{DOCUMENT_FOLDERS as Jn,isSlugName as St,layoutOf as Yn}from"../browser/shared/workspace.mjs";function Fr(e,n=!1,t=!1){let{components:r,gallery:s,preferencesPage:f,customPages:a,extensions:m}=Yn(e),c=(u,d)=>{try{return xe.readdirSync(u,{withFileTypes:!0}).filter(E=>E.isDirectory()&&d(E.name)).map(E=>Ee.join(u,E.name))}catch{return[]}},p=c(m,u=>Rr(u)&&!Jn.includes(u));if(n){let u=Ee.dirname(e);for(;!xe.existsSync(u)&&Ee.dirname(u)!==u;)u=Ee.dirname(u);return[u,e,...t?[s]:[],m,...p].filter(d=>xe.existsSync(d))}let b=[...c(e,u=>St(u)),...c(f,u=>St(u))],w=u=>[u,...c(u,d=>!d.startsWith(".")).flatMap(w)],v=c(a,u=>St(u)&&!Jn.includes(u));return[...new Set([e,...[s,f,a,m].filter(u=>xe.existsSync(u)),...v,...p,...b,...b.map(u=>Ee.join(u,"assets")).filter(u=>xe.existsSync(u)),...xe.existsSync(r)?w(r):[]])]}function Qe(e,n,{folders:t=process.platform==="linux",extensionsOnly:r=!1,outline:s=!1}={}){let f=bt(e),a=(v,u)=>{!(s&&u===Yn(e).outline)&&(f(u)||Ee.basename(u).startsWith("."))||xe.stat(u,(E,$)=>{if(E)return n(E.code==="ENOENT"?"unlink":"change",u);let k=$.isDirectory();n(v==="rename"?k?"addDir":"add":k?"addDir":"change",u)})},m=()=>{};if(!t&&!r)try{let v=xe.watch(e,{recursive:!0},(u,d)=>d?a(u,Ee.join(e,d.toString())):n("reset",e));return v.on("error",m),{close:()=>v.close()}}catch(v){if(v.code!=="ERR_FEATURE_UNAVAILABLE_ON_PLATFORM")throw v}let c=new Map,p=null,b=()=>{let v=new Set(Fr(e,r,s));for(let[u,d]of c)v.has(u)||(d.close(),c.delete(u));for(let u of v)if(!c.has(u))try{let d=xe.watch(u,(E,$)=>{if(!$)return n("reset",u);E==="rename"&&w(),a(E,Ee.join(u,$.toString()))});d.on("error",m),c.set(u,d)}catch{}},w=()=>{p??=setTimeout(()=>{p=null,b()},50)};return b(),{close(){clearTimeout(p);for(let v of c.values())v.close();c.clear()},get folders(){return[...c.keys()]}}}import Ar from"node:fs/promises";import{packageScript as Dr}from"../browser/shared/export-wrap.mjs";import{serveFound as Lr}from"../browser/shared/http.mjs";import{extensionOf as Ir,mediaTypeOf as Nr}from"../browser/shared/media.mjs";var Wr="/__gallery/components/",Mr=/^\/__gallery\/components\/([a-z0-9][a-z0-9-]*\/[a-z0-9][a-z0-9-]*)\/(.+)$/,Ur={js:"text/javascript; charset=utf-8",mjs:"text/javascript; charset=utf-8",css:"text/css; charset=utf-8",wasm:"application/wasm"};async function Xn(e,n,t,{root:r}){if(!e.startsWith(Wr))return!1;let[,s,f]=Mr.exec(e)??[],a=s?ae(r).packages.get(s):null,m=a?.files.includes(f)?Lt(a,f):null,c=m?await Ar.readFile(m).catch(()=>null):null,p=c&&f==="kit.js"?Buffer.from(Dr(c.toString("utf8").replace(/^\uFEFF/,""))):c,b=p&&n===a.stamp&&n===It(a);return Lr(t,p,{type:p?Ur[Ir(f)]??Nr(f):void 0,headers:{"X-Content-Type-Options":"nosniff","Cache-Control":b?"max-age=31536000, immutable":"no-store"}}),!0}import{BLOCK_ICON as Br}from"../browser/editor/components/icons.mjs";import{LISTED_BLOCKS as Vn}from"../browser/editor/components/registry.mjs";import{PACKAGE_ID as zr}from"../browser/shared/components/installed.mjs";import{netHostsOf as Zn}from"../browser/shared/net-policy.mjs";import{inLanguage as Qn,refusal as qe,said as Oe}from"../browser/shared/i18n/index.mjs";function qn({root:e,taken:n}){let t=()=>{let a=ae(e);return{packages:Nt(a).map(m=>{let c=Bt(m.id)?Ut(m.id):null;return{...m,newer:c?zt(e,c):null,...c?{addAs:c.pack===Wt?c.name:c.id}:{}}}),packs:ut(e,{settings:a.settings}),packageIcon:Br,blocks:Vn.map(({id:m,name:c,icon:p,hideable:b})=>({id:m,name:{zh:Qn("zh",c),en:Qn("en",c)},icon:p,hidden:b&&a.settings.hidden.includes(m),hideable:b})),problem:Dt(a)}},r=({id:a,hidden:m,shown:c,disabled:p,unlisted:b,net:w})=>{if(![m,c,p,b,w].every(u=>u===void 0||typeof u=="boolean"))return Oe("\u5F00\u5173\u7684\u503C\u4E0D\u5BF9");let v=Vn.find(u=>u.id===a);return v?p!==void 0||c!==void 0||b!==void 0||w!==void 0?Oe("\u5185\u7F6E\u5757\u53EA\u80FD\u9690\u85CF\uFF0C\u4E0D\u80FD\u505C\u7528"):m&&!v.hideable?Oe("\u8FD9\u4E2A\u5757\u4E0D\u80FD\u9690\u85CF"):null:typeof a=="string"&&zr.test(a)?w&&Zn(ae(e).packages.get(a)?.needs).length===0?Oe("\u8FD9\u4E2A\u5757\u4E0D\u8054\u7F51"):null:Oe("\u6CA1\u6709\u8FD9\u4E2A\u7EC4\u4EF6")};return{read:t,write:async a=>{if(a?.pack!==void 0){let{pack:w,enabled:v}=a;if(typeof v!="boolean")throw qe(Oe("\u5F00\u5173\u7684\u503C\u4E0D\u5BF9"));if(typeof w!="string"||!ut(e,{settings:ae(e).settings}).some(({id:u})=>u===w))throw qe(Oe("\u6CA1\u6709\u8FD9\u4E2A\u5757\u5305"));return await ft(e,{pack:w,enabled:v}),n(),t()}let m=r(a);if(m)throw qe(m);let{net:c,...p}=a,b=c===void 0?void 0:c?Zn(ae(e).packages.get(a.id)?.needs):[];return await ft(e,{...p,...b?{net:b}:{}}),n(),t()},install:({path:a,zip:m}={})=>{let c=typeof m=="string"?Cn(Buffer.from(m,"base64")):typeof a=="string"&&a.trim()?On(a):null;if(!c)throw qe(Oe("\u7C98\u8D34\u5757\u5305\u7684\u6587\u4EF6\u5939\u6216 zip \u7684\u8DEF\u5F84"),{code:"path"});let p=Kt(e,c);return n(),{...t(),installed:p}}}}import Hr from"node:path";import{exportsDirectory as Gr}from"../browser/shared/paths.mjs";async function eo(e,n,{workspace:t=null}={}){let r=Hr.join(Gr,`${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:r};if(f.repeated.length)return{problems:He(f.repeated),file:r};let{exported:a,failures:m}=await pn([n],{workspace:t});return await s.keep(a.map(c=>c.slug)),{problems:m.get(n)??[],file:r}}import to from"node:fs/promises";import no from"node:path";import{MEDIA_ROUTES as oo,assetFile as Kr,extensionOf as Jr,imageFile as Yr,mediaTypeOf as Xr}from"../browser/shared/media.mjs";import{serveFound as ro}from"../browser/shared/http.mjs";import{slugPattern as ao}from"../browser/shared/reports.mjs";import{pageFiles as Vr}from"../browser/shared/pages.mjs";import{documentDirectory as Zr}from"../browser/shared/workspace.mjs";var Et={asset:e=>({"Content-Type":Xr(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"}},Qr=new RegExp(`^/__gallery/edit/(${Object.keys(oo).join("|")})/([^/]+)/(assets/[^/]+)$`);async function so(e,n,{reportsDirectory:t}){let[,r,s,f]=Qr.exec(e)??[];if(!r)return!1;let a=ao.test(s)&&oo[r](f)?await to.readFile(no.join(Zr(s,t),f)).catch(()=>null):null;return ro(n,a,{headers:Et[r](f)}),!0}var qr={css:"text/css; charset=utf-8",js:"text/javascript; charset=utf-8",mjs:"text/javascript; charset=utf-8"},ea=/^\/pages\/([^/]+)\/(assets\/[^/]+)$/;async function io(e,n,{reportsDirectory:t}){let[,r,s]=ea.exec(e)??[];if(!r)return!1;let f=ao.test(r)&&Kr(s)?await to.readFile(no.join(Vr(r,t).folder,s)).catch(()=>null):null,a=qr[Jr(s??"")];return ro(n,f,{headers:a?{"Content-Type":a,"X-Content-Type-Options":"nosniff","Cache-Control":"no-cache"}:(Yr(s)?Et.asset:Et.file)(s)}),!0}import ta from"node:dns";import{sendJson as Ae}from"../browser/shared/http.mjs";import{createNetCache as na,dataOf as oa}from"../browser/shared/net-cache.mjs";import{readKeys as ra}from"../browser/shared/net-keys.mjs";import{addressKind as tt,addressOf as go,hostIn as co,keptHere as lo,keyIn as fo,mapsHere as aa,netHostsOf as sa,proxyHere as ia,withKey as ca}from"../browser/shared/net-policy.mjs";import{galleryVersion as la}from"../browser/shared/preview-server.mjs";var et=512*1024,da=6e4,mo=20,uo=5,po=1e4,fa=16*1024,ma=new Set([301,302,303,307,308]),ua=/^(?:application\/(?:[\w.-]+\+)?json|text\/[\w.+-]+)$/i,$e=(e,n={})=>({ok:!1,code:e,...n}),oe=(e,n={},t)=>Object.assign(new Error(e),{refusal:$e(e,n),...t===void 0?{}:{detail:t}});function pa(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 r=go(t.href);return r.code?{code:"url",why:`a redirect to ${t.host?`${t.protocol}//${t.host}`:t.protocol}: ${r.why}`}:r}function ho(e,n){let t=[...new Set([n,encodeURIComponent(n)])].filter(Boolean),r=s=>typeof s=="string"?t.reduce((f,a)=>f.split(a).join("{key}"),s):s;return Object.fromEntries(Object.entries(e).map(([s,f])=>[s,r(f)]))}var ha=e=>ta.promises.lookup(e,{all:!0,verbatim:!0}),Ot=e=>URL.parse(e)?.host||"?",Ct=e=>tt(e)==="fake-ip"?"an address a fake-ip proxy's DNS gives":"an address of this computer or of a private network";async function ga(e,{resolve:n,proxy:t}){let r=e.hostname,s=ia(t),f=d=>{let E=tt(d);return E==="public"||E==="fake-ip"&&s},a=r.replace(/^\[|\]$/g,"");if(tt(a)!=="none"){if(f(a))return{address:a};throw oe("private",{host:r,address:a,why:`${a} is ${Ct(a)}`})}let m;try{m=(await n(r)).map(d=>typeof d=="string"?d:d.address)}catch(d){throw oe("offline",{why:`${r} did not resolve (${d.code??d.message})`})}if(m.length===0)throw oe("offline",{why:`${r} did not resolve`});let c=m.filter(d=>!f(d));if(c.length===0)return{address:m[0]};let p=c.filter(d=>!aa(d)),b=p.length?p:c,w=b.find(d=>!d.includes(":"))??b[0],v=`${r} resolved to ${w}, ${Ct(w)}`,u=lo(r)?"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)":p.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(u===null)return{address:null,resolved:w,said:v};throw oe("private",{host:r,address:w,why:`${v}, ${u}`},s||!t||lo(r)?void 0:`${v}, and the proxy it goes through (${Ot(t)}) is not on this computer`)}var wa=({resolve:e=ha,proxyFor:n=hn,connect:t,ca:r}={})=>async(s,{headers:f,signal:a})=>{let m=await n(s.href),c=await ga(s,{resolve:e,proxy:m}),{address:p}=c,b={...t?{connect:t}:{},...r?{ca:r}:{}};try{return await Ke(s,{address:p,proxy:m,headers:f,signal:a,...b})}catch(w){if(!(m&&w.proxyFailed&&(p!==null||w.code==="ECONNREFUSED")))throw p===null&&!a?.aborted?oe("offline",{why:`${c.said}, and no site the proxy of this computer reached by its name proved to be it`},`${c.said}, handed by its name to the proxy (${Ot(m)}): ${w.code??w.message}`):w;let v=d=>`and the proxy of this computer that would reach it${d?` (${Ot(m)})`:""} is not running`,u=p===null?c.said:`${s.hostname.replace(/^\[|\]$/g,"")===p?p:`${s.hostname} resolved to ${p}`}, ${Ct(p)}`;if(p===null||tt(p)!=="public")throw oe("private",{host:s.hostname,address:p??c.resolved,why:`${u}, ${v(!1)}`},`${u}, ${v(!0)}`);return Ke(s,{address:p,proxy:null,headers:f,signal:a,...b})}},wo=e=>(n,{headers:t,signal:r})=>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:r});async function ya(e){let n=0,t=[];for await(let r of e){if(n+=r.length,n>fa)throw Object.assign(new Error("too-large"),{status:413});t.push(r)}return JSON.parse(Buffer.concat(t).toString("utf8"))}function ka(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 yo({root:e,catalog:n=()=>ae(e),hop:t=null,now:r=Date.now,cache:s=na(e),log:f=()=>{}}){let a=t??wa(),m=new Map,c=d=>{let E=r(),$=(m.get(d)??[]).filter(k=>E-k<6e4);return $.length>=mo?(m.set(d,$),!1):(m.set(d,[...$,E]),!0)},p={accept:"application/json, text/plain;q=0.9, text/*;q=0.8","user-agent":`Gallery/${la} (a custom block's card)`};async function b(d,{hosts:E,allowed:$,key:k}){let Y=AbortSignal.timeout(po),M=d;for(let x=0;;x++){let C;try{C=await a(k===void 0?M:new URL(ca(M.href,k)),{headers:p,signal:Y})}catch(L){throw L.refusal?L:oe("offline",{why:Y.aborted?`no answer within ${po/1e3} s`:String(L.code??L.message)})}if(ma.has(C.status)&&C.headers.get("location")){if(C.body?.cancel().catch(()=>{}),x>=uo)throw oe("status",{status:C.status,why:`more than ${uo} redirects`});let L=pa(C.headers.get("location"),M);if(L.code)throw oe("url",{why:L.why});let se=co(L.url.hostname,E);if(!se)throw oe("host",{host:L.url.hostname,why:`a redirect to ${L.url.hostname}, which the block's needs do not name`});if(!$.includes(se))throw oe("consent",{hosts:E.filter(re=>!$.includes(re))});M=L.url,k=fo(M.href)?k:void 0;continue}if(C.status<200||C.status>299)throw C.body?.cancel().catch(()=>{}),oe("status",{status:C.status});let B=C.headers.get("content-type")??"",G=B.split(";")[0].trim();if(G&&!ua.test(G))throw C.body?.cancel().catch(()=>{}),oe("type",{type:G});if(Number(C.headers.get("content-length"))>et)throw C.body?.cancel().catch(()=>{}),oe("too-large",{limit:et});let z;try{z=C.body?await gn(C,et):Buffer.alloc(0)}catch(L){throw oe("offline",{why:String(L.code??L.message)})}if(z===null)throw oe("too-large",{limit:et});return{type:G||"text/plain",text:ka(z,B)}}}let w=(d,E,$)=>{let k=oa(d,E);return k===void 0?$e("type",{why:"the answer is no JSON"}):{ok:!0,data:k,at:d.at,cached:$}};async function v(d){let{block:E,url:$,as:k="json",doc:Y=null}=d??{},M=typeof E=="string"?n().packages.get(E):null;if(!M)return $e("missing",{why:"no custom block of that id loads in this workspace"});let x=sa(M.needs);if(k!=="json"&&k!=="text")return $e("url",{why:'as is "json" or "text"'});let C=go($);if(C.code)return $e("url",{why:C.why});let{url:B}=C,G=co(B.hostname,x);if(!G)return $e("host",{host:B.hostname,why:x.length?`its needs name ${x.join(", ")}`:"its needs name no host of the net"});let z=n().settings.net?.[E]??[];if(!z.includes(G))return $e("consent",{hosts:x.filter(U=>!z.includes(U))});let L;if(fo(B.href)){let U=ra(e);if(L=U[B.hostname]??U[G],L===void 0)return $e("key",{host:B.hostname})}let se=B.href,re=s.get(se);if(s.used(se,Y,k),re&&r()-Date.parse(re.at)<da)return w(re,k,!0);if(!c(E))return re?w(re,k,!0):$e("rate",{why:`more than ${mo} fetches in a minute`});try{let{type:U,text:K}=await b(B,{hosts:x,allowed:z,key:L});return w(s.put(se,{type:U,text:K,at:new Date(r()).toISOString()}),k,!1)}catch(U){if(!U.refusal)throw U;if(re&&U.refusal.code!=="consent")return w(re,k,!0);let K=L===void 0?U.refusal:ho(U.refusal,L),ce=U.detail===void 0?K.why:L===void 0?U.detail:ho({why:U.detail},L).why;return(K.code!=="offline"||U.detail!==void 0)&&f(`${E}: ${B.hostname} refused (${K.code}${ce?`: ${ce}`:""})`),K}}async function u(d,E){if(d.method!=="POST")return Ae(E,405,{ok:!1,reason:"method"});if(d.headers.origin!==`http://${d.headers.host}`)return Ae(E,403,{ok:!1,reason:"origin"});if(!/^application\/json\b/i.test(d.headers["content-type"]??""))return Ae(E,415,{ok:!1,reason:"type"});let $;try{$=await ya(d)}catch(k){return Ae(E,k.status??400,{ok:!1,reason:"body"})}try{return Ae(E,200,await v($))}catch(k){return Ae(E,500,{ok:!1,code:"offline",why:k.message})}}return{handle:u,answer:v,cache:s}}function ko({max:e=20}={}){let n=new Map;return{get(t,r,s){let f=`${t} ${r}`,a=n.get(f);return!a||a.text!==s?null:(n.delete(f),n.set(f,a),a.page)},set(t,r,s,f){let a=`${t} ${r}`;for(n.delete(a),n.set(a,{slug:t,text:s,page:f});n.size>e;)n.delete(n.keys().next().value)},clear(){n.clear()},forget(t){for(let[r,s]of n)s.slug===t&&n.delete(r)},get size(){return n.size}}}import{createHash as va}from"node:crypto";import{readFileSync as xa}from"node:fs";import vo from"node:fs/promises";import $a from"node:path";import{release as Sa,releaseFile as ba}from"../browser/shared/paths.mjs";async function nt(e){let n=await Promise.all(e.map(r=>vo.stat(r).then(({mtimeMs:s,size:f})=>`${s} ${f}`,()=>"none"))),t=va("sha256");return e.forEach((r,s)=>t.update(`${r}\0${n[s]}
|
|
78
|
-
`)),t.digest("hex").slice(0,16)}function xo(e,n){let t=null,r=async()=>(await Promise.all(e.map(async s=>(await vo.readdir(s,{recursive:!0,withFileTypes:!0}).catch(()=>[])).filter(a=>a.isFile()).map(a=>$a.join(a.parentPath,a.name))))).flat().filter(n).sort();return{files:()=>t??=r(),changed:()=>{t=null}}}var jt=Sa?JSON.parse(xa(ba,"utf8")).stamps:null;var it=Io.source.slice(1,-1),Va=new RegExp(`^/generated/(${it})\\.html$`),Za=new RegExp(`^/(${it})/(?:doc|report)\\.html$`),Qa=new RegExp(`^/pages/(${it})$`),qa=new RegExp(`^/__gallery/pages/(${it})/(cards|library|hint)$`),Ft="/__gallery/events",Pe=Ea,Wo=/^\/__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)$/,es=/^\/__gallery\/edit\/(?:v\/[a-f0-9]{16}\/)?src\/(shared\/emoji\/data\/[a-z]+(?:-[a-z]+)*\.(json|bin))$/,rt=[H.join(Pe,"editor","page"),H.join(Pe,"editor","components"),H.join(Pe,"shared")],ts=e=>Wo.test(`/__gallery/edit/src/${H.relative(Pe,e).split(H.sep).join("/")}`);var ns=[Lo,H.join(Pe,"shared","components")],ll=[Lo,...rt],We={"Cache-Control":"no-store"},Fo={"Cache-Control":"max-age=31536000, immutable"},Pt=(e,n,t)=>Tt(e,{type:n,headers:{...We,...ja},body:t});function os(e){let n=e.headers?.host??"",t=e.socket?.localPort;return!!t&&(n===`127.0.0.1:${t}`||n===`localhost:${t}`)}function rs(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 Mo=`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
|
-
});`,Uo=`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(Ja)}) window.dispatchEvent(new CustomEvent("doc-workspace-change", { detail: kind }));
|
|
87
|
-
};`,as=(e,n,t)=>`<script>
|
|
88
|
-
(() => {
|
|
89
|
-
document.currentScript.remove();
|
|
90
|
-
${Mo}
|
|
91
|
-
const solo = new URLSearchParams(location.search).has("solo");
|
|
92
|
-
let catalog = "${t}";
|
|
93
|
-
const holds = (ids) => document.querySelector(ids === undefined ? "[${at}]" : ids.split(",").map((id) => '[${at}="' + id + '"]').join());
|
|
94
|
-
const events = new EventSource("${Ft}?slug=${e}");
|
|
95
|
-
${Uo}
|
|
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>`,ss=(e,n,t)=>`<script>
|
|
120
|
-
(() => {
|
|
121
|
-
document.currentScript.remove();
|
|
122
|
-
${Mo}
|
|
123
|
-
let catalog = "${t}";
|
|
124
|
-
const holds = (ids) => {
|
|
125
|
-
const named = ids === undefined ? "[${at}]" : ids.split(",").filter(Boolean).map((id) => '[${at}="' + 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("${Ft}?page=${e}");
|
|
130
|
-
${Uo}
|
|
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 Ao(e,n){let t=H.relative(e,n).split(H.sep);if(t[0]===".."||H.isAbsolute(t[0])||t[0]==="")return null;if(t.length===1&&t[0]===st)return{slug:null,name:st,packages:!0};let r=c=>process.platform==="win32"?c.toLowerCase():c;if(r(t[0])===Da&&t.length>=2&&Ka(t[1])&&!Co.includes(t[1])){let c=t.slice(2);return c.some(p=>p.startsWith("."))?null:{extension:t[1],name:c.length===1?c[0]:null}}if(r(t[0])===La&&t.length>=2&&No(t[1])&&!Co.includes(t[1])){let c=t.slice(2);return c.some(p=>p.startsWith("."))?null:{page:t[1],name:c.length===1?c[0]:null}}let s=t[0]===".gallery"&&t[1]==="pages"&&t.length>=3,[f,...a]=s?t.slice(2):t,m=!s&&r(f)===Oo;return!(m||Io.test(f))||f==="exports"||a.some(c=>c.startsWith("."))?null:{slug:m?Oo:f,name:a.length===1?a[0]:null,...m?{packages:m}:{}}}function bt(e){let n=w=>process.platform==="win32"?H.resolve(w).toLowerCase():H.resolve(w),{gallery:t,preferencesPage:r,exports:s,extensions:f}=Rt(e),[a,m,c,p]=[n(t),n(r),n(s),n(f)],b=(w,v)=>w===v||w.startsWith(v+H.sep);return w=>{let v=n(w);return b(v,p)&&v!==p&&v.slice(p.length+1).split(H.sep).some((u,d)=>d>0&&(u==="node_modules"||u===".git"))?!0:b(v,a)&&v!==a&&!b(v,m)||b(v,c)}}var Do=`<script data-doc-dev>document.currentScript.remove(); globalThis.${Xa} = ${JSON.stringify(Ya)};</script>`,ue=(e,n,t)=>new RegExp(`</${n}>`,"i").test(e)?e.replace(new RegExp(`</${n}>`,"i"),()=>` ${t}
|
|
145
|
-
</${n}>`):`${e}
|
|
146
|
-
${t}`;function Bo({stateDirectory:e=Oa,logger:n=console,kind:t="dev",workbenchPage:r=null,closeServer:s=async()=>{},exit:f=()=>process.exit(0)}={}){let a=new Set,m=(o,i="",l="report")=>{for(let S of a)(!o||S.slug===o)&&S.response.write(`data: ${o?`${l} ${i}`:"assets"}
|
|
147
|
-
|
|
148
|
-
`)},c=(o,i)=>{for(let l of a)l.page===o&&l.response.write(`data: page ${i}
|
|
149
|
-
|
|
150
|
-
`)},p=!1,b=o=>{p||=o,A("workspace",()=>{let i=p;p=!1;for(let l of a)l.workspace&&(i||!l.ownOnly)&&l.response.write(`data: workspace ${Date.now()}
|
|
151
|
-
|
|
152
|
-
`)})},w=()=>b(!0),v=()=>b(!1),u=o=>m(o,String(Date.now()),"changes"),d=vn({stateDirectory:e,finish:ze,log:o=>n.info?.(`[gallery] ${o}`),onChanges:u}),E=(o,i,l,{lang:S=null,page:F=!1}={})=>Qt(o,i,l,{blank:!0,lang:S,page:F}),$=e?Rn({file:H.join(e,"activity.json")}):null,k=bn({root:D,read:Sn(d),activity:$,draw:(o,i)=>je(o,{slug:i,mode:"words",reportsDirectory:D})}),Y=new Set,M=o=>{for(let i of o)Y.add(i);Y.size!==0&&A("data",()=>{let i=[...Y];Y.clear();for(let l of a)if(l.slug||l.page)for(let S of i)l.response.write(`data: data ${S}
|
|
153
|
-
|
|
154
|
-
`)})},x=o=>H.resolve(H.dirname(_t(o,D)))===H.resolve(D),C=null,B=null,G=()=>B??=(async()=>{for(let o of a)o.response.end();a.clear(),await Promise.race([s().catch(()=>{}),new Promise(o=>setTimeout(o,3e3))]),await $?.close(),await C?.().catch(()=>{}),await L.close(),z.close(),f()})(),z=En({server:{kind:t,version:Pa,stop:G},edits:d,reports:{create:E,export:o=>eo(d,o,{workspace:i=>k.snapshot(i)}),words:(o,i)=>je(o,{slug:i,mode:"words",reportsDirectory:D})},components:qn({root:D,taken:()=>V.taken()}),changed:w,relayed:v,index:k,web:{frameable:wn,title:yn,icon:o=>kn(o)}}),L=Gn({edits:d,workspace:z,reports:{create:E},reportsDirectory:D,offline:o=>un({...o,workspace:i=>k.snapshot(i)})}),se=yo({root:D,hop:process.env.GALLERY_TEST_NET?wo(Number(process.env.GALLERY_TEST_NET)):null,log:o=>n.info?.(`[gallery] ${o}`)}),re=Xt({root:D,edits:d,stateDirectory:e,catalogTaken:()=>V.taken(),log:o=>n.info?.(`[gallery] ${o}`),shown:wt}),U=(o,i,{present:l=!1,editorModule:S,kit:F}={})=>{let y=i,ie="",ne="",fe=!0;try{l||({html:y,snippet:ie,head:ne}=d.preview(o,i,{editor:S,kitTags:le=>an(le,F)}))}catch(le){fe=!1,n.warn(`[gallery] text editing unavailable for ${o}: ${le.message}`)}if({html:y}=ln(y,{slug:o,mode:"preview",kit:F}),y=ue(y,"head",as(o,Ne(i),ae(D).stamp)),y=ue(y,"head",`<script data-doc-dev>${So()}</script>`),y=ue(y,"head",Do),ne&&(y=ue(y,"head",ne)),l)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=Dn(o,i)}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}},K=ko(),ce=xo(rt,ts),h=o=>{let i=_t(o,D);return[i,H.join(i,"assets")]},g=()=>jt?.editor??ce.files().then(nt),j=o=>jt?.kit?.[o.id]??nt([gt(o)]),_=async(o,i,{present:l})=>{let[S,F,y]=await Promise.all([l?"":g(),Promise.all(Fe.map(j)),nt(h(o))]),ie=[l?"present":S,...F,y,ae(D).stamp,`look:${bo(Eo(o,D))}`].join(" "),ne=K.get(o,ie,i);if(ne!==null)return l||d.opened(i),ne;let fe=new Map(Fe.map((pe,Ce)=>[pe,F[Ce]])),ke=l?void 0:`/__gallery/edit/v/${S}/src/editor/page/editor.mjs`,{html:le,whole:de}=U(o,i,{present:l,editorModule:ke,kit:pe=>`${Be(pe)}?v=${fe.get(pe)}`});return de&&K.set(o,ie,i,le),le},T=async o=>{let i=Po(o,D),[l,S]=await Promise.all([ge.readFile(i.html,"utf8").catch(()=>null),ge.readFile(i.json,"utf8").catch(()=>"")]);if(l===null)return null;let[F,y]=await Promise.all([g(),Promise.all(Fe.map(j))]),ie=new Map(Fe.map((O,be)=>[O,y[be]])),ne=ae(D),fe=To(l,S),ke=Yt(l,{blockOf:O=>ht(ne,O)}),le=Object.fromEntries([...new Set(pt(l).cards.map(({block:O})=>O).filter(Boolean))].map(O=>[O,ht(ne,O)])),{html:de}=An(ke,{reportsDirectory:D,slug:o,kit:O=>`${Be(O)}?v=${ie.get(O)}`}),pe=Ha(o,D),Ce=za(o,D),Re=pe?.defaultCards===!0,Me=Ua(l),Ue=O=>ne.packages.get(O)?.name??Mt().find(be=>be.id===O)?.title??null,Se=Re?Ma(D,pt(l).cards.map(({block:O})=>O)).map(O=>({block:O,name:Ue(O)})):[],Ie=JSON.stringify({slug:o,title:pe?.title??o,token:d.token,version:fe,blocks:le,...Ce?{hint:Ce}:{},...Re?{defaults:Re}:{},...Se.length?{news:Se}:{},...Me?{blank:Me}:{}}).replace(/</g,"\\u003c");return de=ue(de,"head",`<script type="application/json" data-ge-page data-doc-dev>${Ie}</script>`),de=ue(de,"head",ss(o,fe,ne.stamp)),de=ue(de,"head",`<script data-doc-dev>${So()}</script>`),de=ue(de,"head",Do),ue(de,"head",`<script type="module" src="/__gallery/edit/v/${F}/src/editor/page/custom-page.mjs" data-doc-dev></script>`)};async function P(o,i,l){try{if(!os(o))return $o(i,403,{ok:!1,reason:"host"});let S=rs(o);if(S)return Tt(i,{status:302,headers:{Location:S,...We}});let F=new URL(o.url||"/","http://localhost"),y=decodeURI(F.pathname);if(y===Ft){i.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-store",Connection:"keep-alive"}),i.write(`retry: 3000
|
|
156
|
-
|
|
157
|
-
`);let O={slug:F.searchParams.get("slug"),page:F.searchParams.get("page"),workspace:F.searchParams.has("workspace"),ownOnly:F.searchParams.get("workspace")==="own",response:i};a.add(O);let{stamp:be,settings:Xo}=ae(D);i.write(`data: components ${be}
|
|
158
|
-
|
|
159
|
-
`),i.write(`data: ${mt(Xo)}
|
|
160
|
-
|
|
161
|
-
`),o.on("close",()=>a.delete(O));return}if(y==="/__gallery/net")return se.handle(o,i);if(y==="/__gallery/edit/commit")return d.commit(o,i);if(y==="/__gallery/edit/reverted")return d.reverted(o,i);if(y==="/__gallery/edit/hand-in")return d.handInRequest(o,i);if(y==="/__gallery/edit/settle")return d.settleRequest(o,i);if(y==="/__gallery/edit/round")return d.roundRequest(o,i);if(y==="/__gallery/edit/upload")return d.upload(o,i);if(y==="/__gallery/edit/unfurl")return d.unfurl(o,i);if(y==="/__gallery/edit/emoji-library"){if(o.method==="POST")return d.addEmoji(o,i);let[O,be]=await d.listEmojis();return $o(i,O,be)}if(y==="/__gallery/edit/icon"){let O=en({value:F.searchParams.get("value")??"",slug:F.searchParams.get("slug"),tab:F.searchParams.has("tab")});return De(i,O?.body,{type:O?.type,headers:{"Cache-Control":"max-age=31536000, immutable"}})}if(await so(y,i,{reportsDirectory:D})||await io(y,i,{reportsDirectory:D})||await Xn(y,F.searchParams.get("v"),i,{root:D}))return;let ie=y.match(/^\/__gallery\/edit\/emoji-library\/([^/]+)$/)?.[1];if(ie){let O=await d.readEmoji(ie);return De(i,O?.body,{type:O?.type,headers:{"Cache-Control":"no-cache"}})}if(y==="/__gallery/edit/frameable")return d.frameable(o,i);if(y==="/__gallery/edit/annotations")return d.annotations(o,i);if(y==="/__gallery/edit/changes")return d.changes(o,i);let ne=y.match(/^\/__gallery\/transfer\/([a-z]+)$/)?.[1];if(ne)return L.handle(o,i,ne);let[,fe,ke]=y.match(qa)??[];if(fe)return re.handle(o,i,fe,ke);let le=y.match(/^\/__gallery\/workspace\/([a-z]+(?:-[a-z]+)*)$/)?.[1];if(le)return z.handle(o,i,le);let[,de,pe]=y.match(Wo)??[];if(pe){let O=await ge.readFile(H.join(Pe,pe),"utf8").catch(()=>null);return De(i,O,{type:"text/javascript; charset=utf-8",headers:de?Fo:We})}let Ce=F.searchParams.has("v")&&Fe.find(O=>Be(O)===y);if(Ce){let O=await ge.readFile(gt(Ce)).catch(()=>null);return De(i,O,{type:y.endsWith(".css")?"text/css; charset=utf-8":"text/javascript; charset=utf-8",headers:Fo})}if(y==="/__gallery/edit/mhchem.js"){let O=await ge.readFile(rn).catch(()=>null);return De(i,O,{type:"text/javascript; charset=utf-8",headers:We})}let[,Re,Me]=y.match(es)??[];if(Re){let O=await ge.readFile(H.join(Pe,Re)).catch(()=>null);return De(i,O,{type:Me==="json"?"application/json; charset=utf-8":"application/octet-stream",headers:{"Cache-Control":"max-age=86400"}})}if(r&&(y==="/"||y==="/index.html"))return Pt(i,"text/html; charset=utf-8",await r(F.pathname,o));let Ue=y.match(Qa)?.[1];if(Ue){let O=await T(Ue);return O===null?l():Pt(i,"text/html; charset=utf-8",O)}let Se=y.match(Va)?.[1];if(!Se){let O=y.match(Za)?.[1];return No(O)&&await ge.access(Na(_t(O,D)).html).then(()=>!0,()=>!1)?Tt(i,{status:302,headers:{Location:`/generated/${O}.html${F.search}`,...We}}):l()}let Ie=await d.readTaken(Se);if(Ie===null)return l();F.searchParams.has("present")||d.noteTaken(Se,Ie.source).then(O=>O&&u(Se),()=>{}),Pt(i,"text/html; charset=utf-8",await _(Se,Ie.text,{present:F.searchParams.has("present")}))}catch(S){l(S)}}let N=new Map,A=(o,i)=>{clearTimeout(N.get(o)),N.set(o,setTimeout(i,120))},I=o=>{Fa(o,D).reads&&m(o,bo(Eo(o,D)),"look")},Z=Kn({settled:d.settled,async tell(o,i){let l=await d.read(o,i.source).catch(S=>(n.error(`[gallery] ${o}: ${S.message}`),{version:Ne(i.source??"")}));if(m(o,l?.version??Ne("")),x(o)){let S=d.writerOf(o,i.source)??"agent";k.changed(o,{source:i.source??null,text:l?.text??null,by:S}).then(M,F=>n.error(`[gallery] ${o}: its facts not read: ${F.message}`))}d.noteTaken(o,i.source).then(S=>S&&u(o),S=>n.error(`[gallery] ${o}: the Agent's changes not kept: ${S.message}`)),d.checkAnnotations(o).catch(S=>n.error(`[gallery] ${o}: annotations not checked: ${S.message}`))}}),X=({id:o,problem:i,off:l})=>l||n.warn(`[gallery] custom block ${o} does not load: ${At("en",i)}`),V=Tn({root:D,tell({stamp:o,problems:i,settings:l},S){for(let F of S)i.has(F)&&X(i.get(F));for(let{response:F}of a)F.write(`data: components ${o} ${S.filter(y=>Aa.test(y)).join(",")}
|
|
162
|
-
|
|
163
|
-
`),F.write(`data: ${mt(l)}
|
|
164
|
-
|
|
165
|
-
`)}});for(let o of ae(D).problems.values())X(o);k.start().then(o=>o>0&&M(["activity"]));let q=bt(D),R=Ro(D).then(o=>o.join("/"),()=>""),W=!1,ee=o=>{W||=o===ot,A("extensions",async()=>{let i=W;W=!1;let l=await R;R=Ro(D).then(S=>S.join("/"),()=>l),(i||await R!==l)&&w()})},te=Ia(),we=Rt(te).extensions,ye=Qe(te,(o,i)=>{if(Ta(i,Rt(te).outline)){w();return}let l=H.relative(i,we);if(o==="reset"||l===""||!l.startsWith("..")&&!H.isAbsolute(l)){ee(ot);return}let S=Ao(te,i);S?.extension&&(S.name===ot||S.name===null)&&ee(S.name)},{extensionsOnly:!0,outline:!0}),dt=(o,i)=>!Ca&&i.some(l=>o.startsWith(l+H.sep));function Ko(o,i){if(o==="reset"){K.clear(),ce.changed(),V.changed(),w();return}if(q(i))return;let l=Ao(D,i);if(l?.page){let{page:S,name:F}=l;F&&Ba(F)&&A(`page:${S}`,async()=>{let y=Po(S,D),[ie,ne]=await Promise.all([ge.readFile(y.html,"utf8").catch(()=>null),ge.readFile(y.json,"utf8").catch(()=>"")]);ie!==null&&c(S,To(ie,ne))}),(F===_o.json||F===_o.html&&/^(add|unlink)$/.test(o)||F===null&&/^(add|unlink)Dir$/.test(o))&&w();return}if(l?.extension){(l.name===ot||l.name===null)&&ee(l.name);return}if(l?.packages&&V.changed(),l?.name===st&&l.slug===null&&A("look:*",()=>new Set([...a].map(({slug:S})=>S).filter(Boolean)).forEach(I)),l?.name===st&&l.slug===null&&w(),l?.slug&&!(l.name&&Wa(l.name))&&K.forget(l.slug),l&&(/^(doc|report)\.json$/.test(l.name??"")||/^(add|unlink)Dir$/.test(o)&&l.name===null)&&K.clear(),l?.slug&&!l.packages&&l.name===null&&/^(add|unlink)Dir$/.test(o)&&x(l.slug)&&(k.forget(l.slug),M(["todos","recent","stats"])),l?.slug&&!(l.packages&&l.name===null)&&(/^(doc|report)\.json$/.test(l.name??"")||/^(add|unlink)Dir$/.test(o)&&l.name===null||/^(add|unlink)$/.test(o)&&jo(l.name??""))&&w(),l?.slug&&!l.packages&&l.name===Ga&&w(),/^(add|unlink)(Dir)?$/.test(o)&&dt(i,rt)&&ce.changed(),l?.name&&(jo(l.name)||/^(doc|report)\.json$/.test(l.name))){if(Z(l.slug),/^(doc|report)\.json$/.test(l.name)){let{slug:S}=l;A(`look:${S}`,()=>I(S))}}else if(l?.name==="annotations.json"){let{slug:S}=l;A(`notes:${S}`,async()=>{let F=await ge.readFile(i,"utf8").catch(()=>null);m(S,F===null?"":Ne(F),"notes")})}else dt(i,ns)?A("kit",async()=>{try{await mn({fresh:!0}),m()}catch(S){n.error(`[gallery] shared kit rebuild failed: ${S.message}`)}}):dt(i,rt)&&A("editor",()=>m())}async function Jo(o){C=await _a({reportsDirectory:D,port:o,token:d.token,kind:t}),await Ra(D)}async function Yo(){ye?.close();for(let o of N.values())clearTimeout(o);V.close(),await $?.close(),await C?.().catch(()=>{}),C=null,await L.close(),z.close()}return{handle:P,changed:Ko,listening:Jo,close:Yo,stop:G,edits:d,get listeners(){return a.size}}}import is from"node:fs/promises";import Le from"node:path";import{FRAMED_BY as cs,serve as zo}from"../browser/shared/http.mjs";var ls={".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"},ds=e=>ls[Le.extname(e).toLowerCase()]??"application/octet-stream";function fs(e,n){if(/%(?:2f|5c|00)/i.test(n)||/[\\\0]/.test(n))return null;let t;try{t=decodeURIComponent(n)}catch{return null}let r=t.split("/");if(r.some(a=>a===""||a==="."||a===".."||/[\\\0:]/.test(a)))return null;let s=Le.resolve(e,...r),f=Le.relative(e,s);return f&&!f.startsWith("..")&&!Le.isAbsolute(f)?s:null}async function Ho(e,n,{web:t,kit:r,vendor:s}){if(e.method!=="GET"&&e.method!=="HEAD")return!1;let f=new URL(e.url||"/","http://localhost").pathname,a=null,m=null;if(f==="/"||f==="/index.html"){if(!t)return!1;[a,m]=[Le.join(t,"index.html"),{"Cache-Control":"no-store",...cs}]}else{let b=[["/assets/",t&&Le.join(t,"assets"),"max-age=31536000, immutable"],["/kit/",r,"no-cache"],["/vendor/",s,"no-cache"]].find(([w,v])=>v&&f.startsWith(w));if(!b)return!1;a=fs(b[1],f.slice(b[0].length)),m={"Cache-Control":b[2]}}let c=a?await is.readFile(a).catch(()=>null):null;return c?(zo(n,{type:ds(a),headers:{...m,"X-Content-Type-Options":"nosniff"},body:e.method==="HEAD"?void 0:c}),!0):(zo(n,{status:404}),!0)}async function Cl({port:e,web:n=ys,kind:t=process.env.GALLERY_SERVER_KIND==="dev"?"dev":"cli",stateDirectory:r=ps,exit:s=(c=0)=>process.exit(c),watch:f=!0,signals:a=!0,log:m=console}={}){await ks(Te),await Jt(Te,{log:$=>m.log(`[gallery] ${new Date().toISOString()} ${$}`)}),Gt(Te,$=>m.log(`[gallery] ${new Date().toISOString()} ${$}`)),Ht(Te);let c=await Vt(Te,{stateDirectory:r});c.did==="made"?m.log(`[gallery] ${new Date().toISOString()} the default home page made: ${c.file} (${c.cards.length} cards)`):c.did==="failed"&&m.warn(`[gallery] ${new Date().toISOString()} ${Zt(c)}`);let p=null,b=null,w=null,v=vs(Te),u=async()=>{b?.close(),w&&ct.unwatchFile(lt,w),await ms.writeFile(v.lastPortFile,`${e}
|
|
166
|
-
`).catch(()=>{}),await new Promise($=>{p.close(()=>$()),p.closeAllConnections()})},E=Bo({stateDirectory:r,logger:{info:$=>m.log($),warn:$=>m.warn($),error:$=>m.error($)},kind:t,closeServer:u,exit:()=>s(0)});if(p=us.createServer(($,k)=>{E.handle($,k,async Y=>{if(Y){m.error(`[gallery] ${$.method} ${$.url}: ${Y.stack??Y.message}`),k.headersSent?k.end():Go(k,{status:500});return}try{if(await Ho($,k,{web:n,kit:hs,vendor:ws}))return}catch(M){m.error(`[gallery] ${$.url}: ${M.message}`)}k.headersSent||Go(k,{status:404})})}),p.keepAliveTimeout=5e3,await new Promise(($,k)=>{p.once("error",k),p.listen(e,"127.0.0.1",()=>{p.off("error",k),$()})}),e=p.address().port,await E.listening(e),f&&(b=Qe(Te,E.changed)),gs){let $=ct.readFileSync(lt,"utf8");w=()=>{let k=null;try{k=ct.readFileSync(lt,"utf8")}catch{}k!==$&&(m.log("[gallery] The package was replaced (another version installed): this server stops; the next gallery command starts the new one."),E.stop())},ct.watchFile(lt,{interval:3e3,persistent:!1},w)}if(a)for(let $ of["SIGINT","SIGTERM","SIGHUP"])process.once($,()=>E.stop());return{server:p,port:e,routes:E,async close(){await u(),await E.close()}}}export{Cl as a};
|