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.
Files changed (119) hide show
  1. package/.env.example +52 -52
  2. package/README.md +156 -147
  3. package/app/plugins/builtin/email.rssany.js +84 -84
  4. package/app/plugins/builtin/rss.rssany.js +164 -164
  5. package/app/plugins/builtin/xiaohongshu.rssany.js +59 -2
  6. package/app/statics/README.md +7 -7
  7. package/app/webui/build/200.html +36 -36
  8. package/app/webui/build/_app/immutable/assets/0.BLOTwIuF.css +1 -0
  9. package/app/webui/build/_app/immutable/assets/10.CmGYYZFR.css +1 -0
  10. package/app/webui/build/_app/immutable/assets/11.Dkz3VS_N.css +1 -0
  11. package/app/webui/build/_app/immutable/assets/14.BCCBoMGj.css +1 -0
  12. package/app/webui/build/_app/immutable/assets/6.Cm_jpHOq.css +1 -0
  13. package/app/webui/build/_app/immutable/assets/7.CJ3BjogD.css +1 -0
  14. package/app/webui/build/_app/immutable/assets/9.CATKVZ-n.css +1 -0
  15. package/app/webui/build/_app/immutable/assets/{SourcesList.D5Lso0bo.css → SourcesList.ke66uOSi.css} +1 -1
  16. package/app/webui/build/_app/immutable/assets/chevron-down.CV-KWLNP.css +1 -0
  17. package/app/webui/build/_app/immutable/chunks/{CGCMIfh3.js → 4TuV_psf.js} +1 -1
  18. package/app/webui/build/_app/immutable/chunks/{DAdOEnFb.js → B0czyjwj.js} +1 -1
  19. package/app/webui/build/_app/immutable/chunks/{CFwxUBGi.js → B553hBXT.js} +1 -1
  20. package/app/webui/build/_app/immutable/chunks/B8StT3Do.js +6 -0
  21. package/app/webui/build/_app/immutable/chunks/BI_ale1m.js +1 -0
  22. package/app/webui/build/_app/immutable/chunks/BK0ygNWX.js +2 -0
  23. package/app/webui/build/_app/immutable/chunks/BKm6QCwp.js +1 -0
  24. package/app/webui/build/_app/immutable/chunks/BT6b4LcZ.js +36 -0
  25. package/app/webui/build/_app/immutable/chunks/BZY5aksi.js +36 -0
  26. package/app/webui/build/_app/immutable/chunks/{C8umpVpB.js → BnqaikL8.js} +1 -1
  27. package/app/webui/build/_app/immutable/chunks/BsQ08Wq_.js +1 -0
  28. package/app/webui/build/_app/immutable/chunks/C9wTDiHH.js +1 -0
  29. package/app/webui/build/_app/immutable/chunks/{B-CeeY89.js → CAKuIoAf.js} +1 -1
  30. package/app/webui/build/_app/immutable/chunks/CEWi_rGa.js +1 -0
  31. package/app/webui/build/_app/immutable/chunks/{ChUctqXA.js → Cc7aBSsN.js} +1 -1
  32. package/app/webui/build/_app/immutable/chunks/{BAJAS8BI.js → D8G961Hm.js} +1 -1
  33. package/app/webui/build/_app/immutable/chunks/{CS53ooo0.js → DIeahUKq.js} +1 -1
  34. package/app/webui/build/_app/immutable/chunks/DO5OXNYS.js +1 -0
  35. package/app/webui/build/_app/immutable/chunks/Dg_D3pjF.js +1 -0
  36. package/app/webui/build/_app/immutable/chunks/{Dyvi1wBH.js → DptdhtA1.js} +1 -1
  37. package/app/webui/build/_app/immutable/chunks/{ClknbeNl.js → FDS7fbwH.js} +1 -1
  38. package/app/webui/build/_app/immutable/chunks/{CqYSO3Dx.js → GeNMTUn1.js} +1 -1
  39. package/app/webui/build/_app/immutable/chunks/{DCEayuDt.js → IhDlsCxD.js} +1 -1
  40. package/app/webui/build/_app/immutable/chunks/Nd0ktDhd.js +1 -0
  41. package/app/webui/build/_app/immutable/chunks/{D6kzEN_P.js → SvdgnirT.js} +1 -1
  42. package/app/webui/build/_app/immutable/chunks/WW6La7Nt.js +2 -0
  43. package/app/webui/build/_app/immutable/chunks/{DsxvjlCC.js → pd_p3yYy.js} +5 -5
  44. package/app/webui/build/_app/immutable/chunks/rNwPv4DZ.js +1 -0
  45. package/app/webui/build/_app/immutable/entry/app.BKLBG-4w.js +2 -0
  46. package/app/webui/build/_app/immutable/entry/start.D-X6pVtx.js +1 -0
  47. package/app/webui/build/_app/immutable/nodes/{0.DK_mcVDm.js → 0.CJDC_3s9.js} +3 -3
  48. package/app/webui/build/_app/immutable/nodes/1.DsKocFSb.js +1 -0
  49. package/app/webui/build/_app/immutable/nodes/10.BeejAn8z.js +1 -0
  50. package/app/webui/build/_app/immutable/nodes/11.D--uwkk0.js +3 -0
  51. package/app/webui/build/_app/immutable/nodes/12.BLyQ6rUu.js +1 -0
  52. package/app/webui/build/_app/immutable/nodes/13.Cl0WQK13.js +1 -0
  53. package/app/webui/build/_app/immutable/nodes/14.T9l5Rh19.js +1 -0
  54. package/app/webui/build/_app/immutable/nodes/15.DHfwIlBx.js +1 -0
  55. package/app/webui/build/_app/immutable/nodes/{16.zfSe93Ab.js → 16.BKDfR-KV.js} +2 -2
  56. package/app/webui/build/_app/immutable/nodes/17.DofB8HQB.js +1 -0
  57. package/app/webui/build/_app/immutable/nodes/2.BOYqXdCa.js +1 -0
  58. package/app/webui/build/_app/immutable/nodes/3.B9ucbp_W.js +1 -0
  59. package/app/webui/build/_app/immutable/nodes/5.9zgwFV6I.js +2 -0
  60. package/app/webui/build/_app/immutable/nodes/6.Bs32Ieii.js +2 -0
  61. package/app/webui/build/_app/immutable/nodes/7.Cigxrk0v.js +1 -0
  62. package/app/webui/build/_app/immutable/nodes/8.pG10rCF0.js +1 -0
  63. package/app/webui/build/_app/immutable/nodes/9.Bzqb3xHY.js +1 -0
  64. package/app/webui/build/_app/version.json +1 -1
  65. package/bin/rssany.js +55 -3
  66. package/dist/index.js +361 -99
  67. package/dist/index.js.map +1 -1
  68. package/package.json +107 -103
  69. package/scripts/dev.mjs +5 -1
  70. package/scripts/postinstall.mjs +44 -0
  71. package/scripts/reset.mjs +137 -135
  72. package/scripts/user-dir.mjs +52 -0
  73. package/app/webui/build/_app/immutable/assets/0.DsKls1SN.css +0 -1
  74. package/app/webui/build/_app/immutable/assets/10.Dj8_pmut.css +0 -1
  75. package/app/webui/build/_app/immutable/assets/13.Qu_tY6H9.css +0 -1
  76. package/app/webui/build/_app/immutable/assets/5.B-dPiwB7.css +0 -1
  77. package/app/webui/build/_app/immutable/assets/6.B27N7pdA.css +0 -1
  78. package/app/webui/build/_app/immutable/assets/8.Cgji2b15.css +0 -1
  79. package/app/webui/build/_app/immutable/assets/9.BsCIAvn3.css +0 -1
  80. package/app/webui/build/_app/immutable/chunks/6prdYIKP.js +0 -1
  81. package/app/webui/build/_app/immutable/chunks/B2cyTHdf.js +0 -2
  82. package/app/webui/build/_app/immutable/chunks/B6WG2Sd3.js +0 -1
  83. package/app/webui/build/_app/immutable/chunks/BA4Gucnq.js +0 -1
  84. package/app/webui/build/_app/immutable/chunks/BkD3yAYe.js +0 -1
  85. package/app/webui/build/_app/immutable/chunks/C4uF_YIK.js +0 -1
  86. package/app/webui/build/_app/immutable/chunks/CBY2biv-.js +0 -1
  87. package/app/webui/build/_app/immutable/chunks/CVW0ymE1.js +0 -1
  88. package/app/webui/build/_app/immutable/chunks/DJ2e04vK.js +0 -36
  89. package/app/webui/build/_app/immutable/chunks/DL3Q5sfb.js +0 -1
  90. package/app/webui/build/_app/immutable/chunks/DVa8Y-mQ.js +0 -1
  91. package/app/webui/build/_app/immutable/chunks/DkamXS6W.js +0 -36
  92. package/app/webui/build/_app/immutable/chunks/DoRPmqLn.js +0 -2
  93. package/app/webui/build/_app/immutable/chunks/_qj9U-za.js +0 -1
  94. package/app/webui/build/_app/immutable/chunks/vtBo8kBV.js +0 -1
  95. package/app/webui/build/_app/immutable/entry/app.RFfWi3_i.js +0 -2
  96. package/app/webui/build/_app/immutable/entry/start.DU_kyeGS.js +0 -1
  97. package/app/webui/build/_app/immutable/nodes/1.0PRrU2uQ.js +0 -1
  98. package/app/webui/build/_app/immutable/nodes/10.CsxzlUER.js +0 -1
  99. package/app/webui/build/_app/immutable/nodes/11.D-PkhIRW.js +0 -1
  100. package/app/webui/build/_app/immutable/nodes/12.GGf-JLUY.js +0 -1
  101. package/app/webui/build/_app/immutable/nodes/13.DWWcH27k.js +0 -6
  102. package/app/webui/build/_app/immutable/nodes/14.COwSLwDN.js +0 -1
  103. package/app/webui/build/_app/immutable/nodes/15.nDN_AHrs.js +0 -1
  104. package/app/webui/build/_app/immutable/nodes/2.AJd2163d.js +0 -1
  105. package/app/webui/build/_app/immutable/nodes/3.CEVEHuaH.js +0 -1
  106. package/app/webui/build/_app/immutable/nodes/4.BT_N8pCh.js +0 -2
  107. package/app/webui/build/_app/immutable/nodes/5.BZScQ2CH.js +0 -2
  108. package/app/webui/build/_app/immutable/nodes/6.CkFk8X--.js +0 -1
  109. package/app/webui/build/_app/immutable/nodes/7.CuQJk7te.js +0 -1
  110. package/app/webui/build/_app/immutable/nodes/8.DIavWJnU.js +0 -1
  111. package/app/webui/build/_app/immutable/nodes/9.Db30M8x0.js +0 -1
  112. /package/app/webui/build/_app/immutable/assets/{11.qYZMiTb0.css → 12.qYZMiTb0.css} +0 -0
  113. /package/app/webui/build/_app/immutable/assets/{12.DfJcfUWl.css → 13.DfJcfUWl.css} +0 -0
  114. /package/app/webui/build/_app/immutable/assets/{14.DfMfOrS3.css → 15.DfMfOrS3.css} +0 -0
  115. /package/app/webui/build/_app/immutable/assets/{15.nNGjXhCQ.css → 17.nNGjXhCQ.css} +0 -0
  116. /package/app/webui/build/_app/immutable/assets/{4.Di6rvlY-.css → 5.Di6rvlY-.css} +0 -0
  117. /package/app/webui/build/_app/immutable/assets/{7.CrNxmd8B.css → 8.CrNxmd8B.css} +0 -0
  118. /package/app/webui/build/_app/immutable/nodes/{17.BtYZF6FM.js → 18.BtYZF6FM.js} +0 -0
  119. /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 imageEl = section.querySelector("img[data-xhs-img], img");
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
  }
