index.html 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  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.0">
  6. <title>TrendRadar 配置文件编辑器</title>
  7. <!-- Tailwind CSS -->
  8. <script src="https://cdn.tailwindcss.com"></script>
  9. <!-- FontAwesome -->
  10. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
  11. <!-- js-yaml -->
  12. <script src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/4.1.0/js-yaml.min.js"></script>
  13. <!-- SortableJS (拖拽排序库) -->
  14. <script src="https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.15.0/Sortable.min.js"></script>
  15. <!-- 自定义样式 -->
  16. <link rel="stylesheet" href="./assets/style.css">
  17. </head>
  18. <body class="bg-gray-100 text-gray-800 font-sans h-screen flex flex-col overflow-hidden">
  19. <!-- 顶部导航 -->
  20. <nav class="bg-white shadow-sm border-b border-gray-200 flex-shrink-0 z-20">
  21. <div class="max-w-full mx-auto px-4 sm:px-6 lg:px-8 h-14 flex items-center justify-between">
  22. <a href="https://github.com/sansan0/TrendRadar" target="_blank" class="flex items-center gap-3 hover:opacity-80 transition-opacity">
  23. <i class="fa-solid fa-sliders text-blue-600 text-lg"></i>
  24. <span class="font-bold text-lg tracking-tight text-gray-900">TrendRadar <span class="text-gray-500 text-xs font-normal ml-2">可视化配置编辑器 </span></span>
  25. </a>
  26. <!-- 隐私安全提示 -->
  27. <div class="hidden lg:flex items-center text-xs text-gray-500 bg-gray-50 px-3 py-1.5 rounded-full border border-gray-100 select-none">
  28. <i class="fa-solid fa-shield-halved mr-1.5 text-green-500"></i>
  29. <span>纯静态页面,数据仅保存在你的本地浏览器,请放心使用</span>
  30. </div>
  31. <div class="flex gap-3">
  32. <button onclick="openLoadConfigModal()" class="text-xs text-blue-600 hover:text-blue-800 underline flex items-center gap-1">
  33. <i class="fa-solid fa-cloud-arrow-down"></i>加载官网最新配置
  34. </button>
  35. <button onclick="copyResult()" class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-1.5 rounded text-sm font-medium transition-colors shadow-sm">
  36. <i class="fa-regular fa-copy mr-1.5"></i>复制配置
  37. </button>
  38. <button onclick="openSupportModal()" class="bg-gradient-to-r from-orange-400 to-pink-500 hover:from-orange-500 hover:to-pink-600 text-white px-4 py-1.5 rounded text-sm font-medium transition-all shadow-md hover:shadow-lg flex items-center gap-1.5">
  39. <i class="fa-solid fa-heart-pulse"></i>支持项目
  40. </button>
  41. </div>
  42. </div>
  43. </nav>
  44. <!-- 主界面:左右分栏 -->
  45. <main class="flex-grow flex overflow-hidden">
  46. <!-- 左侧:源代码编辑器 (Source) -->
  47. <div class="w-1/2 flex flex-col border-r border-gray-200 bg-[#1e1e1e]">
  48. <!-- Tab 切换 -->
  49. <div class="flex items-center bg-[#252526] border-b border-[#333]">
  50. <button id="tab-config" onclick="switchTab('config')" class="tab-button active px-4 py-2 text-xs font-bold text-gray-300 hover:bg-[#2d2d30] transition-colors border-b-2 border-blue-500">
  51. <i class="fa-solid fa-code mr-2"></i>config.yaml
  52. </button>
  53. <button id="tab-frequency" onclick="switchTab('frequency')" class="tab-button px-4 py-2 text-xs font-bold text-gray-500 hover:bg-[#2d2d30] transition-colors border-b-2 border-transparent">
  54. <i class="fa-solid fa-filter mr-2"></i>frequency_words.txt
  55. </button>
  56. <div class="flex-grow"></div>
  57. <!-- 保存时间显示 -->
  58. <div id="save-time-config" class="save-time-badge px-3 text-[10px] text-gray-500 flex items-center gap-1">
  59. <i class="fa-regular fa-clock"></i>
  60. <span id="config-save-label" class="hidden">已保存: </span>
  61. <span id="config-save-time" class="text-gray-400" title="未保存">未保存</span>
  62. </div>
  63. <div id="save-time-frequency" class="save-time-badge hidden px-3 text-[10px] text-gray-500 flex items-center gap-1">
  64. <i class="fa-regular fa-clock"></i>
  65. <span id="frequency-save-label" class="hidden">已保存: </span>
  66. <span id="frequency-save-time" class="text-gray-400" title="未保存">未保存</span>
  67. </div>
  68. </div>
  69. <!-- Config 编辑器 -->
  70. <div id="yaml-editor-wrap" class="tab-content highlight-editor-wrap flex-grow w-full h-full bg-[#1e1e1e]">
  71. <div id="yaml-backdrop" class="highlight-backdrop"></div>
  72. <textarea id="yaml-editor" class="highlight-textarea" spellcheck="false"></textarea>
  73. </div>
  74. <!-- Frequency 编辑器 -->
  75. <div id="frequency-editor-wrap" class="tab-content hidden highlight-editor-wrap flex-grow w-full h-full bg-[#1e1e1e]">
  76. <div id="frequency-backdrop" class="highlight-backdrop"></div>
  77. <textarea id="frequency-editor" class="highlight-textarea" spellcheck="false"></textarea>
  78. </div>
  79. </div>
  80. <!-- 右侧:可视化配置 (Visual) -->
  81. <div class="w-1/2 flex flex-col bg-gray-50">
  82. <div class="flex items-center justify-between px-6 py-3 bg-white border-b border-gray-200">
  83. <div class="flex items-center gap-3">
  84. <span class="text-sm font-bold text-gray-700"><i class="fa-solid fa-list-check mr-2"></i><span id="right-panel-title">配置模块</span></span>
  85. <button id="version-check-btn" onclick="checkVersion()" class="text-xs bg-indigo-500 hover:bg-indigo-600 text-white px-3 py-1 rounded shadow-sm transition-all flex items-center gap-1.5" title="检测 config.yaml 版本">
  86. <i class="fa-solid fa-code-compare"></i>
  87. <span>版本检测</span>
  88. </button>
  89. <button onclick="resetToDefault()" class="text-xs text-gray-400 hover:text-red-500 transition-colors px-2 py-1" title="重置当前内容为默认状态">
  90. <i class="fa-solid fa-rotate-left"></i>
  91. </button>
  92. </div>
  93. </div>
  94. <!-- 模块导航栏 -->
  95. <div id="module-nav" class="tab-content bg-white border-b border-gray-200 px-4 py-2 flex flex-wrap gap-1">
  96. </div>
  97. <!-- Config 可视化面板 -->
  98. <div id="config-panel" class="tab-content flex-grow overflow-y-auto p-6 space-y-6">
  99. </div>
  100. <!-- Frequency 可视化面板 -->
  101. <div id="frequency-panel" class="tab-content hidden flex-grow overflow-y-auto p-6 space-y-6">
  102. </div>
  103. </div>
  104. </main>
  105. <!-- RSS 添加弹窗 -->
  106. <div id="rss-modal" class="modal-overlay hidden">
  107. <div class="modal-content">
  108. <div class="flex items-center justify-between mb-4">
  109. <h3 class="text-lg font-bold text-gray-800"><i class="fa-solid fa-rss mr-2 text-orange-500"></i>添加 RSS 源</h3>
  110. <button onclick="closeRssModal()" class="text-gray-400 hover:text-gray-600"><i class="fa-solid fa-times text-xl"></i></button>
  111. </div>
  112. <div class="space-y-4">
  113. <div>
  114. <label class="block text-xs font-bold text-gray-600 mb-1">源 ID(唯一标识,英文)</label>
  115. <input type="text" id="rss-id" placeholder="例如: my-blog" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
  116. </div>
  117. <div>
  118. <label class="block text-xs font-bold text-gray-600 mb-1">显示名称</label>
  119. <input type="text" id="rss-name" placeholder="例如: 我的博客" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
  120. </div>
  121. <div>
  122. <label class="block text-xs font-bold text-gray-600 mb-1">RSS URL</label>
  123. <input type="text" id="rss-url" placeholder="https://example.com/feed.xml" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
  124. </div>
  125. <div>
  126. <label class="block text-xs font-bold text-gray-600 mb-1">最大文章年龄(天,可选)</label>
  127. <input type="number" id="rss-max-age" placeholder="留空使用全局设置" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
  128. </div>
  129. </div>
  130. <!-- RSS 灵感折叠区 -->
  131. <div class="mt-5 border-t border-gray-100 pt-4">
  132. <button type="button" onclick="toggleRssTips()" class="w-full flex items-center justify-between text-xs text-orange-600 hover:text-orange-700 bg-orange-50 hover:bg-orange-100 px-3 py-2 rounded-lg transition-all group">
  133. <span class="font-bold flex items-center gap-1.5">
  134. <i class="fa-regular fa-lightbulb"></i> RSS 订阅灵感 & 参考库 <span class="font-normal opacity-70 ml-1">(内附常用源)</span>
  135. </span>
  136. <i id="rss-tips-icon" class="fa-solid fa-chevron-down transition-transform duration-200 text-orange-400 group-hover:text-orange-600" style="transform: rotate(180deg);"></i>
  137. </button>
  138. <div id="rss-tips-panel" class="mt-2 space-y-3 pl-1">
  139. <!-- 必应新闻 -->
  140. <div class="bg-white border border-gray-100 rounded-lg p-3 shadow-sm">
  141. <div class="flex items-center gap-2 mb-2">
  142. <i class="fa-brands fa-microsoft text-blue-500"></i>
  143. <span class="font-bold text-gray-700">Bing 新闻 (支持任意关键词)</span>
  144. </div>
  145. <div class="grid grid-cols-2 gap-2 mb-2">
  146. <button onclick="fillRssUrl('https://www.bing.com/news/search?q=科技+编程&format=RSS')" class="text-left text-[10px] border border-gray-200 hover:border-blue-400 hover:bg-blue-50 hover:text-blue-600 rounded px-2 py-1.5 transition-colors truncate" title="点击填入">
  147. 🚀 科技/编程
  148. </button>
  149. <button onclick="fillRssUrl('https://www.bing.com/news/search?q=全球新闻&format=RSS')" class="text-left text-[10px] border border-gray-200 hover:border-blue-400 hover:bg-blue-50 hover:text-blue-600 rounded px-2 py-1.5 transition-colors truncate" title="点击填入">
  150. 🌍 全球新闻
  151. </button>
  152. <button onclick="fillRssUrl('https://www.bing.com/news/search?q=人工智能&format=RSS')" class="text-left text-[10px] border border-gray-200 hover:border-blue-400 hover:bg-blue-50 hover:text-blue-600 rounded px-2 py-1.5 transition-colors truncate" title="点击填入">
  153. 🤖 人工智能
  154. </button>
  155. <button onclick="fillRssUrl('https://www.bing.com/news/search?q=黄金价格+走势&format=RSS')" class="text-left text-[10px] border border-gray-200 hover:border-blue-400 hover:bg-blue-50 hover:text-blue-600 rounded px-2 py-1.5 transition-colors truncate" title="点击填入">
  156. 💰 黄金/财经
  157. </button>
  158. </div>
  159. <div class="text-[10px] text-gray-400">
  160. 💡 小贴士:修改 URL 中的 <code class="bg-gray-100 px-1 rounded text-gray-600">q=</code> 参数即可监控任何你感兴趣的话题。
  161. </div>
  162. </div>
  163. <!-- 更多参考 -->
  164. <div class="bg-white border border-gray-100 rounded-lg p-3 shadow-sm">
  165. <div class="flex items-center gap-2 mb-2">
  166. <i class="fa-solid fa-book-open text-purple-500"></i>
  167. <span class="font-bold text-gray-700">更多 RSS 源参考</span>
  168. </div>
  169. <div class="flex flex-wrap gap-2 text-xs">
  170. <a href="https://github.com/tuan3w/awesome-tech-rss" target="_blank" class="text-blue-600 hover:underline flex items-center bg-blue-50 px-2 py-1 rounded">
  171. <i class="fa-brands fa-github mr-1"></i>科技/编程
  172. </a>
  173. <a href="https://github.com/plenaryapp/awesome-rss-feeds" target="_blank" class="text-blue-600 hover:underline flex items-center bg-blue-50 px-2 py-1 rounded">
  174. <i class="fa-brands fa-github mr-1"></i>全球新闻
  175. </a>
  176. </div>
  177. </div>
  178. <!-- 免责声明 -->
  179. <div class="text-[10px] text-gray-400 italic leading-relaxed px-1">
  180. <i class="fa-solid fa-shield-halved mr-1 text-gray-300"></i>免责声明:以上 RSS 示例及第三方工具均源自互联网,开发者未一一验证其长期有效性,请你在使用前自行核实。
  181. </div>
  182. </div>
  183. </div>
  184. <div class="flex justify-end gap-2 mt-6">
  185. <button onclick="closeRssModal()" class="px-4 py-2 text-gray-600 hover:bg-gray-100 rounded-lg">取消</button>
  186. <button onclick="confirmAddRss()" class="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700">添加</button>
  187. </div>
  188. </div>
  189. </div>
  190. <!-- 平台添加弹窗 -->
  191. <div id="platform-modal" class="modal-overlay hidden">
  192. <div class="modal-content">
  193. <div class="flex items-center justify-between mb-4">
  194. <h3 class="text-lg font-bold text-gray-800"><i class="fa-solid fa-layer-group mr-2 text-green-600"></i>添加热榜平台</h3>
  195. <button onclick="closePlatformModal()" class="text-gray-400 hover:text-gray-600"><i class="fa-solid fa-times text-xl"></i></button>
  196. </div>
  197. <!-- 标签页切换 -->
  198. <div class="flex border-b border-gray-200 mb-4">
  199. <button onclick="switchPlatformTab('select')" id="tab-platform-select" class="flex-1 py-2 text-sm font-bold text-blue-600 border-b-2 border-blue-600 transition-colors">
  200. <i class="fa-solid fa-list mr-1"></i>选择预设
  201. </button>
  202. <button onclick="switchPlatformTab('custom')" id="tab-platform-custom" class="flex-1 py-2 text-sm font-bold text-gray-500 border-b-2 border-transparent hover:text-gray-700 transition-colors">
  203. <i class="fa-solid fa-pen-to-square mr-1"></i>手动输入
  204. </button>
  205. </div>
  206. <!-- 1. 选择预设平台 -->
  207. <div id="platform-select-panel" class="space-y-4">
  208. <div id="available-platforms-list" class="space-y-2 max-h-60 overflow-y-auto pr-1">
  209. <!-- 动态生成可用平台 -->
  210. </div>
  211. <div id="no-platforms-tip" class="hidden text-center py-6 text-gray-500 text-sm bg-gray-50 rounded">
  212. <i class="fa-solid fa-check-circle text-green-500 mr-2"></i>所有预设平台已添加
  213. </div>
  214. </div>
  215. <!-- 2. 手动输入平台 -->
  216. <div id="platform-custom-panel" class="hidden space-y-4">
  217. <div class="bg-blue-50 border border-blue-100 rounded p-3 mb-3 text-xs text-blue-800">
  218. <i class="fa-solid fa-info-circle mr-1"></i>自定义平台需要后端爬虫支持,此处仅用于配置占位。
  219. </div>
  220. <div>
  221. <label class="block text-xs font-bold text-gray-600 mb-1">平台 Key(英文)</label>
  222. <input type="text" id="custom-platform-key" placeholder="例如: sspai" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
  223. </div>
  224. <div>
  225. <label class="block text-xs font-bold text-gray-600 mb-1">显示名称</label>
  226. <input type="text" id="custom-platform-name" placeholder="例如: 少数派" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
  227. </div>
  228. </div>
  229. <div class="flex justify-end gap-2 mt-6">
  230. <button onclick="closePlatformModal()" class="px-4 py-2 text-gray-600 hover:bg-gray-100 rounded-lg">取消</button>
  231. <button onclick="confirmAddPlatform()" class="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700">添加</button>
  232. </div>
  233. </div>
  234. </div>
  235. <!-- 词组类型选择弹窗 -->
  236. <div id="wordgroup-type-modal" class="modal-overlay hidden">
  237. <div class="modal-content max-w-2xl">
  238. <div class="flex items-center justify-between mb-4">
  239. <h3 class="text-lg font-bold text-gray-800"><i class="fa-solid fa-layer-group mr-2 text-blue-500"></i>选择词组类型</h3>
  240. <button onclick="closeWordGroupTypeModal()" class="text-gray-400 hover:text-gray-600"><i class="fa-solid fa-times text-xl"></i></button>
  241. </div>
  242. <div class="space-y-3">
  243. <!-- 组别名类型 -->
  244. <div onclick="confirmAddWordGroup('group')" class="cursor-pointer border-2 border-orange-200 bg-orange-50 rounded-lg p-4 hover:border-orange-400 hover:bg-orange-100 transition-all">
  245. <div class="flex items-center gap-3">
  246. <span class="text-xs bg-orange-500 text-white px-2 py-1 rounded font-bold">组别名</span>
  247. <span class="font-bold text-gray-800">多关键词词组(推荐)</span>
  248. </div>
  249. <div class="mt-2 text-sm text-gray-600">
  250. <div class="font-mono bg-white rounded p-2 text-xs border border-orange-200">
  251. <div class="text-orange-600">[东亚]</div>
  252. <div>日本</div>
  253. <div>韩国</div>
  254. <div>朝鲜</div>
  255. </div>
  256. <div class="mt-2 text-xs text-gray-500">
  257. <i class="fa-solid fa-check-circle text-orange-500 mr-1"></i>适用于:多个关键词归为一组,统一显示为组名
  258. </div>
  259. </div>
  260. </div>
  261. <!-- 单个别名类型 -->
  262. <div onclick="confirmAddWordGroup('alias')" class="cursor-pointer border-2 border-teal-200 bg-teal-50 rounded-lg p-4 hover:border-teal-400 hover:bg-teal-100 transition-all">
  263. <div class="flex items-center gap-3">
  264. <span class="text-xs bg-teal-500 text-white px-2 py-1 rounded font-bold">单个别名</span>
  265. <span class="font-bold text-gray-800">正则/关键词 + 别名</span>
  266. </div>
  267. <div class="mt-2 text-sm text-gray-600">
  268. <div class="font-mono bg-white rounded p-2 text-xs border border-teal-200">
  269. <div>/胖东来|于东来/ <span class="text-teal-600">=></span> 胖东来</div>
  270. </div>
  271. <div class="mt-2 text-xs text-gray-500">
  272. <i class="fa-solid fa-check-circle text-teal-500 mr-1"></i>适用于:用正则匹配多个词,显示为一个别名(前后有空行分隔)
  273. </div>
  274. </div>
  275. </div>
  276. <!-- 连续别名类型 -->
  277. <div onclick="confirmAddWordGroup('multi-alias')" class="cursor-pointer border-2 border-purple-200 bg-purple-50 rounded-lg p-4 hover:border-purple-400 hover:bg-purple-100 transition-all">
  278. <div class="flex items-center gap-3">
  279. <span class="text-xs bg-purple-500 text-white px-2 py-1 rounded font-bold">连续别名组</span>
  280. <span class="font-bold text-gray-800">多个相关品牌/词组</span>
  281. </div>
  282. <div class="mt-2 text-sm text-gray-600">
  283. <div class="font-mono bg-white rounded p-2 text-xs border border-purple-200">
  284. <div>/智元|灵犀|稚晖君/ <span class="text-purple-600">=></span> 智元机器人</div>
  285. <div>/众擎|EngineAI/ <span class="text-purple-600">=></span> 众擎机器人</div>
  286. </div>
  287. <div class="mt-2 text-xs text-gray-500">
  288. <i class="fa-solid fa-check-circle text-purple-500 mr-1"></i>适用于:多个相关品牌放在一起(<strong>无空行分隔</strong>)
  289. </div>
  290. </div>
  291. </div>
  292. <!-- 普通词组类型 -->
  293. <div onclick="confirmAddWordGroup('plain')" class="cursor-pointer border-2 border-gray-200 bg-gray-50 rounded-lg p-4 hover:border-gray-400 hover:bg-gray-100 transition-all">
  294. <div class="flex items-center gap-3">
  295. <span class="text-xs bg-gray-500 text-white px-2 py-1 rounded font-bold">普通词组</span>
  296. <span class="font-bold text-gray-800">简单关键词</span>
  297. </div>
  298. <div class="mt-2 text-sm text-gray-600">
  299. <div class="font-mono bg-white rounded p-2 text-xs border border-gray-200">
  300. <div>申奥</div>
  301. </div>
  302. <div class="mt-2 text-xs text-gray-500">
  303. <i class="fa-solid fa-check-circle text-gray-500 mr-1"></i>适用于:单个或少量普通关键词
  304. </div>
  305. </div>
  306. </div>
  307. </div>
  308. <div class="flex justify-end gap-2 mt-6">
  309. <button onclick="closeWordGroupTypeModal()" class="px-4 py-2 text-gray-600 hover:bg-gray-100 rounded-lg">取消</button>
  310. </div>
  311. </div>
  312. </div>
  313. <!-- 支持项目弹窗 -->
  314. <div id="support-modal" class="modal-overlay hidden" onclick="closeSupportModalOutside(event)">
  315. <div class="modal-content support-modal-content max-w-5xl w-[95%] max-h-[90vh] overflow-y-auto p-8">
  316. <div class="flex items-center justify-between mb-8">
  317. <div class="flex items-center gap-4">
  318. <div class="w-12 h-12 bg-orange-50 rounded-full flex items-center justify-center text-orange-500 shadow-sm relative overflow-hidden">
  319. <div class="absolute inset-0 bg-orange-400 opacity-20 animate-ping"></div>
  320. <i class="fa-solid fa-heart text-2xl animate-pulse relative z-10"></i>
  321. </div>
  322. <div>
  323. <h3 class="text-2xl font-bold text-gray-800 tracking-tight">觉得好用?支持一下 ✨</h3>
  324. <p class="text-sm text-gray-500 mt-1">TrendRadar 完全开源免费,你的每一次支持都是作者更新的动力</p>
  325. </div>
  326. </div>
  327. <button onclick="closeSupportModal()" class="w-10 h-10 flex items-center justify-center rounded-full hover:bg-gray-100 text-gray-400 transition-colors">
  328. <i class="fa-solid fa-times text-xl"></i>
  329. </button>
  330. </div>
  331. <div class="grid grid-cols-1 md:grid-cols-4 gap-6">
  332. <a href="https://github.com/sansan0/TrendRadar" target="_blank" class="support-card group border-orange-200 bg-orange-50/30">
  333. <div class="absolute top-0 right-0 bg-gradient-to-r from-orange-400 to-red-500 text-white text-[10px] px-2 py-0.5 rounded-bl-lg font-bold shadow-sm z-10">推荐支持</div>
  334. <div class="support-card-num opacity-50">01</div>
  335. <div class="support-icon text-orange-500 bg-orange-100 group-hover:bg-orange-200 mb-4 group-hover:scale-110 transition-transform">
  336. <i class="fa-solid fa-star text-2xl"></i>
  337. </div>
  338. <h4 class="text-lg font-bold text-gray-800 mb-2">点亮 Star</h4>
  339. <p class="text-sm text-gray-500 mb-6 text-center leading-relaxed">免费且重要!<br>只需 1 秒,让更多人发现它</p>
  340. <span class="support-btn bg-gradient-to-r from-orange-400 to-red-500 shadow-lg shadow-orange-200 group-hover:shadow-xl group-hover:from-orange-500 group-hover:to-red-600">立即前往 GitHub</span>
  341. </a>
  342. <div class="support-card group">
  343. <div class="absolute top-0 right-0 bg-gradient-to-r from-green-400 to-emerald-500 text-white text-[10px] px-2 py-0.5 rounded-bl-lg font-bold shadow-sm z-10">订阅更新</div>
  344. <div class="support-card-num">02</div>
  345. <div class="support-icon text-green-600 bg-green-50 group-hover:bg-green-100 mb-4">
  346. <i class="fa-brands fa-weixin text-2xl"></i>
  347. </div>
  348. <h4 class="text-lg font-bold text-gray-800 mb-2">不迷路</h4>
  349. <p class="text-sm text-gray-500 mb-4 text-center">关注公众号<br>第一时间获取更新通知</p>
  350. <div class="w-36 h-36 bg-white border border-gray-100 rounded-xl p-2 shadow-sm group-hover:shadow-md transition-shadow">
  351. <img src="./assets/weixin.webp" alt="微信公众号" class="w-full h-full object-contain">
  352. </div>
  353. <p class="text-xs text-gray-400 mt-3">扫码加入社区</p>
  354. </div>
  355. <div class="support-card group">
  356. <div class="absolute top-0 right-0 bg-gradient-to-r from-emerald-400 to-teal-500 text-white text-[10px] px-2 py-0.5 rounded-bl-lg font-bold shadow-sm z-10">随心鼓励</div>
  357. <div class="support-card-num">03</div>
  358. <div class="support-icon text-emerald-600 bg-emerald-50 group-hover:bg-emerald-100 mb-4">
  359. <i class="fa-solid fa-hand-holding-heart text-2xl"></i>
  360. </div>
  361. <h4 class="text-lg font-bold text-gray-800 mb-2">随心赞赏</h4>
  362. <p class="text-sm text-gray-500 mb-4 text-center">一瓶水、一包辣条都是爱<br>金额随意,1 元也是动力</p>
  363. <div class="w-36 h-36 bg-white border border-gray-100 rounded-xl p-2 shadow-sm group-hover:shadow-md transition-shadow">
  364. <img src="https://cdn-1258574687.cos.ap-shanghai.myqcloud.com/img/%2F2026%2F01%2F18ecce7c224ce0ea4c59394c29e408f8-e0d1db45.webp" alt="微信支付" class="w-full h-full object-contain">
  365. </div>
  366. <p class="text-xs text-gray-400 mt-3">微信扫码 • 丰俭由人</p>
  367. </div>
  368. <a href="https://sansan0.github.io/mao-map/" target="_blank" class="support-card group">
  369. <div class="absolute top-0 right-0 bg-gradient-to-r from-red-400 to-rose-500 text-white text-[10px] px-2 py-0.5 rounded-bl-lg font-bold shadow-sm z-10">探索发现</div>
  370. <div class="support-card-num">04</div>
  371. <div class="support-icon text-red-500 bg-red-50 group-hover:bg-red-100 mb-4">
  372. <i class="fa-solid fa-map-location-dot text-2xl"></i>
  373. </div>
  374. <h4 class="text-lg font-bold text-gray-800 mb-2">探索更多</h4>
  375. <p class="text-sm text-gray-500 mb-6 text-center leading-relaxed">历史足迹地图<br>另一个用心的作品</p>
  376. <span class="support-btn bg-red-50 text-red-600 group-hover:bg-red-100 group-hover:text-red-700 border border-red-100">去看看</span>
  377. </a>
  378. </div>
  379. <div class="mt-8 pt-6 border-t border-gray-100 text-center">
  380. <p class="text-sm text-gray-400 font-serif italic tracking-wide">“江山如此多娇,引无数英雄竞折腰”</p>
  381. </div>
  382. </div>
  383. </div>
  384. <script src="./assets/script.js"></script>
  385. </body>
  386. </html>