rssany 0.3.1 → 0.3.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/.env.example +52 -52
- package/README.md +156 -147
- package/app/plugins/builtin/email.rssany.js +84 -84
- package/app/plugins/builtin/rss.rssany.js +164 -164
- package/app/plugins/builtin/xiaohongshu.rssany.js +59 -2
- package/app/statics/README.md +7 -7
- package/app/webui/build/200.html +36 -36
- package/app/webui/build/_app/immutable/assets/0.BLOTwIuF.css +1 -0
- package/app/webui/build/_app/immutable/assets/10.CmGYYZFR.css +1 -0
- package/app/webui/build/_app/immutable/assets/11.Dkz3VS_N.css +1 -0
- package/app/webui/build/_app/immutable/assets/14.BCCBoMGj.css +1 -0
- package/app/webui/build/_app/immutable/assets/6.Cm_jpHOq.css +1 -0
- package/app/webui/build/_app/immutable/assets/7.CJ3BjogD.css +1 -0
- package/app/webui/build/_app/immutable/assets/9.CATKVZ-n.css +1 -0
- package/app/webui/build/_app/immutable/assets/{SourcesList.D5Lso0bo.css → SourcesList.ke66uOSi.css} +1 -1
- package/app/webui/build/_app/immutable/assets/chevron-down.CV-KWLNP.css +1 -0
- package/app/webui/build/_app/immutable/chunks/{CGCMIfh3.js → 4TuV_psf.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/{DAdOEnFb.js → B0czyjwj.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/{CFwxUBGi.js → B553hBXT.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/B8StT3Do.js +6 -0
- package/app/webui/build/_app/immutable/chunks/BI_ale1m.js +1 -0
- package/app/webui/build/_app/immutable/chunks/BK0ygNWX.js +2 -0
- package/app/webui/build/_app/immutable/chunks/BKm6QCwp.js +1 -0
- package/app/webui/build/_app/immutable/chunks/BT6b4LcZ.js +36 -0
- package/app/webui/build/_app/immutable/chunks/BZY5aksi.js +36 -0
- package/app/webui/build/_app/immutable/chunks/{C8umpVpB.js → BnqaikL8.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/BsQ08Wq_.js +1 -0
- package/app/webui/build/_app/immutable/chunks/C9wTDiHH.js +1 -0
- package/app/webui/build/_app/immutable/chunks/{B-CeeY89.js → CAKuIoAf.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/CEWi_rGa.js +1 -0
- package/app/webui/build/_app/immutable/chunks/{ChUctqXA.js → Cc7aBSsN.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/{BAJAS8BI.js → D8G961Hm.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/{CS53ooo0.js → DIeahUKq.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/DO5OXNYS.js +1 -0
- package/app/webui/build/_app/immutable/chunks/Dg_D3pjF.js +1 -0
- package/app/webui/build/_app/immutable/chunks/{Dyvi1wBH.js → DptdhtA1.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/{ClknbeNl.js → FDS7fbwH.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/{CqYSO3Dx.js → GeNMTUn1.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/{DCEayuDt.js → IhDlsCxD.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/Nd0ktDhd.js +1 -0
- package/app/webui/build/_app/immutable/chunks/{D6kzEN_P.js → SvdgnirT.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/WW6La7Nt.js +2 -0
- package/app/webui/build/_app/immutable/chunks/{DsxvjlCC.js → pd_p3yYy.js} +5 -5
- package/app/webui/build/_app/immutable/chunks/rNwPv4DZ.js +1 -0
- package/app/webui/build/_app/immutable/entry/app.BKLBG-4w.js +2 -0
- package/app/webui/build/_app/immutable/entry/start.D-X6pVtx.js +1 -0
- package/app/webui/build/_app/immutable/nodes/{0.DK_mcVDm.js → 0.CJDC_3s9.js} +3 -3
- package/app/webui/build/_app/immutable/nodes/1.DsKocFSb.js +1 -0
- package/app/webui/build/_app/immutable/nodes/10.BeejAn8z.js +1 -0
- package/app/webui/build/_app/immutable/nodes/11.D--uwkk0.js +3 -0
- package/app/webui/build/_app/immutable/nodes/12.BLyQ6rUu.js +1 -0
- package/app/webui/build/_app/immutable/nodes/13.Cl0WQK13.js +1 -0
- package/app/webui/build/_app/immutable/nodes/14.T9l5Rh19.js +1 -0
- package/app/webui/build/_app/immutable/nodes/15.DHfwIlBx.js +1 -0
- package/app/webui/build/_app/immutable/nodes/{16.zfSe93Ab.js → 16.BKDfR-KV.js} +2 -2
- package/app/webui/build/_app/immutable/nodes/17.DofB8HQB.js +1 -0
- package/app/webui/build/_app/immutable/nodes/2.BOYqXdCa.js +1 -0
- package/app/webui/build/_app/immutable/nodes/3.B9ucbp_W.js +1 -0
- package/app/webui/build/_app/immutable/nodes/5.9zgwFV6I.js +2 -0
- package/app/webui/build/_app/immutable/nodes/6.Bs32Ieii.js +2 -0
- package/app/webui/build/_app/immutable/nodes/7.Cigxrk0v.js +1 -0
- package/app/webui/build/_app/immutable/nodes/8.pG10rCF0.js +1 -0
- package/app/webui/build/_app/immutable/nodes/9.Bzqb3xHY.js +1 -0
- package/app/webui/build/_app/version.json +1 -1
- package/bin/rssany.js +55 -3
- package/dist/index.js +361 -99
- package/dist/index.js.map +1 -1
- package/package.json +107 -103
- package/scripts/dev.mjs +5 -1
- package/scripts/postinstall.mjs +44 -0
- package/scripts/reset.mjs +137 -135
- package/scripts/user-dir.mjs +52 -0
- package/app/webui/build/_app/immutable/assets/0.DsKls1SN.css +0 -1
- package/app/webui/build/_app/immutable/assets/10.Dj8_pmut.css +0 -1
- package/app/webui/build/_app/immutable/assets/13.Qu_tY6H9.css +0 -1
- package/app/webui/build/_app/immutable/assets/5.B-dPiwB7.css +0 -1
- package/app/webui/build/_app/immutable/assets/6.B27N7pdA.css +0 -1
- package/app/webui/build/_app/immutable/assets/8.Cgji2b15.css +0 -1
- package/app/webui/build/_app/immutable/assets/9.BsCIAvn3.css +0 -1
- package/app/webui/build/_app/immutable/chunks/6prdYIKP.js +0 -1
- package/app/webui/build/_app/immutable/chunks/B2cyTHdf.js +0 -2
- package/app/webui/build/_app/immutable/chunks/B6WG2Sd3.js +0 -1
- package/app/webui/build/_app/immutable/chunks/BA4Gucnq.js +0 -1
- package/app/webui/build/_app/immutable/chunks/BkD3yAYe.js +0 -1
- package/app/webui/build/_app/immutable/chunks/C4uF_YIK.js +0 -1
- package/app/webui/build/_app/immutable/chunks/CBY2biv-.js +0 -1
- package/app/webui/build/_app/immutable/chunks/CVW0ymE1.js +0 -1
- package/app/webui/build/_app/immutable/chunks/DJ2e04vK.js +0 -36
- package/app/webui/build/_app/immutable/chunks/DL3Q5sfb.js +0 -1
- package/app/webui/build/_app/immutable/chunks/DVa8Y-mQ.js +0 -1
- package/app/webui/build/_app/immutable/chunks/DkamXS6W.js +0 -36
- package/app/webui/build/_app/immutable/chunks/DoRPmqLn.js +0 -2
- package/app/webui/build/_app/immutable/chunks/_qj9U-za.js +0 -1
- package/app/webui/build/_app/immutable/chunks/vtBo8kBV.js +0 -1
- package/app/webui/build/_app/immutable/entry/app.RFfWi3_i.js +0 -2
- package/app/webui/build/_app/immutable/entry/start.DU_kyeGS.js +0 -1
- package/app/webui/build/_app/immutable/nodes/1.0PRrU2uQ.js +0 -1
- package/app/webui/build/_app/immutable/nodes/10.CsxzlUER.js +0 -1
- package/app/webui/build/_app/immutable/nodes/11.D-PkhIRW.js +0 -1
- package/app/webui/build/_app/immutable/nodes/12.GGf-JLUY.js +0 -1
- package/app/webui/build/_app/immutable/nodes/13.DWWcH27k.js +0 -6
- package/app/webui/build/_app/immutable/nodes/14.COwSLwDN.js +0 -1
- package/app/webui/build/_app/immutable/nodes/15.nDN_AHrs.js +0 -1
- package/app/webui/build/_app/immutable/nodes/2.AJd2163d.js +0 -1
- package/app/webui/build/_app/immutable/nodes/3.CEVEHuaH.js +0 -1
- package/app/webui/build/_app/immutable/nodes/4.BT_N8pCh.js +0 -2
- package/app/webui/build/_app/immutable/nodes/5.BZScQ2CH.js +0 -2
- package/app/webui/build/_app/immutable/nodes/6.CkFk8X--.js +0 -1
- package/app/webui/build/_app/immutable/nodes/7.CuQJk7te.js +0 -1
- package/app/webui/build/_app/immutable/nodes/8.DIavWJnU.js +0 -1
- package/app/webui/build/_app/immutable/nodes/9.Db30M8x0.js +0 -1
- /package/app/webui/build/_app/immutable/assets/{11.qYZMiTb0.css → 12.qYZMiTb0.css} +0 -0
- /package/app/webui/build/_app/immutable/assets/{12.DfJcfUWl.css → 13.DfJcfUWl.css} +0 -0
- /package/app/webui/build/_app/immutable/assets/{14.DfMfOrS3.css → 15.DfMfOrS3.css} +0 -0
- /package/app/webui/build/_app/immutable/assets/{15.nNGjXhCQ.css → 17.nNGjXhCQ.css} +0 -0
- /package/app/webui/build/_app/immutable/assets/{4.Di6rvlY-.css → 5.Di6rvlY-.css} +0 -0
- /package/app/webui/build/_app/immutable/assets/{7.CrNxmd8B.css → 8.CrNxmd8B.css} +0 -0
- /package/app/webui/build/_app/immutable/nodes/{17.BtYZF6FM.js → 18.BtYZF6FM.js} +0 -0
- /package/app/webui/build/_app/immutable/nodes/{18.BIzqhTqv.js → 4.BIzqhTqv.js} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// 内置 RSS/Atom/JSON Feed:通过浏览器(Puppeteer)拉取 Feed URL,再用 rss-parser 解析;
|
|
2
|
-
// 与站点插件一致走 Chrome,便于应对需浏览器环境或代理的场景;XML 使用 HTTP 响应原文(useHttpResponseBody)。
|
|
1
|
+
// 内置 RSS/Atom/JSON Feed:通过浏览器(Puppeteer)拉取 Feed URL,再用 rss-parser 解析;
|
|
2
|
+
// 与站点插件一致走 Chrome,便于应对需浏览器环境或代理的场景;XML 使用 HTTP 响应原文(useHttpResponseBody)。
|
|
3
3
|
export const id = "__rss__";
|
|
4
4
|
export const name = "RSS Feed";
|
|
5
5
|
export const pattern = /^https:\/\//;
|
|
@@ -7,167 +7,167 @@ export const match = looksLikeFeed;
|
|
|
7
7
|
export const priority = 20;
|
|
8
8
|
export const refreshInterval = "1h";
|
|
9
9
|
|
|
10
|
-
const UA = "RssAny/1.0 (+https://github.com/joohw/rssany)";
|
|
11
|
-
|
|
12
|
-
const IMAGE_TYPE_RE = /^image\//i;
|
|
13
|
-
const IMAGE_EXT_IN_PATH_RE = /\.(jpg|jpeg|png|gif|webp|avif|svg)(\?|#|$)/i;
|
|
14
|
-
|
|
15
|
-
function trimUrl(s) {
|
|
16
|
-
if (typeof s !== "string") return undefined;
|
|
17
|
-
const t = s.trim();
|
|
18
|
-
return t || undefined;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/** rss-parser 常把多位作者压成一段逗号(或中文逗号)分隔文本,拆成数组入库。 */
|
|
22
|
-
function authorsFromCommaText(authorRaw) {
|
|
23
|
-
if (typeof authorRaw !== "string") return undefined;
|
|
24
|
-
const parts = authorRaw
|
|
25
|
-
.split(/[,,]/)
|
|
26
|
-
.map((s) => s.trim())
|
|
27
|
-
.filter(Boolean);
|
|
28
|
-
return parts.length > 0 ? parts : undefined;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** 从 rss-parser 条目上尽量取出配图 URL(入库用 imageUrl,与 Gateway 的 cover_img 对齐)。 */
|
|
32
|
-
function extractItemImageUrl(item) {
|
|
33
|
-
const enc = item.enclosure;
|
|
34
|
-
if (enc && typeof enc.url === "string") {
|
|
35
|
-
const u = trimUrl(enc.url);
|
|
36
|
-
const t = typeof enc.type === "string" ? enc.type : "";
|
|
37
|
-
if (u && (IMAGE_TYPE_RE.test(t) || (!t && IMAGE_EXT_IN_PATH_RE.test(u)))) {
|
|
38
|
-
return u;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const itunesImg = item.itunes && typeof item.itunes.image === "string" ? item.itunes.image : undefined;
|
|
43
|
-
const fromItunes = trimUrl(itunesImg);
|
|
44
|
-
if (fromItunes) return fromItunes;
|
|
45
|
-
|
|
46
|
-
const thumbs = item.mediaThumbnail;
|
|
47
|
-
if (Array.isArray(thumbs) && thumbs[0]?.$) {
|
|
48
|
-
const u = trimUrl(thumbs[0].$.url ?? thumbs[0].$.href);
|
|
49
|
-
if (u) return u;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const mediaBlocks = item.mediaContent;
|
|
53
|
-
if (Array.isArray(mediaBlocks)) {
|
|
54
|
-
for (const block of mediaBlocks) {
|
|
55
|
-
const $ = block && block.$;
|
|
56
|
-
if (!$ || typeof $.url !== "string") continue;
|
|
57
|
-
const medium = $.medium;
|
|
58
|
-
const ctype = typeof $.type === "string" ? $.type : "";
|
|
59
|
-
if (medium === "image" || IMAGE_TYPE_RE.test(ctype)) {
|
|
60
|
-
const u = trimUrl($.url);
|
|
61
|
-
if (u) return u;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const atomLinks = item.atomLinks;
|
|
67
|
-
if (Array.isArray(atomLinks)) {
|
|
68
|
-
for (const l of atomLinks) {
|
|
69
|
-
const $ = l && l.$;
|
|
70
|
-
if (!$ || typeof $.href !== "string") continue;
|
|
71
|
-
const rel = String($.rel || "").toLowerCase();
|
|
72
|
-
const ctype = String($.type || "").toLowerCase();
|
|
73
|
-
if (rel === "enclosure" && ctype.startsWith("image/")) {
|
|
74
|
-
const u = trimUrl($.href);
|
|
75
|
-
if (u) return u;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const fromHtml =
|
|
81
|
-
firstImgSrcFromHtml(item.content) ||
|
|
82
|
-
firstImgSrcFromHtml(item.summary) ||
|
|
83
|
-
firstImgSrcFromHtml(item["content:encoded"]) ||
|
|
84
|
-
firstImgSrcFromHtml(item.contentSnippet);
|
|
85
|
-
if (fromHtml && /^https:\/\//i.test(fromHtml)) {
|
|
86
|
-
return fromHtml;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return undefined;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function firstImgSrcFromHtml(html) {
|
|
93
|
-
if (typeof html !== "string" || !html) return undefined;
|
|
94
|
-
const m = html.match(/<img[^>]+src\s*=\s*["']([^"']+)["']/i);
|
|
95
|
-
return m ? trimUrl(m[1]) : undefined;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
async function fetchFeedXml(url, ctx) {
|
|
99
|
-
const fetchHtml = ctx.fetchHtml;
|
|
100
|
-
if (typeof fetchHtml !== "function") {
|
|
101
|
-
throw new Error("RSS 插件需要 ctx.fetchHtml(请通过 feeder / buildSourceContext 调用)");
|
|
102
|
-
}
|
|
103
|
-
const { html } = await fetchHtml(url, {
|
|
104
|
-
waitMs: 800,
|
|
105
|
-
purify: false,
|
|
106
|
-
useHttpResponseBody: true,
|
|
107
|
-
});
|
|
108
|
-
return html;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export async function fetchItems(sourceId, ctx) {
|
|
112
|
-
const { deps } = ctx;
|
|
113
|
-
const xml = await fetchFeedXml(sourceId, ctx);
|
|
114
|
-
const parser = new deps.RssParser({
|
|
115
|
-
timeout: 30_000,
|
|
116
|
-
headers: {
|
|
117
|
-
"User-Agent": UA,
|
|
118
|
-
Accept: "application/rss+xml,application/atom+xml,application/json,application/xml,text/xml,*/*",
|
|
119
|
-
},
|
|
120
|
-
customFields: {
|
|
121
|
-
item: [
|
|
122
|
-
["media:thumbnail", "mediaThumbnail", { keepArray: true }],
|
|
123
|
-
["media:content", "mediaContent", { keepArray: true }],
|
|
124
|
-
["link", "atomLinks", { keepArray: true }],
|
|
125
|
-
],
|
|
126
|
-
},
|
|
127
|
-
});
|
|
128
|
-
const feed = await parser.parseString(xml);
|
|
129
|
-
return (feed.items ?? []).map((item) => {
|
|
130
|
-
const link = item.link ?? item.guid ?? sourceId;
|
|
131
|
-
const guid = item.guid ?? deps.createHash("sha256").update(link).digest("hex");
|
|
132
|
-
const pubDate =
|
|
133
|
-
item.pubDate != null
|
|
134
|
-
? new Date(item.pubDate)
|
|
135
|
-
: item.isoDate != null
|
|
136
|
-
? new Date(item.isoDate)
|
|
137
|
-
: new Date();
|
|
138
|
-
const authorRaw =
|
|
139
|
-
typeof item.creator === "string" ? item.creator : typeof item.author === "string" ? item.author : undefined;
|
|
140
|
-
const author = authorsFromCommaText(authorRaw);
|
|
141
|
-
const summary =
|
|
142
|
-
typeof item.summary === "string" ? item.summary : typeof item.contentSnippet === "string" ? item.contentSnippet : undefined;
|
|
143
|
-
const content =
|
|
144
|
-
typeof item.content === "string" ? item.content : typeof item["content:encoded"] === "string" ? item["content:encoded"] : undefined;
|
|
145
|
-
const imageUrl = extractItemImageUrl(item);
|
|
146
|
-
const base = {
|
|
147
|
-
guid,
|
|
148
|
-
title: item.title ?? "",
|
|
149
|
-
link,
|
|
150
|
-
pubDate,
|
|
151
|
-
author,
|
|
152
|
-
summary,
|
|
153
|
-
content,
|
|
154
|
-
};
|
|
155
|
-
if (!imageUrl) return base;
|
|
156
|
-
return { ...base, imageUrl, cover_img: imageUrl };
|
|
157
|
-
});
|
|
10
|
+
const UA = "RssAny/1.0 (+https://github.com/joohw/rssany)";
|
|
11
|
+
|
|
12
|
+
const IMAGE_TYPE_RE = /^image\//i;
|
|
13
|
+
const IMAGE_EXT_IN_PATH_RE = /\.(jpg|jpeg|png|gif|webp|avif|svg)(\?|#|$)/i;
|
|
14
|
+
|
|
15
|
+
function trimUrl(s) {
|
|
16
|
+
if (typeof s !== "string") return undefined;
|
|
17
|
+
const t = s.trim();
|
|
18
|
+
return t || undefined;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** rss-parser 常把多位作者压成一段逗号(或中文逗号)分隔文本,拆成数组入库。 */
|
|
22
|
+
function authorsFromCommaText(authorRaw) {
|
|
23
|
+
if (typeof authorRaw !== "string") return undefined;
|
|
24
|
+
const parts = authorRaw
|
|
25
|
+
.split(/[,,]/)
|
|
26
|
+
.map((s) => s.trim())
|
|
27
|
+
.filter(Boolean);
|
|
28
|
+
return parts.length > 0 ? parts : undefined;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** 从 rss-parser 条目上尽量取出配图 URL(入库用 imageUrl,与 Gateway 的 cover_img 对齐)。 */
|
|
32
|
+
function extractItemImageUrl(item) {
|
|
33
|
+
const enc = item.enclosure;
|
|
34
|
+
if (enc && typeof enc.url === "string") {
|
|
35
|
+
const u = trimUrl(enc.url);
|
|
36
|
+
const t = typeof enc.type === "string" ? enc.type : "";
|
|
37
|
+
if (u && (IMAGE_TYPE_RE.test(t) || (!t && IMAGE_EXT_IN_PATH_RE.test(u)))) {
|
|
38
|
+
return u;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const itunesImg = item.itunes && typeof item.itunes.image === "string" ? item.itunes.image : undefined;
|
|
43
|
+
const fromItunes = trimUrl(itunesImg);
|
|
44
|
+
if (fromItunes) return fromItunes;
|
|
45
|
+
|
|
46
|
+
const thumbs = item.mediaThumbnail;
|
|
47
|
+
if (Array.isArray(thumbs) && thumbs[0]?.$) {
|
|
48
|
+
const u = trimUrl(thumbs[0].$.url ?? thumbs[0].$.href);
|
|
49
|
+
if (u) return u;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const mediaBlocks = item.mediaContent;
|
|
53
|
+
if (Array.isArray(mediaBlocks)) {
|
|
54
|
+
for (const block of mediaBlocks) {
|
|
55
|
+
const $ = block && block.$;
|
|
56
|
+
if (!$ || typeof $.url !== "string") continue;
|
|
57
|
+
const medium = $.medium;
|
|
58
|
+
const ctype = typeof $.type === "string" ? $.type : "";
|
|
59
|
+
if (medium === "image" || IMAGE_TYPE_RE.test(ctype)) {
|
|
60
|
+
const u = trimUrl($.url);
|
|
61
|
+
if (u) return u;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const atomLinks = item.atomLinks;
|
|
67
|
+
if (Array.isArray(atomLinks)) {
|
|
68
|
+
for (const l of atomLinks) {
|
|
69
|
+
const $ = l && l.$;
|
|
70
|
+
if (!$ || typeof $.href !== "string") continue;
|
|
71
|
+
const rel = String($.rel || "").toLowerCase();
|
|
72
|
+
const ctype = String($.type || "").toLowerCase();
|
|
73
|
+
if (rel === "enclosure" && ctype.startsWith("image/")) {
|
|
74
|
+
const u = trimUrl($.href);
|
|
75
|
+
if (u) return u;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const fromHtml =
|
|
81
|
+
firstImgSrcFromHtml(item.content) ||
|
|
82
|
+
firstImgSrcFromHtml(item.summary) ||
|
|
83
|
+
firstImgSrcFromHtml(item["content:encoded"]) ||
|
|
84
|
+
firstImgSrcFromHtml(item.contentSnippet);
|
|
85
|
+
if (fromHtml && /^https:\/\//i.test(fromHtml)) {
|
|
86
|
+
return fromHtml;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function firstImgSrcFromHtml(html) {
|
|
93
|
+
if (typeof html !== "string" || !html) return undefined;
|
|
94
|
+
const m = html.match(/<img[^>]+src\s*=\s*["']([^"']+)["']/i);
|
|
95
|
+
return m ? trimUrl(m[1]) : undefined;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async function fetchFeedXml(url, ctx) {
|
|
99
|
+
const fetchHtml = ctx.fetchHtml;
|
|
100
|
+
if (typeof fetchHtml !== "function") {
|
|
101
|
+
throw new Error("RSS 插件需要 ctx.fetchHtml(请通过 feeder / buildSourceContext 调用)");
|
|
102
|
+
}
|
|
103
|
+
const { html } = await fetchHtml(url, {
|
|
104
|
+
waitMs: 800,
|
|
105
|
+
purify: false,
|
|
106
|
+
useHttpResponseBody: true,
|
|
107
|
+
});
|
|
108
|
+
return html;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export async function fetchItems(sourceId, ctx) {
|
|
112
|
+
const { deps } = ctx;
|
|
113
|
+
const xml = await fetchFeedXml(sourceId, ctx);
|
|
114
|
+
const parser = new deps.RssParser({
|
|
115
|
+
timeout: 30_000,
|
|
116
|
+
headers: {
|
|
117
|
+
"User-Agent": UA,
|
|
118
|
+
Accept: "application/rss+xml,application/atom+xml,application/json,application/xml,text/xml,*/*",
|
|
119
|
+
},
|
|
120
|
+
customFields: {
|
|
121
|
+
item: [
|
|
122
|
+
["media:thumbnail", "mediaThumbnail", { keepArray: true }],
|
|
123
|
+
["media:content", "mediaContent", { keepArray: true }],
|
|
124
|
+
["link", "atomLinks", { keepArray: true }],
|
|
125
|
+
],
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
const feed = await parser.parseString(xml);
|
|
129
|
+
return (feed.items ?? []).map((item) => {
|
|
130
|
+
const link = item.link ?? item.guid ?? sourceId;
|
|
131
|
+
const guid = item.guid ?? deps.createHash("sha256").update(link).digest("hex");
|
|
132
|
+
const pubDate =
|
|
133
|
+
item.pubDate != null
|
|
134
|
+
? new Date(item.pubDate)
|
|
135
|
+
: item.isoDate != null
|
|
136
|
+
? new Date(item.isoDate)
|
|
137
|
+
: new Date();
|
|
138
|
+
const authorRaw =
|
|
139
|
+
typeof item.creator === "string" ? item.creator : typeof item.author === "string" ? item.author : undefined;
|
|
140
|
+
const author = authorsFromCommaText(authorRaw);
|
|
141
|
+
const summary =
|
|
142
|
+
typeof item.summary === "string" ? item.summary : typeof item.contentSnippet === "string" ? item.contentSnippet : undefined;
|
|
143
|
+
const content =
|
|
144
|
+
typeof item.content === "string" ? item.content : typeof item["content:encoded"] === "string" ? item["content:encoded"] : undefined;
|
|
145
|
+
const imageUrl = extractItemImageUrl(item);
|
|
146
|
+
const base = {
|
|
147
|
+
guid,
|
|
148
|
+
title: item.title ?? "",
|
|
149
|
+
link,
|
|
150
|
+
pubDate,
|
|
151
|
+
author,
|
|
152
|
+
summary,
|
|
153
|
+
content,
|
|
154
|
+
};
|
|
155
|
+
if (!imageUrl) return base;
|
|
156
|
+
return { ...base, imageUrl, cover_img: imageUrl };
|
|
157
|
+
});
|
|
158
158
|
}
|
|
159
159
|
|
|
160
|
-
function looksLikeFeed(url) {
|
|
161
|
-
const lower = url.toLowerCase();
|
|
162
|
-
return (
|
|
163
|
-
lower.includes("/feed") ||
|
|
164
|
-
lower.includes("/rss") ||
|
|
165
|
-
lower.includes("/atom") ||
|
|
166
|
-
lower.endsWith(".xml") ||
|
|
167
|
-
lower.endsWith(".rss") ||
|
|
168
|
-
lower.endsWith(".atom") ||
|
|
169
|
-
lower.includes("format=rss") ||
|
|
170
|
-
lower.includes("format=atom") ||
|
|
171
|
-
lower.includes("output=rss")
|
|
172
|
-
);
|
|
173
|
-
}
|
|
160
|
+
function looksLikeFeed(url) {
|
|
161
|
+
const lower = url.toLowerCase();
|
|
162
|
+
return (
|
|
163
|
+
lower.includes("/feed") ||
|
|
164
|
+
lower.includes("/rss") ||
|
|
165
|
+
lower.includes("/atom") ||
|
|
166
|
+
lower.endsWith(".xml") ||
|
|
167
|
+
lower.endsWith(".rss") ||
|
|
168
|
+
lower.endsWith(".atom") ||
|
|
169
|
+
lower.includes("format=rss") ||
|
|
170
|
+
lower.includes("format=atom") ||
|
|
171
|
+
lower.includes("output=rss")
|
|
172
|
+
);
|
|
173
|
+
}
|
|
@@ -134,8 +134,7 @@ function parseListHtml(html, url) {
|
|
|
134
134
|
const title = (titleEl?.textContent ?? "").trim() || "Note";
|
|
135
135
|
const authorEl = section.querySelector('a[aria-current="page"] .name') ?? section.querySelector('a[aria-current="page"] span');
|
|
136
136
|
const author = (authorEl?.textContent ?? "").trim() || undefined;
|
|
137
|
-
const
|
|
138
|
-
const image = imageEl?.getAttribute("src")?.trim() || undefined;
|
|
137
|
+
const image = pickSectionImage(section);
|
|
139
138
|
const summary = image ? undefined : title;
|
|
140
139
|
const guid = noteId ? hashNoteGuid(noteId) : _deps.createHash("sha256").update(link).digest("hex");
|
|
141
140
|
items.push({
|
|
@@ -200,6 +199,59 @@ function extractUrl(val) {
|
|
|
200
199
|
}
|
|
201
200
|
|
|
202
201
|
|
|
202
|
+
function isUsableImageUrl(url) {
|
|
203
|
+
const u = (url ?? "").trim();
|
|
204
|
+
if (!u) return false;
|
|
205
|
+
if (u.startsWith("data:")) return false;
|
|
206
|
+
if (/^blob:/i.test(u)) return false;
|
|
207
|
+
return u.startsWith("http://") || u.startsWith("https://") || u.startsWith("//");
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
function normalizeImageUrl(url) {
|
|
212
|
+
const u = (url ?? "").trim();
|
|
213
|
+
if (!isUsableImageUrl(u)) return undefined;
|
|
214
|
+
return u.startsWith("//") ? `https:${u}` : u;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
function pickImageFromSrcset(srcset) {
|
|
219
|
+
const raw = (srcset ?? "").trim();
|
|
220
|
+
if (!raw) return undefined;
|
|
221
|
+
const parts = raw.split(",").map((p) => p.trim()).filter(Boolean);
|
|
222
|
+
for (let i = parts.length - 1; i >= 0; i -= 1) {
|
|
223
|
+
const candidate = parts[i]?.split(/\s+/)[0];
|
|
224
|
+
const normalized = normalizeImageUrl(candidate);
|
|
225
|
+
if (normalized) return normalized;
|
|
226
|
+
}
|
|
227
|
+
return undefined;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
function pickSectionImage(section) {
|
|
232
|
+
const imageEl = section.querySelector("img[data-xhs-img], img");
|
|
233
|
+
if (imageEl) {
|
|
234
|
+
const candidates = [
|
|
235
|
+
imageEl.getAttribute("src"),
|
|
236
|
+
imageEl.getAttribute("data-src"),
|
|
237
|
+
imageEl.getAttribute("data-lazy-src"),
|
|
238
|
+
imageEl.getAttribute("data-original"),
|
|
239
|
+
pickImageFromSrcset(imageEl.getAttribute("srcset")),
|
|
240
|
+
];
|
|
241
|
+
for (const candidate of candidates) {
|
|
242
|
+
const normalized = normalizeImageUrl(candidate);
|
|
243
|
+
if (normalized) return normalized;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
for (const el of section.querySelectorAll("[style*='background-image']")) {
|
|
247
|
+
const url = extractUrl(el.getAttribute("style") ?? "");
|
|
248
|
+
const normalized = normalizeImageUrl(url);
|
|
249
|
+
if (normalized && (normalized.includes("xhscdn") || normalized.includes("sns-webpic"))) return normalized;
|
|
250
|
+
}
|
|
251
|
+
return undefined;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
|
|
203
255
|
function collectNoteImages(root) {
|
|
204
256
|
const urls = [];
|
|
205
257
|
const seen = new Set();
|
|
@@ -336,11 +388,16 @@ export async function fetchItems(sourceId, ctx) {
|
|
|
336
388
|
async function enrichItem(item, ctx) {
|
|
337
389
|
const { html } = await ctx.fetchHtml(item.link);
|
|
338
390
|
const detail = extractDetailHtml(html);
|
|
391
|
+
const imgUrls = collectNoteImages(_deps.parseHtml(html));
|
|
392
|
+
const imageUrl = item.imageUrl ?? imgUrls[0];
|
|
339
393
|
return {
|
|
340
394
|
...item,
|
|
341
395
|
author: detail.author ?? item.author,
|
|
342
396
|
title: detail.title ?? item.title,
|
|
343
397
|
content: detail.content ? `<p>${detail.content.replace(/\n\n/g, "</p><p>")}</p>` : undefined,
|
|
344
398
|
pubDate: detail.pubDate ?? item.pubDate,
|
|
399
|
+
imageUrl,
|
|
400
|
+
coverImg: imageUrl,
|
|
401
|
+
cover_img: imageUrl,
|
|
345
402
|
};
|
|
346
403
|
}
|
package/app/statics/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
# statics
|
|
2
|
-
|
|
3
|
-
静态 HTML 页面:home(首页)、401、404。
|
|
4
|
-
|
|
5
|
-
- **home.html**:首页,含 Try This 示例链接;下方「需登录的站点」从 `/plugins` 拉取,每个站点可点击「打开登录页」调用 `POST /auth/ensure?siteId=...` 批量做登录。
|
|
6
|
-
- **401.html**:需登录时返回;占位符 `{{listUrl}}` 由 router 注入为失败请求的订阅地址;页内「打开有头登录页」按钮调用 `POST /auth/ensure?url=...` 弹出有头浏览器完成登录。
|
|
7
|
-
- **404.html**:无匹配站点时返回。
|
|
1
|
+
# statics
|
|
2
|
+
|
|
3
|
+
静态 HTML 页面:home(首页)、401、404。
|
|
4
|
+
|
|
5
|
+
- **home.html**:首页,含 Try This 示例链接;下方「需登录的站点」从 `/plugins` 拉取,每个站点可点击「打开登录页」调用 `POST /auth/ensure?siteId=...` 批量做登录。
|
|
6
|
+
- **401.html**:需登录时返回;占位符 `{{listUrl}}` 由 router 注入为失败请求的订阅地址;页内「打开有头登录页」按钮调用 `POST /auth/ensure?url=...` 弹出有头浏览器完成登录。
|
|
7
|
+
- **404.html**:无匹配站点时返回。
|
package/app/webui/build/200.html
CHANGED
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="zh-CN">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
-
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
7
|
-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
8
|
-
<link
|
|
9
|
-
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
|
|
10
|
-
rel="stylesheet"
|
|
11
|
-
/>
|
|
12
|
-
<link rel="icon" href="/favicon.ico" sizes="32x32" />
|
|
13
|
-
<link rel="icon" href="/favicon.png" type="image/png" />
|
|
14
|
-
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
|
15
|
-
<link href="/_app/immutable/entry/start.
|
|
16
|
-
<link href="/_app/immutable/chunks/
|
|
17
|
-
<link href="/_app/immutable/chunks/
|
|
18
|
-
<link href="/_app/immutable/chunks/
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
7
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
8
|
+
<link
|
|
9
|
+
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
|
|
10
|
+
rel="stylesheet"
|
|
11
|
+
/>
|
|
12
|
+
<link rel="icon" href="/favicon.ico" sizes="32x32" />
|
|
13
|
+
<link rel="icon" href="/favicon.png" type="image/png" />
|
|
14
|
+
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
|
15
|
+
<link href="/_app/immutable/entry/start.D-X6pVtx.js" rel="modulepreload">
|
|
16
|
+
<link href="/_app/immutable/chunks/BKm6QCwp.js" rel="modulepreload">
|
|
17
|
+
<link href="/_app/immutable/chunks/BsQ08Wq_.js" rel="modulepreload">
|
|
18
|
+
<link href="/_app/immutable/chunks/FDS7fbwH.js" rel="modulepreload">
|
|
19
19
|
<link href="/_app/immutable/chunks/BUApaBEI.js" rel="modulepreload">
|
|
20
|
-
<link href="/_app/immutable/chunks/
|
|
21
|
-
<link href="/_app/immutable/entry/app.
|
|
22
|
-
<link href="/_app/immutable/chunks/
|
|
23
|
-
<link href="/_app/immutable/chunks/
|
|
24
|
-
<link href="/_app/immutable/chunks/
|
|
25
|
-
<link href="/_app/immutable/chunks/
|
|
26
|
-
<link href="/_app/immutable/chunks/
|
|
27
|
-
<link href="/_app/immutable/chunks/
|
|
28
|
-
<link href="/_app/immutable/chunks/
|
|
29
|
-
|
|
30
|
-
</head>
|
|
31
|
-
<body>
|
|
20
|
+
<link href="/_app/immutable/chunks/DptdhtA1.js" rel="modulepreload">
|
|
21
|
+
<link href="/_app/immutable/entry/app.BKLBG-4w.js" rel="modulepreload">
|
|
22
|
+
<link href="/_app/immutable/chunks/BK0ygNWX.js" rel="modulepreload">
|
|
23
|
+
<link href="/_app/immutable/chunks/DIeahUKq.js" rel="modulepreload">
|
|
24
|
+
<link href="/_app/immutable/chunks/rNwPv4DZ.js" rel="modulepreload">
|
|
25
|
+
<link href="/_app/immutable/chunks/C9wTDiHH.js" rel="modulepreload">
|
|
26
|
+
<link href="/_app/immutable/chunks/CAKuIoAf.js" rel="modulepreload">
|
|
27
|
+
<link href="/_app/immutable/chunks/D8G961Hm.js" rel="modulepreload">
|
|
28
|
+
<link href="/_app/immutable/chunks/BI_ale1m.js" rel="modulepreload">
|
|
29
|
+
|
|
30
|
+
</head>
|
|
31
|
+
<body>
|
|
32
32
|
<div id="svelte">
|
|
33
33
|
<script>
|
|
34
34
|
{
|
|
35
|
-
|
|
35
|
+
__sveltekit_d5v56a = {
|
|
36
36
|
base: ""
|
|
37
37
|
};
|
|
38
38
|
|
|
39
39
|
const element = document.currentScript.parentElement;
|
|
40
40
|
|
|
41
41
|
Promise.all([
|
|
42
|
-
import("/_app/immutable/entry/start.
|
|
43
|
-
import("/_app/immutable/entry/app.
|
|
42
|
+
import("/_app/immutable/entry/start.D-X6pVtx.js"),
|
|
43
|
+
import("/_app/immutable/entry/app.BKLBG-4w.js")
|
|
44
44
|
]).then(([kit, app]) => {
|
|
45
45
|
kit.start(app, element);
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
</script>
|
|
49
|
-
</div>
|
|
50
|
-
</body>
|
|
51
|
-
</html>
|
|
49
|
+
</div>
|
|
50
|
+
</body>
|
|
51
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.toast.svelte-zemmny{position:fixed;top:1rem;left:50%;transform:translate(-50%);background:#111;color:#fff;padding:.625rem 1.25rem;border-radius:8px;font-size:.875rem;z-index:100;white-space:nowrap;pointer-events:none}.toast.error.svelte-zemmny{background:#c0392b}.toast.success.svelte-zemmny{background:#1a7f37}/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.fixed{position:fixed}.static{position:static}.sticky{position:sticky}.start{inset-inline-start:var(--spacing)}.flex{display:flex}.inline{display:inline}.table{display:table}.flex-shrink{flex-shrink:1}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.flex-wrap{flex-wrap:wrap}.border{border-style:var(--tw-border-style);border-width:1px}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.\[webui\:watch\]{webui:watch}}:root{--primary:#5e6ad2;--primary-foreground:#fff;--color-primary:var(--primary);--color-primary-hover:#7c85e8;--color-primary-light:#5e6ad22e;--color-primary-foreground:var(--primary-foreground);--background:#f7f7f7;--foreground:#1f1f1f;--color-background:var(--background);--color-foreground:var(--foreground);--color-card:#fff;--color-card-elevated:#fcfcfc;--color-card-foreground:#2e2e2e;--color-muted:#0000000e;--color-muted-foreground:#737373;--color-muted-foreground-strong:#4a4a4a;--color-muted-foreground-soft:#787878;--color-accent:#0000000e;--color-accent-foreground:#2e2e2e;--color-border:#0000001c;--color-border-muted:#00000013;--color-hairline:#00000013;--color-input:#00000024;--color-destructive:#b12525;--color-destructive-foreground:#fff;--color-success:#207945;--color-success-foreground:#fff;--color-scrollbar-thumb:#00000038;--shadow-panel:0 12px 40px #00000014;--radius-sm:6px;--radius-md:8px;--radius-lg:10px;--shell-gutter:clamp(.5rem, 1.8vw, 1rem);--layout-page-inset:clamp(.4rem, 1.25vw, .85rem);--layout-max-width:64rem;--content-max:64rem;--topbar-sticky-offset: 3.125rem ;--main-padding-top:1.5rem;--feed-sticky-gap-after:1rem}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;height:100%}body{background:var(--color-background);height:100%;min-height:100%;color:var(--color-foreground);flex-direction:column;width:100%;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;display:flex;overflow:hidden}#svelte{flex-direction:column;flex:1;height:100%;min-height:0;display:flex;overflow:hidden}*{scrollbar-width:thin;scrollbar-color:var(--color-scrollbar-thumb) transparent}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-thumb{background:var(--color-scrollbar-thumb);border-radius:999px}::-webkit-scrollbar-track{background:0 0}.options-menu-trigger{width:2rem;height:2rem;color:var(--color-muted-foreground);border-radius:var(--radius-sm);cursor:pointer;-webkit-tap-highlight-color:transparent;background:0 0;border:1px solid #0000;flex-shrink:0;justify-content:center;align-items:center;padding:0;transition:color .15s,background-color .15s,border-color .15s;display:inline-flex}.options-menu-trigger:hover:not(:disabled){color:var(--color-foreground);background:var(--color-muted);border-color:var(--color-border)}.options-menu-trigger:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.options-menu-trigger:disabled{opacity:.45;cursor:not-allowed}.options-menu-panel{z-index:100;background:var(--color-card-elevated);border:1px solid var(--color-border);border-radius:var(--radius-md);min-width:9rem;box-shadow:var(--shadow-panel);padding:.35rem}.options-menu-item{box-sizing:border-box;text-align:left;width:100%;color:var(--color-foreground);border-radius:var(--radius-sm);cursor:pointer;background:0 0;border:none;margin:0;padding:.5rem .65rem;font-family:inherit;font-size:.8125rem;line-height:1.35;transition:background .12s;display:block}.options-menu-item:hover:not(:disabled){background:var(--color-muted)}.options-menu-item:disabled{opacity:.55;cursor:not-allowed}.options-menu-item-danger{color:var(--color-destructive)}.options-menu-item-danger:hover:not(:disabled){background:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.options-menu-item-danger:hover:not(:disabled){background:color-mix(in srgb,var(--color-destructive) 12%,transparent)}}.page-header .options-menu-trigger{margin-top:.1rem}.admin-feed-header{border-bottom:1px solid var(--color-border-muted);flex-shrink:0;justify-content:space-between;align-items:flex-end;gap:1rem;padding:.75rem 0;display:flex}.admin-feed-header__left{flex:1;min-width:0}.admin-feed-header__left>h2{color:var(--color-foreground);margin:0 0 .15rem;font-size:.9375rem;font-weight:600}.admin-feed-header__desc{color:var(--color-muted-foreground-soft);margin:0;font-size:.75rem;line-height:1.45}.admin-feed-header__actions{flex-direction:row;flex-shrink:0;align-items:center;gap:.5rem;min-width:0;display:flex}.admin-toolbar-btn{box-sizing:border-box;white-space:nowrap;cursor:pointer;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;gap:.35rem;min-height:2rem;padding:.35rem .65rem;font-family:inherit;font-size:.8125rem;font-weight:500;line-height:1.25;transition:opacity .15s,background .15s;display:inline-flex}.admin-toolbar-btn:disabled{opacity:.5;cursor:not-allowed}.admin-toolbar-btn--primary{color:var(--color-primary-foreground);background:var(--color-primary);border:none}.admin-toolbar-btn--primary:hover:not(:disabled){opacity:.9;background:var(--color-primary-hover,var(--color-primary))}.admin-toolbar-btn--secondary{color:var(--color-foreground);background:var(--color-muted);border:1px solid var(--color-border)}.admin-toolbar-btn--secondary:hover:not(:disabled){background:var(--color-accent)}.admin-toolbar-btn--danger{color:var(--color-destructive);background:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.admin-toolbar-btn--danger{background:color-mix(in srgb,var(--color-destructive) 12%,var(--color-muted))}}.admin-toolbar-btn--danger{border:1px solid var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.admin-toolbar-btn--danger{border:1px solid color-mix(in srgb,var(--color-destructive) 35%,transparent)}}.admin-toolbar-btn--danger:hover:not(:disabled){background:var(--color-destructive)}@supports (color:color-mix(in lab,red,red)){.admin-toolbar-btn--danger:hover:not(:disabled){background:color-mix(in srgb,var(--color-destructive) 18%,var(--color-muted))}}.admin-toolbar-input{box-sizing:border-box;border:1px solid var(--color-input);border-radius:var(--radius-sm);background:var(--color-card-elevated);width:min(100%,18rem);min-width:10rem;height:2rem;min-height:2rem;color:var(--color-foreground);padding:.35rem .6rem;font-family:inherit;font-size:.8125rem}.admin-toolbar-input:focus{border-color:var(--color-primary);outline:none}.admin-toolbar-input::placeholder{color:var(--color-muted-foreground-soft)}@media(max-width:600px){.admin-feed-header{flex-direction:column;align-items:stretch}.admin-feed-header__actions{justify-content:flex-end}.admin-feed-header__actions .admin-toolbar-input{flex:1;width:auto;min-width:0}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}button:not([class]),button[class=""]{font:inherit;cursor:pointer;padding:.35rem .75rem;border:1px solid var(--color-input);border-radius:var(--radius-sm, 6px);background:var(--color-card-elevated);color:var(--color-foreground)}button:not([class]):hover:not(:disabled),button[class=""]:hover:not(:disabled){background:var(--color-accent);border-color:var(--color-border)}button:not([class]):disabled,button[class=""]:disabled{opacity:.45;cursor:not-allowed}.layout-outer.svelte-12qhfyh{box-sizing:border-box;display:flex;flex-direction:column;width:100%;flex:1;min-height:0;overflow:hidden;padding:var(--layout-page-inset, .75rem);--home-feed-rail-width: 36rem;--nav-rail-width: 3rem}.layout-app.svelte-12qhfyh{display:flex;flex-direction:row;justify-content:center;align-items:stretch;flex:1;min-height:0;width:100%;overflow:hidden}.layout-merged-cluster.svelte-12qhfyh{box-sizing:border-box;display:flex;flex-direction:row;align-items:stretch;flex:0 1 var(--layout-max-width);align-self:stretch;min-width:0;min-height:0;width:min(100%,var(--layout-max-width));max-width:min(100%,var(--layout-max-width));margin-inline:auto;border:1px solid var(--color-border-muted);border-radius:var(--radius-lg);overflow:hidden;background:var(--color-card)}.layout-nav-rail.svelte-12qhfyh{flex:0 0 var(--nav-rail-width);width:var(--nav-rail-width);display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;flex-shrink:0;background:transparent;border-right:1px solid var(--color-border-muted);z-index:30}.nav-rail-links.svelte-12qhfyh{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;padding:.75rem .35rem;flex:1;min-height:0}.nav-rail-cluster.svelte-12qhfyh{display:flex;flex-direction:column;gap:0;width:100%;max-width:2.35rem;border-radius:var(--radius-sm);overflow:hidden;background:var(--color-muted)}.nav-rail-link.svelte-12qhfyh{display:flex;align-items:center;justify-content:center;min-height:2.65rem;padding:.4rem .25rem;color:var(--color-muted-foreground-strong);text-decoration:none;border-radius:0;border-bottom:1px solid var(--color-border-muted);transition:color .15s ease,background .15s ease}.nav-rail-link.svelte-12qhfyh:last-child{border-bottom:none}.nav-rail-link.svelte-12qhfyh svg{flex-shrink:0}.nav-rail-link.svelte-12qhfyh:hover:not(.active){color:var(--color-foreground);background:var(--color-muted)}.nav-rail-link.active.svelte-12qhfyh{color:var(--color-primary);background:var(--color-primary-light)}.nav-rail-footer.svelte-12qhfyh{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:.5rem .2rem .75rem;border-top:1px solid var(--color-border-muted);background:transparent}.nav-rail-github.svelte-12qhfyh{display:inline-flex;align-items:center;justify-content:center;padding:.35rem;color:var(--color-muted-foreground);border-radius:6px;transition:color .15s ease,background .15s ease}.nav-rail-github.svelte-12qhfyh:hover{color:var(--color-foreground);background:var(--color-muted)}.nav-rail-github-icon.svelte-12qhfyh{width:18px;height:18px;display:block}.nav-rail-brand.svelte-12qhfyh{font-size:.62rem;font-weight:600;line-height:1.15;color:var(--color-muted-foreground-soft);writing-mode:vertical-rl;text-orientation:mixed;letter-spacing:.06em;max-height:6.5rem;overflow:hidden;text-overflow:ellipsis;text-decoration:none;cursor:pointer;-webkit-user-select:none;user-select:none;transition:color .15s ease}.nav-rail-brand.svelte-12qhfyh:hover{color:var(--color-foreground)}.nav-rail-brand.svelte-12qhfyh:focus-visible{outline:1px solid color-mix(in srgb,var(--color-primary) 55%,transparent);outline-offset:2px}.shell.svelte-12qhfyh{box-sizing:border-box;width:100%;max-width:min(var(--content-max),100%);margin-left:auto;margin-right:auto;padding-inline:var(--shell-gutter)}.shell-frame.svelte-12qhfyh{box-sizing:border-box;display:flex;flex-direction:column;flex:1 1 auto;min-width:0;min-height:0;max-width:none;border:none;background:transparent}.shell-frame--with-feed-rail.svelte-12qhfyh{border-right:none}.layout-feed-rail.svelte-12qhfyh{box-sizing:border-box;flex:0 0 var(--home-feed-rail-width);width:var(--home-feed-rail-width);display:flex;flex-direction:column;min-height:0;align-self:stretch;border-left:1px solid var(--color-border-muted);background:transparent}.layout-feed-rail--home.svelte-12qhfyh{padding-top:calc(var(--main-padding-top) + .75rem)}.layout-feed-rail.svelte-12qhfyh .source-feed-panel-inline{flex:1 1 auto;min-height:0;width:100%;max-width:none;height:100%}@media(max-width:720px){.layout-merged-cluster.svelte-12qhfyh{flex-direction:column;width:100%!important;border-radius:var(--radius-md);border-left:none;border-right:none}.layout-nav-rail.svelte-12qhfyh{flex:0 0 auto;width:100%;flex-direction:row;align-items:center;justify-content:space-between;border-right:none;border-bottom:1px solid var(--color-border-muted)}.nav-rail-links.svelte-12qhfyh{flex-direction:row;justify-content:center;padding:.4rem .5rem}.nav-rail-cluster.svelte-12qhfyh{flex-direction:row;max-width:none;width:auto}.nav-rail-link.svelte-12qhfyh{min-height:0;min-width:2.65rem;padding:.45rem .5rem;border-bottom:none;border-right:1px solid var(--color-border-muted)}.nav-rail-link.svelte-12qhfyh:last-child{border-right:none}.nav-rail-footer.svelte-12qhfyh{flex-direction:row;border-top:none;padding:.35rem .5rem;gap:.5rem}.nav-rail-brand.svelte-12qhfyh{writing-mode:horizontal-tb;max-height:none;font-size:.65rem;max-width:5rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.shell-frame--with-feed-rail.svelte-12qhfyh{border-right:none}.layout-feed-rail.svelte-12qhfyh{flex:1 1 auto;width:100%;max-width:none;max-height:min(42vh,22rem);min-height:12rem;border-left:none;border-top:1px solid var(--color-border-muted)}.layout-feed-rail--home.svelte-12qhfyh{padding-top:0}}.main.svelte-12qhfyh{flex:0 1 auto;min-width:0;display:flex;flex-direction:column;padding-top:var(--main-padding-top);padding-bottom:1.5rem}.main.main-fill.svelte-12qhfyh{flex:1;min-height:0;overflow:hidden;padding-bottom:0}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.feed-wrap.svelte-jqd85f{margin-top:calc(-1 * var(--main-padding-top));width:100%;max-width:42rem}.feed-col.svelte-jqd85f{padding:0}.feed-header.svelte-jqd85f{padding:var(--main-padding-top) 0 .875rem;flex-shrink:0;border-bottom:1px solid var(--color-border-muted)}.feed-header.svelte-jqd85f h2:where(.svelte-jqd85f){font-size:.9375rem;font-weight:600;margin:0 0 .25rem;color:var(--color-foreground)}.page-desc.svelte-jqd85f{font-size:.75rem;color:var(--color-muted-foreground-soft);margin:0}.state.svelte-jqd85f{padding:2rem;text-align:center;color:var(--color-muted-foreground);font-size:.875rem}.body.svelte-jqd85f{flex:1;overflow:visible;padding:1rem 0}.section-title.svelte-jqd85f{font-size:.8125rem;font-weight:600;color:var(--color-muted-foreground);margin:0 0 .25rem}.hint.svelte-jqd85f{font-size:.75rem;color:var(--color-muted-foreground-soft);margin:0 0 .5rem}.pipeline-section.svelte-jqd85f{margin-bottom:1.5rem}.step-list.svelte-jqd85f{display:flex;flex-direction:column;gap:0;border:1px solid var(--color-border);border-radius:var(--radius-sm);overflow:hidden}.step-row.svelte-jqd85f{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:var(--color-card);border-bottom:1px solid var(--color-border);cursor:grab}.step-row.svelte-jqd85f:last-child{border-bottom:none}.step-row.dragging.svelte-jqd85f{opacity:.5;cursor:grabbing}.drag-handle.svelte-jqd85f{color:var(--color-muted-foreground-soft);font-size:.875rem;cursor:grab;-webkit-user-select:none;user-select:none}.toggle-wrap.svelte-jqd85f{display:flex;align-items:center;cursor:pointer}.toggle-wrap.svelte-jqd85f input:where(.svelte-jqd85f){position:absolute;opacity:0;width:0;height:0}.toggle-slider.svelte-jqd85f{width:36px;height:20px;background:var(--color-input);border-radius:10px;transition:background .2s}.toggle-slider.svelte-jqd85f:after{content:"";display:block;width:16px;height:16px;background:var(--color-card-elevated);border-radius:50%;margin:2px 0 0 2px;transition:transform .2s;box-shadow:0 1px 2px #00000059}.toggle-wrap.svelte-jqd85f input:where(.svelte-jqd85f):checked+.toggle-slider:where(.svelte-jqd85f){background:var(--color-success)}.toggle-wrap.svelte-jqd85f input:where(.svelte-jqd85f):checked+.toggle-slider:where(.svelte-jqd85f):after{transform:translate(16px)}.step-label.svelte-jqd85f{flex:1;font-size:.875rem;min-width:0;color:var(--color-foreground)}.btn-add.svelte-jqd85f{margin-top:.5rem;padding:.35rem .75rem;font-size:.8125rem;color:var(--color-muted-foreground);background:var(--color-muted);border:1px solid var(--color-border);border-radius:4px;cursor:pointer}.btn-add.svelte-jqd85f:hover:not(:disabled){background:var(--color-accent)}.save-row.svelte-jqd85f{margin-top:1rem}.btn.svelte-jqd85f{padding:.5rem 1rem;font-size:.875rem;border-radius:var(--radius-sm);cursor:pointer;border:none}.btn-primary.svelte-jqd85f{background:var(--color-primary);color:var(--color-primary-foreground)}.btn-primary.svelte-jqd85f:hover:not(:disabled){background:var(--color-primary-hover)}.btn.svelte-jqd85f:disabled{opacity:.6;cursor:not-allowed}@media(max-width:600px){.feed-wrap.svelte-jqd85f{max-width:100%}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.feed-wrap.svelte-1f24zj{margin-top:calc(-1 * var(--main-padding-top));width:100%;max-width:42rem}.feed-col.svelte-1f24zj{padding:0}.body.svelte-1f24zj{overflow:visible;padding:var(--main-padding-top) 0 1rem}.intro.svelte-1f24zj{color:var(--color-muted-foreground-strong);margin:0 0 1.25rem;line-height:1.5;font-size:.875rem}.intro.svelte-1f24zj code:where(.svelte-1f24zj){font-size:.8125rem}.section-title.svelte-1f24zj{font-size:.8125rem;font-weight:600;color:var(--color-muted-foreground);margin:0 0 .5rem}.form-section.svelte-1f24zj{margin-bottom:1.25rem}.text-input.svelte-1f24zj{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;border:1px solid var(--color-input);border-radius:var(--radius-sm);background:var(--color-card-elevated);color:var(--color-foreground)}.text-input.svelte-1f24zj::placeholder{color:var(--color-muted-foreground-soft)}.proxy-select-trigger{display:inline-flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;border:1px solid var(--color-input);border-radius:var(--radius-sm);background:var(--color-card-elevated);color:var(--color-foreground);font-family:inherit;cursor:pointer}.proxy-select-trigger span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.proxy-select-trigger:focus-visible{border-color:var(--color-primary);box-shadow:0 0 0 3px var(--color-primary-light)}.proxy-select-content{z-index:140;width:var(--bits-select-anchor-width);max-width:min(42rem,calc(100vw - 2rem));padding:.25rem;background:var(--color-card-elevated);border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:var(--shadow-panel)}.proxy-select-viewport{display:flex;flex-direction:column;gap:.05rem;max-height:16rem;overflow:auto}.proxy-select-item{display:flex;align-items:center;min-height:2rem;padding:.4rem .6rem;font-size:.8125rem;line-height:1.25;color:var(--color-foreground);border-radius:var(--radius-sm);outline:none;cursor:pointer;word-break:break-all}.proxy-select-item[data-highlighted]{background:var(--color-muted)}.proxy-select-item[data-selected]{color:var(--color-primary);background:var(--color-primary-light)}.hint.svelte-1f24zj{font-size:.75rem;color:var(--color-muted-foreground-soft);margin:.5rem 0 0;line-height:1.45}.btn-row.svelte-1f24zj{display:flex;gap:.75rem}.btn.svelte-1f24zj{padding:.5rem 1rem;font-size:.875rem;border-radius:6px;cursor:pointer;border:none}.btn-primary.svelte-1f24zj{background:var(--color-primary);color:var(--color-primary-foreground)}.btn-primary.svelte-1f24zj:hover:not(:disabled){background:var(--color-primary-hover)}.btn.svelte-1f24zj:disabled{opacity:.6;cursor:not-allowed}@media(max-width:600px){.feed-wrap.svelte-1f24zj{max-width:100%}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.feed-wrap.svelte-1lsf4ps{--feed-sticky-gap-after: 0;margin-top:calc(-1 * var(--main-padding-top));width:100%;max-width:100%;display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}.feed-col.svelte-1lsf4ps{flex:1;display:flex;flex-direction:column;overflow:hidden;min-height:0;background:transparent}.feed-toolbar-block.svelte-1lsf4ps{flex-shrink:0;padding-top:var(--main-padding-top);padding-bottom:var(--feed-sticky-gap-after)}.feed-toolbar-block.svelte-1lsf4ps .admin-feed-header{min-height:4.1rem}.log-filter-input.svelte-1lsf4ps{width:min(16rem,34vw)}.log-level-trigger.svelte-1lsf4ps{width:7.25rem;min-width:7.25rem;height:2.25rem;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.45rem .65rem;font-size:.8125rem;font-family:inherit;color:var(--color-foreground);background:var(--color-card-elevated);border:1px solid var(--color-input);border-radius:6px;flex-shrink:0;cursor:pointer;font-variant-numeric:tabular-nums;transition:border-color .15s,background .15s,box-shadow .15s}.log-level-trigger.svelte-1lsf4ps:hover{border-color:var(--color-border)}.log-level-trigger.svelte-1lsf4ps:focus-visible{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 3px var(--color-primary-light)}.log-level-label.svelte-1lsf4ps{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.log-level-trigger.svelte-1lsf4ps svg{flex-shrink:0;color:var(--color-muted-foreground)}.log-level-content{z-index:120;min-width:7rem;padding:.25rem;background:var(--color-card-elevated);border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:var(--shadow-panel)}.log-level-viewport{display:flex;flex-direction:column;gap:.05rem}.log-level-item{display:flex;align-items:center;min-height:1.85rem;padding:.35rem .55rem;font-size:.8125rem;line-height:1.25;color:var(--color-foreground);border-radius:var(--radius-sm);outline:none;cursor:pointer;font-variant-numeric:tabular-nums}.log-level-item[data-highlighted]{background:var(--color-muted)}.log-level-item[data-selected]{color:var(--color-primary);background:var(--color-primary-light)}.log-body-scroll.svelte-1lsf4ps,.log-has-data.svelte-1lsf4ps{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.log-table-scroll.svelte-1lsf4ps{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior-y:contain;-webkit-overflow-scrolling:touch}.log-table-scroll.svelte-1lsf4ps::-webkit-scrollbar{width:4px}.log-table-scroll.svelte-1lsf4ps::-webkit-scrollbar-thumb{background:var(--color-scrollbar-thumb);border-radius:2px}.btn.svelte-1lsf4ps{display:inline-flex;align-items:center;padding:.4rem .9rem;border:none;border-radius:var(--radius-sm);cursor:pointer;font-size:.875rem;font-family:inherit;transition:background .15s}.btn-primary.svelte-1lsf4ps{background:var(--color-primary);color:var(--color-primary-foreground)}.btn-primary.svelte-1lsf4ps:hover:not(:disabled){background:var(--color-primary-hover)}.btn-secondary.svelte-1lsf4ps{background:var(--color-muted);color:var(--color-foreground);border:1px solid var(--color-border)}.btn-secondary.svelte-1lsf4ps:hover:not(:disabled){background:var(--color-accent)}.btn.svelte-1lsf4ps:disabled{opacity:.4;cursor:not-allowed}.btn-sm.svelte-1lsf4ps{padding:.25rem .5rem;font-size:.75rem}.table-wrap.svelte-1lsf4ps{width:100%}table.svelte-1lsf4ps{width:100%;table-layout:fixed;border-collapse:collapse}thead.svelte-1lsf4ps th:where(.svelte-1lsf4ps){position:sticky;top:0;z-index:3;background:var(--color-card-elevated);font-size:.72rem;font-weight:600;color:var(--color-muted-foreground);text-transform:uppercase;letter-spacing:.04em;padding:.5rem .75rem;text-align:left;border-bottom:1px solid var(--color-border);box-shadow:0 1px 0 var(--color-border)}tbody.svelte-1lsf4ps tr:where(.svelte-1lsf4ps){border-bottom:1px solid var(--color-border-muted)}tbody.svelte-1lsf4ps tr:where(.svelte-1lsf4ps):hover{background:var(--color-muted)}tbody.svelte-1lsf4ps td:where(.svelte-1lsf4ps){padding:.5rem .75rem;font-size:.8125rem;vertical-align:middle}.th-time.svelte-1lsf4ps{width:130px}.th-level.svelte-1lsf4ps{width:68px}.th-cat.svelte-1lsf4ps{width:7rem;max-width:28vw}.th-msg.svelte-1lsf4ps{min-width:0}.log-row.svelte-1lsf4ps{cursor:pointer}.log-row.svelte-1lsf4ps:focus{outline:1px dotted var(--color-muted-foreground);outline-offset:-1px}.td-time.svelte-1lsf4ps{color:var(--color-muted-foreground);white-space:nowrap}.td-level.svelte-1lsf4ps{white-space:nowrap}.badge.svelte-1lsf4ps{display:inline-block;padding:.12rem .4rem;border-radius:4px;font-size:.7rem;font-weight:500}.badge.level-error.svelte-1lsf4ps{background:color-mix(in srgb,var(--color-destructive) 18%,transparent);color:var(--color-destructive);border:1px solid color-mix(in srgb,var(--color-destructive) 45%,transparent)}.badge.level-warn.svelte-1lsf4ps{background:#eab30824;color:#fbbf24;border:1px solid rgba(234,179,8,.35)}.badge.level-info.svelte-1lsf4ps{background:var(--color-primary-light);color:var(--color-primary-hover);border:1px solid color-mix(in srgb,var(--color-primary) 40%,transparent)}.badge.level-debug.svelte-1lsf4ps{background:var(--color-muted);color:var(--color-muted-foreground-strong);border:1px solid var(--color-border)}.td-cat.svelte-1lsf4ps{color:var(--color-muted-foreground-strong)}.td-msg.svelte-1lsf4ps{word-break:break-word;max-width:320px}.payload-row.svelte-1lsf4ps td:where(.svelte-1lsf4ps){padding:.25rem .75rem .65rem;background:transparent;border-bottom:1px solid var(--color-border-muted);vertical-align:top}.payload-content.svelte-1lsf4ps{margin:0;padding:0;font-family:Menlo,Monaco,Consolas,monospace;font-size:.72rem;line-height:1.5;background:transparent;border:none;border-radius:0;overflow-x:auto;max-height:200px;overflow-y:auto;white-space:pre-wrap;word-break:break-all;color:var(--color-muted-foreground-strong)}.log-toolbar.svelte-1lsf4ps{display:flex;align-items:center;justify-content:space-between;padding:.65rem 0 .85rem;flex-shrink:0}.pagination-info.svelte-1lsf4ps{font-size:.8125rem;color:var(--color-muted-foreground)}.pagination-btns.svelte-1lsf4ps{display:flex;gap:.5rem}.state.svelte-1lsf4ps{flex:1;display:flex;align-items:center;justify-content:center;text-align:center;padding:3rem 1.5rem;color:var(--color-muted-foreground-soft);font-size:.875rem}.state.err.svelte-1lsf4ps{flex:1;align-self:stretch;color:var(--color-destructive);background:color-mix(in srgb,var(--color-destructive) 12%,transparent);border-radius:var(--radius-md);padding:1rem;margin:.75rem 0}@media(max-width:720px){.feed-wrap.svelte-1lsf4ps{max-width:100%}.payload-row.svelte-1lsf4ps td:where(.svelte-1lsf4ps){padding-left:.5rem}.payload-row.svelte-1lsf4ps td[colspan="4"]:where(.svelte-1lsf4ps){padding-left:.5rem}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.feed-wrap.svelte-bhaf7m{margin-top:calc(-1 * var(--main-padding-top));width:100%;max-width:42rem}.feed-col.svelte-bhaf7m{padding:0}.body.svelte-bhaf7m{overflow:visible;padding:var(--main-padding-top) 0 1rem}.intro.svelte-bhaf7m{color:var(--color-muted-foreground-strong);margin:0 0 1.25rem;line-height:1.5;font-size:.875rem}.intro.svelte-bhaf7m code:where(.svelte-bhaf7m){font-size:.8125rem}.section-title.svelte-bhaf7m{font-size:.8125rem;font-weight:600;color:var(--color-muted-foreground);margin:0 0 .5rem}.form-section.svelte-bhaf7m{margin-bottom:1.25rem}.url-input.svelte-bhaf7m{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;border:1px solid var(--color-input);border-radius:var(--radius-sm);background:var(--color-card-elevated);color:var(--color-foreground)}.url-input.svelte-bhaf7m::placeholder{color:var(--color-muted-foreground-soft)}.hint.svelte-bhaf7m{font-size:.75rem;color:var(--color-muted-foreground-soft);margin:.5rem 0 0;line-height:1.45}.btn-row.svelte-bhaf7m{display:flex;gap:.75rem;flex-wrap:wrap}.btn.svelte-bhaf7m{padding:.5rem 1rem;font-size:.875rem;border-radius:6px;cursor:pointer;border:none}.btn-primary.svelte-bhaf7m{background:var(--color-primary);color:var(--color-primary-foreground)}.btn-primary.svelte-bhaf7m:hover:not(:disabled){background:var(--color-primary-hover)}.btn-secondary.svelte-bhaf7m{background:var(--color-muted);color:var(--color-foreground);border:1px solid var(--color-border)}.btn-secondary.svelte-bhaf7m:hover:not(:disabled){background:var(--color-accent)}.btn.svelte-bhaf7m:disabled{opacity:.6;cursor:not-allowed}@media(max-width:600px){.feed-wrap.svelte-bhaf7m{max-width:100%}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.feed-wrap.svelte-1a0dvmg{margin-top:calc(-1 * var(--main-padding-top));width:100%;max-width:42rem}.feed-col.svelte-1a0dvmg{padding:0}.body.svelte-1a0dvmg{overflow:visible;padding:var(--main-padding-top) 0 1rem}.intro.svelte-1a0dvmg{color:var(--color-muted-foreground-strong);margin:0 0 1.25rem;line-height:1.5;font-size:.875rem}.section-title.svelte-1a0dvmg{font-size:.8125rem;font-weight:600;color:var(--color-muted-foreground);margin:0 0 .5rem}.form-section.svelte-1a0dvmg{margin-bottom:1.25rem}.text-input.svelte-1a0dvmg{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;border:1px solid var(--color-input);border-radius:var(--radius-sm);background:var(--color-card-elevated);color:var(--color-foreground)}.text-input.svelte-1a0dvmg::placeholder{color:var(--color-muted-foreground-soft)}.hint.svelte-1a0dvmg{font-size:.75rem;color:var(--color-muted-foreground-soft);margin:.5rem 0 0;line-height:1.45}.btn-row.svelte-1a0dvmg{display:flex;gap:.75rem}.btn.svelte-1a0dvmg{padding:.5rem 1rem;font-size:.875rem;border-radius:6px;cursor:pointer;border:none}.btn-primary.svelte-1a0dvmg{background:var(--color-primary);color:var(--color-primary-foreground)}.btn-primary.svelte-1a0dvmg:hover:not(:disabled){background:var(--color-primary-hover)}.btn-secondary.svelte-1a0dvmg{background:var(--color-muted);color:var(--color-foreground);border:1px solid var(--color-border)}.btn-secondary.svelte-1a0dvmg:hover:not(:disabled){background:var(--color-accent)}.btn.svelte-1a0dvmg:disabled{opacity:.6;cursor:not-allowed}@media(max-width:600px){.feed-wrap.svelte-1a0dvmg{max-width:100%}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.feed-wrap.svelte-1x680s0{margin-top:calc(-1 * var(--main-padding-top));width:100%;max-width:42rem}.feed-col.svelte-1x680s0{padding:0}.feed-header.svelte-1x680s0{padding:var(--main-padding-top) 0 .875rem;flex-shrink:0;border-bottom:1px solid var(--color-border-muted)}.feed-header.svelte-1x680s0 h2:where(.svelte-1x680s0){font-size:.9375rem;font-weight:600;margin:0 0 .25rem;color:var(--color-foreground)}.page-desc.svelte-1x680s0{font-size:.75rem;color:var(--color-muted-foreground-soft);margin:0;line-height:1.5}.body.svelte-1x680s0{flex:1;overflow:visible;padding:1rem 0}.url-row.svelte-1x680s0{display:flex;gap:.5rem;margin-bottom:.75rem}.url-row.svelte-1x680s0 input:where(.svelte-1x680s0){flex:1;padding:.65rem 1rem;border:1px solid var(--color-input);border-radius:var(--radius-md);font-size:.9375rem;outline:none;transition:border .15s,box-shadow .15s;min-width:0;background:var(--color-card-elevated);color:var(--color-foreground);font-family:inherit}.url-row.svelte-1x680s0 input:where(.svelte-1x680s0):focus{border-color:var(--color-primary);box-shadow:0 0 0 3px var(--color-primary-light)}.action-row.svelte-1x680s0{display:flex;justify-content:flex-start;margin-bottom:.75rem}.action-row.svelte-1x680s0 button:where(.svelte-1x680s0){padding:.65rem 1.375rem;background:var(--color-primary);color:var(--color-primary-foreground);border:none;border-radius:8px;cursor:pointer;font-size:.9rem;font-family:inherit;white-space:nowrap;transition:background .15s}.action-row.svelte-1x680s0 button:where(.svelte-1x680s0):hover:not(:disabled){background:var(--color-primary-hover)}.action-row.svelte-1x680s0 button:where(.svelte-1x680s0):disabled{opacity:.65;cursor:not-allowed}.result-error.svelte-1x680s0{margin-top:1rem;width:100%;padding:.75rem 1rem;border-radius:var(--radius-md);background:color-mix(in srgb,var(--color-destructive, #c00) 12%,transparent);color:var(--color-foreground);font-size:.8125rem;white-space:pre-wrap;word-break:break-word}.result-wrap.svelte-1x680s0{margin-top:1rem;width:100%}.result-label.svelte-1x680s0{font-size:.75rem;font-weight:600;color:var(--color-muted-foreground);margin:0 0 .4rem}.result-json.svelte-1x680s0{margin:0;padding:1rem;max-height:min(70vh,520px);overflow:auto;font-size:.75rem;line-height:1.45;border-radius:var(--radius-md);border:1px solid var(--color-input);background:var(--color-muted);color:var(--color-foreground)}.proxy-row.svelte-1x680s0{margin-bottom:.75rem}.proxy-select-trigger{display:inline-flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;box-sizing:border-box;padding:.55rem 1rem;border:1px solid var(--color-input);border-radius:var(--radius-md);font-size:.8125rem;outline:none;transition:border .15s,box-shadow .15s;background:var(--color-card-elevated);color:var(--color-foreground);font-family:inherit;cursor:pointer}.proxy-select-trigger:focus-visible{border-color:var(--color-primary);box-shadow:0 0 0 3px var(--color-primary-light)}.proxy-select-trigger span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.proxy-select-content{z-index:140;width:var(--bits-select-anchor-width);max-width:min(42rem,calc(100vw - 2rem));padding:.25rem;background:var(--color-card-elevated);border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:var(--shadow-panel)}.proxy-select-viewport{display:flex;flex-direction:column;gap:.05rem;max-height:16rem;overflow:auto}.proxy-select-item{display:flex;align-items:center;min-height:2rem;padding:.4rem .6rem;font-size:.8125rem;line-height:1.25;color:var(--color-foreground);border-radius:var(--radius-sm);outline:none;cursor:pointer;word-break:break-all}.proxy-select-item[data-highlighted]{background:var(--color-muted)}.proxy-select-item[data-selected]{color:var(--color-primary);background:var(--color-primary-light)}.field-hint.svelte-1x680s0{margin:.4rem 0 0;font-size:.75rem;color:var(--color-muted-foreground-soft);line-height:1.4}@media(max-width:600px){.feed-wrap.svelte-1x680s0{max-width:100%}}
|