@@ -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**:无匹配站点时返回。
@@ -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.DU_kyeGS.js" rel="modulepreload">
16
- <link href="/_app/immutable/chunks/CVW0ymE1.js" rel="modulepreload">
17
- <link href="/_app/immutable/chunks/vtBo8kBV.js" rel="modulepreload">
18
- <link href="/_app/immutable/chunks/ClknbeNl.js" rel="modulepreload">
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/Dyvi1wBH.js" rel="modulepreload">
21
- <link href="/_app/immutable/entry/app.RFfWi3_i.js" rel="modulepreload">
22
- <link href="/_app/immutable/chunks/B2cyTHdf.js" rel="modulepreload">
23
- <link href="/_app/immutable/chunks/CS53ooo0.js" rel="modulepreload">
24
- <link href="/_app/immutable/chunks/BkD3yAYe.js" rel="modulepreload">
25
- <link href="/_app/immutable/chunks/C4uF_YIK.js" rel="modulepreload">
26
- <link href="/_app/immutable/chunks/B-CeeY89.js" rel="modulepreload">
27
- <link href="/_app/immutable/chunks/BAJAS8BI.js" rel="modulepreload">
28
- <link href="/_app/immutable/chunks/B6WG2Sd3.js" rel="modulepreload">
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
- __sveltekit_29f0f = {
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.DU_kyeGS.js"),
43
- import("/_app/immutable/entry/app.RFfWi3_i.js")
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%}}