Tieba Remix: 贴吧网页端重塑

贴吧网页端重塑

目前為 2025-01-02 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name Tieba Remix: 贴吧网页端重塑
  3. // @namespace https://github.com/HacksawBlade/Tieba-Remix
  4. // @version 0.4.4-r1-beta
  5. // @author 锯条
  6. // @description 贴吧网页端重塑
  7. // @license MIT
  8. // @icon https://gitee.com/HacksawBlade/Tieba-Remix/raw/master/assets/images/main/icon16.png
  9. // @icon64 https://gitee.com/HacksawBlade/Tieba-Remix/raw/master/assets/images/main/icon64.png
  10. // @match *://tieba.baidu.com
  11. // @match *://tieba.baidu.com/index.*
  12. // @match *://tieba.baidu.com/?*
  13. // @match *://tieba.baidu.com/p/*
  14. // @match *://tieba.baidu.com/f?*
  15. // @match *://jump.bdimg.com/safecheck/*
  16. // @match *://jump2.bdimg.com/safecheck/*
  17. // @require https://fastly.jsdelivr.net/npm/vue@3.4.19/dist/vue.global.prod.js
  18. // @require data:application/javascript,%3Bwindow.Vue%3DVue%3B
  19. // @require https://fastly.jsdelivr.net/npm/element-plus@2.5.3/dist/index.full.min.js
  20. // @require https://fastly.jsdelivr.net/npm/marked@9.1.6/lib/marked.umd.min.js
  21. // @resource element-plus/dist/index.css https://fastly.jsdelivr.net/npm/element-plus@2.5.3/dist/index.css
  22. // @grant GM_addStyle
  23. // @grant GM_deleteValue
  24. // @grant GM_getResourceText
  25. // @grant GM_getValue
  26. // @grant GM_info
  27. // @grant GM_listValues
  28. // @grant GM_openInTab
  29. // @grant GM_setValue
  30. // @run-at document-start
  31. // ==/UserScript==
  32.  
  33. (n=>{if(typeof GM_addStyle=="function"){GM_addStyle(n);return}const o=document.createElement("style");o.textContent=n,document.head.append(o)})(` @charset "UTF-8";@keyframes kf-fade-in {
  34. 0% {
  35. opacity: 0;
  36. }
  37. 100% {
  38. opacity: 1;
  39. }
  40. }
  41. @keyframes kf-fade-out {
  42. 0% {
  43. opacity: 1;
  44. }
  45. 100% {
  46. opacity: 0;
  47. }
  48. }
  49. @keyframes kf-dialog-in {
  50. 0% {
  51. opacity: 0;
  52. transform: scale(1.2);
  53. }
  54. 100% {
  55. opacity: 1;
  56. transform: scale(1);
  57. }
  58. }
  59. @keyframes kf-zoom-in {
  60. 0% {
  61. transform: scale(0.72);
  62. }
  63. 100% {
  64. transform: scale(1);
  65. }
  66. }
  67. @keyframes kf-fade-zoom-in {
  68. 0% {
  69. opacity: 0;
  70. transform: scale(0.72);
  71. }
  72. 100% {
  73. opacity: 1;
  74. transform: scale(1);
  75. }
  76. }
  77. .user-button {
  78. box-sizing: border-box;
  79. padding: 2px 8px;
  80. border: none;
  81. border-radius: 6px;
  82. background: none;
  83. background-color: var(--default-background);
  84. box-shadow: 0 0 0 1px var(--border-color);
  85. color: var(--default-fore);
  86. cursor: pointer;
  87. transition: 0.4s;
  88. }
  89. .user-button:hover:not([disabled]) {
  90. background-color: var(--default-hover);
  91. }
  92. .user-button:active:not([disabled]) {
  93. background-color: var(--default-active);
  94. }
  95. .user-button:focus:not([disabled]) {
  96. border-color: var(--tieba-theme-color);
  97. box-shadow: 0 0 0 2px var(--tieba-theme-color);
  98. }
  99. .theme-style.user-button {
  100. color: var(--default-background) !important;
  101. }
  102. .theme-style.user-button {
  103. background-color: var(--tieba-theme-color);
  104. }
  105. .theme-style.user-button:hover {
  106. background-color: var(--tieba-theme-hover);
  107. }
  108. .theme-style.user-button:active {
  109. background-color: var(--tieba-theme-active);
  110. }
  111. .unset-background.user-button {
  112. background-color: transparent;
  113. background-color: initial;
  114. }
  115. .no-border.user-button {
  116. box-shadow: none;
  117. }
  118. .no-border-all.user-button {
  119. box-shadow: none;
  120. }
  121. .no-border-all.user-button:hover, .no-border-all.user-button:focus {
  122. box-shadow: none;
  123. }@keyframes kf-fade-in-db54e64e {
  124. 0% {
  125. opacity: 0;
  126. }
  127. 100% {
  128. opacity: 1;
  129. }
  130. }
  131. @keyframes kf-fade-out-db54e64e {
  132. 0% {
  133. opacity: 1;
  134. }
  135. 100% {
  136. opacity: 0;
  137. }
  138. }
  139. @keyframes kf-dialog-in-db54e64e {
  140. 0% {
  141. opacity: 0;
  142. transform: scale(1.2);
  143. }
  144. 100% {
  145. opacity: 1;
  146. transform: scale(1);
  147. }
  148. }
  149. @keyframes kf-zoom-in-db54e64e {
  150. 0% {
  151. transform: scale(0.72);
  152. }
  153. 100% {
  154. transform: scale(1);
  155. }
  156. }
  157. @keyframes kf-fade-zoom-in-db54e64e {
  158. 0% {
  159. opacity: 0;
  160. transform: scale(0.72);
  161. }
  162. 100% {
  163. opacity: 1;
  164. transform: scale(1);
  165. }
  166. }
  167. html[data-v-db54e64e] {
  168. padding: 0;
  169. margin: 0;
  170. text-align: justify;
  171. }
  172. body[data-v-db54e64e] {
  173. overflow-x: hidden;
  174. overflow-y: scroll;
  175. overflow: hidden scroll;
  176. padding: 0;
  177. margin: 0;
  178. font-family: var(--code-zh);
  179. }
  180. body[no-scrollbar][data-v-db54e64e] {
  181. overflow: hidden;
  182. }
  183. div[data-v-db54e64e],
  184. p[data-v-db54e64e] {
  185. margin: 0;
  186. }
  187. select[data-v-db54e64e] {
  188. padding: 1px 8px;
  189. border: 1px solid var(--border-color);
  190. border-radius: 8px;
  191. cursor: pointer;
  192. }
  193. option[data-v-db54e64e] {
  194. cursor: pointer;
  195. }
  196. option[data-v-db54e64e]:checked {
  197. background-color: var(--tieba-theme-color);
  198. color: var(--default-background);
  199. }
  200. a[data-v-db54e64e] {
  201. color: inherit;
  202. -webkit-text-decoration: none;
  203. text-decoration: none;
  204. word-break: break-all;
  205. }
  206. .dialogJ[data-v-db54e64e] {
  207. position: fixed !important;
  208. top: 50% !important;
  209. left: 50% !important;
  210. }
  211. .dialogJ[data-v-db54e64e] {
  212. transform: translate(-50%, -50%);
  213. }
  214. @keyframes stretch-db54e64e {
  215. 0% {
  216. padding: 0 12px;
  217. opacity: 0;
  218. }
  219. 50% {
  220. opacity: 1;
  221. }
  222. 100% {
  223. padding: 8px 12px;
  224. }
  225. }
  226. .check[data-v-db54e64e] {
  227. color: var(--level-green-fore);
  228. }
  229. .warning[data-v-db54e64e] {
  230. color: var(--warning-color);
  231. }
  232. .error[data-v-db54e64e] {
  233. color: var(--error-color);
  234. }
  235. .toast-container[data-v-db54e64e] {
  236. position: fixed;
  237. z-index: 999;
  238. bottom: 96px;
  239. left: 50%;
  240. display: flex;
  241. max-height: 60vh;
  242. align-items: center;
  243. padding: 8px 12px;
  244. border: 1px solid var(--border-color);
  245. border-radius: 16px;
  246. animation: stretch-db54e64e 0.4s cubic-bezier(0.18, 0.89, 0.32, 1.6);
  247. background-color: var(--default-background);
  248. box-shadow: 0 10px 24px rgba(0, 0, 0, 0.2);
  249. gap: 6px;
  250. text-overflow: ellipsis;
  251. transform: translateX(-50%);
  252. transition: all ease 0.4s;
  253. }
  254. .toast-container .toast-icon[data-v-db54e64e] {
  255. font-size: 18px;
  256. }
  257. .toast-container .toast-content[data-v-db54e64e] {
  258. overflow: hidden;
  259. max-width: 80vw;
  260. max-height: 60vh;
  261. padding: 0 6px;
  262. text-align: left;
  263. text-overflow: ellipsis;
  264. white-space: pre-wrap;
  265. }
  266. .toast-container span[data-v-db54e64e] {
  267. color: var(--minimal-fore);
  268. font-size: 12px;
  269. }
  270. .toast-container .toast-controls .close-button[data-v-db54e64e] {
  271. padding: 6px;
  272. color: var(--error-color);
  273. font-weight: bold;
  274. }
  275. .toast-container .toast-controls .close-button[data-v-db54e64e]:not(:active):not(:focus) {
  276. box-shadow: none;
  277. }
  278. .blur-effect[data-v-db54e64e] {
  279. background-color: var(--trans-default-background);
  280. }
  281. html:not([perf-saver]) .blur-effect[data-v-db54e64e] {
  282. -webkit-backdrop-filter: blur(24px);
  283. backdrop-filter: blur(24px);
  284. }
  285. html.dark-theme .blur-effect[data-v-db54e64e] {
  286. -webkit-backdrop-filter: blur(24px) brightness(0.8);
  287. backdrop-filter: blur(24px) brightness(0.8);
  288. }body {
  289. --el-color-primary: var(--tieba-theme-color) !important;
  290. }/* stylelint-disable font-family-no-missing-generic-family-keyword */\r
  291. /* https: //fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,200..400,0..1,-50..100 */\r
  292. \r
  293. /* fallback */\r
  294. @font-face {\r
  295. font-family: "Material Symbols";\r
  296. font-style: normal;\r
  297. font-weight: 200 400;\r
  298. src: url("https://fonts.gstatic.com/s/materialsymbolsoutlined/v110/kJEhBvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oFsI.woff2") format("woff2");\r
  299. }\r
  300. \r
  301. .material-symbols-outlined {\r
  302. display: inline-block;\r
  303. direction: ltr;\r
  304. font-family: "Material Symbols";\r
  305. font-size: 24px;\r
  306. -webkit-font-smoothing: antialiased;\r
  307. font-style: normal;\r
  308. font-weight: normal;\r
  309. letter-spacing: normal;\r
  310. line-height: 1;\r
  311. text-transform: none;\r
  312. white-space: nowrap;\r
  313. word-wrap: normal;\r
  314. }\r
  315. :root {
  316. --img-tieba-icon: url("https://gitee.com/HacksawBlade/Tieba-Remix/raw/master/assets/images/main/icon.png");
  317. }
  318.  
  319. .dark-theme {
  320. --default-background: rgb(32, 32, 32);
  321. --default-hover: rgb(42, 42, 42);
  322. --default-active: rgb(54, 54, 54);
  323. --page-background: rgb(26, 26, 26);
  324. --trans-page-background: rgba(26, 26, 26, 0.6);
  325. --trans-default-background: rgba(32, 32, 32, 0.6);
  326. --deep-background: rgb(26, 26, 26);
  327. --trans-deep-background: rgba(20, 20, 20, 0.6);
  328. --light-background: rgb(60, 60, 60);
  329. --trans-light-background: rgba(60, 60, 60, 0.6);
  330. --very-light-background: rgb(60, 60, 60);
  331. --elem-color: rgb(26, 26, 26);
  332. --default-fore: rgb(230, 230, 230);
  333. --light-fore: rgb(200, 200, 200);
  334. --minimal-fore: rgb(144, 144, 144);
  335. --highlight-fore: rgb(255, 255, 255);
  336. --border-color: rgba(96, 96, 96, 0.6);
  337. --light-border-color: rgba(96, 96, 96, 0.2);
  338. --tieba-theme-color: rgb(113, 97, 193);
  339. --trans-tieba-theme-color: rgba(113, 97, 193, 0.6);
  340. --tieba-theme-hover: rgb(149, 128, 254);
  341. --tieba-theme-active: rgb(172, 156, 253);
  342. --tieba-theme-background: rgba(113, 97, 193, 0.2);
  343. --tieba-theme-fore: rgb(150, 128, 255);
  344. --level-green-background: rgba(96, 153, 59, 0.1);
  345. --level-green-fore: rgb(133, 206, 84);
  346. --level-blue-background: rgba(0, 165, 227, 0.1);
  347. --level-blue-fore: rgb(0, 169, 255);
  348. --level-yellow-background: rgba(229, 193, 90, 0.1);
  349. --level-yellow-fore: rgb(242, 205, 96);
  350. --level-orange-background: rgba(204, 122, 0, 0.1);
  351. --level-orange-fore: rgb(255, 170, 0);
  352. --check-color: lawngreen;
  353. --error-color: tomato;
  354. --warning-color: orange;
  355. color-scheme: dark;
  356. }
  357.  
  358. .light-theme {
  359. --default-background: rgb(255, 255, 255);
  360. --default-hover: rgb(240, 240, 240);
  361. --default-active: rgb(224, 224, 224);
  362. --page-background: rgb(245, 245, 245);
  363. --trans-page-background: rgba(245, 245, 245, 0.6);
  364. --trans-default-background: rgba(255, 255, 255, 0.6);
  365. --deep-background: rgb(228, 228, 228);
  366. --trans-deep-background: rgba(200, 200, 200, 0.6);
  367. --light-background: rgb(235, 235, 235);
  368. --trans-light-background: rgba(228, 228, 228, 0.6);
  369. --very-light-background: rgb(245, 245, 245);
  370. --elem-color: rgb(240, 240, 240);
  371. --default-fore: rgb(16, 16, 16);
  372. --light-fore: rgb(64, 64, 64);
  373. --minimal-fore: rgb(92, 92, 92);
  374. --highlight-fore: rgb(0, 0, 0);
  375. --border-color: rgba(210, 210, 210, 0.6);
  376. --light-border-color: rgba(210, 210, 210, 0.2);
  377. --tieba-theme-color: rgb(97, 78, 194);
  378. --trans-tieba-theme-color: rgba(97, 78, 194, 0.6);
  379. --tieba-theme-hover: rgb(119, 105, 194);
  380. --tieba-theme-active: rgb(150, 134, 232);
  381. --tieba-theme-background: rgba(97, 78, 194, 0.2);
  382. --tieba-theme-fore: rgb(58, 46, 116);
  383. --level-green-background: rgba(84, 130, 53, 0.1);
  384. --level-green-fore: rgb(51, 78, 32);
  385. --level-blue-background: rgba(0, 153, 213, 0.1);
  386. --level-blue-fore: rgb(0, 81, 111);
  387. --level-yellow-background: rgba(164, 139, 63, 0.1);
  388. --level-yellow-fore: rgb(124, 105, 46);
  389. --level-orange-background: rgba(255, 153, 0, 0.1);
  390. --level-orange-fore: rgb(178, 104, 0);
  391. --check-color: green;
  392. --error-color: darkred;
  393. --warning-color: darkorange;
  394. color-scheme: "light";
  395. }@keyframes kf-fade-in {
  396. 0% {
  397. opacity: 0;
  398. }
  399. 100% {
  400. opacity: 1;
  401. }
  402. }
  403. @keyframes kf-fade-out {
  404. 0% {
  405. opacity: 1;
  406. }
  407. 100% {
  408. opacity: 0;
  409. }
  410. }
  411. @keyframes kf-dialog-in {
  412. 0% {
  413. opacity: 0;
  414. transform: scale(1.2);
  415. }
  416. 100% {
  417. opacity: 1;
  418. transform: scale(1);
  419. }
  420. }
  421. @keyframes kf-zoom-in {
  422. 0% {
  423. transform: scale(0.72);
  424. }
  425. 100% {
  426. transform: scale(1);
  427. }
  428. }
  429. @keyframes kf-fade-zoom-in {
  430. 0% {
  431. opacity: 0;
  432. transform: scale(0.72);
  433. }
  434. 100% {
  435. opacity: 1;
  436. transform: scale(1);
  437. }
  438. }
  439. html {
  440. padding: 0;
  441. margin: 0;
  442. text-align: justify;
  443. }
  444.  
  445. body {
  446. overflow-x: hidden;
  447. overflow-y: scroll;
  448. overflow: hidden scroll;
  449. padding: 0;
  450. margin: 0;
  451. font-family: var(--code-zh);
  452. }
  453. body[no-scrollbar] {
  454. overflow: hidden;
  455. }
  456.  
  457. div,
  458. p {
  459. margin: 0;
  460. }
  461.  
  462. select {
  463. padding: 1px 8px;
  464. border: 1px solid var(--border-color);
  465. border-radius: 8px;
  466. cursor: pointer;
  467. }
  468.  
  469. option {
  470. cursor: pointer;
  471. }
  472.  
  473. option:checked {
  474. background-color: var(--tieba-theme-color);
  475. color: var(--default-background);
  476. }
  477.  
  478. a {
  479. color: inherit;
  480. -webkit-text-decoration: none;
  481. text-decoration: none;
  482. word-break: break-all;
  483. }
  484.  
  485. .dialogJ {
  486. position: fixed !important;
  487. top: 50% !important;
  488. left: 50% !important;
  489. }
  490.  
  491. .dialogJ {
  492. transform: translate(-50%, -50%);
  493. }@keyframes kf-fade-in {
  494. 0% {
  495. opacity: 0;
  496. }
  497. 100% {
  498. opacity: 1;
  499. }
  500. }
  501. @keyframes kf-fade-out {
  502. 0% {
  503. opacity: 1;
  504. }
  505. 100% {
  506. opacity: 0;
  507. }
  508. }
  509. @keyframes kf-dialog-in {
  510. 0% {
  511. opacity: 0;
  512. transform: scale(1.2);
  513. }
  514. 100% {
  515. opacity: 1;
  516. transform: scale(1);
  517. }
  518. }
  519. @keyframes kf-zoom-in {
  520. 0% {
  521. transform: scale(0.72);
  522. }
  523. 100% {
  524. transform: scale(1);
  525. }
  526. }
  527. @keyframes kf-fade-zoom-in {
  528. 0% {
  529. opacity: 0;
  530. transform: scale(0.72);
  531. }
  532. 100% {
  533. opacity: 1;
  534. transform: scale(1);
  535. }
  536. }
  537. html {
  538. padding: 0;
  539. margin: 0;
  540. text-align: justify;
  541. }
  542.  
  543. body {
  544. overflow-x: hidden;
  545. overflow-y: scroll;
  546. overflow: hidden scroll;
  547. padding: 0;
  548. margin: 0;
  549. font-family: var(--code-zh);
  550. }
  551. body[no-scrollbar] {
  552. overflow: hidden;
  553. }
  554.  
  555. div,
  556. p {
  557. margin: 0;
  558. }
  559.  
  560. select {
  561. padding: 1px 8px;
  562. border: 1px solid var(--border-color);
  563. border-radius: 8px;
  564. cursor: pointer;
  565. }
  566.  
  567. option {
  568. cursor: pointer;
  569. }
  570.  
  571. option:checked {
  572. background-color: var(--tieba-theme-color);
  573. color: var(--default-background);
  574. }
  575.  
  576. a {
  577. color: inherit;
  578. -webkit-text-decoration: none;
  579. text-decoration: none;
  580. word-break: break-all;
  581. }
  582.  
  583. .dialogJ {
  584. position: fixed !important;
  585. top: 50% !important;
  586. left: 50% !important;
  587. }
  588.  
  589. .dialogJ {
  590. transform: translate(-50%, -50%);
  591. }
  592.  
  593. .icon,
  594. .outline-icon {
  595. font-family: "Material Symbols", monospace !important;
  596. }
  597.  
  598. .icon,
  599. .outline-icon {
  600. font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 40;
  601. -webkit-user-select: none;
  602. -moz-user-select: none;
  603. user-select: none;
  604. }
  605.  
  606. .filled-icon {
  607. font-family: "Material Symbols", monospace !important;
  608. }
  609.  
  610. .filled-icon {
  611. font-variation-settings: "FILL" 1, "wght" 400, "GRAD" 0, "opsz" 40;
  612. -webkit-user-select: none;
  613. -moz-user-select: none;
  614. user-select: none;
  615. }
  616.  
  617. .anchor, .anchor-underline {
  618. color: var(--tieba-theme-fore);
  619. cursor: pointer;
  620. -webkit-text-decoration: none;
  621. text-decoration: none;
  622. transition: 0.4s;
  623. }
  624.  
  625. .anchor-underline {
  626. text-decoration: underline;
  627. -webkit-text-decoration: underline solid currentColor;
  628. text-decoration: underline solid currentColor;
  629. text-decoration-thickness: 1.2px;
  630. -webkit-text-decoration: underline 1.2px;
  631. text-decoration: underline 1.2px;
  632. }
  633.  
  634. .anchor:hover, .anchor-underline:hover {
  635. background-color: var(--default-hover);
  636. }
  637.  
  638. .anchor-underline:hover {
  639. text-decoration: underline;
  640. -webkit-text-decoration: underline solid rgba(0, 0, 0, 0);
  641. text-decoration: underline solid rgba(0, 0, 0, 0);
  642. text-decoration-thickness: 1.2px;
  643. -webkit-text-decoration: underline 1.2px rgba(0, 0, 0, 0);
  644. text-decoration: underline 1.2px rgba(0, 0, 0, 0);
  645. }
  646.  
  647. .anchor:active, .anchor-underline:active {
  648. background-color: var(--default-active);
  649. }
  650.  
  651. .markdown {
  652. font-family: var(--code-zh);
  653. font-size: 16px;
  654. }
  655. .markdown code {
  656. padding: 2px 6px;
  657. border-radius: 8px;
  658. background-color: var(--light-border-color);
  659. font-family: var(--code-monospace);
  660. word-wrap: break-word;
  661. }
  662. .markdown a {
  663. color: var(--tieba-theme-fore);
  664. }
  665. .markdown a:hover {
  666. -webkit-text-decoration: underline;
  667. text-decoration: underline;
  668. }
  669. .markdown h2 {
  670. margin: 20px 0 8px;
  671. font-size: 24px;
  672. }
  673. .markdown h3 {
  674. margin: 16px 0 6px;
  675. }
  676. .markdown ul {
  677. margin: 6px 0;
  678. }
  679. .markdown li {
  680. margin: 6px 0 6px 22px;
  681. list-style: disc;
  682. }
  683. .markdown li::marker {
  684. color: var(--minimal-fore);
  685. }
  686. .markdown blockquote {
  687. margin: 20px 16px;
  688. color: var(--minimal-fore);
  689. }
  690.  
  691. .settings-toggle-button {
  692. border: none !important;
  693. background-color: transparent !important;
  694. background-color: initial !important;
  695. }
  696.  
  697. .settings-toggle-button {
  698. border-radius: 36px;
  699. }
  700.  
  701. .settings-toggle-button.toggle-off {
  702. color: var(--minimal-fore);
  703. font-variation-settings: "FILL" 0;
  704. }
  705.  
  706. .settings-toggle-button.toggle-off::after {
  707. content: "toggle_off";
  708. }
  709.  
  710. .settings-toggle-button.toggle-on::after {
  711. content: "toggle_on";
  712. }
  713.  
  714. .settings-toggle-button.toggle-on {
  715. color: var(--tieba-theme-color);
  716. font-variation-settings: "FILL" 1;
  717. }
  718.  
  719. .settings-toggle-button.toggle-off:hover {
  720. color: var(--default-hover);
  721. }
  722.  
  723. .settings-toggle-button.toggle-off:active {
  724. color: var(--default-active);
  725. }
  726.  
  727. .settings-toggle-button.toggle-on:hover {
  728. color: var(tieba-theme-hover);
  729. }
  730.  
  731. .settings-toggle-button.toggle-on:active {
  732. color: var(--tieba-theme-active);
  733. }
  734.  
  735. .level-green {
  736. background-color: var(--level-green-background) !important;
  737. color: var(--level-green-fore) !important;
  738. }
  739.  
  740. .level-blue {
  741. background-color: var(--level-blue-background) !important;
  742. color: var(--level-blue-fore) !important;
  743. }
  744.  
  745. .level-yellow {
  746. background-color: var(--level-yellow-background) !important;
  747. color: var(--level-yellow-fore) !important;
  748. }
  749.  
  750. .level-orange {
  751. background-color: var(--level-orange-background) !important;
  752. color: var(--level-orange-fore) !important;
  753. }
  754.  
  755. .remove-default {
  756. line-height: normal !important;
  757. }
  758.  
  759. .remove-default {
  760. font-size: 16px;
  761. }
  762. .remove-default button,
  763. .remove-default input,
  764. .remove-default optgroup,
  765. .remove-default select,
  766. .remove-default textarea {
  767. font-family: var(--code-zh);
  768. font-size: 14px;
  769. }
  770. .remove-default .content {
  771. min-height: 0;
  772. min-height: initial;
  773. background: transparent none repeat 0 0 / auto auto padding-box border-box scroll;
  774. background: initial;
  775. }
  776. .remove-default code {
  777. display: inline;
  778. display: initial;
  779. width: auto;
  780. width: initial;
  781. height: auto;
  782. height: initial;
  783. }
  784. .remove-default .content,
  785. .remove-default .foot {
  786. width: auto;
  787. width: initial;
  788. }
  789. .remove-default button {
  790. color: inherit;
  791. }
  792.  
  793. html:not([perf-saver]) body.custom-background .blur-if-custom-background {
  794. -webkit-backdrop-filter: blur(24px);
  795. backdrop-filter: blur(24px);
  796. }
  797. html.dark-theme body.custom-background .blur-if-custom-background {
  798. -webkit-backdrop-filter: blur(24px) brightness(0.8);
  799. backdrop-filter: blur(24px) brightness(0.8);
  800. }
  801.  
  802. html:not([perf-saver]) .blur-effect {
  803. -webkit-backdrop-filter: blur(24px);
  804. backdrop-filter: blur(24px);
  805. }
  806. html.dark-theme .blur-effect {
  807. -webkit-backdrop-filter: blur(24px) brightness(0.8);
  808. backdrop-filter: blur(24px) brightness(0.8);
  809. }
  810.  
  811. html:not([perf-saver]) .raster-effect {
  812. -webkit-backdrop-filter: saturate(0.8) blur(4px);
  813. backdrop-filter: saturate(0.8) blur(4px);
  814. background-color: var(--trans-page-background);
  815. background-image: radial-gradient(transparent 1px, var(--page-background) 1px);
  816. background-size: 4px 4px;
  817. }
  818. /* \u641C\u7D22\u680F */
  819. .search-form {
  820. background-color: var(--default-background);
  821. }
  822.  
  823. .search-form p {
  824. display: none;
  825. }
  826.  
  827. .page404 {
  828. background-color: var(--default-background);
  829. }
  830.  
  831. .main-title {
  832. color: var(--default-fore);
  833. }
  834.  
  835. .main-title a {
  836. color: var(--tieba-theme-fore);
  837. }
  838.  
  839. .app_download_box {
  840. display: none;
  841. }
  842.  
  843. #error_404_iframe {
  844. display: none;
  845. }
  846. body {
  847. background-color: var(--page-background);
  848. color: var(--default-fore);
  849. }
  850.  
  851. /* \u5BFC\u822A\u680F */
  852. .head_inner {
  853. /* \u5BFC\u822A\u680F\u989D\u5934 */
  854. background-color: var(--default-background);
  855. }
  856.  
  857. .u_menu_item a {
  858. /* \u9876\u90E8\u8D85\u94FE\u63A5 */
  859. color: var(--default-fore);
  860. }
  861.  
  862. .head_inner .search_logo {
  863. left: 72px;
  864. width: 60px;
  865. height: 60px;
  866. /* logo */
  867. background-image: var(--img-tieba-icon);
  868. }
  869.  
  870. .search_top {
  871. border: none;
  872. }
  873.  
  874. .search_nav a:link,
  875. .search_nav a:hover,
  876. .search_nav a:visited {
  877. /* \u5BFC\u822A\u680F\u8D85\u94FE\u63A5 */
  878. color: var(--default-fore);
  879. }
  880.  
  881. .u_menu_item a:hover,
  882. .u_menu_item a:visited {
  883. color: var(--default-fore);
  884. }
  885.  
  886. /* \u641C\u7D22 */
  887. .search_main {
  888. padding-bottom: 96px;
  889. }
  890.  
  891. .search_bright .search_inp_border {
  892. /* \u641C\u7D22\u6846 */
  893. border-color: var(--border-color);
  894. border-bottom-left-radius: 8px;
  895. border-top-left-radius: 8px;
  896. color: var(--default-fore);
  897. }
  898.  
  899. .search_bright .search_inp_border:focus {
  900. border-color: var(--tieba-theme-color);
  901. }
  902.  
  903. .search_bright .search_btn {
  904. border-color: var(--trans-tieba-theme-color);
  905. /* \u641C\u7D22\u76F8\u5173\u6309\u94AE */
  906. border-radius: 8px;
  907. background-color: var(--tieba-theme-background);
  908. color: var(--tieba-theme-fore);
  909. }
  910.  
  911. .search_bright .search_btn_enter_ba {
  912. /* \u201C\u8FDB\u5165\u8D34\u5427\u201D\u6309\u94AE */
  913. background-color: var(--tieba-theme-color);
  914. border-bottom-left-radius: 0;
  915. border-top-left-radius: 0;
  916. color: var(--default-background);
  917. }
  918.  
  919. .search_bright .search_btn:visited {
  920. color: var(--tieba-theme-fore);
  921. }
  922.  
  923. .search_bright .search_btn_enter_ba:visited {
  924. background-color: var(--tieba-theme-color);
  925. color: var(--default-background);
  926. }
  927.  
  928. .search_bright .search_btn_enter_ba:hover {
  929. background-color: var(--tieba-theme-color);
  930. color: var(--default-background);
  931. }
  932.  
  933. .suggestion {
  934. border-color: var(--border-color) !important;
  935. border-radius: 6px !important;
  936. background-color: var(--elem-color) !important;
  937. box-shadow: none !important;
  938. color: var(--default-fore) !important;
  939. }
  940.  
  941. .suggestion {
  942. transform: translateY(4px);
  943. }
  944.  
  945. .suggestion .break_tip {
  946. background-color: var(--default-background) !important;
  947. }
  948.  
  949. .suggestion .highlight {
  950. color: var(--tieba-theme-color) !important;
  951. }
  952.  
  953. .suggestion .highlight {
  954. /* \u9AD8\u4EAE\u6587\u672C */
  955. }
  956.  
  957. .suggestion .operation_title {
  958. color: var(--default-fore) !important;
  959. }
  960.  
  961. .suggestion .operation_title {
  962. /* \u70ED\u8BAE\u6587\u5B57 */
  963. }
  964.  
  965. .suggestion .forum_image {
  966. /* \u63A8\u8350\u56FE\u6807 */
  967. border-radius: 8px;
  968. }
  969.  
  970. .suggestion .forum_name {
  971. color: var(--default-fore) !important;
  972. }
  973.  
  974. .suggestion .forum_name {
  975. /* \u63A8\u8350\u6807\u9898 */
  976. }
  977.  
  978. .suggestion .on {
  979. background-color: var(--light-background) !important;
  980. }
  981.  
  982. .suggestion .on {
  983. /* \u641C\u7D22\u63A8\u8350\uFF1A\u9009\u4E2D */
  984. }
  985.  
  986. /* \u9996\u9875\u6A2A\u5E45 */
  987. .page-container .top-sec {
  988. display: none;
  989. }
  990.  
  991. /* \u5185\u5BB9 */
  992. .page-container .content-sec {
  993. background: none;
  994. }
  995.  
  996. /* \u5DE6\u4FA7\u60AC\u505C */
  997. .page-container .left-sec {
  998. border-radius: 24px;
  999. border-top: none;
  1000. background: none;
  1001. background-color: var(--elem-color);
  1002. }
  1003.  
  1004. .f-d-w {
  1005. border-radius: 24px;
  1006. /* \u5DE6\u4FA7\u60AC\u505C 2 */
  1007. background-color: var(--elem-color);
  1008. }
  1009.  
  1010. .f-d-w .f-d-item {
  1011. background: none;
  1012. }
  1013.  
  1014. .aggregate_entrance_wrap {
  1015. /* \u4E13\u9898 */
  1016. display: none;
  1017. }
  1018.  
  1019. .u-f-t .gap {
  1020. border: none;
  1021. /* \u201C\u8D34\u5427\u5206\u7C7B\u201D\u5206\u9694\u7B26 */
  1022. background: none;
  1023. }
  1024.  
  1025. .f-d-w .all {
  1026. /* \u201C\u67E5\u770B\u5168\u90E8\u201D\u6309\u94AE */
  1027. background: none;
  1028. }
  1029.  
  1030. .forum_rcmd {
  1031. /* \u70ED\u95E8\u5427\u5361\u7247 */
  1032. border: 0;
  1033. border-radius: 24px;
  1034. background-color: var(--elem-color);
  1035. }
  1036.  
  1037. .region_bright .region_header {
  1038. /* \u201C\u6211\u5728\u8D34\u5427\u201D\u6807\u9898 */
  1039. color: var(--default-fore);
  1040. }
  1041.  
  1042. .page-container .left-sec .region_bright {
  1043. border-radius: 24px;
  1044. }
  1045.  
  1046. .my_tieba_mod .media_left,
  1047. .my_tieba_mod .media-left {
  1048. /* \u5934\u50CF\u8FB9\u6846 */
  1049. border: none;
  1050. }
  1051.  
  1052. .media_left img,
  1053. .media-left img {
  1054. /* \u5934\u50CF */
  1055. border-radius: 16px;
  1056. }
  1057.  
  1058. #nameValue {
  1059. /* \u6211\u7684\u7528\u6237\u540D */
  1060. color: var(--default-fore);
  1061. }
  1062.  
  1063. #j_tcharge_dialog {
  1064. /* \u201C\u83B7\u53D6\u201D\u8D85\u94FE\u63A5 */
  1065. color: var(--default-fore);
  1066. }
  1067.  
  1068. #onekey_sign .onekey_btn,
  1069. #onekey_sign a.onekey_btn {
  1070. /* \u7B7E\u5230\u6309\u94AE */
  1071. border-radius: 8px;
  1072. margin-right: -5px;
  1073. background: none;
  1074. background-color: var(--tieba-theme-color);
  1075. color: var(--elem-color);
  1076. text-align: center;
  1077. }
  1078.  
  1079. #onekey_sign .onekey_btn::after {
  1080. content: "\u4E00\u952E\u7B7E\u5230";
  1081. }
  1082.  
  1083. #onekey_sign a.signed_btn .icon_signed {
  1084. /* \u5DF2\u7B7E\u5230\u6807\u8BB0 */
  1085. margin-top: 2px;
  1086. background: var(--svg-checkmark);
  1087. background-repeat: no-repeat;
  1088. background-size: 20px;
  1089. filter: drop-shadow(var(--elem-color) 0 9999px);
  1090. transform: translateY(-9999px);
  1091. }
  1092.  
  1093. #onekey_sign .onekey_btn:hover {
  1094. box-shadow: 0 0 10px var(--tieba-theme-color);
  1095. }
  1096.  
  1097. .u-f-w {
  1098. /* \u8FDB\u5427 div */
  1099. padding-bottom: 20px;
  1100. }
  1101.  
  1102. .left-cont-fixed {
  1103. /* \u8FDB\u5427 div \u56FA\u5B9A */
  1104. position: relative;
  1105. bottom: 0;
  1106. }
  1107.  
  1108. .u-f-w .sign,
  1109. .u-f-w .unsign,
  1110. .always-forum-item .sign,
  1111. .always-forum-item .unsign {
  1112. /* \u8FDB\u5427\u6309\u94AE */
  1113. border-radius: 8px;
  1114. background: none;
  1115. background-color: var(--light-background);
  1116. color: var(--default-fore);
  1117. }
  1118.  
  1119. .u-f-w .sign,
  1120. .always-forum-item .sign {
  1121. /* \u5DF2\u7B7E\u5230 */
  1122. background-color: var(--tieba-theme-background);
  1123. color: var(--tieba-theme-fore);
  1124. }
  1125.  
  1126. .u-f-w .sign,
  1127. .u-f-w .unsign {
  1128. margin-bottom: 8px;
  1129. }
  1130.  
  1131. .u-f-w .sign:hover,
  1132. .u-f-w .unsign:hover,
  1133. .always-forum-item .sign:hover,
  1134. .always-forum-item .unsign:hover {
  1135. background: none;
  1136. background-color: var(--tieba-theme-color);
  1137. box-shadow: 0 0 10px var(--tieba-theme-color);
  1138. color: var(--elem-color);
  1139. -webkit-text-decoration: none;
  1140. text-decoration: none;
  1141. }
  1142.  
  1143. .u-f-w .more {
  1144. /* \u201C\u67E5\u770B\u66F4\u591A\u201D\u6309\u94AE */
  1145. border: none;
  1146. border-radius: 8px;
  1147. background: none;
  1148. background-color: var(--elem-color);
  1149. box-shadow: none;
  1150. color: var(--default-fore);
  1151. }
  1152.  
  1153. .more-txt {
  1154. /* \u201C\u67E5\u770B\u66F4\u591A\u201D\u6309\u94AE\u6587\u5B57 */
  1155. color: var(--default-fore);
  1156. }
  1157.  
  1158. .u-f-w .more-hover {
  1159. width: 188px;
  1160. margin: auto;
  1161. background-color: var(--tieba-theme-color);
  1162. box-shadow: 0 0 10px var(--tieba-theme-color);
  1163. color: var(--elem-color);
  1164. }
  1165.  
  1166. .u-f-w .more-hover .more-txt,
  1167. .u-f-w .more:hover .more-txt {
  1168. margin-left: 60px;
  1169. color: var(--elem-color);
  1170. }
  1171.  
  1172. .always-forum-title {
  1173. /* \u5C55\u5F00\u6807\u9898 */
  1174. border: none;
  1175. margin-top: 10px;
  1176. }
  1177.  
  1178. #alwayforum-wraper {
  1179. /* \u5173\u6CE8\u5427\u5C55\u5F00 */
  1180. background-color: var(--elem-color);
  1181. }
  1182.  
  1183. .pop-up-frame {
  1184. /* \u5C55\u5F00\u9875\u9762 */
  1185. border: none;
  1186. border-radius: 24px;
  1187. background-color: var(--elem-color);
  1188. border-bottom-left-radius: 0;
  1189. box-shadow: none;
  1190. }
  1191.  
  1192. .always-forum-close {
  1193. /* \u5C55\u5F00\u53C9\u53F7 */
  1194. display: none;
  1195. }
  1196.  
  1197. .always-forum-item .addnewforumbtn {
  1198. /* \u201C\u6DFB\u52A0\u7231\u901B\u7684\u5427\u201D\u6309\u94AE */
  1199. width: 110px;
  1200. padding-left: 0;
  1201. border-radius: 8px;
  1202. background: none;
  1203. background-color: var(--tieba-theme-background);
  1204. color: var(--tieba-theme-fore);
  1205. font-size: 20px;
  1206. text-align: center;
  1207. }
  1208.  
  1209. .always-forum-item .addnewforumbtn::after {
  1210. content: "+";
  1211. }
  1212.  
  1213. .always-forum-item .addnewforumbtn:hover {
  1214. background-color: var(--tieba-theme-color);
  1215. box-shadow: 0 0 10px var(--tieba-theme-color);
  1216. color: var(--elem-color);
  1217. }
  1218.  
  1219. .tbui_scroll_panel .tbui_scroll_button {
  1220. /* \u5C55\u5F00\u6EDA\u52A8\u6761 */
  1221. width: 6px;
  1222. border: none;
  1223. border-radius: 24px;
  1224. background-color: var(--very-light-background);
  1225. }
  1226.  
  1227. .tbui_scroll_panel .tbui_scroll_bar {
  1228. width: 6px;
  1229. /* \u6EDA\u52A8\u6761\u80CC\u666F */
  1230. background: none;
  1231. }
  1232.  
  1233. .forum_rcmd .class_title > div {
  1234. /* \u70ED\u95E8\u5427 icon */
  1235. color: var(--default-fore);
  1236. }
  1237.  
  1238. .rcmd_forum_item .forum_name {
  1239. /* \u70ED\u95E8\u5427\u6807\u9898 */
  1240. color: var(--default-fore);
  1241. }
  1242.  
  1243. .rcmd_forum_item .rcmd_forum_logo {
  1244. /* \u70ED\u95E8\u5427\u56FE\u7247 */
  1245. border: none;
  1246. border-radius: 16px;
  1247. background: none;
  1248. }
  1249.  
  1250. /* \u52A8\u6001 */
  1251. .page-container .r-left-sec,
  1252. .sub_nav_wrap,
  1253. .title-tag-wraper,
  1254. .thread-name-wraper,
  1255. .n_reply {
  1256. width: 780px;
  1257. }
  1258.  
  1259. .n_txt {
  1260. /* \u52A8\u6001\u6B63\u6587 */
  1261. width: 720px;
  1262. color: var(--light-fore);
  1263. }
  1264.  
  1265. .sub_nav_wrap {
  1266. /* \u52A8\u6001\u5207\u6362 */
  1267. background: none;
  1268. background-color: var(--default-background);
  1269. box-shadow: none;
  1270. }
  1271.  
  1272. .sub_nav_list a.cur {
  1273. /* \u5F53\u524D\u6807\u7B7E */
  1274. border: none;
  1275. color: var(--tieba-theme-color);
  1276. }
  1277.  
  1278. .sub_nav_list .nav_hover {
  1279. width: 56px !important;
  1280. }
  1281.  
  1282. .sub_nav_list .nav_hover {
  1283. /* \u6807\u7B7E\u8272\u5757 */
  1284. border-bottom: 3px solid var(--tieba-theme-color);
  1285. }
  1286.  
  1287. .sub_nav_list li.sub_nav_line {
  1288. /* \u6807\u7B7E\u5206\u9694\u7B26 */
  1289. background: none;
  1290. }
  1291.  
  1292. /* \u53F3\u4FA7\u60AC\u505C */
  1293. .page-container .r-right-sec {
  1294. display: none;
  1295. }
  1296.  
  1297. .item_hd {
  1298. /* \u201C\u8D34\u5427\u70ED\u8BAE\u699C\u201D\u6807\u9898 */
  1299. border: none;
  1300. border-radius: 24px;
  1301. background-color: var(--default-background);
  1302. color: var(--default-fore);
  1303. }
  1304.  
  1305. .item_hd .title {
  1306. color: var(--default-fore);
  1307. }
  1308.  
  1309. .topic_list .topic_item .topic_flag_hot {
  1310. /* \u70ED\u70B9\u6570\u5B57\u7F16\u53F7 */
  1311. border-radius: 4px;
  1312. }
  1313.  
  1314. .item .item_hd {
  1315. /* \u516C\u544A\u677F\u6807\u9898 */
  1316. border: none;
  1317. background-color: var(--default-background);
  1318. color: var(--default-fore);
  1319. }
  1320.  
  1321. .item .item_hd .title {
  1322. color: var(--default-fore);
  1323. }
  1324.  
  1325. .notice-wrap-fixed {
  1326. /* \u516C\u544A\u677F\u60AC\u505C */
  1327. background-color: var(--default-color);
  1328. border-bottom-left-radius: 24px;
  1329. border-bottom-right-radius: 24px;
  1330. }
  1331.  
  1332. .notice,
  1333. .notice img {
  1334. /* \u516C\u544A\u677F\u56FE\u7247 */
  1335. border-radius: 24px;
  1336. }
  1337.  
  1338. /* \u52A8\u6001\u5185\u5BB9 */
  1339. .new_list .title {
  1340. /* \u8D34\u5B50\u6807\u9898 */
  1341. color: var(--tieba-theme-color);
  1342. }
  1343.  
  1344. .new_list .title:hover {
  1345. color: var(--tieba-theme-color);
  1346. -webkit-text-decoration: underline;
  1347. text-decoration: underline;
  1348. }
  1349.  
  1350. .title-tag-wraper a {
  1351. /* \u52A8\u6001\u8D34\u5427\u540D */
  1352. padding: 4px 10px;
  1353. border-radius: 24px;
  1354. background-color: var(--light-background);
  1355. color: var(--light-fore);
  1356. font-size: 12px;
  1357. }
  1358.  
  1359. .title-tag-wraper a:hover {
  1360. color: var(--light-fore);
  1361. -webkit-text-decoration: none;
  1362. text-decoration: none;
  1363. }
  1364.  
  1365. .list-post-num {
  1366. /* \u8D34\u5B50\u56DE\u590D\u6570 */
  1367. top: 0;
  1368. padding: 4px 10px;
  1369. border: none;
  1370. border-radius: 16px;
  1371. background-color: var(--tieba-theme-background);
  1372. color: var(--tieba-theme-fore);
  1373. }
  1374.  
  1375. .list-triangle-border,
  1376. .list-triangle-body {
  1377. /* \u8D34\u5B50\u56DE\u590D\u6570\u4E09\u89D2 */
  1378. display: none;
  1379. }
  1380.  
  1381. .new_list .post_author {
  1382. /* \u4F5C\u8005 */
  1383. padding: 0;
  1384. margin-bottom: 24px;
  1385. background: none;
  1386. color: var(--default-fore);
  1387. -webkit-text-decoration: none;
  1388. text-decoration: none;
  1389. }
  1390.  
  1391. .new_list .time {
  1392. /* \u65F6\u95F4 */
  1393. padding: 0;
  1394. background: none;
  1395. }
  1396.  
  1397. .topic-tag {
  1398. /* \u52A8\u6001\u8BDD\u9898 */
  1399. display: none;
  1400. }
  1401.  
  1402. .n_img img {
  1403. /* \u52A8\u6001\u56FE\u7247 */
  1404. border: none;
  1405. border-radius: 16px;
  1406. cursor: pointer;
  1407. }
  1408.  
  1409. .n_img li {
  1410. border-radius: 16px;
  1411. }
  1412.  
  1413. .n_img li .feed_highlight {
  1414. /* \u56FE\u7247\u653E\u5927 */
  1415. background: none;
  1416. cursor: pointer;
  1417. }
  1418.  
  1419. .media_box {
  1420. /* \u56FE\u7247\u63A7\u4EF6 */
  1421. border: none;
  1422. border-radius: 16px;
  1423. background-color: var(--light-background);
  1424. }
  1425.  
  1426. .media_box img {
  1427. border-radius: 16px;
  1428. cursor: pointer;
  1429. }
  1430.  
  1431. .ui_btn {
  1432. /* \u201C\u8FDB\u5165\u8D34\u5B50\u201D\u6309\u94AE */
  1433. border: none;
  1434. border-radius: 24px;
  1435. background: none;
  1436. background-color: var(--tieba-theme-color);
  1437. color: var(--default-background);
  1438. }
  1439.  
  1440. .ui_btn:hover {
  1441. -webkit-text-decoration: none !important;
  1442. text-decoration: none !important;
  1443. }
  1444.  
  1445. .ui_btn:hover {
  1446. background: none;
  1447. background-color: var(--tieba-theme-color);
  1448. box-shadow: 0 0 10px var(--tieba-theme-color);
  1449. color: var(--default-background);
  1450. }
  1451.  
  1452. .btn_more {
  1453. /* \u66F4\u591A\u6309\u94AE */
  1454. width: 200px;
  1455. height: auto;
  1456. height: initial;
  1457. border-radius: 24px;
  1458. background: none;
  1459. background-color: var(--tieba-theme-background);
  1460. }
  1461.  
  1462. .btn_more:hover,
  1463. .data_error_bar a:hover,
  1464. .btn_more a:hover {
  1465. background: none !important;
  1466. background-color: var(--tieba-theme-color) !important;
  1467. color: var(--default-background) !important;
  1468. }
  1469.  
  1470. .data_error_bar a,
  1471. .btn_more a {
  1472. border: none;
  1473. color: var(--tieba-theme-fore);
  1474. }
  1475.  
  1476. /* \u9875\u811A */
  1477. .bottom-bg {
  1478. background: none;
  1479. }
  1480.  
  1481. .footer {
  1482. border-top: 1px solid var(--light-background);
  1483. background-color: var(--light-background);
  1484. }
  1485.  
  1486. /* \u65E0\u5173\u5185\u5BB9 */
  1487. .f-d-w,
  1488. .left-cont-wraper .ufw-gap {
  1489. display: none;
  1490. }
  1491.  
  1492. /* \u5E95\u90E8\u52A0\u8F7D gif */
  1493. #data_loading img {
  1494. display: none;
  1495. }
  1496. @keyframes kf-fade-in {
  1497. 0% {
  1498. opacity: 0;
  1499. }
  1500. 100% {
  1501. opacity: 1;
  1502. }
  1503. }
  1504. @keyframes kf-fade-out {
  1505. 0% {
  1506. opacity: 1;
  1507. }
  1508. 100% {
  1509. opacity: 0;
  1510. }
  1511. }
  1512. @keyframes kf-dialog-in {
  1513. 0% {
  1514. opacity: 0;
  1515. transform: scale(1.2);
  1516. }
  1517. 100% {
  1518. opacity: 1;
  1519. transform: scale(1);
  1520. }
  1521. }
  1522. @keyframes kf-zoom-in {
  1523. 0% {
  1524. transform: scale(0.72);
  1525. }
  1526. 100% {
  1527. transform: scale(1);
  1528. }
  1529. }
  1530. @keyframes kf-fade-zoom-in {
  1531. 0% {
  1532. opacity: 0;
  1533. transform: scale(0.72);
  1534. }
  1535. 100% {
  1536. opacity: 1;
  1537. transform: scale(1);
  1538. }
  1539. }
  1540. html {
  1541. padding: 0;
  1542. margin: 0;
  1543. text-align: justify;
  1544. }
  1545.  
  1546. body {
  1547. overflow-x: hidden;
  1548. overflow-y: scroll;
  1549. overflow: hidden scroll;
  1550. padding: 0;
  1551. margin: 0;
  1552. font-family: var(--code-zh);
  1553. }
  1554. body[no-scrollbar] {
  1555. overflow: hidden;
  1556. }
  1557.  
  1558. div,
  1559. p {
  1560. margin: 0;
  1561. }
  1562.  
  1563. select {
  1564. padding: 1px 8px;
  1565. border: 1px solid var(--border-color);
  1566. border-radius: 8px;
  1567. cursor: pointer;
  1568. }
  1569.  
  1570. option {
  1571. cursor: pointer;
  1572. }
  1573.  
  1574. option:checked {
  1575. background-color: var(--tieba-theme-color);
  1576. color: var(--default-background);
  1577. }
  1578.  
  1579. a {
  1580. color: inherit;
  1581. -webkit-text-decoration: none;
  1582. text-decoration: none;
  1583. word-break: break-all;
  1584. }
  1585.  
  1586. .dialogJ {
  1587. position: fixed !important;
  1588. top: 50% !important;
  1589. left: 50% !important;
  1590. }
  1591.  
  1592. .dialogJ {
  1593. transform: translate(-50%, -50%);
  1594. }
  1595.  
  1596. .tbui_aside_float_bar li a {
  1597. font-family: "Material Symbols", monospace !important;
  1598. }
  1599.  
  1600. .tbui_aside_float_bar li a {
  1601. font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 40;
  1602. -webkit-user-select: none;
  1603. -moz-user-select: none;
  1604. user-select: none;
  1605. }
  1606.  
  1607. /* \u52A8\u753B */
  1608. /* \u6DE1\u5165\u52A8\u753B */
  1609. @keyframes animation-fade-in {
  1610. 0% {
  1611. opacity: 0;
  1612. }
  1613. 100% {
  1614. opacity: 1;
  1615. }
  1616. }
  1617. .fade-in-elem {
  1618. animation: animation-fade-in ease 0.3s forwards;
  1619. }
  1620.  
  1621. #com_userbar {
  1622. display: none;
  1623. }
  1624.  
  1625. /* \u529F\u80FD\u6309\u94AE */
  1626. .tbui_aside_float_bar {
  1627. border: none !important;
  1628. background: none !important;
  1629. }
  1630.  
  1631. .tbui_aside_float_bar li {
  1632. width: 40px;
  1633. height: 40px;
  1634. border-radius: 24px;
  1635. margin: 8px 0;
  1636. background-color: var(--light-background);
  1637. }
  1638.  
  1639. .tbui_aside_float_bar li:hover {
  1640. background-color: var(--default-hover);
  1641. }
  1642.  
  1643. .tbui_aside_float_bar li:active {
  1644. background-color: var(--default-active);
  1645. }
  1646.  
  1647. .tbui_aside_float_bar li a {
  1648. width: 40px !important;
  1649. height: 40px !important;
  1650. background: none !important;
  1651. }
  1652.  
  1653. .tbui_aside_float_bar li a {
  1654. border-radius: 24px;
  1655. }
  1656.  
  1657. .tbui_aside_float_bar a {
  1658. width: 40px !important;
  1659. height: 40px !important;
  1660. }
  1661.  
  1662. .tbui_aside_float_bar a {
  1663. /* \u529F\u80FD\u6309\u94AE svg \u5BB9\u5668 */
  1664. color: var(--minimal-fore);
  1665. font-size: 24px;
  1666. line-height: 40px;
  1667. text-align: center;
  1668. /* background-size: 20px;
  1669. background-repeat: no-repeat;
  1670. background-position: center;
  1671. filter: drop-shadow(var(--minimal-fore) 0 -9999px);
  1672. transform: translateY(9999px); */
  1673. }
  1674.  
  1675. /* .tbui_aside_float_bar a:hover {
  1676. color: var(--default-background);
  1677. filter: drop-shadow(var(--default-fore) 0 -9999px);
  1678. } */
  1679. .tbui_aside_float_bar .tbui_fbar_auxiliaryCare a {
  1680. height: 40px !important;
  1681. background: none !important;
  1682. }
  1683. .tbui_aside_float_bar .tbui_fbar_auxiliaryCare a {
  1684. /* \u65E0\u969C\u788D\u6A21\u5F0F */
  1685. }
  1686.  
  1687. .tbui_fbar_auxiliaryCare a::after {
  1688. content: "accessibility_new";
  1689. /* background-image: var(--svg-accessibility); */
  1690. }
  1691.  
  1692. .tbui_fbar_top a::after {
  1693. /* \u56DE\u5230\u9876\u90E8 */
  1694. /* color: var(--tieba-theme-fore); */
  1695. content: "arrow_upward";
  1696. /* background-image: var(--svg-arrow-up);
  1697. filter: drop-shadow(var(--tieba-theme-fore) 0 -9999px); */
  1698. }
  1699.  
  1700. /* .tbui_aside_float_bar .tbui_fbar_top a {
  1701. background-color: var(--tieba-theme-background) !important;
  1702. } */
  1703. /* .tbui_fbar_top a:hover::after {
  1704. color: var(--default-background);
  1705. } */
  1706. .tbui_fbar_post a::after {
  1707. /* \u56DE\u8D34 */
  1708. /* color: var(--default-background); */
  1709. content: "chat";
  1710. font-size: 22px;
  1711. /* vertical-align: bottom; */
  1712. /* background-image: var(--svg-message);
  1713. filter: drop-shadow(var(--default-background) 0 -9999px); */
  1714. }
  1715.  
  1716. /* .tbui_aside_float_bar .tbui_fbar_post a,
  1717. .tbui_aside_float_bar .tbui_fbar_post a:hover {
  1718. background-color: var(--tieba-theme-color) !important;
  1719. } */
  1720. .tbui_fbar_feedback a::after {
  1721. /* \u53CD\u9988 */
  1722. content: "report";
  1723. font-size: 26px;
  1724. /* background-image: var(--svg-infomation-outline);
  1725. background-size: 24px; */
  1726. }
  1727.  
  1728. .tbui_aside_float_bar li.tbui_fbar_feedback a {
  1729. background: none !important;
  1730. }
  1731.  
  1732. .tbui_aside_float_bar li.tbui_fbar_feedback a {
  1733. /* \u90E8\u5206\u5427\u53CD\u9988 */
  1734. }
  1735.  
  1736. .tbui_aside_float_bar .tbui_fbar_feedback a,
  1737. .tbui_aside_float_bar .tbui_fbar_feedback a:hover {
  1738. background: none !important;
  1739. }
  1740.  
  1741. .tbui_aside_float_bar .tbui_fbar_down,
  1742. .tbui_aside_float_bar .tbui_fbar_props,
  1743. .tbui_aside_float_bar .tbui_fbar_tsukkomi,
  1744. .tbui_aside_float_bar .tbui_fbar_share,
  1745. .tbui_aside_float_bar .tbui_fbar_favor,
  1746. .tbui_aside_float_bar .tbui_fbar_refresh {
  1747. display: none;
  1748. }
  1749.  
  1750. /* \u56FE\u7247\u7F29\u653E\u63A7\u4EF6 */
  1751. .p_tools a {
  1752. padding: 0 10px;
  1753. background: none;
  1754. vertical-align: bottom;
  1755. }
  1756.  
  1757. .p_tools span {
  1758. /* \u5206\u9694\u7EBF */
  1759. display: none;
  1760. }
  1761.  
  1762. .p_tools .p_putup::before,
  1763. .p_tools .tb_icon_ypic::before,
  1764. .p_tools .tb_icon_turnleft::before,
  1765. .p_tools .tb_icon_turnright::before {
  1766. margin-right: 4px;
  1767. font-family: "Material Symbols", system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif;
  1768. font-size: 14px;
  1769. vertical-align: bottom;
  1770. }
  1771.  
  1772. .p_tools .p_putup::before {
  1773. /* \u6536\u8D77 */
  1774. content: "zoom_out";
  1775. }
  1776.  
  1777. .p_tools .tb_icon_ypic::before {
  1778. /* \u67E5\u770B\u5927\u56FE */
  1779. content: "zoom_out_map";
  1780. }
  1781.  
  1782. .p_tools .tb_icon_turnleft::before {
  1783. /* \u5DE6\u8F6C */
  1784. content: "turn_left";
  1785. }
  1786.  
  1787. .p_tools .tb_icon_turnright::before {
  1788. /* \u53F3\u8F6C */
  1789. content: "turn_right";
  1790. }
  1791. .d_name a:hover,
  1792. #container .content a.at:hover {
  1793. -webkit-text-decoration: none;
  1794. text-decoration: none;
  1795. }
  1796.  
  1797. .l_reply_num {
  1798. color: inherit !important;
  1799. }
  1800.  
  1801. .l_reply_num {
  1802. /* \u56DE\u5E16\u4FE1\u606F */
  1803. }
  1804.  
  1805. #j_navtab_game,
  1806. .nav_list .more-config-navtab {
  1807. /* \u6E38\u620F tab */
  1808. display: none;
  1809. }
  1810.  
  1811. #j_navtab_wanle {
  1812. /* \u73A9\u4E50 tab */
  1813. display: none;
  1814. }
  1815.  
  1816. .nav_wrap_add_border {
  1817. border: none;
  1818. }
  1819.  
  1820. #head {
  1821. /* \u80CC\u666F */
  1822. background: none;
  1823. background-color: transparent;
  1824. }
  1825.  
  1826. /* \u5185\u5BB9 */
  1827. #container .content {
  1828. border-radius: 24px;
  1829. background: transparent none repeat 0 0 / auto auto padding-box border-box scroll;
  1830. background: initial;
  1831. }
  1832.  
  1833. .card_top_wrap {
  1834. background: none !important;
  1835. background-color: var(--elem-color) !important;
  1836. }
  1837.  
  1838. .card_top_wrap {
  1839. border-radius: 24px 24px 0 0;
  1840. }
  1841.  
  1842. .card_top_theme2 {
  1843. border: none;
  1844. margin-right: 0;
  1845. }
  1846.  
  1847. /* \u53BB\u9664\u65E0\u5173\u5185\u5BB9 */
  1848. #novel-ranking .novel-ranking-frs-body,
  1849. .novel-award-aside {
  1850. /* \u5C0F\u8BF4\u4EBA\u6C14\u699C\u76F8\u5173 */
  1851. display: none;
  1852. }
  1853.  
  1854. /* \u5427\u56FE\u6807 */
  1855. .card_head,
  1856. .plat_head_theme2 .plat_picbox {
  1857. top: -32px !important;
  1858. width: 64px !important;
  1859. height: 64px !important;
  1860. padding: 0 !important;
  1861. padding: initial !important;
  1862. border: 4px solid var(--border-color) !important;
  1863. border-radius: 24px !important;
  1864. background: none !important;
  1865. }
  1866. .card_head,
  1867. .plat_head_theme2 .plat_picbox {
  1868. overflow: hidden;
  1869. }
  1870.  
  1871. .card_head_img,
  1872. .plat_head_theme2 .plat_picbox img {
  1873. width: 64px !important;
  1874. height: 64px !important;
  1875. }
  1876.  
  1877. /* \u5427\u540D */
  1878. .card_title,
  1879. .plat_title_h3 {
  1880. margin: 5px 20px 0;
  1881. }
  1882.  
  1883. .card_top_theme2 .card_title_fname,
  1884. .plat_title_h3,
  1885. .plat_title_h3:hover,
  1886. .plat_title_h3:visited {
  1887. color: var(--highlight-fore);
  1888. }
  1889.  
  1890. .islike_focus {
  1891. margin-top: 4px !important;
  1892. }
  1893.  
  1894. .islike_focus {
  1895. /* \u5173\u6CE8\u5427\u6309\u94AE */
  1896. border-radius: 24px;
  1897. background: none;
  1898. background-color: var(--tieba-theme-color);
  1899. color: var(--elem-color);
  1900. font-size: 14px;
  1901. line-height: 28px;
  1902. text-align: center;
  1903. }
  1904.  
  1905. .islike_focus::after {
  1906. content: "\u5173\u6CE8";
  1907. }
  1908.  
  1909. .cancel_focus {
  1910. /* \u53D6\u5173\u5427\u6309\u94AE */
  1911. width: 72px;
  1912. border: 2px solid var(--trans-tieba-theme-color);
  1913. border-radius: 24px;
  1914. background: none;
  1915. background-color: var(--tieba-theme-background);
  1916. color: var(--tieba-theme-fore);
  1917. font-size: 14px;
  1918. line-height: 28px;
  1919. text-align: center;
  1920. }
  1921.  
  1922. .cancel_focus::after {
  1923. content: "\u5DF2\u5173\u6CE8";
  1924. }
  1925.  
  1926. .card_top_right {
  1927. /* \u7B7E\u5230\u6309\u94AE container */
  1928. margin-top: 20px;
  1929. }
  1930.  
  1931. .sign_box_bright {
  1932. width: 140px !important;
  1933. height: 40px !important;
  1934. }
  1935.  
  1936. .sign_box_bright {
  1937. /* \u7B7E\u5230\u6309\u94AE */
  1938. border: 2px solid var(--trans-tieba-theme-color);
  1939. border-radius: 24px;
  1940. background: none;
  1941. background-color: var(--tieba-theme-color);
  1942. color: var(--default-background);
  1943. font-size: 18px;
  1944. line-height: 40px;
  1945. text-align: center;
  1946. }
  1947.  
  1948. .sign_btn_bright::before {
  1949. color: var(--elem-color);
  1950. content: "\u7B7E\u5230";
  1951. }
  1952.  
  1953. .sign_box_bright_signed {
  1954. /* \u7B7E\u5230\u6309\u94AE\uFF1A\u5DF2\u7B7E\u5230 */
  1955. background-color: var(--tieba-theme-background);
  1956. text-align: inherit;
  1957. }
  1958.  
  1959. .sign_today_date,
  1960. .sign_month_lack_days {
  1961. /* \u7B7E\u5230\u65E5\u671F\u7B49 */
  1962. display: none;
  1963. }
  1964.  
  1965. .sign_keep_span {
  1966. width: 140px !important;
  1967. }
  1968.  
  1969. .sign_keep_span {
  1970. height: 40px;
  1971. }
  1972.  
  1973. .sign_keep_span,
  1974. .sign_mod_bright .sign_keep_span {
  1975. /* \u5DF2\u7B7E\u5230\u6309\u94AE\u6587\u672C */
  1976. margin: 0;
  1977. margin: initial;
  1978. color: var(--tieba-theme-fore);
  1979. font-size: 12px;
  1980. text-align: center;
  1981. }
  1982.  
  1983. .sign_box_bright_signed::before {
  1984. content: none !important;
  1985. }
  1986.  
  1987. .sign_mod_bright .sign_keep_span::before {
  1988. content: "\u5DF2\u7B7E\u5230 | ";
  1989. }
  1990.  
  1991. .jump_input_bright {
  1992. padding: 0 10px;
  1993. /* \u8DF3\u9875\u6587\u672C\u6846 */
  1994. border-color: var(--border-color);
  1995. border-radius: 16px;
  1996. }
  1997.  
  1998. /* \u6807\u9898 */
  1999. .left_section {
  2000. background: none;
  2001. }
  2002.  
  2003. .core_title_wrap_bright {
  2004. /* \u6807\u9898\u680F */
  2005. border-color: var(--border-color);
  2006. -webkit-backdrop-filter: blur(24px);
  2007. backdrop-filter: blur(24px);
  2008. background-color: var(--trans-default-background);
  2009. }
  2010.  
  2011. .core_title_theme_bright,
  2012. .core_title_absolute_bright .core_title_theme_bright {
  2013. /* \u90E8\u5206\u5427\u6807\u9898\u680F */
  2014. border-color: var(--border-color);
  2015. background: none;
  2016. }
  2017.  
  2018. .left_section .core_title_absolute_bright {
  2019. -webkit-backdrop-filter: blur(24px);
  2020. backdrop-filter: blur(24px);
  2021. background-color: var(--trans-default-background);
  2022. }
  2023.  
  2024. .core_title_txt {
  2025. /* \u6807\u9898\u6587\u5B57 */
  2026. margin-left: 24px;
  2027. background: none;
  2028. }
  2029.  
  2030. .tittle_fill_dom.filled {
  2031. background-color: var(--default-background);
  2032. }
  2033.  
  2034. .core_title h1 {
  2035. /* \u90E8\u5206\u5427\u6807\u9898 */
  2036. margin-left: 0;
  2037. color: var(--highlight-fore);
  2038. }
  2039.  
  2040. .nav_wrap {
  2041. background-image: none !important;
  2042. }
  2043.  
  2044. .nav_wrap {
  2045. border-color: var(--border-color);
  2046. background-color: var(--light-background);
  2047. /* \u5BFC\u822A */
  2048. }
  2049.  
  2050. .nav_list a.nav_icon,
  2051. .nav_list .tbnav_arrow {
  2052. /* \u90E8\u5206\u5427\u5BFC\u822A\u680F */
  2053. padding-left: 22px;
  2054. background: transparent none repeat 0 0 / auto auto padding-box border-box scroll;
  2055. background: initial;
  2056. }
  2057.  
  2058. .nav_wrap,
  2059. .nav_list .space,
  2060. .nav_list .focus,
  2061. .nav_list li:hover,
  2062. .nav_list li:hover .tbnav_tab_inner,
  2063. .nav_list .focus .tbnav_tab_inner {
  2064. background: transparent none repeat 0 0 / auto auto padding-box border-box scroll;
  2065. background: initial;
  2066. }
  2067.  
  2068. .nav_list a {
  2069. color: var(--default-fore);
  2070. }
  2071.  
  2072. span.tP {
  2073. color: var(--highlight-fore) !important;
  2074. }
  2075.  
  2076. span.tP {
  2077. /* \u5F3A\u8C03\u5B57 */
  2078. }
  2079.  
  2080. .thread_theme_5 {
  2081. /* \u8DF3\u9875 */
  2082. width: auto;
  2083. width: initial;
  2084. border-color: var(--border-color);
  2085. border-right: none;
  2086. border-left: none;
  2087. background-color: var(--light-background);
  2088. }
  2089.  
  2090. .btn_sub,
  2091. .btn-sub,
  2092. .btn-sub-b,
  2093. .core_title_btns li a,
  2094. .p_favthr_main {
  2095. border: none;
  2096. border-radius: 8px;
  2097. /* \u90E8\u5206\u6309\u94AE */
  2098. background: none;
  2099. background-color: var(--tieba-theme-background);
  2100. color: var(--tieba-theme-fore);
  2101. }
  2102.  
  2103. .btn_sub:hover,
  2104. .btn-sub:hover,
  2105. .btn-sub-b:hover,
  2106. .btn_sub:active,
  2107. .btn-sub:active,
  2108. .btn-sub-b:active,
  2109. .btn_sub:focus,
  2110. .btn-sub:focus,
  2111. .btn-sub-b:focus {
  2112. background-color: var(--tieba-theme-color);
  2113. color: var(--default-background);
  2114. }
  2115.  
  2116. .l_lzonly:hover,
  2117. .p_favthr_main:hover {
  2118. background-color: var(--tieba-theme-color) !important;
  2119. color: var(--default-background) !important;
  2120. }
  2121.  
  2122. .l_lzonly:hover,
  2123. .p_favthr_main:hover {
  2124. /* \u90E8\u5206\u5427\u6309\u94AE hover */
  2125. }
  2126.  
  2127. #quick_reply {
  2128. /* \u56DE\u590D\u6309\u94AE */
  2129. display: none;
  2130. }
  2131.  
  2132. .d_lzonly_bdaside,
  2133. .p_favthr_main p,
  2134. .j_quick_reply,
  2135. .j_lzl_p a {
  2136. /* \u90E8\u5206\u5427\u6309\u94AE\u5B57\u4F53 */
  2137. color: inherit;
  2138. }
  2139.  
  2140. .j_quick_reply {
  2141. /* \u90E8\u5206\u5427\u989D\u5934 */
  2142. padding-left: 0;
  2143. padding-left: initial;
  2144. }
  2145.  
  2146. /* \u5DE6\u4FA7\u7528\u6237\u4FE1\u606F */
  2147. .l_post_bright {
  2148. width: auto !important;
  2149. width: initial !important;
  2150. border-color: var(--border-color) !important;
  2151. background: none !important;
  2152. }
  2153.  
  2154. .p_author_face {
  2155. border: none !important;
  2156. background: none !important;
  2157. }
  2158.  
  2159. .icon_relative img {
  2160. /* \u5C42\u4E3B\u5934\u50CF */
  2161. border-radius: 16px;
  2162. }
  2163.  
  2164. .d_name .p_author_name {
  2165. /* \u5C42\u4E3B\u540D */
  2166. color: var(--tieba-theme-fore);
  2167. }
  2168.  
  2169. .novel-level-icon {
  2170. /* \u5C0F\u8BF4\u7B49\u7EA7\u56FE\u6807 */
  2171. display: none;
  2172. }
  2173.  
  2174. .d_badge_bright,
  2175. .user_level .badge {
  2176. /* \u7B49\u7EA7\u5934\u8854 */
  2177. border: 1px solid var(--border-color);
  2178. border-radius: 24px;
  2179. background-color: var(--light-background);
  2180. }
  2181.  
  2182. .user_level .badge_name {
  2183. /* \u7B49\u7EA7\u5934\u8854\u6587\u672C */
  2184. color: inherit;
  2185. }
  2186.  
  2187. .d_badge_bright .d_badge_title {
  2188. padding-left: 4px;
  2189. color: var(--default-fore);
  2190. }
  2191.  
  2192. .d_badge_bright .d_badge_lv,
  2193. .user_level .badge_index {
  2194. background-image: none !important;
  2195. }
  2196.  
  2197. .d_badge_bright .d_badge_lv,
  2198. .user_level .badge_index {
  2199. /* \u7B49\u7EA7\u56FE\u6807 */
  2200. background-color: var(--tieba-theme-background);
  2201. color: var(--tieba-theme-fore);
  2202. }
  2203.  
  2204. .d_badge_lv,
  2205. .user_level .badge_index {
  2206. top: auto !important;
  2207. top: initial !important;
  2208. left: 60px !important;
  2209. width: auto !important;
  2210. width: initial !important;
  2211. height: 8px !important;
  2212. padding: 0 4px !important;
  2213. margin: 12px 4px !important;
  2214. font-family: inherit !important;
  2215. line-height: 2px !important;
  2216. }
  2217.  
  2218. .d_badge_lv,
  2219. .user_level .badge_index {
  2220. border-radius: 16px;
  2221. font-size: 14px;
  2222. font-style: italic;
  2223. }
  2224.  
  2225. .d_badge_icon1 .d_badge_lv,
  2226. .tieba-lvl-green {
  2227. background-color: var(--level-green-background) !important;
  2228. color: var(--level-green-fore) !important;
  2229. }
  2230.  
  2231. .d_badge_icon1 .d_badge_lv,
  2232. .tieba-lvl-green {
  2233. /* \u7EFF\u724C */
  2234. }
  2235.  
  2236. .d_badge_icon2 .d_badge_lv,
  2237. .d_badge_icon2_1 .d_badge_lv,
  2238. .d_badge_icon2_2 .d_badge_lv,
  2239. .tieba-lvl-blue {
  2240. background-color: var(--level-blue-background) !important;
  2241. color: var(--level-blue-fore) !important;
  2242. }
  2243.  
  2244. .d_badge_icon2 .d_badge_lv,
  2245. .d_badge_icon2_1 .d_badge_lv,
  2246. .d_badge_icon2_2 .d_badge_lv,
  2247. .tieba-lvl-blue {
  2248. /* \u84DD\u724C */
  2249. }
  2250.  
  2251. .d_badge_icon3 .d_badge_lv,
  2252. .d_badge_icon3_1 .d_badge_lv,
  2253. .d_badge_icon3_2 .d_badge_lv,
  2254. .tieba-lvl-yellow {
  2255. background-color: var(--level-yellow-background) !important;
  2256. color: var(--level-yellow-fore) !important;
  2257. }
  2258.  
  2259. .d_badge_icon3 .d_badge_lv,
  2260. .d_badge_icon3_1 .d_badge_lv,
  2261. .d_badge_icon3_2 .d_badge_lv,
  2262. .tieba-lvl-yellow {
  2263. /* \u9EC4\u724C */
  2264. }
  2265.  
  2266. .d_badge_icon4 .d_badge_lv,
  2267. .d_badge_icon4_1 .d_badge_lv,
  2268. .d_badge_icon4_2 .d_badge_lv,
  2269. .tieba-lvl-orange {
  2270. background-color: var(--level-orange-background) !important;
  2271. color: var(--level-orange-fore) !important;
  2272. }
  2273.  
  2274. .d_badge_icon4 .d_badge_lv,
  2275. .d_badge_icon4_1 .d_badge_lv,
  2276. .d_badge_icon4_2 .d_badge_lv,
  2277. .tieba-lvl-orange {
  2278. /* \u6A59\u724C */
  2279. }
  2280.  
  2281. .d_badge_bawu1 .d_badge_lv,
  2282. .d_badge_bawu2 .d_badge_lv {
  2283. text-indent: inherit !important;
  2284. }
  2285.  
  2286. .d_badge_bawu1 .d_badge_lv,
  2287. .d_badge_bawu2 .d_badge_lv {
  2288. /* \u5427\u52A1 */
  2289. }
  2290.  
  2291. .d_author .d_pb_icons {
  2292. /* \u5370\u8BB0 */
  2293. display: none;
  2294. }
  2295.  
  2296. .icon_book_link_icon {
  2297. /* \u67E5\u770B\u6211\u7684\u5370\u8BB0 */
  2298. display: none;
  2299. }
  2300.  
  2301. .region_bright {
  2302. /* \u53F3\u4FA7\u4FE1\u606F */
  2303. border: none;
  2304. margin-top: 12px;
  2305. background: none;
  2306. background-color: var(--elem-color);
  2307. }
  2308.  
  2309. .region_bright .region_title {
  2310. color: var(--default-fore) !important;
  2311. }
  2312.  
  2313. #celebrity {
  2314. display: none;
  2315. }
  2316.  
  2317. .balv_mod .media_left,
  2318. .balv_mod .media-left {
  2319. /* \u6211\u7684\u5934\u50CF */
  2320. border: none;
  2321. }
  2322.  
  2323. .right_section .tieba_notice {
  2324. /* \u53F3\u4FA7\u53CD\u9988 */
  2325. background: none;
  2326. }
  2327.  
  2328. .topic_list_box {
  2329. /* \u53F3\u4FA7\u8D34\u5427\u70ED\u8BAE\u699C */
  2330. display: none;
  2331. background-color: var(--default-background);
  2332. }
  2333.  
  2334. .pb_content {
  2335. /* \u5BB9\u5668\uFF1A\u53F3\u4FA7\u5269\u4F59\u90E8\u5206 */
  2336. border: none;
  2337. background: none;
  2338. background-color: var(--elem-color);
  2339. }
  2340.  
  2341. .notice-icon,
  2342. .right_section .tieba_notice {
  2343. padding-left: 0 !important;
  2344. padding-left: initial !important;
  2345. background: none !important;
  2346. }
  2347.  
  2348. .notice-icon,
  2349. .right_section .tieba_notice {
  2350. /* \u53F3\u4FA7\u53CD\u9988 */
  2351. }
  2352.  
  2353. .tieba_notice li {
  2354. background: none;
  2355. }
  2356.  
  2357. /* \u6B63\u6587 */
  2358. .p_content {
  2359. border: none;
  2360. background-color: var(--default-background);
  2361. }
  2362.  
  2363. .forbid-speech-banner {
  2364. /* \u697C\u4E3B\u5C4F\u853D */
  2365. border-top: none;
  2366. }
  2367.  
  2368. .BDE_Image {
  2369. /* \u6B63\u6587\u56FE\u7247 */
  2370. border-radius: 24px;
  2371. }
  2372.  
  2373. .BDE_Image:first-child {
  2374. margin-top: 8px;
  2375. }
  2376.  
  2377. .share_btn_wrapper {
  2378. /* \u5206\u4EAB\u63A7\u4EF6 */
  2379. display: none;
  2380. }
  2381.  
  2382. .post-tail-wrap .icon-jubao {
  2383. /* \u697C\u5C42\u4E3E\u62A5 */
  2384. display: none;
  2385. }
  2386.  
  2387. .post-tail-wrap .icon-jubao::after {
  2388. content: "\u4E3E\u62A5";
  2389. }
  2390.  
  2391. .post-tail-wrap .tail-info {
  2392. /* \u697C\u5C42\u8D85\u94FE\u63A5 */
  2393. color: var(--minimal-fore);
  2394. }
  2395.  
  2396. .j_jb_ele .tail-info {
  2397. color: var(--tieba-theme-fore) !important;
  2398. }
  2399.  
  2400. .j_jb_ele .tail-info {
  2401. /* \u4E3E\u62A5\u8D85\u94FE\u63A5 */
  2402. }
  2403.  
  2404. .complaint {
  2405. color: var(--tieba-theme-fore) !important;
  2406. }
  2407.  
  2408. .complaint {
  2409. /* \u90E8\u5206\u5427\u697C\u5C42\u4E3E\u62A5 */
  2410. padding-right: 4px;
  2411. background: none;
  2412. }
  2413.  
  2414. .complaint::after {
  2415. content: "\u4E3E\u62A5";
  2416. }
  2417.  
  2418. .post-tail-wrap .question-image:hover::before {
  2419. /* IP\u5C5E\u5730\u8BF4\u660E */
  2420. border-color: var(--border-color);
  2421. border-radius: 8px;
  2422. background-color: var(--light-background);
  2423. color: var(--default-fore);
  2424. }
  2425.  
  2426. .post_bubble_top,
  2427. .post_bubble_bottom {
  2428. /* \u7279\u6B8A\u6C14\u6CE1 */
  2429. display: none;
  2430. }
  2431.  
  2432. .post_bubble_middle {
  2433. background: none !important;
  2434. }
  2435.  
  2436. .post_bubble_middle {
  2437. width: auto;
  2438. width: initial;
  2439. padding: 0;
  2440. padding: initial;
  2441. }
  2442.  
  2443. .save_face_bg_2 {
  2444. /* \u4F1A\u5458\u53F3\u4E0A\u89D2\u6807\u8BB0 */
  2445. display: none;
  2446. }
  2447.  
  2448. .replace_div .replace_tip {
  2449. /* \u5C55\u5F00\u56FE\u7247 */
  2450. border-color: var(--border-color);
  2451. background-color: var(--elem-color);
  2452. }
  2453.  
  2454. .achievement_medal_section {
  2455. /* \u6210\u5C31\u5FBD\u7AE0 */
  2456. display: none;
  2457. }
  2458.  
  2459. .l_post_bright .d_post_content_main .d_sign_split {
  2460. /* \u7B7E\u540D\u6863\u5206\u5272\u7EBF */
  2461. border-bottom: 1px solid var(--border-color);
  2462. }
  2463.  
  2464. /* \u56DE\u590D */
  2465. .d_post_content_main {
  2466. background-color: var(--default-background) !important;
  2467. }
  2468.  
  2469. .lzl_p_p {
  2470. /* \u56DE\u590D\u5934\u50CF\u8FB9\u6846 */
  2471. border: none;
  2472. }
  2473.  
  2474. .lzl_p_p img {
  2475. /* \u56DE\u590D\u5934\u50CF */
  2476. border-radius: 8px;
  2477. }
  2478.  
  2479. .core_reply_wrapper {
  2480. border: 1px solid var(--border-color) !important;
  2481. border-radius: 16px !important;
  2482. margin-bottom: 16px !important;
  2483. background: none !important;
  2484. background-color: var(--very-light-background) !important;
  2485. color: var(--default-fore) !important;
  2486. }
  2487.  
  2488. .core_reply_wrapper {
  2489. /* \u56DE\u590D */
  2490. /* border-top-right-radius: 0 !important; */
  2491. }
  2492.  
  2493. .core_reply_content li {
  2494. border-top: 0;
  2495. border-top: initial;
  2496. }
  2497.  
  2498. .core_reply_content li.first_no_border {
  2499. margin-top: 6px;
  2500. }
  2501.  
  2502. .lzl_content_main {
  2503. /* \u56DE\u590D\u6587\u5B57 */
  2504. color: var(--default-fore);
  2505. }
  2506.  
  2507. .l_post_bright .core_reply_wrapper .core_reply_border_top,
  2508. .core_reply_border_bottom,
  2509. .l_post_bright .core_reply_wrapper .core_reply_content {
  2510. border: none;
  2511. background: none;
  2512. }
  2513.  
  2514. .lzl_link_fold {
  2515. display: none !important;
  2516. border: 1px solid var(--border-color) !important;
  2517. border-bottom: none !important;
  2518. background-color: var(--very-light-background) !important;
  2519. }
  2520.  
  2521. .lzl_link_fold {
  2522. /* \u6536\u8D77\u56DE\u590D */
  2523. border-radius: 8px 8px 0 0;
  2524. color: var(--tieba-theme-fore);
  2525. }
  2526.  
  2527. .core_reply div.hideLzl {
  2528. /* \u52A0\u8F7D\u56DE\u590D */
  2529. background: none;
  2530. background-color: var(--very-light-background);
  2531. }
  2532.  
  2533. .core_reply_wrapper .loading_reply {
  2534. /* \u52A0\u8F7D\u52A8\u753B */
  2535. display: none;
  2536. }
  2537.  
  2538. .lzl_cnt .lzl_s_r {
  2539. /* \u56DE\u590D\u8D85\u94FE\u63A5 */
  2540. color: var(--tieba-theme-fore);
  2541. }
  2542.  
  2543. .lzl_li_pager_s .lzl_more,
  2544. .lzl_more span {
  2545. /* \u8FD8\u6709x\u6761\u56DE\u590D */
  2546. color: var(--light-fore);
  2547. }
  2548.  
  2549. .j_lzl_m {
  2550. /* \u70B9\u51FB\u67E5\u770B */
  2551. color: var(--tieba-theme-fore);
  2552. }
  2553.  
  2554. .lzl_cnt .lzl_time {
  2555. color: var(--minimal-fore);
  2556. }
  2557.  
  2558. .lzl_jb_in,
  2559. .user-jubao-button {
  2560. /* \u697C\u4E2D\u697C\u4E3E\u62A5 */
  2561. background: none;
  2562. color: var(--tieba-theme-fore);
  2563. }
  2564.  
  2565. .lzl_jb_in::after,
  2566. .user-jubao-button::after {
  2567. content: "\u4E3E\u62A5";
  2568. }
  2569.  
  2570. .lzl_cnt .lzl_content_main {
  2571. display: block;
  2572. }
  2573.  
  2574. /* .core_reply .hideLzl {
  2575. opacity: 0;
  2576. height: 0;
  2577. }
  2578.  
  2579. .core_reply div:not(.hideLzl) {
  2580. opacity: 1;
  2581. height: unset;
  2582. } */
  2583. /* \u8D34\u5B50\u5185\u5BB9\u8D85\u94FE\u63A5 */
  2584. .d_post_content a,
  2585. .lzl_cnt .lzl_content_main a:not(.at) {
  2586. margin: auto 2px;
  2587. color: var(--tieba-theme-fore);
  2588. /* text-decoration: underline 1.2px; */
  2589. transition: 0.4s;
  2590. }
  2591.  
  2592. /* .d_post_content a:hover,
  2593. .d_post_content a:focus,
  2594. .lzl_cnt .lzl_content_main a:not(.at):hover,
  2595. .lzl_cnt .lzl_content_main a:not(.at):focus {
  2596. background-color: var(--trans-light-background);
  2597. text-decoration: none;
  2598. } */
  2599. .pager_theme_5 a,
  2600. .pager_theme_5 span,
  2601. .jump_btn_bright {
  2602. /* \u8DF3\u9875\u6309\u94AE */
  2603. border-color: var(--default-background);
  2604. border-radius: 8px;
  2605. background: none;
  2606. background-color: var(--default-background);
  2607. color: var(--minimal-fore);
  2608. }
  2609.  
  2610. .pager_theme_5 a:hover,
  2611. .jump_btn_bright:hover {
  2612. border-color: var(--tieba-theme-color);
  2613. background-color: var(--tieba-theme-color);
  2614. color: var(--default-background);
  2615. }
  2616.  
  2617. /* \u5E95\u90E8 */
  2618. .thread_theme_7 {
  2619. /* \u9876\u680F */
  2620. width: auto;
  2621. width: initial;
  2622. border-color: var(--border-color);
  2623. background-color: var(--light-background);
  2624. }
  2625.  
  2626. #pb-footer-header {
  2627. background-color: var(--default-background);
  2628. }
  2629.  
  2630. #tb_rich_poster_container {
  2631. /* \u5185\u5BB9 */
  2632. width: auto;
  2633. width: initial;
  2634. border-radius: 24px;
  2635. background-color: var(--default-background);
  2636. }
  2637.  
  2638. .poster_head_text a.cur {
  2639. color: var(--highlight-fore) !important;
  2640. }
  2641.  
  2642. .edui-editor-body {
  2643. border-color: var(--border-color) !important;
  2644. }
  2645.  
  2646. .edui-editor-body {
  2647. /* \u6587\u672C\u6846 */
  2648. border-radius: 16px;
  2649. background: none;
  2650. }
  2651.  
  2652. .edui-container .edui-editor-body.body-container-focus,
  2653. .edui-container .edui-editor-body.body-container-focus .edui-body-container {
  2654. border-color: var(--tieba-theme-color) !important;
  2655. }
  2656.  
  2657. .old_style_wrapper {
  2658. border-color: var(--border-color);
  2659. border-radius: 24px;
  2660. background-color: var(--elem-color);
  2661. }
  2662.  
  2663. .edui-editor-body .edui-body-container {
  2664. width: auto !important;
  2665. width: initial !important;
  2666. }
  2667.  
  2668. .edui-editor-body .edui-body-container {
  2669. /* \u5168\u90E8\u6587\u672C\u6846 */
  2670. border-radius: 16px;
  2671. background: var(--default-background);
  2672. }
  2673.  
  2674. .edui-toolbar .edui-btn-toolbar,
  2675. .edui-container .edui-toolbar {
  2676. margin-top: 4px;
  2677. /* \u5DE5\u5177\u680F */
  2678. background-color: var(--elem-color);
  2679. }
  2680.  
  2681. .pb_footer {
  2682. width: auto;
  2683. width: initial;
  2684. border: none;
  2685. border-color: var(--border-color);
  2686. background: none;
  2687. }
  2688.  
  2689. .save-to-quick-reply-btn {
  2690. /* \u201C\u4FDD\u5B58\u81F3\u5FEB\u901F\u56DE\u8D34\u201D\u6309\u94AE */
  2691. border-color: var(--border-color);
  2692. background: none;
  2693. background-color: var(--light-background);
  2694. color: inherit;
  2695. }
  2696.  
  2697. .save-to-quick-reply-btn span {
  2698. color: var(--tieba-theme-fore);
  2699. }
  2700.  
  2701. .footer {
  2702. display: none;
  2703. }
  2704.  
  2705. .skin_normal .wrap2 {
  2706. background: none;
  2707. background-color: var(--page-background);
  2708. }
  2709.  
  2710. #lcsas-container {
  2711. display: none;
  2712. }
  2713.  
  2714. /* TODO: \u9690\u85CF\u7528\u62373\u5929 */
  2715. .user-hide-post-down,
  2716. .user-hide-post-up {
  2717. background-color: var(--light-fore);
  2718. background-position: center;
  2719. background-repeat: no-repeat;
  2720. background-size: 16px;
  2721. -webkit-mask: var(--svg-arrow-down-circle);
  2722. mask: var(--svg-arrow-down-circle);
  2723. /* filter: drop-shadow(var(--minimal-fore) 0 -9999px);
  2724. transform: translateY(9999px); */
  2725. opacity: 0;
  2726. }
  2727.  
  2728. /* \u9009\u62E9\u641C\u7D22 */
  2729. #selectsearch-icon {
  2730. display: none;
  2731. }
  2732.  
  2733. /* TODO: \u7528\u6237\u5361\u7247 */
  2734. .ui_card_wrap {
  2735. background: none;
  2736. }
  2737.  
  2738. .ui_card_content {
  2739. border-color: var(--border-color);
  2740. border-radius: 16px;
  2741. background: none;
  2742. box-shadow: 0 0 20px rgba(0, 0, 0, 0.2);
  2743. }
  2744.  
  2745. .card_userinfo_wrap {
  2746. background: none;
  2747. background-color: var(--default-background);
  2748. }
  2749.  
  2750. .card_userinfo_left .userinfo_head {
  2751. /* \u5934\u50CF\u8FB9\u6846 */
  2752. background: none;
  2753. }
  2754.  
  2755. .j_avatar img {
  2756. width: 92px;
  2757. height: 92px;
  2758. border: 4px solid var(--border-color);
  2759. border-radius: 24px;
  2760. -webkit-backdrop-filter: blur(24px);
  2761. backdrop-filter: blur(24px);
  2762. }
  2763.  
  2764. .card_userinfo_middle .userinfo_sex {
  2765. background: none;
  2766. }
  2767.  
  2768. .userinfo_sex_male::after {
  2769. content: "\u2642";
  2770. }
  2771.  
  2772. .userinfo_sex_female::after {
  2773. content: "\u2640";
  2774. }
  2775.  
  2776. .ui_card_wrap .ui_white_down,
  2777. .ui_card_wrap .ui_white_up {
  2778. /* \u4E09\u89D2 */
  2779. display: none;
  2780. }
  2781.  
  2782. .card_userinfo_guide {
  2783. /* \u53F3\u4E0A\u89D2 */
  2784. display: none;
  2785. }
  2786.  
  2787. .user_card_loading {
  2788. /* \u52A0\u8F7D */
  2789. background-color: var(--default-background);
  2790. }
  2791.  
  2792. .user_card_loading img {
  2793. display: none;
  2794. }
  2795.  
  2796. /* TODO: \u7B2C\u4E09\u65B9\u5185\u5BB9\u5427\u9002\u914D */
  2797. /* \u7531\u7B2C\u4E09\u65B9\u63D0\u4F9B\u7684\u5427 */
  2798. /* \u8FDB\u5427\u5BFC\u822A */
  2799. .plat_head_theme2,
  2800. .plat_header {
  2801. border: none;
  2802. background-color: transparent;
  2803. background-color: initial;
  2804. }html.dark{color-scheme:dark;--el-color-primary:#409eff;--el-color-primary-light-3:#3375b9;--el-color-primary-light-5:#2a598a;--el-color-primary-light-7:#213d5b;--el-color-primary-light-8:#1d3043;--el-color-primary-light-9:#18222c;--el-color-primary-dark-2:#66b1ff;--el-color-success:#67c23a;--el-color-success-light-3:#4e8e2f;--el-color-success-light-5:#3e6b27;--el-color-success-light-7:#2d481f;--el-color-success-light-8:#25371c;--el-color-success-light-9:#1c2518;--el-color-success-dark-2:#85ce61;--el-color-warning:#e6a23c;--el-color-warning-light-3:#a77730;--el-color-warning-light-5:#7d5b28;--el-color-warning-light-7:#533f20;--el-color-warning-light-8:#3e301c;--el-color-warning-light-9:#292218;--el-color-warning-dark-2:#ebb563;--el-color-danger:#f56c6c;--el-color-danger-light-3:#b25252;--el-color-danger-light-5:#854040;--el-color-danger-light-7:#582e2e;--el-color-danger-light-8:#412626;--el-color-danger-light-9:#2b1d1d;--el-color-danger-dark-2:#f78989;--el-color-error:#f56c6c;--el-color-error-light-3:#b25252;--el-color-error-light-5:#854040;--el-color-error-light-7:#582e2e;--el-color-error-light-8:#412626;--el-color-error-light-9:#2b1d1d;--el-color-error-dark-2:#f78989;--el-color-info:#909399;--el-color-info-light-3:#6b6d71;--el-color-info-light-5:#525457;--el-color-info-light-7:#393a3c;--el-color-info-light-8:#2d2d2f;--el-color-info-light-9:#202121;--el-color-info-dark-2:#a6a9ad;--el-box-shadow:0px 12px 32px 4px rgba(0, 0, 0, 0.36),0px 8px 20px rgba(0, 0, 0, 0.72);--el-box-shadow-light:0px 0px 12px rgba(0, 0, 0, 0.72);--el-box-shadow-lighter:0px 0px 6px rgba(0, 0, 0, 0.72);--el-box-shadow-dark:0px 16px 48px 16px rgba(0, 0, 0, 0.72),0px 12px 32px #000000,0px 8px 16px -8px #000000;--el-bg-color-page:#0a0a0a;--el-bg-color:#141414;--el-bg-color-overlay:#1d1e1f;--el-text-color-primary:#E5EAF3;--el-text-color-regular:#CFD3DC;--el-text-color-secondary:#A3A6AD;--el-text-color-placeholder:#8D9095;--el-text-color-disabled:#6C6E72;--el-border-color-darker:#636466;--el-border-color-dark:#58585B;--el-border-color:#4C4D4F;--el-border-color-light:#414243;--el-border-color-lighter:#363637;--el-border-color-extra-light:#2B2B2C;--el-fill-color-darker:#424243;--el-fill-color-dark:#39393A;--el-fill-color:#303030;--el-fill-color-light:#262727;--el-fill-color-lighter:#1D1D1D;--el-fill-color-extra-light:#191919;--el-fill-color-blank:transparent;--el-mask-color:rgba(0, 0, 0, 0.8);--el-mask-color-extra-light:rgba(0, 0, 0, 0.3)}html.dark .el-button{--el-button-disabled-text-color:rgba(255, 255, 255, 0.5)}html.dark .el-card{--el-card-bg-color:var(--el-bg-color-overlay)}html.dark .el-empty{--el-empty-fill-color-0:var(--el-color-black);--el-empty-fill-color-1:#4b4b52;--el-empty-fill-color-2:#36383d;--el-empty-fill-color-3:#1e1e20;--el-empty-fill-color-4:#262629;--el-empty-fill-color-5:#202124;--el-empty-fill-color-6:#212224;--el-empty-fill-color-7:#1b1c1f;--el-empty-fill-color-8:#1c1d1f;--el-empty-fill-color-9:#18181a}@keyframes kf-fade-in-f9deea39 {
  2805. 0% {
  2806. opacity: 0;
  2807. }
  2808. 100% {
  2809. opacity: 1;
  2810. }
  2811. }
  2812. @keyframes kf-fade-out-f9deea39 {
  2813. 0% {
  2814. opacity: 1;
  2815. }
  2816. 100% {
  2817. opacity: 0;
  2818. }
  2819. }
  2820. @keyframes kf-dialog-in-f9deea39 {
  2821. 0% {
  2822. opacity: 0;
  2823. transform: scale(1.2);
  2824. }
  2825. 100% {
  2826. opacity: 1;
  2827. transform: scale(1);
  2828. }
  2829. }
  2830. @keyframes kf-zoom-in-f9deea39 {
  2831. 0% {
  2832. transform: scale(0.72);
  2833. }
  2834. 100% {
  2835. transform: scale(1);
  2836. }
  2837. }
  2838. @keyframes kf-fade-zoom-in-f9deea39 {
  2839. 0% {
  2840. opacity: 0;
  2841. transform: scale(0.72);
  2842. }
  2843. 100% {
  2844. opacity: 1;
  2845. transform: scale(1);
  2846. }
  2847. }
  2848. html[data-v-f9deea39] {
  2849. padding: 0;
  2850. margin: 0;
  2851. text-align: justify;
  2852. }
  2853. body[data-v-f9deea39] {
  2854. overflow-x: hidden;
  2855. overflow-y: scroll;
  2856. overflow: hidden scroll;
  2857. padding: 0;
  2858. margin: 0;
  2859. font-family: var(--code-zh);
  2860. }
  2861. body[no-scrollbar][data-v-f9deea39] {
  2862. overflow: hidden;
  2863. }
  2864. div[data-v-f9deea39],
  2865. p[data-v-f9deea39] {
  2866. margin: 0;
  2867. }
  2868. select[data-v-f9deea39] {
  2869. padding: 1px 8px;
  2870. border: 1px solid var(--border-color);
  2871. border-radius: 8px;
  2872. cursor: pointer;
  2873. }
  2874. option[data-v-f9deea39] {
  2875. cursor: pointer;
  2876. }
  2877. option[data-v-f9deea39]:checked {
  2878. background-color: var(--tieba-theme-color);
  2879. color: var(--default-background);
  2880. }
  2881. a[data-v-f9deea39] {
  2882. color: inherit;
  2883. -webkit-text-decoration: none;
  2884. text-decoration: none;
  2885. word-break: break-all;
  2886. }
  2887. .dialogJ[data-v-f9deea39] {
  2888. position: fixed !important;
  2889. top: 50% !important;
  2890. left: 50% !important;
  2891. }
  2892. .dialogJ[data-v-f9deea39] {
  2893. transform: translate(-50%, -50%);
  2894. }
  2895. .dialog-wrapper[data-v-f9deea39] {
  2896. position: fixed;
  2897. z-index: 9999;
  2898. top: 0;
  2899. left: 0;
  2900. display: flex;
  2901. width: 100%;
  2902. height: 100%;
  2903. background-color: transparent;
  2904. animation: kf-fade-in-f9deea39 0.2s;
  2905. }
  2906. .dialog-wrapper.darker[data-v-f9deea39] {
  2907. background-color: rgba(0, 0, 0, 0.72);
  2908. }
  2909. html:not([perf-saver]) .blur-effect[data-v-f9deea39] {
  2910. -webkit-backdrop-filter: blur(4px);
  2911. backdrop-filter: blur(4px);
  2912. }
  2913. html.dark-theme .blur-effect[data-v-f9deea39] {
  2914. -webkit-backdrop-filter: blur(4px) brightness(0.8);
  2915. backdrop-filter: blur(4px) brightness(0.8);
  2916. }@keyframes kf-fade-in-8df9d0bc {
  2917. 0% {
  2918. opacity: 0;
  2919. }
  2920. 100% {
  2921. opacity: 1;
  2922. }
  2923. }
  2924. @keyframes kf-fade-out-8df9d0bc {
  2925. 0% {
  2926. opacity: 1;
  2927. }
  2928. 100% {
  2929. opacity: 0;
  2930. }
  2931. }
  2932. @keyframes kf-dialog-in-8df9d0bc {
  2933. 0% {
  2934. opacity: 0;
  2935. transform: scale(1.2);
  2936. }
  2937. 100% {
  2938. opacity: 1;
  2939. transform: scale(1);
  2940. }
  2941. }
  2942. @keyframes kf-zoom-in-8df9d0bc {
  2943. 0% {
  2944. transform: scale(0.72);
  2945. }
  2946. 100% {
  2947. transform: scale(1);
  2948. }
  2949. }
  2950. @keyframes kf-fade-zoom-in-8df9d0bc {
  2951. 0% {
  2952. opacity: 0;
  2953. transform: scale(0.72);
  2954. }
  2955. 100% {
  2956. opacity: 1;
  2957. transform: scale(1);
  2958. }
  2959. }
  2960. html[data-v-8df9d0bc] {
  2961. padding: 0;
  2962. margin: 0;
  2963. text-align: justify;
  2964. }
  2965. body[data-v-8df9d0bc] {
  2966. overflow-x: hidden;
  2967. overflow-y: scroll;
  2968. overflow: hidden scroll;
  2969. padding: 0;
  2970. margin: 0;
  2971. font-family: var(--code-zh);
  2972. }
  2973. body[no-scrollbar][data-v-8df9d0bc] {
  2974. overflow: hidden;
  2975. }
  2976. div[data-v-8df9d0bc],
  2977. p[data-v-8df9d0bc] {
  2978. margin: 0;
  2979. }
  2980. select[data-v-8df9d0bc] {
  2981. padding: 1px 8px;
  2982. border: 1px solid var(--border-color);
  2983. border-radius: 8px;
  2984. cursor: pointer;
  2985. }
  2986. option[data-v-8df9d0bc] {
  2987. cursor: pointer;
  2988. }
  2989. option[data-v-8df9d0bc]:checked {
  2990. background-color: var(--tieba-theme-color);
  2991. color: var(--default-background);
  2992. }
  2993. a[data-v-8df9d0bc] {
  2994. color: inherit;
  2995. -webkit-text-decoration: none;
  2996. text-decoration: none;
  2997. word-break: break-all;
  2998. }
  2999. .dialogJ[data-v-8df9d0bc] {
  3000. position: fixed !important;
  3001. top: 50% !important;
  3002. left: 50% !important;
  3003. }
  3004. .dialogJ[data-v-8df9d0bc] {
  3005. transform: translate(-50%, -50%);
  3006. }
  3007. .message-box[data-v-8df9d0bc] {
  3008. display: flex;
  3009. overflow: hidden;
  3010. max-width: 60vw;
  3011. max-height: 80vh;
  3012. box-sizing: border-box;
  3013. flex-direction: column;
  3014. border: 1px solid var(--light-border-color);
  3015. border-radius: 16px;
  3016. margin: auto;
  3017. animation: kf-dialog-in-8df9d0bc 0.4s ease;
  3018. background-color: var(--default-background);
  3019. box-shadow: 0 0 20px rgba(0, 0, 0, 0.3);
  3020. font-size: 16px;
  3021. transition: 0.4s ease;
  3022. }
  3023. .message-box .message-wrapper[data-v-8df9d0bc] {
  3024. display: flex;
  3025. overflow-x: hidden;
  3026. overflow-y: auto;
  3027. overflow: hidden auto;
  3028. flex-direction: column;
  3029. padding: 16px;
  3030. }
  3031. .message-box .message-wrapper .title[data-v-8df9d0bc] {
  3032. margin-bottom: 8px;
  3033. color: var(--highlight-fore);
  3034. font-size: 20px;
  3035. font-weight: bold;
  3036. }
  3037. .message-box .message-controls[data-v-8df9d0bc] {
  3038. display: flex;
  3039. padding: 16px;
  3040. margin-top: auto;
  3041. background-color: var(--deep-background);
  3042. gap: 8px;
  3043. }
  3044. .message-box .message-controls .message-button[data-v-8df9d0bc] {
  3045. flex-grow: 1;
  3046. padding: 6px 16px;
  3047. font-size: 14px;
  3048. }@keyframes kf-fade-in {
  3049. 0% {
  3050. opacity: 0;
  3051. }
  3052. 100% {
  3053. opacity: 1;
  3054. }
  3055. }
  3056. @keyframes kf-fade-out {
  3057. 0% {
  3058. opacity: 1;
  3059. }
  3060. 100% {
  3061. opacity: 0;
  3062. }
  3063. }
  3064. @keyframes kf-dialog-in {
  3065. 0% {
  3066. opacity: 0;
  3067. transform: scale(1.2);
  3068. }
  3069. 100% {
  3070. opacity: 1;
  3071. transform: scale(1);
  3072. }
  3073. }
  3074. @keyframes kf-zoom-in {
  3075. 0% {
  3076. transform: scale(0.72);
  3077. }
  3078. 100% {
  3079. transform: scale(1);
  3080. }
  3081. }
  3082. @keyframes kf-fade-zoom-in {
  3083. 0% {
  3084. opacity: 0;
  3085. transform: scale(0.72);
  3086. }
  3087. 100% {
  3088. opacity: 1;
  3089. transform: scale(1);
  3090. }
  3091. }
  3092. html {
  3093. padding: 0;
  3094. margin: 0;
  3095. text-align: justify;
  3096. }
  3097. body {
  3098. overflow-x: hidden;
  3099. overflow-y: scroll;
  3100. overflow: hidden scroll;
  3101. padding: 0;
  3102. margin: 0;
  3103. font-family: var(--code-zh);
  3104. }
  3105. body[no-scrollbar] {
  3106. overflow: hidden;
  3107. }
  3108. div,
  3109. p {
  3110. margin: 0;
  3111. }
  3112. select {
  3113. padding: 1px 8px;
  3114. border: 1px solid var(--border-color);
  3115. border-radius: 8px;
  3116. cursor: pointer;
  3117. }
  3118. option {
  3119. cursor: pointer;
  3120. }
  3121. option:checked {
  3122. background-color: var(--tieba-theme-color);
  3123. color: var(--default-background);
  3124. }
  3125. a {
  3126. color: inherit;
  3127. -webkit-text-decoration: none;
  3128. text-decoration: none;
  3129. word-break: break-all;
  3130. }
  3131. .dialogJ {
  3132. position: fixed !important;
  3133. top: 50% !important;
  3134. left: 50% !important;
  3135. }
  3136. .dialogJ {
  3137. transform: translate(-50%, -50%);
  3138. }
  3139. .block-panel {
  3140. display: flex;
  3141. min-width: 30px;
  3142. height: 26px;
  3143. align-items: center;
  3144. justify-content: center;
  3145. padding: 2px 8px;
  3146. border-radius: 24px;
  3147. margin: auto;
  3148. background-color: var(--trans-light-background);
  3149. font-size: 14px;
  3150. text-align: center;
  3151. }
  3152. .block-panel .icon {
  3153. color: var(--light-fore);
  3154. font-size: 18px;
  3155. }
  3156. .block-panel .panel-button {
  3157. border: none !important;
  3158. }
  3159. .block-panel .panel-button {
  3160. width: 30px;
  3161. height: 30px;
  3162. padding: 4px;
  3163. border-radius: 48px;
  3164. }
  3165. .block-panel.left-align {
  3166. margin-left: 0;
  3167. }@keyframes kf-fade-in-bedddce2 {
  3168. 0% {
  3169. opacity: 0;
  3170. }
  3171. 100% {
  3172. opacity: 1;
  3173. }
  3174. }
  3175. @keyframes kf-fade-out-bedddce2 {
  3176. 0% {
  3177. opacity: 1;
  3178. }
  3179. 100% {
  3180. opacity: 0;
  3181. }
  3182. }
  3183. @keyframes kf-dialog-in-bedddce2 {
  3184. 0% {
  3185. opacity: 0;
  3186. transform: scale(1.2);
  3187. }
  3188. 100% {
  3189. opacity: 1;
  3190. transform: scale(1);
  3191. }
  3192. }
  3193. @keyframes kf-zoom-in-bedddce2 {
  3194. 0% {
  3195. transform: scale(0.72);
  3196. }
  3197. 100% {
  3198. transform: scale(1);
  3199. }
  3200. }
  3201. @keyframes kf-fade-zoom-in-bedddce2 {
  3202. 0% {
  3203. opacity: 0;
  3204. transform: scale(0.72);
  3205. }
  3206. 100% {
  3207. opacity: 1;
  3208. transform: scale(1);
  3209. }
  3210. }
  3211. #header-progress[data-v-bedddce2] {
  3212. position: fixed;
  3213. z-index: 99999;
  3214. top: 0;
  3215. max-width: 100vw;
  3216. height: 4px;
  3217. background-color: var(--tieba-theme-color);
  3218. transition: 0.4s;
  3219. }
  3220. #header-progress.complete[data-v-bedddce2] {
  3221. animation: kf-fade-out-bedddce2 0.6s forwards;
  3222. }.toggle-button[data-v-6728dba5] {
  3223. color: var(--default-fore);
  3224. }
  3225. .toggle-button .icon[data-v-6728dba5],
  3226. .toggle-button .outline-icon[data-v-6728dba5] {
  3227. color: var(--minimal-fore);
  3228. }
  3229. .toggle-button.toggle-on[data-v-6728dba5] {
  3230. background-color: var(--tieba-theme-color);
  3231. color: var(--default-background);
  3232. }@keyframes kf-fade-in-b1e43839 {
  3233. 0% {
  3234. opacity: 0;
  3235. }
  3236. 100% {
  3237. opacity: 1;
  3238. }
  3239. }
  3240. @keyframes kf-fade-out-b1e43839 {
  3241. 0% {
  3242. opacity: 1;
  3243. }
  3244. 100% {
  3245. opacity: 0;
  3246. }
  3247. }
  3248. @keyframes kf-dialog-in-b1e43839 {
  3249. 0% {
  3250. opacity: 0;
  3251. transform: scale(1.2);
  3252. }
  3253. 100% {
  3254. opacity: 1;
  3255. transform: scale(1);
  3256. }
  3257. }
  3258. @keyframes kf-zoom-in-b1e43839 {
  3259. 0% {
  3260. transform: scale(0.72);
  3261. }
  3262. 100% {
  3263. transform: scale(1);
  3264. }
  3265. }
  3266. @keyframes kf-fade-zoom-in-b1e43839 {
  3267. 0% {
  3268. opacity: 0;
  3269. transform: scale(0.72);
  3270. }
  3271. 100% {
  3272. opacity: 1;
  3273. transform: scale(1);
  3274. }
  3275. }
  3276. html[data-v-b1e43839] {
  3277. padding: 0;
  3278. margin: 0;
  3279. text-align: justify;
  3280. }
  3281. body[data-v-b1e43839] {
  3282. overflow-x: hidden;
  3283. overflow-y: scroll;
  3284. overflow: hidden scroll;
  3285. padding: 0;
  3286. margin: 0;
  3287. font-family: var(--code-zh);
  3288. }
  3289. body[no-scrollbar][data-v-b1e43839] {
  3290. overflow: hidden;
  3291. }
  3292. div[data-v-b1e43839],
  3293. p[data-v-b1e43839] {
  3294. margin: 0;
  3295. }
  3296. select[data-v-b1e43839] {
  3297. padding: 1px 8px;
  3298. border: 1px solid var(--border-color);
  3299. border-radius: 8px;
  3300. cursor: pointer;
  3301. }
  3302. option[data-v-b1e43839] {
  3303. cursor: pointer;
  3304. }
  3305. option[data-v-b1e43839]:checked {
  3306. background-color: var(--tieba-theme-color);
  3307. color: var(--default-background);
  3308. }
  3309. a[data-v-b1e43839] {
  3310. color: inherit;
  3311. -webkit-text-decoration: none;
  3312. text-decoration: none;
  3313. word-break: break-all;
  3314. }
  3315. .dialogJ[data-v-b1e43839] {
  3316. position: fixed !important;
  3317. top: 50% !important;
  3318. left: 50% !important;
  3319. }
  3320. .dialogJ[data-v-b1e43839] {
  3321. transform: translate(-50%, -50%);
  3322. }
  3323. .images-viewer .head-controls .head-btn.toggle-on[data-v-b1e43839] {
  3324. font-family: "Material Symbols", monospace !important;
  3325. }
  3326. .images-viewer .head-controls .head-btn.toggle-on[data-v-b1e43839] {
  3327. font-variation-settings: "FILL" 1, "wght" 400, "GRAD" 0, "opsz" 40;
  3328. -webkit-user-select: none;
  3329. -moz-user-select: none;
  3330. user-select: none;
  3331. }
  3332. .images-viewer[data-v-b1e43839] {
  3333. display: flex;
  3334. width: 100%;
  3335. height: 100%;
  3336. flex-direction: column;
  3337. align-items: center;
  3338. justify-content: center;
  3339. transition: 0.4s;
  3340. }
  3341. .images-viewer .icon[data-v-b1e43839] {
  3342. color: var(--light-fore);
  3343. }
  3344. .images-viewer .control-panel[data-v-b1e43839] {
  3345. position: absolute;
  3346. display: flex;
  3347. align-items: center;
  3348. padding: 10px;
  3349. border: 1px solid var(--light-border-color);
  3350. border-radius: 18px;
  3351. background-color: var(--trans-default-background);
  3352. box-shadow: 0 0 32px rgba(0, 0, 0, 0.4);
  3353. }
  3354. html:not([perf-saver]) .images-viewer .control-panel[data-v-b1e43839] {
  3355. -webkit-backdrop-filter: blur(24px);
  3356. backdrop-filter: blur(24px);
  3357. }
  3358. html.dark-theme .images-viewer .control-panel[data-v-b1e43839] {
  3359. -webkit-backdrop-filter: blur(24px) brightness(0.8);
  3360. backdrop-filter: blur(24px) brightness(0.8);
  3361. }
  3362. .images-viewer .head-controls[data-v-b1e43839] {
  3363. top: 16px;
  3364. margin-bottom: auto;
  3365. transition: 0.4s;
  3366. }
  3367. .images-viewer .head-controls.hide[data-v-b1e43839] {
  3368. box-shadow: none;
  3369. transform: translateY(calc(-100% - 16px));
  3370. }
  3371. .images-viewer .head-controls .head-btn[data-v-b1e43839] {
  3372. width: 36px;
  3373. height: 36px;
  3374. padding: 0;
  3375. border-radius: 12px;
  3376. background-color: transparent;
  3377. background-color: initial;
  3378. box-shadow: none;
  3379. font-size: 16px;
  3380. }
  3381. .images-viewer .head-controls .head-btn[data-v-b1e43839]:hover {
  3382. background-color: var(--default-background);
  3383. color: var(--tieba-theme-color);
  3384. }
  3385. .images-viewer .head-controls .head-btn.toggle-on[data-v-b1e43839] {
  3386. background-color: var(--tieba-theme-color);
  3387. color: var(--default-background);
  3388. }
  3389. .images-viewer .head-controls .head-btn.toggle-on[data-v-b1e43839]:hover {
  3390. filter: brightness(1.2);
  3391. }
  3392. .images-viewer .head-controls .close[data-v-b1e43839]:hover {
  3393. color: var(--error-color);
  3394. }
  3395. .images-viewer .head-controls span[data-v-b1e43839] {
  3396. color: var(--minimal-fore);
  3397. font-family: var(--code-monospace);
  3398. }
  3399. .images-viewer .head-controls .zoom-size[data-v-b1e43839] {
  3400. padding: 10px;
  3401. }
  3402. .images-viewer .back[data-v-b1e43839],
  3403. .images-viewer .forward[data-v-b1e43839] {
  3404. height: 60px;
  3405. box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
  3406. font-size: large;
  3407. }
  3408. .images-viewer .back[data-v-b1e43839] {
  3409. left: 32px;
  3410. }
  3411. .images-viewer .back.hide[data-v-b1e43839] {
  3412. box-shadow: none;
  3413. transform: translateX(calc(-100% - 32px));
  3414. }
  3415. .images-viewer .forward[data-v-b1e43839] {
  3416. right: 32px;
  3417. }
  3418. .images-viewer .forward.hide[data-v-b1e43839] {
  3419. box-shadow: none;
  3420. transform: translateX(calc(100% + 32px));
  3421. }
  3422. .images-viewer .back[data-v-b1e43839]:hover,
  3423. .images-viewer .forward[data-v-b1e43839]:hover {
  3424. background-color: var(--default-background);
  3425. }
  3426. .images-viewer .back[data-v-b1e43839]:focus,
  3427. .images-viewer .forward[data-v-b1e43839]:focus {
  3428. box-shadow: 0 0 0 2px var(--tieba-theme-color);
  3429. }
  3430. .images-viewer .image-container[data-v-b1e43839] {
  3431. display: flex;
  3432. width: 100%;
  3433. height: 100%;
  3434. align-items: center;
  3435. justify-content: center;
  3436. }
  3437. .images-viewer .image-container .curr-image[data-v-b1e43839] {
  3438. position: absolute;
  3439. -o-object-fit: contain;
  3440. object-fit: contain;
  3441. transition: var(--487af7f1);
  3442. }
  3443. .images-viewer .image-container .curr-image.changing[data-v-b1e43839] {
  3444. display: none;
  3445. transition: none;
  3446. }
  3447. .images-viewer .bottom-controls[data-v-b1e43839] {
  3448. bottom: 16px;
  3449. display: flex;
  3450. margin-top: auto;
  3451. gap: 4px;
  3452. transition: 0.4s;
  3453. }
  3454. .images-viewer .bottom-controls.hide[data-v-b1e43839] {
  3455. box-shadow: none;
  3456. transform: translateY(calc(100% + 16px));
  3457. }
  3458. .images-viewer .bottom-controls .bottom-btn[data-v-b1e43839] {
  3459. overflow: hidden;
  3460. width: 100px;
  3461. height: 75px;
  3462. padding: 0;
  3463. border: none;
  3464. border-radius: 10px;
  3465. background-color: var(--trans-default-background);
  3466. transition: all linear 0.1s;
  3467. }
  3468. .images-viewer .bottom-controls .bottom-btn .image-list[data-v-b1e43839] {
  3469. width: 100%;
  3470. height: 100%;
  3471. -o-object-fit: cover;
  3472. object-fit: cover;
  3473. }
  3474. .images-viewer .bottom-controls .bottom-btn.selected[data-v-b1e43839] {
  3475. border: 3px solid var(--tieba-theme-color);
  3476. }@keyframes kf-fade-in-b160e8b2 {
  3477. 0% {
  3478. opacity: 0;
  3479. }
  3480. 100% {
  3481. opacity: 1;
  3482. }
  3483. }
  3484. @keyframes kf-fade-out-b160e8b2 {
  3485. 0% {
  3486. opacity: 1;
  3487. }
  3488. 100% {
  3489. opacity: 0;
  3490. }
  3491. }
  3492. @keyframes kf-dialog-in-b160e8b2 {
  3493. 0% {
  3494. opacity: 0;
  3495. transform: scale(1.2);
  3496. }
  3497. 100% {
  3498. opacity: 1;
  3499. transform: scale(1);
  3500. }
  3501. }
  3502. @keyframes kf-zoom-in-b160e8b2 {
  3503. 0% {
  3504. transform: scale(0.72);
  3505. }
  3506. 100% {
  3507. transform: scale(1);
  3508. }
  3509. }
  3510. @keyframes kf-fade-zoom-in-b160e8b2 {
  3511. 0% {
  3512. opacity: 0;
  3513. transform: scale(0.72);
  3514. }
  3515. 100% {
  3516. opacity: 1;
  3517. transform: scale(1);
  3518. }
  3519. }
  3520. html[data-v-b160e8b2] {
  3521. padding: 0;
  3522. margin: 0;
  3523. text-align: justify;
  3524. }
  3525. body[data-v-b160e8b2] {
  3526. overflow-x: hidden;
  3527. overflow-y: scroll;
  3528. overflow: hidden scroll;
  3529. padding: 0;
  3530. margin: 0;
  3531. font-family: var(--code-zh);
  3532. }
  3533. body[no-scrollbar][data-v-b160e8b2] {
  3534. overflow: hidden;
  3535. }
  3536. div[data-v-b160e8b2],
  3537. p[data-v-b160e8b2] {
  3538. margin: 0;
  3539. }
  3540. select[data-v-b160e8b2] {
  3541. padding: 1px 8px;
  3542. border: 1px solid var(--border-color);
  3543. border-radius: 8px;
  3544. cursor: pointer;
  3545. }
  3546. option[data-v-b160e8b2] {
  3547. cursor: pointer;
  3548. }
  3549. option[data-v-b160e8b2]:checked {
  3550. background-color: var(--tieba-theme-color);
  3551. color: var(--default-background);
  3552. }
  3553. a[data-v-b160e8b2] {
  3554. color: inherit;
  3555. -webkit-text-decoration: none;
  3556. text-decoration: none;
  3557. word-break: break-all;
  3558. }
  3559. .dialogJ[data-v-b160e8b2] {
  3560. position: fixed !important;
  3561. top: 50% !important;
  3562. left: 50% !important;
  3563. }
  3564. .dialogJ[data-v-b160e8b2] {
  3565. transform: translate(-50%, -50%);
  3566. }
  3567. .post-container .bottom-controls .replies[data-v-b160e8b2]::before {
  3568. font-family: "Material Symbols", monospace !important;
  3569. }
  3570. .post-container .bottom-controls .replies[data-v-b160e8b2]::before {
  3571. font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 40;
  3572. -webkit-user-select: none;
  3573. -moz-user-select: none;
  3574. user-select: none;
  3575. }
  3576. a[data-v-b160e8b2] {
  3577. color: inherit;
  3578. -webkit-text-decoration: none;
  3579. text-decoration: none;
  3580. }
  3581. p[data-v-b160e8b2] {
  3582. margin: 0;
  3583. }
  3584. img[data-v-b160e8b2]::before {
  3585. display: block;
  3586. width: 100%;
  3587. height: 100%;
  3588. box-sizing: border-box;
  3589. background-color: var(--light-background);
  3590. content: "";
  3591. }
  3592. .dynamic .img-button[data-v-b160e8b2] {
  3593. min-width: 30% !important;
  3594. flex: initial !important;
  3595. flex-grow: 1 !important;
  3596. }
  3597. .post-container[data-v-b160e8b2] {
  3598. display: flex;
  3599. width: 100%;
  3600. box-sizing: border-box;
  3601. flex-direction: column;
  3602. padding: 16px;
  3603. border-radius: 16px;
  3604. background-color: var(--default-background);
  3605. cursor: pointer;
  3606. gap: 20px;
  3607. text-align: justify;
  3608. }
  3609. .post-container .forum-btn[data-v-b160e8b2] {
  3610. border-radius: 24px;
  3611. font-size: 14px;
  3612. }
  3613. .post-container .forum-btn[data-v-b160e8b2]:not(:hover):not(:active):not(:focus) {
  3614. background-color: var(--light-background);
  3615. box-shadow: none;
  3616. }
  3617. .post-container .main-content[data-v-b160e8b2] {
  3618. display: flex;
  3619. flex-direction: column;
  3620. gap: 8px;
  3621. }
  3622. .post-container .main-content .title[data-v-b160e8b2] {
  3623. margin: 0;
  3624. color: var(--highlight-fore);
  3625. font-weight: bold;
  3626. }
  3627. .post-container .main-content .content[data-v-b160e8b2] {
  3628. overflow: hidden;
  3629. color: var(--light-fore);
  3630. font-size: 14px;
  3631. text-overflow: ellipsis;
  3632. }
  3633. .post-container .img-container[data-v-b160e8b2] {
  3634. display: flex;
  3635. overflow: hidden;
  3636. flex-wrap: wrap;
  3637. border-radius: 16px;
  3638. gap: 6px;
  3639. }
  3640. .post-container .img-container .img-button[data-v-b160e8b2] {
  3641. overflow: hidden;
  3642. min-width: 40%;
  3643. height: 144px;
  3644. flex: 1;
  3645. padding: 0;
  3646. border: none;
  3647. border-radius: 0;
  3648. }
  3649. .post-container .img-container .img-button .post-img[data-v-b160e8b2] {
  3650. width: 100%;
  3651. height: 100%;
  3652. -o-object-fit: cover;
  3653. object-fit: cover;
  3654. transition: 0.4s cubic-bezier(0, 0, 0.2, 1);
  3655. }
  3656. .post-container .img-container .img-button .post-img[data-v-b160e8b2]:hover {
  3657. scale: 1.2;
  3658. }
  3659. .post-container .bottom-controls[data-v-b160e8b2] {
  3660. display: flex;
  3661. align-items: center;
  3662. gap: 12px;
  3663. }
  3664. .post-container .bottom-controls .author[data-v-b160e8b2] {
  3665. display: flex;
  3666. align-items: center;
  3667. padding: 0;
  3668. border-radius: 24px;
  3669. background-color: transparent;
  3670. background-color: initial;
  3671. }
  3672. .post-container .bottom-controls .author .author-portrait[data-v-b160e8b2] {
  3673. width: 32px;
  3674. height: 32px;
  3675. border-radius: 24px;
  3676. -o-object-fit: cover;
  3677. object-fit: cover;
  3678. }
  3679. .post-container .bottom-controls .author .author-info[data-v-b160e8b2] {
  3680. display: flex;
  3681. flex-direction: column;
  3682. padding: 0 10px;
  3683. text-align: left;
  3684. }
  3685. .post-container .bottom-controls .author .author-info .author-name[data-v-b160e8b2] {
  3686. font-size: 14px;
  3687. font-weight: bold;
  3688. }
  3689. .post-container .bottom-controls .author .author-info .post-time[data-v-b160e8b2] {
  3690. color: var(--minimal-fore);
  3691. font-size: 12px;
  3692. }
  3693. .post-container .bottom-controls .author[data-v-b160e8b2]:not(:hover):not(:active):not(:focus) {
  3694. box-shadow: none;
  3695. }
  3696. .post-container .bottom-controls .replies[data-v-b160e8b2] {
  3697. display: flex;
  3698. min-width: 16px;
  3699. align-items: center;
  3700. border-radius: 24px;
  3701. margin-left: auto;
  3702. color: var(--light-fore);
  3703. font-family: var(--code-monospace);
  3704. font-size: 13px;
  3705. font-weight: bold;
  3706. }
  3707. .post-container .bottom-controls .replies[data-v-b160e8b2]::before {
  3708. margin-right: 6px;
  3709. content: "forum";
  3710. font-size: 16px;
  3711. font-weight: normal;
  3712. }.masonry-wrapper[data-v-0a8673bc] {
  3713. display: flex;
  3714. width: 100%;
  3715. max-width: var(--content-max);
  3716. flex-direction: column;
  3717. align-items: center;
  3718. gap: 12px;
  3719. }
  3720. .masonry-wrapper .masonry-container[data-v-0a8673bc] {
  3721. width: 100%;
  3722. margin: auto;
  3723. }
  3724. @keyframes feeds-in-0a8673bc {
  3725. 0% {
  3726. transform: scale(0.72);
  3727. }
  3728. 100% {
  3729. transform: scale(1);
  3730. }
  3731. }
  3732. .masonry-wrapper .masonry-container .post-elem[data-v-0a8673bc] {
  3733. animation: feeds-in-0a8673bc 0.4s cubic-bezier(0.18, 0.89, 0.32, 1.2);
  3734. }
  3735. .masonry-wrapper .masonry-container .post-elem[data-v-0a8673bc]:not(:hover):not(:active):not(:focus) {
  3736. box-shadow: none;
  3737. }
  3738. .masonry-wrapper > .post-elem[data-v-0a8673bc] {
  3739. position: absolute !important;
  3740. visibility: hidden !important;
  3741. }.about-wrapper[data-v-8c03e998] {
  3742. display: flex;
  3743. flex-direction: column;
  3744. align-items: center;
  3745. padding: 8px;
  3746. margin: auto;
  3747. gap: 12px;
  3748. }
  3749. .about-wrapper .main-title[data-v-8c03e998] {
  3750. display: flex;
  3751. align-items: center;
  3752. gap: 12px;
  3753. }
  3754. .about-wrapper .main-title .main-icon[data-v-8c03e998] {
  3755. width: 64px;
  3756. height: 64px;
  3757. }
  3758. .about-wrapper .main-title .title[data-v-8c03e998] {
  3759. color: var(--highlight-fore);
  3760. font-size: 32px;
  3761. font-style: italic;
  3762. font-weight: bold;
  3763. }
  3764. .about-wrapper .script-info[data-v-8c03e998] {
  3765. display: flex;
  3766. flex-direction: column;
  3767. align-items: center;
  3768. color: var(--minimal-fore);
  3769. gap: 8px;
  3770. }
  3771. .about-wrapper .script-info .author-info[data-v-8c03e998] {
  3772. display: flex;
  3773. align-items: baseline;
  3774. gap: 8px;
  3775. }
  3776. .about-wrapper .about-controls[data-v-8c03e998] {
  3777. display: flex;
  3778. margin-top: 16px;
  3779. gap: 8px;
  3780. }
  3781. .about-wrapper .about-controls .about-button[data-v-8c03e998] {
  3782. padding: 6px 10px;
  3783. font-size: 14px;
  3784. }.update-wrapper[data-v-8906d00c] {
  3785. display: flex;
  3786. max-width: 100%;
  3787. flex-direction: column;
  3788. gap: 8px;
  3789. }
  3790. .update-wrapper .latest-info[data-v-8906d00c] {
  3791. display: flex;
  3792. align-items: center;
  3793. padding: 2px 8px;
  3794. border-radius: 16px;
  3795. margin: auto;
  3796. margin-bottom: 12px;
  3797. background-color: var(--level-blue-background);
  3798. color: var(--level-blue-fore);
  3799. gap: 6px;
  3800. }
  3801. .update-wrapper .latest-info.is-latest[data-v-8906d00c] {
  3802. background-color: var(--level-green-background);
  3803. color: var(--level-green-fore);
  3804. }
  3805. .update-wrapper .title-container[data-v-8906d00c] {
  3806. display: flex;
  3807. align-items: center;
  3808. gap: 10px;
  3809. }
  3810. .update-wrapper .title-container .title[data-v-8906d00c] {
  3811. font-size: 20px;
  3812. font-weight: bold;
  3813. }
  3814. .update-wrapper .title-container .is-pre-release[data-v-8906d00c] {
  3815. padding: 2px 8px;
  3816. border-radius: 16px;
  3817. background-color: var(--level-orange-background);
  3818. color: var(--level-orange-fore);
  3819. font-size: 14px;
  3820. }
  3821. .update-wrapper .main-info[data-v-8906d00c] {
  3822. display: flex;
  3823. align-items: center;
  3824. gap: 8px;
  3825. }
  3826. .update-wrapper .main-info .avatar[data-v-8906d00c] {
  3827. width: 32px;
  3828. height: 32px;
  3829. border-radius: 32px;
  3830. }
  3831. .update-wrapper .main-info .release-time[data-v-8906d00c] {
  3832. margin-left: auto;
  3833. }
  3834. .update-wrapper .update-controls[data-v-8906d00c] {
  3835. display: flex;
  3836. align-items: center;
  3837. margin-top: 8px;
  3838. gap: 8px;
  3839. }
  3840. .update-wrapper .update-controls .up-button[data-v-8906d00c] {
  3841. padding: 4px 8px;
  3842. border-radius: 10px;
  3843. font-size: 15px;
  3844. font-weight: bold;
  3845. }
  3846. .update-wrapper .update-controls .up-name[data-v-8906d00c] {
  3847. font-family: var(--code-monospace);
  3848. }
  3849. .forbidden-wrapper[data-v-8906d00c] {
  3850. display: flex;
  3851. width: 100%;
  3852. height: 100%;
  3853. flex-direction: column;
  3854. align-items: center;
  3855. }
  3856. .forbidden-wrapper .icon[data-v-8906d00c] {
  3857. font-size: 64px;
  3858. }.layout-custom-back[data-v-fcb5c431] {
  3859. display: flex;
  3860. width: 100%;
  3861. flex-direction: column;
  3862. gap: 8px;
  3863. }
  3864. .layout-custom-back .custom-image[data-v-fcb5c431] {
  3865. max-width: 100%;
  3866. max-height: 320px;
  3867. border-radius: 8px;
  3868. margin: 0 auto;
  3869. }
  3870. .layout-custom-back .custom-back-buttons[data-v-fcb5c431] {
  3871. display: flex;
  3872. align-items: center;
  3873. justify-content: flex-end;
  3874. gap: 6px;
  3875. }
  3876. .layout-custom-back .adjust-controls[data-v-fcb5c431] {
  3877. display: flex;
  3878. flex-direction: column;
  3879. gap: 8px;
  3880. }
  3881. .layout-custom-back .adjust-controls .control-set[data-v-fcb5c431] {
  3882. display: flex;
  3883. align-items: baseline;
  3884. gap: 6px;
  3885. }
  3886. .layout-custom-back .adjust-controls .control-set .editor[data-v-fcb5c431] {
  3887. width: auto;
  3888. font-family: var(--code-zh);
  3889. }.theme-color-component[data-v-54fb2e9b] {
  3890. display: flex;
  3891. width: 100%;
  3892. flex-direction: column;
  3893. align-items: flex-start;
  3894. gap: 6px;
  3895. }
  3896. .theme-color-component .title[data-v-54fb2e9b] {
  3897. margin: 0;
  3898. color: var(--minimal-fore);
  3899. text-align: center;
  3900. }
  3901. .theme-color-component .picker[data-v-54fb2e9b] {
  3902. display: flex;
  3903. gap: 6px;
  3904. }
  3905. .theme-color-component .picker label[data-v-54fb2e9b] {
  3906. color: var(--minimal-fore);
  3907. }
  3908. .theme-color-component .reset-button[data-v-54fb2e9b] {
  3909. margin-left: auto;
  3910. }.theme-picker {
  3911. z-index: 9999 !important;
  3912. }@keyframes kf-fade-in-a690d550 {
  3913. 0% {
  3914. opacity: 0;
  3915. }
  3916. 100% {
  3917. opacity: 1;
  3918. }
  3919. }
  3920. @keyframes kf-fade-out-a690d550 {
  3921. 0% {
  3922. opacity: 1;
  3923. }
  3924. 100% {
  3925. opacity: 0;
  3926. }
  3927. }
  3928. @keyframes kf-dialog-in-a690d550 {
  3929. 0% {
  3930. opacity: 0;
  3931. transform: scale(1.2);
  3932. }
  3933. 100% {
  3934. opacity: 1;
  3935. transform: scale(1);
  3936. }
  3937. }
  3938. @keyframes kf-zoom-in-a690d550 {
  3939. 0% {
  3940. transform: scale(0.72);
  3941. }
  3942. 100% {
  3943. transform: scale(1);
  3944. }
  3945. }
  3946. @keyframes kf-fade-zoom-in-a690d550 {
  3947. 0% {
  3948. opacity: 0;
  3949. transform: scale(0.72);
  3950. }
  3951. 100% {
  3952. opacity: 1;
  3953. transform: scale(1);
  3954. }
  3955. }
  3956. .user-textbox[data-v-a690d550] {
  3957. box-sizing: border-box;
  3958. padding: 4px;
  3959. border: 2px solid var(--border-color);
  3960. border-radius: 6px;
  3961. background-color: var(--default-background);
  3962. outline: none;
  3963. transition: 0.4s;
  3964. }
  3965. .user-textbox[data-v-a690d550]:hover {
  3966. border-color: var(--light-background);
  3967. }
  3968. .user-textbox[data-v-a690d550]:focus {
  3969. border-color: var(--tieba-theme-color);
  3970. }
  3971. .lodash-style.user-textbox[data-v-a690d550] {
  3972. padding: 0;
  3973. border: none;
  3974. border-radius: 0;
  3975. border-bottom: 2px solid var(--border-color);
  3976. }@keyframes kf-fade-in-8c694269 {
  3977. 0% {
  3978. opacity: 0;
  3979. }
  3980. 100% {
  3981. opacity: 1;
  3982. }
  3983. }
  3984. @keyframes kf-fade-out-8c694269 {
  3985. 0% {
  3986. opacity: 1;
  3987. }
  3988. 100% {
  3989. opacity: 0;
  3990. }
  3991. }
  3992. @keyframes kf-dialog-in-8c694269 {
  3993. 0% {
  3994. opacity: 0;
  3995. transform: scale(1.2);
  3996. }
  3997. 100% {
  3998. opacity: 1;
  3999. transform: scale(1);
  4000. }
  4001. }
  4002. @keyframes kf-zoom-in-8c694269 {
  4003. 0% {
  4004. transform: scale(0.72);
  4005. }
  4006. 100% {
  4007. transform: scale(1);
  4008. }
  4009. }
  4010. @keyframes kf-fade-zoom-in-8c694269 {
  4011. 0% {
  4012. opacity: 0;
  4013. transform: scale(0.72);
  4014. }
  4015. 100% {
  4016. opacity: 1;
  4017. transform: scale(1);
  4018. }
  4019. }
  4020. html[data-v-8c694269] {
  4021. padding: 0;
  4022. margin: 0;
  4023. text-align: justify;
  4024. }
  4025. body[data-v-8c694269] {
  4026. overflow-x: hidden;
  4027. overflow-y: scroll;
  4028. overflow: hidden scroll;
  4029. padding: 0;
  4030. margin: 0;
  4031. font-family: var(--code-zh);
  4032. }
  4033. body[no-scrollbar][data-v-8c694269] {
  4034. overflow: hidden;
  4035. }
  4036. div[data-v-8c694269],
  4037. p[data-v-8c694269] {
  4038. margin: 0;
  4039. }
  4040. select[data-v-8c694269] {
  4041. padding: 1px 8px;
  4042. border: 1px solid var(--border-color);
  4043. border-radius: 8px;
  4044. cursor: pointer;
  4045. }
  4046. option[data-v-8c694269] {
  4047. cursor: pointer;
  4048. }
  4049. option[data-v-8c694269]:checked {
  4050. background-color: var(--tieba-theme-color);
  4051. color: var(--default-background);
  4052. }
  4053. a[data-v-8c694269] {
  4054. color: inherit;
  4055. -webkit-text-decoration: none;
  4056. text-decoration: none;
  4057. word-break: break-all;
  4058. }
  4059. .dialogJ[data-v-8c694269] {
  4060. position: fixed !important;
  4061. top: 50% !important;
  4062. left: 50% !important;
  4063. }
  4064. .dialogJ[data-v-8c694269] {
  4065. transform: translate(-50%, -50%);
  4066. }
  4067. @keyframes content-in-8c694269 {
  4068. 0% {
  4069. opacity: 0;
  4070. transform: translateY(20px);
  4071. }
  4072. 100% {
  4073. opacity: 1;
  4074. }
  4075. }
  4076. .key-button[data-v-8c694269] {
  4077. display: flex;
  4078. overflow: hidden;
  4079. min-width: 80px;
  4080. align-items: center;
  4081. padding: 12px 16px;
  4082. border-radius: 0;
  4083. box-shadow: none;
  4084. font-size: 16px;
  4085. gap: 12px;
  4086. text-align: justify;
  4087. white-space: nowrap;
  4088. }
  4089. .key-button .icon[data-v-8c694269] {
  4090. font-size: 20px;
  4091. font-variation-settings: "FILL" 0, "wght" 300;
  4092. transition: font-variation-settings 0.2s ease;
  4093. }
  4094. .key-button .key-info[data-v-8c694269] {
  4095. display: flex;
  4096. width: calc(100% - 32px);
  4097. flex-direction: column;
  4098. }
  4099. .key-button .key-title[data-v-8c694269],
  4100. .key-button .key-desc[data-v-8c694269] {
  4101. overflow: hidden;
  4102. text-overflow: ellipsis;
  4103. }
  4104. .key-button .key-desc[data-v-8c694269] {
  4105. color: var(--minimal-fore);
  4106. font-size: 14px;
  4107. }
  4108. .key-button.selected[data-v-8c694269] {
  4109. background-color: var(--tieba-theme-color) !important;
  4110. color: var(--default-background) !important;
  4111. }
  4112. .key-button.selected[data-v-8c694269] {
  4113. font-weight: bold;
  4114. }
  4115. .key-button.selected .icon[data-v-8c694269] {
  4116. font-variation-settings: "FILL" 1, "GRAD" 48, "wght" 300;
  4117. font-weight: normal;
  4118. }
  4119. .key-button.selected .key-desc[data-v-8c694269] {
  4120. color: var(--default-background);
  4121. }
  4122. .settings-wrapper[data-v-8c694269] {
  4123. display: flex;
  4124. overflow: hidden;
  4125. width: 72%;
  4126. min-width: 720px;
  4127. height: 72%;
  4128. min-height: 400px;
  4129. box-sizing: border-box;
  4130. border: 1px solid var(--light-border-color);
  4131. border-radius: 18px;
  4132. margin: auto;
  4133. animation: kf-dialog-in-8c694269 0.4s ease;
  4134. background-color: var(--default-background);
  4135. box-shadow: 0 0 24px rgba(0, 0, 0, 0.2);
  4136. }
  4137. .settings-wrapper .left-container[data-v-8c694269] {
  4138. display: flex;
  4139. width: 30%;
  4140. max-width: 280px;
  4141. flex-direction: column;
  4142. }
  4143. .settings-wrapper .left-container .search-controls[data-v-8c694269] {
  4144. display: flex;
  4145. flex-direction: column;
  4146. padding: 16px;
  4147. gap: 8px;
  4148. }
  4149. .settings-wrapper .left-container .search-controls .title[data-v-8c694269] {
  4150. color: var(--default-fore) !important;
  4151. }
  4152. .settings-wrapper .left-container .search-controls .title[data-v-8c694269] {
  4153. margin-top: 8px;
  4154. font-size: 20px;
  4155. font-weight: bold;
  4156. line-height: normal;
  4157. }
  4158. .settings-wrapper .left-container .search-controls .search-box[data-v-8c694269] {
  4159. padding: 6px;
  4160. font-size: 14px;
  4161. }
  4162. .settings-wrapper .left-container .left-panel[data-v-8c694269] {
  4163. display: flex;
  4164. box-sizing: border-box;
  4165. flex-direction: column;
  4166. }
  4167. .settings-wrapper .middle-container[data-v-8c694269] {
  4168. display: flex;
  4169. width: 20%;
  4170. max-width: 220px;
  4171. flex-direction: column;
  4172. padding: 16px 6px;
  4173. background-color: var(--deep-background);
  4174. gap: 6px;
  4175. }
  4176. .settings-wrapper .middle-container .sub-key[data-v-8c694269] {
  4177. display: flex;
  4178. padding: 8px 16px;
  4179. border-radius: 12px;
  4180. gap: 4px;
  4181. }
  4182. .settings-wrapper .middle-container .sub-key .key-title[data-v-8c694269] {
  4183. font-size: 14px;
  4184. }
  4185. .settings-wrapper .middle-container .sub-key[data-v-8c694269]:not(:hover):not(:active):not(:focus) {
  4186. background-color: transparent;
  4187. background-color: initial;
  4188. }
  4189. .settings-wrapper .right-container[data-v-8c694269] {
  4190. display: flex;
  4191. overflow: auto;
  4192. width: 50%;
  4193. flex-direction: column;
  4194. flex-grow: 1;
  4195. padding: 16px;
  4196. animation: content-in-8c694269 0.2s cubic-bezier(0, 0, 0.2, 1);
  4197. background-color: var(--default-background);
  4198. font-size: 14px;
  4199. gap: 32px;
  4200. }
  4201. .settings-wrapper .right-container .setting-content[data-v-8c694269] {
  4202. display: flex;
  4203. flex-direction: column;
  4204. gap: 8px;
  4205. }
  4206. .settings-wrapper .right-container .setting-content .content-title[data-v-8c694269] {
  4207. color: var(--highlight-fore);
  4208. font-size: 18px;
  4209. font-weight: bold;
  4210. }
  4211. .settings-wrapper .right-container .setting-content .content-sub-title[data-v-8c694269] {
  4212. color: var(--default-fore);
  4213. font-size: 16px;
  4214. font-weight: bold;
  4215. }
  4216. .settings-wrapper .right-container .setting-content .content-desc[data-v-8c694269] {
  4217. display: flex;
  4218. flex-direction: column;
  4219. color: var(--light-fore);
  4220. gap: 6px;
  4221. }
  4222. .settings-wrapper .right-container .setting-content .content-textbox[data-v-8c694269] {
  4223. box-sizing: content-box;
  4224. margin-left: auto;
  4225. }
  4226. .settings-wrapper .right-container .setting-content .content-textbox.textarea[data-v-8c694269] {
  4227. width: 100%;
  4228. height: 6em;
  4229. resize: none;
  4230. }
  4231. .settings-wrapper .right-container .setting-content .content-image[data-v-8c694269] {
  4232. max-width: 100%;
  4233. max-height: 320px;
  4234. border-radius: 8px;
  4235. margin: 0 auto;
  4236. }
  4237. .settings-wrapper .right-container .setting-content .setting-control[data-v-8c694269] {
  4238. display: flex;
  4239. }
  4240. .settings-wrapper .right-container .setting-content .setting-control .settings-toggle-button[data-v-8c694269] {
  4241. margin-left: auto;
  4242. background: none;
  4243. font-size: 36px;
  4244. }
  4245. .settings-wrapper .right-container .setting-content .setting-control .settings-toggle-button.toggle-on[data-v-8c694269] {
  4246. color: var(--tieba-theme-color);
  4247. }
  4248. .settings-wrapper .right-container .setting-content .setting-control .settings-toggle-button.toggle-on[data-v-8c694269]:hover {
  4249. color: var(--tieba-theme-fore);
  4250. }
  4251. .settings-wrapper .right-container .setting-content .setting-control .icon-component[data-v-8c694269] {
  4252. margin-left: auto;
  4253. font-size: 64px;
  4254. font-variation-settings: "FILL" 1;
  4255. }
  4256. .settings-wrapper .empty-container[data-v-8c694269] {
  4257. margin: auto;
  4258. color: var(--minimal-fore);
  4259. font-size: 72px;
  4260. }@keyframes kf-fade-in-b3af10bd {
  4261. 0% {
  4262. opacity: 0;
  4263. }
  4264. 100% {
  4265. opacity: 1;
  4266. }
  4267. }
  4268. @keyframes kf-fade-out-b3af10bd {
  4269. 0% {
  4270. opacity: 1;
  4271. }
  4272. 100% {
  4273. opacity: 0;
  4274. }
  4275. }
  4276. @keyframes kf-dialog-in-b3af10bd {
  4277. 0% {
  4278. opacity: 0;
  4279. transform: scale(1.2);
  4280. }
  4281. 100% {
  4282. opacity: 1;
  4283. transform: scale(1);
  4284. }
  4285. }
  4286. @keyframes kf-zoom-in-b3af10bd {
  4287. 0% {
  4288. transform: scale(0.72);
  4289. }
  4290. 100% {
  4291. transform: scale(1);
  4292. }
  4293. }
  4294. @keyframes kf-fade-zoom-in-b3af10bd {
  4295. 0% {
  4296. opacity: 0;
  4297. transform: scale(0.72);
  4298. }
  4299. 100% {
  4300. opacity: 1;
  4301. transform: scale(1);
  4302. }
  4303. }
  4304. html[data-v-b3af10bd] {
  4305. padding: 0;
  4306. margin: 0;
  4307. text-align: justify;
  4308. }
  4309. body[data-v-b3af10bd] {
  4310. overflow-x: hidden;
  4311. overflow-y: scroll;
  4312. overflow: hidden scroll;
  4313. padding: 0;
  4314. margin: 0;
  4315. font-family: var(--code-zh);
  4316. }
  4317. body[no-scrollbar][data-v-b3af10bd] {
  4318. overflow: hidden;
  4319. }
  4320. div[data-v-b3af10bd],
  4321. p[data-v-b3af10bd] {
  4322. margin: 0;
  4323. }
  4324. select[data-v-b3af10bd] {
  4325. padding: 1px 8px;
  4326. border: 1px solid var(--border-color);
  4327. border-radius: 8px;
  4328. cursor: pointer;
  4329. }
  4330. option[data-v-b3af10bd] {
  4331. cursor: pointer;
  4332. }
  4333. option[data-v-b3af10bd]:checked {
  4334. background-color: var(--tieba-theme-color);
  4335. color: var(--default-background);
  4336. }
  4337. a[data-v-b3af10bd] {
  4338. color: inherit;
  4339. -webkit-text-decoration: none;
  4340. text-decoration: none;
  4341. word-break: break-all;
  4342. }
  4343. .dialogJ[data-v-b3af10bd] {
  4344. position: fixed !important;
  4345. top: 50% !important;
  4346. left: 50% !important;
  4347. }
  4348. .dialogJ[data-v-b3af10bd] {
  4349. transform: translate(-50%, -50%);
  4350. }
  4351. .index-wrapper .grid-container .profile-menu-container .curr-user .user-profile[data-v-b3af10bd] {
  4352. -o-object-fit: contain;
  4353. object-fit: contain;
  4354. }
  4355. a[data-v-b3af10bd] {
  4356. color: inherit;
  4357. -webkit-text-decoration: none;
  4358. text-decoration: none;
  4359. }
  4360. .block-wrapper[data-v-b3af10bd] {
  4361. display: flex;
  4362. flex-direction: column;
  4363. gap: 8px;
  4364. }
  4365. .block-controls[data-v-b3af10bd] {
  4366. display: flex;
  4367. width: 100%;
  4368. align-items: center;
  4369. gap: 8px;
  4370. }
  4371. .block-controls .block-title[data-v-b3af10bd] {
  4372. margin: 0;
  4373. font-size: 24px;
  4374. font-weight: bold;
  4375. }
  4376. .block-container[data-v-b3af10bd] {
  4377. padding: 8px;
  4378. border-radius: 12px;
  4379. background-color: var(--trans-light-background);
  4380. }
  4381. html:not([perf-saver]) body.custom-background .block-container[data-v-b3af10bd] {
  4382. -webkit-backdrop-filter: blur(24px);
  4383. backdrop-filter: blur(24px);
  4384. }
  4385. html.dark-theme body.custom-background .block-container[data-v-b3af10bd] {
  4386. -webkit-backdrop-filter: blur(24px) brightness(0.8);
  4387. backdrop-filter: blur(24px) brightness(0.8);
  4388. }
  4389. .block-panel[data-v-b3af10bd] {
  4390. display: flex;
  4391. min-width: 30px;
  4392. height: 26px;
  4393. align-items: center;
  4394. justify-content: center;
  4395. padding: 2px 8px;
  4396. border-radius: 24px;
  4397. margin-left: auto;
  4398. background-color: var(--trans-light-background);
  4399. font-size: 14px;
  4400. text-align: center;
  4401. }
  4402. .block-panel .icon[data-v-b3af10bd] {
  4403. color: var(--light-fore);
  4404. font-size: 18px;
  4405. }
  4406. .block-panel .panel-btn[data-v-b3af10bd] {
  4407. width: 30px;
  4408. height: 30px;
  4409. padding: 4px;
  4410. border: none;
  4411. border-radius: 48px;
  4412. }
  4413. .block-panel.left-align[data-v-b3af10bd] {
  4414. margin-left: 0;
  4415. }
  4416. .index-wrapper[data-v-b3af10bd] {
  4417. display: flex;
  4418. flex-direction: column;
  4419. align-items: center;
  4420. gap: 12px;
  4421. }
  4422. .index-wrapper .grid-container[data-v-b3af10bd] {
  4423. display: grid;
  4424. max-width: var(--content-max);
  4425. margin: 16px;
  4426. grid-gap: 36px;
  4427. gap: 36px;
  4428. grid-template-rows: repeat(1, 1fr);
  4429. }
  4430. .index-wrapper .grid-container .head-controls[data-v-b3af10bd] {
  4431. display: flex;
  4432. flex-direction: column;
  4433. align-items: center;
  4434. padding: 24px;
  4435. margin-top: 24px;
  4436. gap: 24px;
  4437. }
  4438. .index-wrapper .grid-container .head-controls .main-title[data-v-b3af10bd] {
  4439. display: flex;
  4440. align-items: center;
  4441. justify-content: center;
  4442. gap: 12px;
  4443. }
  4444. .index-wrapper .grid-container .head-controls .main-title .main-icon[data-v-b3af10bd] {
  4445. height: 64px;
  4446. }
  4447. .index-wrapper .grid-container .head-controls .main-title .title[data-v-b3af10bd] {
  4448. font-size: 36px;
  4449. font-style: italic;
  4450. font-weight: bold;
  4451. }
  4452. .index-wrapper .grid-container .head-controls .search-controls[data-v-b3af10bd] {
  4453. position: relative;
  4454. display: grid;
  4455. width: 100%;
  4456. max-width: 420px;
  4457. justify-content: center;
  4458. grid-template-columns: 1fr 72px;
  4459. }
  4460. .index-wrapper .grid-container .head-controls .search-controls .search-box[data-v-b3af10bd] {
  4461. width: 100%;
  4462. padding: 8px;
  4463. border-bottom-right-radius: 0;
  4464. border-top-right-radius: 0;
  4465. font-size: 16px;
  4466. }
  4467. .index-wrapper .grid-container .head-controls .search-controls .search-button[data-v-b3af10bd] {
  4468. border: none;
  4469. border-bottom-left-radius: 0;
  4470. border-top-left-radius: 0;
  4471. font-size: 16px;
  4472. font-weight: bold;
  4473. }
  4474. .index-wrapper .grid-container .head-controls .search-controls .search-suggestions[data-v-b3af10bd] {
  4475. position: absolute;
  4476. z-index: 1;
  4477. top: 100%;
  4478. display: flex;
  4479. overflow: hidden;
  4480. width: 100%;
  4481. box-sizing: border-box;
  4482. flex-direction: column;
  4483. border: 1px solid var(--border-color);
  4484. border-radius: 6px;
  4485. margin-top: 4px;
  4486. background-color: var(--default-background);
  4487. box-shadow: 0 0 20px rgba(0, 0, 0, 0.2);
  4488. animation: kf-fade-in-b3af10bd 0.2s;
  4489. }
  4490. .index-wrapper .grid-container .head-controls .search-controls .search-suggestions .search-elem[data-v-b3af10bd] {
  4491. display: flex;
  4492. overflow: hidden;
  4493. box-sizing: border-box;
  4494. padding: 0;
  4495. padding: 8px;
  4496. border: none;
  4497. border-radius: 0;
  4498. animation: stretch-b3af10bd 0.2s cubic-bezier(0.22, 0.61, 0.36, 1);
  4499. gap: 8px;
  4500. text-align: justify;
  4501. }
  4502. @keyframes stretch-b3af10bd {
  4503. 0% {
  4504. padding: 4px 8px;
  4505. }
  4506. 100% {
  4507. padding: 8px;
  4508. }
  4509. }
  4510. .index-wrapper .grid-container .head-controls .search-controls .search-suggestions .search-elem .sugg-img[data-v-b3af10bd] {
  4511. width: 42px;
  4512. height: 42px;
  4513. border-radius: 8px;
  4514. }
  4515. .index-wrapper .grid-container .head-controls .search-controls .search-suggestions .search-elem .sugg-content[data-v-b3af10bd] {
  4516. position: relative;
  4517. display: flex;
  4518. width: calc(100% - 42px - 8px);
  4519. flex-direction: column;
  4520. justify-content: center;
  4521. gap: 4px;
  4522. }
  4523. .index-wrapper .grid-container .head-controls .search-controls .search-suggestions .search-elem .sugg-content .sugg-title[data-v-b3af10bd] {
  4524. overflow: hidden;
  4525. margin: 0;
  4526. font-size: 14px;
  4527. font-weight: bold;
  4528. text-overflow: ellipsis;
  4529. white-space: nowrap;
  4530. }
  4531. .index-wrapper .grid-container .head-controls .search-controls .search-suggestions .search-elem .sugg-content .sugg-desc[data-v-b3af10bd] {
  4532. overflow: hidden;
  4533. margin: 0;
  4534. color: var(--light-fore);
  4535. font-size: 12px;
  4536. text-overflow: ellipsis;
  4537. white-space: nowrap;
  4538. }
  4539. .index-wrapper .grid-container .profile-menu-container[data-v-b3af10bd] {
  4540. position: absolute;
  4541. z-index: 1;
  4542. }
  4543. .index-wrapper .grid-container .profile-menu-container .curr-user[data-v-b3af10bd] {
  4544. position: fixed;
  4545. top: 24px;
  4546. left: 24px;
  4547. overflow: hidden;
  4548. width: 36px;
  4549. height: 36px;
  4550. padding: 0;
  4551. border: 3px solid var(--border-color);
  4552. border-radius: 36px;
  4553. }
  4554. .index-wrapper .grid-container .profile-menu-container .curr-user .user-profile[data-v-b3af10bd] {
  4555. width: 100%;
  4556. }
  4557. .index-wrapper .grid-container .profile-menu-container .profile-menu[data-v-b3af10bd] {
  4558. top: 64px;
  4559. left: 24px;
  4560. }
  4561. .index-wrapper .grid-container .config-menu-container[data-v-b3af10bd] {
  4562. position: absolute;
  4563. z-index: 1;
  4564. display: flex;
  4565. }
  4566. .index-wrapper .grid-container .config-menu-container .config-menu-btn[data-v-b3af10bd] {
  4567. position: fixed;
  4568. top: 24px;
  4569. right: 24px;
  4570. height: 32px;
  4571. border: none;
  4572. border-radius: 36px;
  4573. background-color: var(--page-background);
  4574. font-size: 24px;
  4575. }
  4576. .index-wrapper .grid-container .config-menu-container .config-menu-btn[data-v-b3af10bd]:hover {
  4577. background-color: var(--default-background);
  4578. }
  4579. .index-wrapper .grid-container .config-menu-container .config-menu-btn[data-v-b3af10bd]:active {
  4580. background-color: var(--default-hover);
  4581. }
  4582. .index-wrapper .grid-container .config-menu-container .config-menu[data-v-b3af10bd] {
  4583. top: 64px;
  4584. right: 24px;
  4585. opacity: 1;
  4586. }
  4587. .index-wrapper .grid-container .signed-count[data-v-b3af10bd] {
  4588. font-weight: bold;
  4589. }
  4590. .index-wrapper .grid-container .block-panel.followed[data-v-b3af10bd] {
  4591. margin-left: auto;
  4592. }
  4593. .index-wrapper .grid-container .followed-container[data-v-b3af10bd] {
  4594. margin-top: -16px;
  4595. }
  4596. .index-wrapper .grid-container .followed-container .followed-list[data-v-b3af10bd] {
  4597. display: flex;
  4598. flex-wrap: wrap;
  4599. padding: 8px;
  4600. border-radius: 12px;
  4601. background-color: var(--trans-light-background);
  4602. gap: 4px;
  4603. }
  4604. .index-wrapper .grid-container .followed-container .followed-list .followed-btn[data-v-b3af10bd] {
  4605. display: flex;
  4606. align-items: center;
  4607. padding: 6px 8px;
  4608. border-radius: 12px;
  4609. font-size: 14px;
  4610. gap: 6px;
  4611. }
  4612. .index-wrapper .grid-container .followed-container .followed-list .followed-btn .signed[data-v-b3af10bd] {
  4613. color: green;
  4614. font-weight: bold;
  4615. }
  4616. .index-wrapper .grid-container .followed-container .followed-list .followed-btn .forum-level[data-v-b3af10bd] {
  4617. min-width: 24px;
  4618. padding: 0 2px;
  4619. border-radius: 24px;
  4620. font-weight: bold;
  4621. text-align: center;
  4622. }
  4623. .index-wrapper .grid-container .topic-list[data-v-b3af10bd] {
  4624. display: grid;
  4625. grid-gap: 4px;
  4626. gap: 4px;
  4627. grid-auto-rows: max-content;
  4628. grid-template-columns: repeat(2, 1fr);
  4629. }
  4630. .index-wrapper .grid-container .topic-list .topic-btn[data-v-b3af10bd] {
  4631. display: flex;
  4632. width: 100%;
  4633. height: 100%;
  4634. align-items: center;
  4635. padding: 12px;
  4636. border-radius: 12px;
  4637. gap: 8px;
  4638. }
  4639. .index-wrapper .grid-container .topic-list .topic-btn .topic-img[data-v-b3af10bd] {
  4640. width: 72px;
  4641. border-radius: 12px;
  4642. }
  4643. .index-wrapper .grid-container .topic-list .topic-btn .topic-content[data-v-b3af10bd] {
  4644. display: flex;
  4645. flex-flow: column wrap;
  4646. gap: 4px;
  4647. text-align: justify;
  4648. }
  4649. .index-wrapper .grid-container .topic-list .topic-btn .topic-content .topic-title[data-v-b3af10bd] {
  4650. display: flex;
  4651. align-items: center;
  4652. gap: 6px;
  4653. }
  4654. .index-wrapper .grid-container .topic-list .topic-btn .topic-content .topic-title [class^=topic-rank][data-v-b3af10bd] {
  4655. padding: 0 4px;
  4656. border-radius: 4px;
  4657. background-color: orange;
  4658. color: var(--default-background);
  4659. font-weight: bold;
  4660. text-align: center;
  4661. }
  4662. .index-wrapper .grid-container .topic-list .topic-btn .topic-content .topic-title .topic-name[data-v-b3af10bd] {
  4663. font-size: 16px;
  4664. font-weight: bold;
  4665. }
  4666. .index-wrapper .grid-container .topic-list .topic-btn .topic-content .topic-desc[data-v-b3af10bd] {
  4667. color: var(--light-fore);
  4668. font-size: 14px;
  4669. }
  4670. .index-wrapper .masonry-container[data-v-b3af10bd] {
  4671. display: flex;
  4672. width: calc(100% - 32px);
  4673. max-width: var(--content-max);
  4674. box-sizing: border-box;
  4675. flex-direction: column;
  4676. align-items: center;
  4677. gap: 8px;
  4678. }
  4679. .index-wrapper .masonry-container .feeds-container[data-v-b3af10bd] {
  4680. width: 100%;
  4681. margin: auto;
  4682. }
  4683. @keyframes feeds-in-b3af10bd {
  4684. 0% {
  4685. transform: scale(0.72);
  4686. }
  4687. 100% {
  4688. transform: scale(1);
  4689. }
  4690. }
  4691. @keyframes refresh-btn-in-b3af10bd {
  4692. 0% {
  4693. padding: 0 18px;
  4694. opacity: 0;
  4695. }
  4696. 100% {
  4697. padding: 8px 18px;
  4698. opacity: 1;
  4699. }
  4700. }
  4701. .index-wrapper .masonry-container .feeds-container .feeds-refresh-btn[data-v-b3af10bd] {
  4702. position: fixed;
  4703. z-index: 1;
  4704. bottom: 24px;
  4705. left: 50%;
  4706. display: flex;
  4707. align-items: center;
  4708. justify-content: center;
  4709. padding: 8px 18px;
  4710. border-width: 2px;
  4711. border-radius: 16px;
  4712. animation: refresh-btn-in-b3af10bd 0.4s ease;
  4713. box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);
  4714. font-size: 14px;
  4715. font-weight: bold;
  4716. gap: 6px;
  4717. transform: translateX(-50%);
  4718. }
  4719. .index-wrapper .masonry-container .feeds-container .feeds-refresh-btn .icon[data-v-b3af10bd] {
  4720. font-size: 18px;
  4721. }
  4722. .index-wrapper .masonry-container .post-elem[data-v-b3af10bd] {
  4723. animation: feeds-in-b3af10bd 0.4s cubic-bezier(0.18, 0.89, 0.32, 1.2);
  4724. }
  4725. .index-wrapper .masonry-container .post-elem[data-v-b3af10bd]:not(:hover):not(:active):not(:focus) {
  4726. box-shadow: none;
  4727. }
  4728. .index-wrapper .masonry-container .empty-container .no-feed-content[data-v-b3af10bd] {
  4729. color: var(--minimal-fore);
  4730. font-size: small;
  4731. text-align: center;
  4732. }@keyframes kf-fade-in-88fc5825 {
  4733. 0% {
  4734. opacity: 0;
  4735. }
  4736. 100% {
  4737. opacity: 1;
  4738. }
  4739. }
  4740. @keyframes kf-fade-out-88fc5825 {
  4741. 0% {
  4742. opacity: 1;
  4743. }
  4744. 100% {
  4745. opacity: 0;
  4746. }
  4747. }
  4748. @keyframes kf-dialog-in-88fc5825 {
  4749. 0% {
  4750. opacity: 0;
  4751. transform: scale(1.2);
  4752. }
  4753. 100% {
  4754. opacity: 1;
  4755. transform: scale(1);
  4756. }
  4757. }
  4758. @keyframes kf-zoom-in-88fc5825 {
  4759. 0% {
  4760. transform: scale(0.72);
  4761. }
  4762. 100% {
  4763. transform: scale(1);
  4764. }
  4765. }
  4766. @keyframes kf-fade-zoom-in-88fc5825 {
  4767. 0% {
  4768. opacity: 0;
  4769. transform: scale(0.72);
  4770. }
  4771. 100% {
  4772. opacity: 1;
  4773. transform: scale(1);
  4774. }
  4775. }
  4776. html[data-v-88fc5825] {
  4777. padding: 0;
  4778. margin: 0;
  4779. text-align: justify;
  4780. }
  4781. body[data-v-88fc5825] {
  4782. overflow-x: hidden;
  4783. overflow-y: scroll;
  4784. overflow: hidden scroll;
  4785. padding: 0;
  4786. margin: 0;
  4787. font-family: var(--code-zh);
  4788. }
  4789. body[no-scrollbar][data-v-88fc5825] {
  4790. overflow: hidden;
  4791. }
  4792. div[data-v-88fc5825],
  4793. p[data-v-88fc5825] {
  4794. margin: 0;
  4795. }
  4796. select[data-v-88fc5825] {
  4797. padding: 1px 8px;
  4798. border: 1px solid var(--border-color);
  4799. border-radius: 8px;
  4800. cursor: pointer;
  4801. }
  4802. option[data-v-88fc5825] {
  4803. cursor: pointer;
  4804. }
  4805. option[data-v-88fc5825]:checked {
  4806. background-color: var(--tieba-theme-color);
  4807. color: var(--default-background);
  4808. }
  4809. a[data-v-88fc5825] {
  4810. color: inherit;
  4811. -webkit-text-decoration: none;
  4812. text-decoration: none;
  4813. word-break: break-all;
  4814. }
  4815. .dialogJ[data-v-88fc5825] {
  4816. position: fixed !important;
  4817. top: 50% !important;
  4818. left: 50% !important;
  4819. }
  4820. .dialogJ[data-v-88fc5825] {
  4821. transform: translate(-50%, -50%);
  4822. }
  4823. .pager-wrapper .pager-button-container .pager-button.icon[data-v-88fc5825] {
  4824. font-family: "Material Symbols", monospace !important;
  4825. }
  4826. .pager-wrapper .pager-button-container .pager-button.icon[data-v-88fc5825] {
  4827. font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 40;
  4828. -webkit-user-select: none;
  4829. -moz-user-select: none;
  4830. user-select: none;
  4831. }
  4832. .pager-wrapper[data-v-88fc5825] {
  4833. display: flex;
  4834. width: -moz-fit-content;
  4835. width: fit-content;
  4836. box-sizing: border-box;
  4837. align-items: center;
  4838. padding: 4px;
  4839. font-size: 16px;
  4840. gap: 6px;
  4841. }
  4842. .pager-wrapper .pager-button-container[data-v-88fc5825] {
  4843. display: flex;
  4844. align-items: center;
  4845. gap: 4px;
  4846. }
  4847. .pager-wrapper .pager-button-container .pager-button[data-v-88fc5825] {
  4848. color: var(--default-fore);
  4849. font-family: var(--code-monospace);
  4850. }
  4851. .pager-wrapper .pager-button-container .pager-button[data-v-88fc5825]:not(:hover):not(:active):not(:focus) {
  4852. background-color: transparent;
  4853. }
  4854. .pager-wrapper .pager-button-container .pager-button.fill[data-v-88fc5825]:not(:hover):not(:active):not(:focus) {
  4855. background-color: var(--defualt-background);
  4856. }
  4857. .pager-wrapper .pager-button-container .pager-button.curr-pager-button[data-v-88fc5825] {
  4858. border-radius: 0;
  4859. box-shadow: 0 3px 0 var(--tieba-theme-color);
  4860. color: var(--tieba-theme-color);
  4861. font-weight: bold;
  4862. }
  4863. .pager-wrapper .pager-separactor[data-v-88fc5825] {
  4864. color: var(--minimal-fore);
  4865. font-family: var(--code-monospace);
  4866. }
  4867. .pager-wrapper .jumper-container[data-v-88fc5825] {
  4868. display: flex;
  4869. align-items: center;
  4870. color: var(--light-fore);
  4871. gap: 6px;
  4872. }
  4873. .pager-wrapper .jumper-container .jumper[data-v-88fc5825] {
  4874. width: 36px;
  4875. width: 3em;
  4876. padding: 2px 4px;
  4877. color: var(--default-fore);
  4878. font-family: var(--code-monospace);
  4879. }
  4880. .pager-wrapper .tail-slot[data-v-88fc5825] {
  4881. margin-left: auto;
  4882. color: var(--minimal-fore);
  4883. }@keyframes slide-in-217ff1bf {
  4884. 0% {
  4885. opacity: 0;
  4886. transform: translateY(20%);
  4887. }
  4888. }
  4889. #thread-editor[data-v-217ff1bf] {
  4890. bottom: 0;
  4891. left: 50%;
  4892. display: flex;
  4893. width: 100%;
  4894. max-width: var(--content-max);
  4895. max-height: 100vh;
  4896. box-sizing: border-box;
  4897. flex-direction: column;
  4898. align-items: center;
  4899. padding: 24px;
  4900. border-radius: 8px 8px 0 0;
  4901. margin: auto auto 0;
  4902. animation: slide-in-217ff1bf 0.4s ease;
  4903. background-color: var(--default-background);
  4904. gap: 8px;
  4905. transition: 0.4s;
  4906. }
  4907. #thread-editor #thread-editor-exit[data-v-217ff1bf] {
  4908. margin-left: auto;
  4909. font-size: 18px;
  4910. }
  4911. #thread-editor #thread-editor-exit[data-v-217ff1bf]:not(:hover):not(:active):not(:focus) {
  4912. box-shadow: none;
  4913. }
  4914. #thread-editor .title-editor[data-v-217ff1bf] {
  4915. width: 100%;
  4916. flex-grow: 1;
  4917. border-width: 3px;
  4918. background-color: transparent;
  4919. font-size: 24px;
  4920. font-weight: bold;
  4921. }
  4922. #thread-editor h1[data-v-217ff1bf] {
  4923. margin-right: auto;
  4924. }
  4925. #thread-editor #thread-editor-slot[data-v-217ff1bf] {
  4926. width: 100%;
  4927. flex-shrink: 2;
  4928. }
  4929. #thread-editor #thread-editor-toolbar[data-v-217ff1bf] {
  4930. display: flex;
  4931. width: 100%;
  4932. align-items: center;
  4933. }
  4934. #thread-editor #thread-editor-toolbar #thread-editor-submit[data-v-217ff1bf] {
  4935. padding: 4px 12px;
  4936. margin-left: auto;
  4937. font-size: 16px;
  4938. font-weight: bold;
  4939. }@keyframes kf-fade-in {
  4940. 0% {
  4941. opacity: 0;
  4942. }
  4943. 100% {
  4944. opacity: 1;
  4945. }
  4946. }
  4947. @keyframes kf-fade-out {
  4948. 0% {
  4949. opacity: 1;
  4950. }
  4951. 100% {
  4952. opacity: 0;
  4953. }
  4954. }
  4955. @keyframes kf-dialog-in {
  4956. 0% {
  4957. opacity: 0;
  4958. transform: scale(1.2);
  4959. }
  4960. 100% {
  4961. opacity: 1;
  4962. transform: scale(1);
  4963. }
  4964. }
  4965. @keyframes kf-zoom-in {
  4966. 0% {
  4967. transform: scale(0.72);
  4968. }
  4969. 100% {
  4970. transform: scale(1);
  4971. }
  4972. }
  4973. @keyframes kf-fade-zoom-in {
  4974. 0% {
  4975. opacity: 0;
  4976. transform: scale(0.72);
  4977. }
  4978. 100% {
  4979. opacity: 1;
  4980. transform: scale(1);
  4981. }
  4982. }
  4983. html {
  4984. padding: 0;
  4985. margin: 0;
  4986. text-align: justify;
  4987. }
  4988. body {
  4989. overflow-x: hidden;
  4990. overflow-y: scroll;
  4991. overflow: hidden scroll;
  4992. padding: 0;
  4993. margin: 0;
  4994. font-family: var(--code-zh);
  4995. }
  4996. body[no-scrollbar] {
  4997. overflow: hidden;
  4998. }
  4999. div,
  5000. p {
  5001. margin: 0;
  5002. }
  5003. select {
  5004. padding: 1px 8px;
  5005. border: 1px solid var(--border-color);
  5006. border-radius: 8px;
  5007. cursor: pointer;
  5008. }
  5009. option {
  5010. cursor: pointer;
  5011. }
  5012. option:checked {
  5013. background-color: var(--tieba-theme-color);
  5014. color: var(--default-background);
  5015. }
  5016. a {
  5017. color: inherit;
  5018. -webkit-text-decoration: none;
  5019. text-decoration: none;
  5020. word-break: break-all;
  5021. }
  5022. .dialogJ {
  5023. position: fixed !important;
  5024. top: 50% !important;
  5025. left: 50% !important;
  5026. }
  5027. .dialogJ {
  5028. transform: translate(-50%, -50%);
  5029. }
  5030. #thread-editor .edui-container .edui-toolbar .edui-btn-toolbar .edui-btn .edui-icon::before {
  5031. font-family: "Material Symbols", monospace !important;
  5032. }
  5033. #thread-editor .edui-container .edui-toolbar .edui-btn-toolbar .edui-btn .edui-icon::before {
  5034. font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 40;
  5035. -webkit-user-select: none;
  5036. -moz-user-select: none;
  5037. user-select: none;
  5038. }
  5039. body {
  5040. overflow-x: hidden;
  5041. overflow-y: scroll;
  5042. overflow: hidden scroll;
  5043. }
  5044. #thread-editor .edui-container {
  5045. width: 100% !important;
  5046. }
  5047. #thread-editor .edui-container .edui-toolbar {
  5048. height: auto;
  5049. align-items: center;
  5050. background-color: transparent;
  5051. }
  5052. #thread-editor .edui-container .edui-toolbar .edui-btn-toolbar {
  5053. display: flex;
  5054. background-color: transparent;
  5055. gap: 8px;
  5056. }
  5057. #thread-editor .edui-container .edui-toolbar .edui-btn-toolbar .edui-btn {
  5058. padding: 1px;
  5059. border-radius: 4px;
  5060. margin-right: 0;
  5061. background: none;
  5062. background-color: var(--light-background);
  5063. box-shadow: 0 0 0 1px var(--border-color);
  5064. cursor: pointer;
  5065. transition: 0.4s;
  5066. }
  5067. #thread-editor .edui-container .edui-toolbar .edui-btn-toolbar .edui-btn .edui-icon {
  5068. display: flex;
  5069. width: -moz-max-content;
  5070. width: max-content;
  5071. align-items: center;
  5072. padding: 2px 4px;
  5073. background: none;
  5074. gap: 4px;
  5075. }
  5076. #thread-editor .edui-container .edui-toolbar .edui-btn-toolbar .edui-btn .edui-icon::before {
  5077. font-size: 16px;
  5078. }
  5079. #thread-editor .edui-container .edui-toolbar .edui-dialog-container .edui-dropdown-menu {
  5080. overflow: hidden;
  5081. width: -moz-max-content;
  5082. width: max-content;
  5083. padding: 0;
  5084. border: 2px solid var(--border-color);
  5085. border-radius: 6px;
  5086. background: none;
  5087. }
  5088. #thread-editor .edui-container .edui-toolbar .edui-dialog-container .edui-dropdown-menu .edui-popup-body {
  5089. padding: 0;
  5090. border: none;
  5091. background-color: var(--default-background);
  5092. }
  5093. #thread-editor .edui-container .edui-toolbar .edui-dialog-container .edui-dropdown-menu .edui-popup-caret {
  5094. display: none;
  5095. }
  5096. #thread-editor .edui-container .edui-editor-body {
  5097. border: none;
  5098. border-radius: 0;
  5099. border-bottom: 3px solid var(--tieba-theme-color);
  5100. transition: 0.4s;
  5101. }
  5102. #thread-editor .edui-container .edui-editor-body:hover {
  5103. border-color: var(--light-background);
  5104. }
  5105. #thread-editor .edui-container .edui-editor-body:focus {
  5106. border-color: var(--tieba-theme-color);
  5107. }
  5108. #thread-editor .edui-container .edui-body-container {
  5109. min-height: 18px !important;
  5110. }
  5111. #thread-editor .edui-container .edui-body-container {
  5112. max-height: 50vh;
  5113. padding: 0;
  5114. border-radius: 0;
  5115. background-color: transparent;
  5116. }
  5117. .edui-btn-topic {
  5118. display: none !important;
  5119. }
  5120. #thread-editor .edui-btn-toolbar .edui-icon.edui-icon-medal::before {
  5121. content: "diamond";
  5122. }
  5123. #thread-editor .edui-btn-toolbar .edui-icon.edui-icon-medal::after {
  5124. content: "\u7279\u6743";
  5125. }
  5126. #thread-editor .edui-btn-toolbar .edui-icon.edui-icon-image::before {
  5127. content: "photo";
  5128. }
  5129. #thread-editor .edui-btn-toolbar .edui-icon.edui-icon-image::after {
  5130. content: "\u63D2\u5165\u56FE\u7247";
  5131. }
  5132. #thread-editor .edui-btn-toolbar .edui-icon.edui-icon-video::before {
  5133. content: "video_file";
  5134. }
  5135. #thread-editor .edui-btn-toolbar .edui-icon.edui-icon-video::after {
  5136. content: "\u63D2\u5165\u89C6\u9891";
  5137. }
  5138. #thread-editor .edui-btn-toolbar .edui-icon.edui-icon-emotion::before {
  5139. content: "face";
  5140. }
  5141. #thread-editor .edui-btn-toolbar .edui-icon.edui-icon-emotion::after {
  5142. content: "\u63D2\u5165\u8868\u60C5";
  5143. }
  5144. #thread-editor .edui-btn-toolbar .edui-icon.edui-icon-scrawl::before {
  5145. content: "format_paint";
  5146. }
  5147. #thread-editor .edui-btn-toolbar .edui-icon.edui-icon-scrawl::after {
  5148. content: "\u6D82\u9E26";
  5149. }
  5150. #thread-editor .edui-btn-toolbar .edui-icon.edui-icon-topic::before {
  5151. content: "grid_3x3";
  5152. }
  5153. #thread-editor .edui-btn-toolbar .edui-icon.edui-icon-topic::after {
  5154. content: "\u8BDD\u9898";
  5155. }
  5156. #thread-editor .edui-btn-toolbar .edui-icon.edui-icon-quick-reply::before {
  5157. content: "rocket_launch";
  5158. }
  5159. #thread-editor .edui-btn-toolbar .edui-icon.edui-icon-quick-reply::after {
  5160. content: "\u5FEB\u901F\u56DE\u5E16";
  5161. }
  5162. @keyframes kf-fade-in {
  5163. 0% {
  5164. opacity: 0;
  5165. }
  5166. 100% {
  5167. opacity: 1;
  5168. }
  5169. }
  5170. @keyframes kf-fade-out {
  5171. 0% {
  5172. opacity: 1;
  5173. }
  5174. 100% {
  5175. opacity: 0;
  5176. }
  5177. }
  5178. @keyframes kf-dialog-in {
  5179. 0% {
  5180. opacity: 0;
  5181. transform: scale(1.2);
  5182. }
  5183. 100% {
  5184. opacity: 1;
  5185. transform: scale(1);
  5186. }
  5187. }
  5188. @keyframes kf-zoom-in {
  5189. 0% {
  5190. transform: scale(0.72);
  5191. }
  5192. 100% {
  5193. transform: scale(1);
  5194. }
  5195. }
  5196. @keyframes kf-fade-zoom-in {
  5197. 0% {
  5198. opacity: 0;
  5199. transform: scale(0.72);
  5200. }
  5201. 100% {
  5202. opacity: 1;
  5203. transform: scale(1);
  5204. }
  5205. }
  5206. html {
  5207. padding: 0;
  5208. margin: 0;
  5209. text-align: justify;
  5210. }
  5211. body {
  5212. overflow-x: hidden;
  5213. overflow-y: scroll;
  5214. overflow: hidden scroll;
  5215. padding: 0;
  5216. margin: 0;
  5217. font-family: var(--code-zh);
  5218. }
  5219. body[no-scrollbar] {
  5220. overflow: hidden;
  5221. }
  5222. div,
  5223. p {
  5224. margin: 0;
  5225. }
  5226. select {
  5227. padding: 1px 8px;
  5228. border: 1px solid var(--border-color);
  5229. border-radius: 8px;
  5230. cursor: pointer;
  5231. }
  5232. option {
  5233. cursor: pointer;
  5234. }
  5235. option:checked {
  5236. background-color: var(--tieba-theme-color);
  5237. color: var(--default-background);
  5238. }
  5239. a {
  5240. color: inherit;
  5241. -webkit-text-decoration: none;
  5242. text-decoration: none;
  5243. word-break: break-all;
  5244. }
  5245. .dialogJ {
  5246. position: fixed !important;
  5247. top: 50% !important;
  5248. left: 50% !important;
  5249. }
  5250. .dialogJ {
  5251. transform: translate(-50%, -50%);
  5252. }
  5253. .edui-popup-body .layer_medal_list li a::before,
  5254. .edui-popup-body .layer_btn_list li a::before {
  5255. font-family: "Material Symbols", monospace !important;
  5256. }
  5257. .edui-popup-body .layer_medal_list li a::before,
  5258. .edui-popup-body .layer_btn_list li a::before {
  5259. font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 40;
  5260. -webkit-user-select: none;
  5261. -moz-user-select: none;
  5262. user-select: none;
  5263. }
  5264. .edui-dialog-container .upload_container .next_step, .edui-popup-body .layer_medal_list li a,
  5265. .edui-popup-body .layer_btn_list li a {
  5266. box-sizing: border-box;
  5267. padding: 2px 8px;
  5268. border: none;
  5269. border-radius: 6px;
  5270. background: none;
  5271. background-color: var(--default-background);
  5272. box-shadow: 0 0 0 1px var(--border-color);
  5273. color: var(--default-fore);
  5274. cursor: pointer;
  5275. transition: 0.4s;
  5276. }
  5277. .edui-dialog-container .upload_container .next_step:hover:not([disabled]), .edui-popup-body .layer_medal_list li a:hover:not([disabled]),
  5278. .edui-popup-body .layer_btn_list li a:hover:not([disabled]) {
  5279. background-color: var(--default-hover);
  5280. }
  5281. .edui-dialog-container .upload_container .next_step:active:not([disabled]), .edui-popup-body .layer_medal_list li a:active:not([disabled]),
  5282. .edui-popup-body .layer_btn_list li a:active:not([disabled]) {
  5283. background-color: var(--default-active);
  5284. }
  5285. .edui-dialog-container .upload_container .next_step:focus:not([disabled]), .edui-popup-body .layer_medal_list li a:focus:not([disabled]),
  5286. .edui-popup-body .layer_btn_list li a:focus:not([disabled]) {
  5287. border-color: var(--tieba-theme-color);
  5288. box-shadow: 0 0 0 2px var(--tieba-theme-color);
  5289. }
  5290. .edui-dialog-container .upload_container .theme-style.next_step, .edui-popup-body .layer_medal_list li a.theme-style,
  5291. .edui-popup-body .layer_btn_list li a.theme-style {
  5292. color: var(--default-background) !important;
  5293. }
  5294. .edui-dialog-container .upload_container .theme-style.next_step, .edui-popup-body .layer_medal_list li a.theme-style,
  5295. .edui-popup-body .layer_btn_list li a.theme-style {
  5296. background-color: var(--tieba-theme-color);
  5297. }
  5298. .edui-dialog-container .upload_container .theme-style.next_step:hover, .edui-popup-body .layer_medal_list li a.theme-style:hover,
  5299. .edui-popup-body .layer_btn_list li a.theme-style:hover {
  5300. background-color: var(--tieba-theme-hover);
  5301. }
  5302. .edui-dialog-container .upload_container .theme-style.next_step:active, .edui-popup-body .layer_medal_list li a.theme-style:active,
  5303. .edui-popup-body .layer_btn_list li a.theme-style:active {
  5304. background-color: var(--tieba-theme-active);
  5305. }
  5306. .edui-dialog-container .upload_container .unset-background.next_step, .edui-popup-body .layer_medal_list li a.unset-background,
  5307. .edui-popup-body .layer_btn_list li a.unset-background {
  5308. background-color: transparent;
  5309. background-color: initial;
  5310. }
  5311. .edui-dialog-container .upload_container .no-border.next_step, .edui-popup-body .layer_medal_list li a.no-border,
  5312. .edui-popup-body .layer_btn_list li a.no-border {
  5313. box-shadow: none;
  5314. }
  5315. .edui-dialog-container .upload_container .no-border-all.next_step, .edui-popup-body .layer_medal_list li a.no-border-all,
  5316. .edui-popup-body .layer_btn_list li a.no-border-all {
  5317. box-shadow: none;
  5318. }
  5319. .edui-dialog-container .upload_container .no-border-all.next_step:hover, .edui-popup-body .layer_medal_list li a.no-border-all:hover,
  5320. .edui-popup-body .layer_btn_list li a.no-border-all:hover, .edui-dialog-container .upload_container .no-border-all.next_step:focus, .edui-popup-body .layer_medal_list li a.no-border-all:focus,
  5321. .edui-popup-body .layer_btn_list li a.no-border-all:focus {
  5322. box-shadow: none;
  5323. }
  5324. .edui-dialog-container .edui-popup {
  5325. position: static !important;
  5326. }
  5327. .edui-dialog-container .upload_container {
  5328. padding: 0 20px 20px 0;
  5329. }
  5330. .edui-dialog-container .upload_container .slide_item_img {
  5331. border-color: var(--tieba-theme-color) !important;
  5332. }
  5333. .edui-dialog-container .upload_container .slide_item_img {
  5334. overflow: hidden;
  5335. }
  5336. .edui-dialog-container .upload_container .watermark_options {
  5337. position: static;
  5338. margin-left: 20px;
  5339. }
  5340. .edui-dialog-container .upload_container .next_step {
  5341. position: static;
  5342. width: -moz-max-content;
  5343. width: max-content;
  5344. height: -moz-max-content;
  5345. height: max-content;
  5346. padding: 4px 8px;
  5347. margin-left: auto;
  5348. line-height: normal;
  5349. }
  5350. .edui-popup-body {
  5351. position: static;
  5352. }
  5353. .edui-popup-body .layer_medal_list,
  5354. .edui-popup-body .layer_btn_list {
  5355. width: -moz-max-content;
  5356. width: max-content;
  5357. height: -moz-max-content;
  5358. height: max-content;
  5359. }
  5360. .edui-popup-body .layer_medal_list li,
  5361. .edui-popup-body .layer_btn_list li {
  5362. display: flex;
  5363. overflow: hidden;
  5364. align-items: center;
  5365. padding: 0;
  5366. background: none;
  5367. }
  5368. .edui-popup-body .layer_medal_list li a,
  5369. .edui-popup-body .layer_btn_list li a {
  5370. display: flex;
  5371. width: -moz-max-content;
  5372. width: max-content;
  5373. height: -moz-max-content;
  5374. height: max-content;
  5375. align-items: center;
  5376. padding: 4px 8px;
  5377. border-radius: 0;
  5378. box-shadow: none;
  5379. gap: 4px;
  5380. }
  5381. .edui-popup-body .layer_medal_list li a::before,
  5382. .edui-popup-body .layer_btn_list li a::before {
  5383. font-size: 16px;
  5384. }
  5385. .layer_medal_list li.post_bubble a::before {
  5386. content: "bubble_chart";
  5387. }
  5388. .layer_medal_list li.post_bubble a::after {
  5389. content: "\u53D1\u5E16\u6C14\u6CE1";
  5390. }
  5391. .layer_medal_list li.colorful_font a::before {
  5392. content: "format_color_text";
  5393. }
  5394. .layer_medal_list li.colorful_font a::after {
  5395. content: "\u5F69\u8272\u5B57\u4F53";
  5396. }
  5397. .layer_btn_list {
  5398. padding: 0 !important;
  5399. }
  5400. .layer_btn_list li {
  5401. border: none !important;
  5402. }
  5403. .layer_btn_list li.from_upload a::before {
  5404. content: "upload_file";
  5405. }
  5406. .layer_btn_list li.from_upload a::after {
  5407. content: "\u4E0A\u4F20\u6587\u4EF6";
  5408. }
  5409. .layer_btn_list li.from_web a::before {
  5410. content: "web";
  5411. }
  5412. .layer_btn_list li.from_web a::after {
  5413. content: "\u7F51\u7EDC\u56FE\u7247";
  5414. }@keyframes kf-fade-in {
  5415. 0% {
  5416. opacity: 0;
  5417. }
  5418. 100% {
  5419. opacity: 1;
  5420. }
  5421. }
  5422. @keyframes kf-fade-out {
  5423. 0% {
  5424. opacity: 1;
  5425. }
  5426. 100% {
  5427. opacity: 0;
  5428. }
  5429. }
  5430. @keyframes kf-dialog-in {
  5431. 0% {
  5432. opacity: 0;
  5433. transform: scale(1.2);
  5434. }
  5435. 100% {
  5436. opacity: 1;
  5437. transform: scale(1);
  5438. }
  5439. }
  5440. @keyframes kf-zoom-in {
  5441. 0% {
  5442. transform: scale(0.72);
  5443. }
  5444. 100% {
  5445. transform: scale(1);
  5446. }
  5447. }
  5448. @keyframes kf-fade-zoom-in {
  5449. 0% {
  5450. opacity: 0;
  5451. transform: scale(0.72);
  5452. }
  5453. 100% {
  5454. opacity: 1;
  5455. transform: scale(1);
  5456. }
  5457. }
  5458. html {
  5459. padding: 0;
  5460. margin: 0;
  5461. text-align: justify;
  5462. }
  5463. body {
  5464. overflow-x: hidden;
  5465. overflow-y: scroll;
  5466. overflow: hidden scroll;
  5467. padding: 0;
  5468. margin: 0;
  5469. font-family: var(--code-zh);
  5470. }
  5471. body[no-scrollbar] {
  5472. overflow: hidden;
  5473. }
  5474. div,
  5475. p {
  5476. margin: 0;
  5477. }
  5478. select {
  5479. padding: 1px 8px;
  5480. border: 1px solid var(--border-color);
  5481. border-radius: 8px;
  5482. cursor: pointer;
  5483. }
  5484. option {
  5485. cursor: pointer;
  5486. }
  5487. option:checked {
  5488. background-color: var(--tieba-theme-color);
  5489. color: var(--default-background);
  5490. }
  5491. a {
  5492. color: inherit;
  5493. -webkit-text-decoration: none;
  5494. text-decoration: none;
  5495. word-break: break-all;
  5496. }
  5497. .dialogJ {
  5498. position: fixed !important;
  5499. top: 50% !important;
  5500. left: 50% !important;
  5501. }
  5502. .dialogJ {
  5503. transform: translate(-50%, -50%);
  5504. }
  5505. #thread-editor .emotion_container .ueditor_emotion_tab .s_prev::before,
  5506. #thread-editor .emotion_container .ueditor_emotion_tab .s_next::before {
  5507. font-family: "Material Symbols", monospace !important;
  5508. }
  5509. #thread-editor .emotion_container .ueditor_emotion_tab .s_prev::before,
  5510. #thread-editor .emotion_container .ueditor_emotion_tab .s_next::before {
  5511. font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 40;
  5512. -webkit-user-select: none;
  5513. -moz-user-select: none;
  5514. user-select: none;
  5515. }
  5516. #thread-editor .emotion_container .ueditor_emotion_tab .s_prev,
  5517. #thread-editor .emotion_container .ueditor_emotion_tab .s_next {
  5518. box-sizing: border-box;
  5519. padding: 2px 8px;
  5520. border: none;
  5521. border-radius: 6px;
  5522. background: none;
  5523. background-color: var(--default-background);
  5524. box-shadow: 0 0 0 1px var(--border-color);
  5525. color: var(--default-fore);
  5526. cursor: pointer;
  5527. transition: 0.4s;
  5528. }
  5529. #thread-editor .emotion_container .ueditor_emotion_tab .s_prev:hover:not([disabled]),
  5530. #thread-editor .emotion_container .ueditor_emotion_tab .s_next:hover:not([disabled]) {
  5531. background-color: var(--default-hover);
  5532. }
  5533. #thread-editor .emotion_container .ueditor_emotion_tab .s_prev:active:not([disabled]),
  5534. #thread-editor .emotion_container .ueditor_emotion_tab .s_next:active:not([disabled]) {
  5535. background-color: var(--default-active);
  5536. }
  5537. #thread-editor .emotion_container .ueditor_emotion_tab .s_prev:focus:not([disabled]),
  5538. #thread-editor .emotion_container .ueditor_emotion_tab .s_next:focus:not([disabled]) {
  5539. border-color: var(--tieba-theme-color);
  5540. box-shadow: 0 0 0 2px var(--tieba-theme-color);
  5541. }
  5542. #thread-editor .emotion_container .ueditor_emotion_tab .theme-style.s_prev,
  5543. #thread-editor .emotion_container .ueditor_emotion_tab .theme-style.s_next {
  5544. color: var(--default-background) !important;
  5545. }
  5546. #thread-editor .emotion_container .ueditor_emotion_tab .theme-style.s_prev,
  5547. #thread-editor .emotion_container .ueditor_emotion_tab .theme-style.s_next {
  5548. background-color: var(--tieba-theme-color);
  5549. }
  5550. #thread-editor .emotion_container .ueditor_emotion_tab .theme-style.s_prev:hover,
  5551. #thread-editor .emotion_container .ueditor_emotion_tab .theme-style.s_next:hover {
  5552. background-color: var(--tieba-theme-hover);
  5553. }
  5554. #thread-editor .emotion_container .ueditor_emotion_tab .theme-style.s_prev:active,
  5555. #thread-editor .emotion_container .ueditor_emotion_tab .theme-style.s_next:active {
  5556. background-color: var(--tieba-theme-active);
  5557. }
  5558. #thread-editor .emotion_container .ueditor_emotion_tab .unset-background.s_prev,
  5559. #thread-editor .emotion_container .ueditor_emotion_tab .unset-background.s_next {
  5560. background-color: transparent;
  5561. background-color: initial;
  5562. }
  5563. #thread-editor .emotion_container .ueditor_emotion_tab .no-border.s_prev,
  5564. #thread-editor .emotion_container .ueditor_emotion_tab .no-border.s_next {
  5565. box-shadow: none;
  5566. }
  5567. #thread-editor .emotion_container .ueditor_emotion_tab .no-border-all.s_prev,
  5568. #thread-editor .emotion_container .ueditor_emotion_tab .no-border-all.s_next {
  5569. box-shadow: none;
  5570. }
  5571. #thread-editor .emotion_container .ueditor_emotion_tab .no-border-all.s_prev:hover,
  5572. #thread-editor .emotion_container .ueditor_emotion_tab .no-border-all.s_next:hover, #thread-editor .emotion_container .ueditor_emotion_tab .no-border-all.s_prev:focus,
  5573. #thread-editor .emotion_container .ueditor_emotion_tab .no-border-all.s_next:focus {
  5574. box-shadow: none;
  5575. }
  5576. #thread-editor .emotion_container .tbui_scroll_panel {
  5577. overflow: hidden;
  5578. border-radius: 4px 4px 0 0;
  5579. }
  5580. html.dark-theme #thread-editor .emotion_container td, html.dark-theme #thread-editor .emotion_container .emotion_preview {
  5581. filter: brightness(0.8);
  5582. }
  5583. #thread-editor .emotion_container .emotion_preview {
  5584. border: 1px solid var(--border-color);
  5585. border-radius: 6px;
  5586. box-shadow: 0 0 10px rgba(0, 0, 0, 0.01);
  5587. }
  5588. html.dark-theme #thread-editor .emotion_container .emotion_preview {
  5589. box-shadow: 0 0 16px rgba(0, 0, 0, 0.2);
  5590. }
  5591. #thread-editor .emotion_container .ueditor_emotion_tab {
  5592. display: flex;
  5593. align-items: center;
  5594. justify-content: space-evenly;
  5595. border-top: 2px solid var(--border-color);
  5596. background: none;
  5597. background-color: var(--default-background);
  5598. color: var(--default-fore);
  5599. }
  5600. #thread-editor .emotion_container .ueditor_emotion_tab .s_prev,
  5601. #thread-editor .emotion_container .ueditor_emotion_tab .s_next {
  5602. width: -moz-max-content !important;
  5603. width: max-content !important;
  5604. height: -moz-max-content !important;
  5605. height: max-content !important;
  5606. }
  5607. #thread-editor .emotion_container .ueditor_emotion_tab .s_prev,
  5608. #thread-editor .emotion_container .ueditor_emotion_tab .s_next {
  5609. position: static;
  5610. padding: 0 2px;
  5611. background: none;
  5612. box-shadow: none;
  5613. }
  5614. #thread-editor .emotion_container .ueditor_emotion_tab .s_prev::before,
  5615. #thread-editor .emotion_container .ueditor_emotion_tab .s_next::before {
  5616. font-size: 10px;
  5617. }
  5618. #thread-editor .emotion_container .ueditor_emotion_tab .s_prev::before {
  5619. content: "arrow_back_ios";
  5620. }
  5621. #thread-editor .emotion_container .ueditor_emotion_tab .s_next::before {
  5622. content: "arrow_forward_ios";
  5623. }
  5624. #thread-editor .emotion_container .ueditor_emotion_tab .s_tab_con_wrapper {
  5625. position: static;
  5626. }
  5627. #thread-editor .emotion_container .ueditor_emotion_tab .s_tab_con_wrapper .s_tab_btn {
  5628. border-radius: 4px;
  5629. background: none;
  5630. background-color: var(--default-background);
  5631. }
  5632. #thread-editor .emotion_container .ueditor_emotion_tab .s_tab_con_wrapper .s_tab_btn .s_tab_btnbg {
  5633. border-radius: 4px;
  5634. background: none;
  5635. transition: 0.4s;
  5636. }
  5637. #thread-editor .emotion_container .ueditor_emotion_tab .s_tab_con_wrapper .s_hover {
  5638. filter: brightness(1.2);
  5639. }
  5640. #thread-editor .emotion_container .ueditor_emotion_tab .s_tab_con_wrapper .s_hover .s_tab_btnbg {
  5641. filter: brightness(1.4);
  5642. }
  5643. #thread-editor .emotion_container .ueditor_emotion_tab .s_tab_con_wrapper .selected {
  5644. background: none;
  5645. }
  5646. #thread-editor .emotion_container .ueditor_emotion_tab .s_tab_con_wrapper .selected .s_tab_btnbg {
  5647. background-color: var(--tieba-theme-color);
  5648. color: var(--default-background);
  5649. font-weight: bold;
  5650. }@keyframes kf-fade-in-e01667c9 {
  5651. 0% {
  5652. opacity: 0;
  5653. }
  5654. 100% {
  5655. opacity: 1;
  5656. }
  5657. }
  5658. @keyframes kf-fade-out-e01667c9 {
  5659. 0% {
  5660. opacity: 1;
  5661. }
  5662. 100% {
  5663. opacity: 0;
  5664. }
  5665. }
  5666. @keyframes kf-dialog-in-e01667c9 {
  5667. 0% {
  5668. opacity: 0;
  5669. transform: scale(1.2);
  5670. }
  5671. 100% {
  5672. opacity: 1;
  5673. transform: scale(1);
  5674. }
  5675. }
  5676. @keyframes kf-zoom-in-e01667c9 {
  5677. 0% {
  5678. transform: scale(0.72);
  5679. }
  5680. 100% {
  5681. transform: scale(1);
  5682. }
  5683. }
  5684. @keyframes kf-fade-zoom-in-e01667c9 {
  5685. 0% {
  5686. opacity: 0;
  5687. transform: scale(0.72);
  5688. }
  5689. 100% {
  5690. opacity: 1;
  5691. transform: scale(1);
  5692. }
  5693. }
  5694. html[data-v-e01667c9] {
  5695. padding: 0;
  5696. margin: 0;
  5697. text-align: justify;
  5698. }
  5699. body[data-v-e01667c9] {
  5700. overflow-x: hidden;
  5701. overflow-y: scroll;
  5702. overflow: hidden scroll;
  5703. padding: 0;
  5704. margin: 0;
  5705. font-family: var(--code-zh);
  5706. }
  5707. body[no-scrollbar][data-v-e01667c9] {
  5708. overflow: hidden;
  5709. }
  5710. div[data-v-e01667c9],
  5711. p[data-v-e01667c9] {
  5712. margin: 0;
  5713. }
  5714. select[data-v-e01667c9] {
  5715. padding: 1px 8px;
  5716. border: 1px solid var(--border-color);
  5717. border-radius: 8px;
  5718. cursor: pointer;
  5719. }
  5720. option[data-v-e01667c9] {
  5721. cursor: pointer;
  5722. }
  5723. option[data-v-e01667c9]:checked {
  5724. background-color: var(--tieba-theme-color);
  5725. color: var(--default-background);
  5726. }
  5727. a[data-v-e01667c9] {
  5728. color: inherit;
  5729. -webkit-text-decoration: none;
  5730. text-decoration: none;
  5731. word-break: break-all;
  5732. }
  5733. .dialogJ[data-v-e01667c9] {
  5734. position: fixed !important;
  5735. top: 50% !important;
  5736. left: 50% !important;
  5737. }
  5738. .dialogJ[data-v-e01667c9] {
  5739. transform: translate(-50%, -50%);
  5740. }
  5741. .toggle-panel .toggle-wrapper .toggle-container .panel-button.toggle-off[data-v-e01667c9] {
  5742. font-family: "Material Symbols", monospace !important;
  5743. }
  5744. .toggle-panel .toggle-wrapper .toggle-container .panel-button.toggle-off[data-v-e01667c9] {
  5745. font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 40;
  5746. -webkit-user-select: none;
  5747. -moz-user-select: none;
  5748. user-select: none;
  5749. }
  5750. .toggle-panel .toggle-wrapper .toggle-container .panel-button.toggle-on[data-v-e01667c9] {
  5751. font-family: "Material Symbols", monospace !important;
  5752. }
  5753. .toggle-panel .toggle-wrapper .toggle-container .panel-button.toggle-on[data-v-e01667c9] {
  5754. font-variation-settings: "FILL" 1, "wght" 400, "GRAD" 0, "opsz" 40;
  5755. -webkit-user-select: none;
  5756. -moz-user-select: none;
  5757. user-select: none;
  5758. }
  5759. .toggle-panel[data-v-e01667c9] {
  5760. display: flex;
  5761. overflow: hidden;
  5762. max-width: 60vh;
  5763. max-height: 60vh;
  5764. box-sizing: border-box;
  5765. flex-direction: column;
  5766. padding: 12px;
  5767. border: 1px solid var(--light-border-color);
  5768. border-radius: 16px;
  5769. margin: auto;
  5770. animation: kf-dialog-in-e01667c9 0.4s ease;
  5771. background-color: var(--default-background);
  5772. box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
  5773. color: var(--default-fore);
  5774. transition: 0.4s ease;
  5775. }
  5776. .toggle-panel .toggle-wrapper[data-v-e01667c9] {
  5777. display: flex;
  5778. flex-wrap: wrap;
  5779. justify-content: center;
  5780. gap: 8px;
  5781. }
  5782. .toggle-panel .toggle-wrapper .toggle-container[data-v-e01667c9] {
  5783. display: flex;
  5784. flex-direction: column;
  5785. align-items: center;
  5786. gap: 4px;
  5787. }
  5788. .toggle-panel .toggle-wrapper .toggle-container .panel-button[data-v-e01667c9] {
  5789. width: 58px;
  5790. height: 58px;
  5791. border-radius: 12px;
  5792. font-size: 24px;
  5793. }
  5794. .toggle-panel .toggle-wrapper .toggle-container .panel-button.toggle-off[data-v-e01667c9] {
  5795. color: var(--minimal-fore);
  5796. }
  5797. .toggle-panel .toggle-wrapper .toggle-container .panel-button.toggle-on[data-v-e01667c9]:focus {
  5798. box-shadow: 0 0 0 1px var(--tieba-theme-color);
  5799. }
  5800. .toggle-panel .toggle-wrapper .toggle-container .toggle-name[data-v-e01667c9] {
  5801. color: var(--light-fore);
  5802. }
  5803. @keyframes kf-fade-in {
  5804. 0% {
  5805. opacity: 0;
  5806. }
  5807. 100% {
  5808. opacity: 1;
  5809. }
  5810. }
  5811. @keyframes kf-fade-out {
  5812. 0% {
  5813. opacity: 1;
  5814. }
  5815. 100% {
  5816. opacity: 0;
  5817. }
  5818. }
  5819. @keyframes kf-dialog-in {
  5820. 0% {
  5821. opacity: 0;
  5822. transform: scale(1.2);
  5823. }
  5824. 100% {
  5825. opacity: 1;
  5826. transform: scale(1);
  5827. }
  5828. }
  5829. @keyframes kf-zoom-in {
  5830. 0% {
  5831. transform: scale(0.72);
  5832. }
  5833. 100% {
  5834. transform: scale(1);
  5835. }
  5836. }
  5837. @keyframes kf-fade-zoom-in {
  5838. 0% {
  5839. opacity: 0;
  5840. transform: scale(0.72);
  5841. }
  5842. 100% {
  5843. opacity: 1;
  5844. transform: scale(1);
  5845. }
  5846. }
  5847. html {
  5848. padding: 0;
  5849. margin: 0;
  5850. text-align: justify;
  5851. }
  5852.  
  5853. body {
  5854. overflow-x: hidden;
  5855. overflow-y: scroll;
  5856. overflow: hidden scroll;
  5857. padding: 0;
  5858. margin: 0;
  5859. font-family: var(--code-zh);
  5860. }
  5861. body[no-scrollbar] {
  5862. overflow: hidden;
  5863. }
  5864.  
  5865. div,
  5866. p {
  5867. margin: 0;
  5868. }
  5869.  
  5870. select {
  5871. padding: 1px 8px;
  5872. border: 1px solid var(--border-color);
  5873. border-radius: 8px;
  5874. cursor: pointer;
  5875. }
  5876.  
  5877. option {
  5878. cursor: pointer;
  5879. }
  5880.  
  5881. option:checked {
  5882. background-color: var(--tieba-theme-color);
  5883. color: var(--default-background);
  5884. }
  5885.  
  5886. a {
  5887. color: inherit;
  5888. -webkit-text-decoration: none;
  5889. text-decoration: none;
  5890. word-break: break-all;
  5891. }
  5892.  
  5893. .dialogJ {
  5894. position: fixed !important;
  5895. top: 50% !important;
  5896. left: 50% !important;
  5897. }
  5898.  
  5899. .dialogJ {
  5900. transform: translate(-50%, -50%);
  5901. }
  5902.  
  5903. .search_internal_btn::after, .icon_author::after, .icon_replyer::after {
  5904. font-family: "Material Symbols", monospace !important;
  5905. }
  5906.  
  5907. .search_internal_btn::after, .icon_author::after, .icon_replyer::after {
  5908. font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 40;
  5909. -webkit-user-select: none;
  5910. -moz-user-select: none;
  5911. user-select: none;
  5912. }
  5913.  
  5914. .search_bright .search_btn_enter_ba {
  5915. box-sizing: border-box;
  5916. padding: 2px 8px;
  5917. border: none;
  5918. border-radius: 6px;
  5919. background: none;
  5920. background-color: var(--default-background);
  5921. box-shadow: 0 0 0 1px var(--border-color);
  5922. color: var(--default-fore);
  5923. cursor: pointer;
  5924. transition: 0.4s;
  5925. }
  5926. .search_bright .search_btn_enter_ba:hover:not([disabled]) {
  5927. background-color: var(--default-hover);
  5928. }
  5929. .search_bright .search_btn_enter_ba:active:not([disabled]) {
  5930. background-color: var(--default-active);
  5931. }
  5932. .search_bright .search_btn_enter_ba:focus:not([disabled]) {
  5933. border-color: var(--tieba-theme-color);
  5934. box-shadow: 0 0 0 2px var(--tieba-theme-color);
  5935. }
  5936. .search_bright .theme-style.search_btn_enter_ba {
  5937. color: var(--default-background) !important;
  5938. }
  5939. .search_bright .theme-style.search_btn_enter_ba {
  5940. background-color: var(--tieba-theme-color);
  5941. }
  5942. .search_bright .theme-style.search_btn_enter_ba:hover {
  5943. background-color: var(--tieba-theme-hover);
  5944. }
  5945. .search_bright .theme-style.search_btn_enter_ba:active {
  5946. background-color: var(--tieba-theme-active);
  5947. }
  5948. .search_bright .unset-background.search_btn_enter_ba {
  5949. background-color: transparent;
  5950. background-color: initial;
  5951. }
  5952. .search_bright .no-border.search_btn_enter_ba {
  5953. box-shadow: none;
  5954. }
  5955. .search_bright .no-border-all.search_btn_enter_ba {
  5956. box-shadow: none;
  5957. }
  5958. .search_bright .no-border-all.search_btn_enter_ba:hover, .search_bright .no-border-all.search_btn_enter_ba:focus {
  5959. box-shadow: none;
  5960. }
  5961.  
  5962. #head {
  5963. background: transparent none repeat 0 0 / auto auto padding-box border-box scroll !important;
  5964. background: initial !important;
  5965. background-color: var(--page-background) !important;
  5966. }
  5967. #head .head_inner {
  5968. background-color: var(--page-background);
  5969. }
  5970.  
  5971. .threadlist_title a,
  5972. .threadlist_title a:hover,
  5973. .threadlist_title a:visited {
  5974. color: var(--tieba-theme-fore) !important;
  5975. }
  5976.  
  5977. .u_menu_item a {
  5978. color: inherit !important;
  5979. }
  5980.  
  5981. .u_menu_item a {
  5982. /* \u9876\u90E8\u83DC\u5355 */
  5983. }
  5984.  
  5985. .card_banner,
  5986. .plat_recom_carousel {
  5987. display: none !important;
  5988. }
  5989.  
  5990. .card_banner,
  5991. .plat_recom_carousel {
  5992. /* \u5927\u5361 */
  5993. }
  5994.  
  5995. .search_main {
  5996. /* \u56FA\u5B9A\u641C\u7D22\u680F */
  5997. padding-bottom: 0;
  5998. padding-bottom: initial;
  5999. }
  6000.  
  6001. .search_bright {
  6002. margin-bottom: 36px;
  6003. }
  6004.  
  6005. .search_bright .search_logo_fixed {
  6006. width: 36px !important;
  6007. height: 36px !important;
  6008. margin-left: 56px !important;
  6009. background-color: rgba(0, 0, 0, 0) !important;
  6010. background-image: var(--img-tieba-icon) !important;
  6011. background-repeat: no-repeat !important;
  6012. }
  6013.  
  6014. .search_bright .search_logo_fixed {
  6015. /* \u56FA\u5B9A\u641C\u7D22\u680F icon */
  6016. }
  6017.  
  6018. .head_inner .search_logo {
  6019. display: none !important;
  6020. }
  6021.  
  6022. .search_form {
  6023. display: flex;
  6024. align-items: center;
  6025. justify-content: center;
  6026. }
  6027. .search_form form {
  6028. margin-left: 0 !important;
  6029. }
  6030.  
  6031. .search_bright .search_inp_border,
  6032. .search_bright .search_ipt {
  6033. height: 40px !important;
  6034. border: 2px solid var(--border-color) !important;
  6035. background-color: var(--default-background) !important;
  6036. color: var(--default-fore) !important;
  6037. }
  6038.  
  6039. .search_bright .search_inp_border,
  6040. .search_bright .search_ipt {
  6041. box-sizing: border-box;
  6042. transition: 0.4s;
  6043. }
  6044. .search_bright .search_inp_border:hover,
  6045. .search_bright .search_ipt:hover {
  6046. border-color: var(--light-background) !important;
  6047. }
  6048. .search_bright .search_inp_border:focus,
  6049. .search_bright .search_ipt:focus {
  6050. border-color: var(--tieba-theme-color) !important;
  6051. }
  6052.  
  6053. .search_bright .search_btn {
  6054. height: 40px !important;
  6055. border: 1px solid var(--border-color) !important;
  6056. background-color: var(--default-background) !important;
  6057. box-shadow: none !important;
  6058. color: var(--default-fore) !important;
  6059. line-height: 40px !important;
  6060. }
  6061.  
  6062. .search_bright .search_btn {
  6063. box-sizing: border-box;
  6064. transition: 0.4s;
  6065. }
  6066. .search_bright .search_btn:hover {
  6067. filter: brightness(1.1);
  6068. }
  6069. .search_bright .search_btn:active {
  6070. filter: brightness(1.2);
  6071. }
  6072.  
  6073. .search_bright .search_btn_enter_ba {
  6074. border: none !important;
  6075. background-color: var(--tieba-theme-color) !important;
  6076. color: var(--default-background) !important;
  6077. }
  6078.  
  6079. .search_bright .search_btn_enter_ba {
  6080. border-bottom-left-radius: 0;
  6081. border-top-left-radius: 0;
  6082. }
  6083.  
  6084. .search_main_fixed {
  6085. display: none !important;
  6086. }
  6087.  
  6088. .search_main_fixed {
  6089. border-color: var(--border-color);
  6090. -webkit-backdrop-filter: blur(24px);
  6091. backdrop-filter: blur(24px);
  6092. background-color: var(--trans-default-background);
  6093. box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
  6094. }
  6095.  
  6096. .card_top_theme {
  6097. border: none !important;
  6098. }
  6099.  
  6100. #content {
  6101. /* \u5BB9\u5668 */
  6102. width: 982px;
  6103. }
  6104.  
  6105. .card_top_theme .card_top {
  6106. padding-left: 120px !important;
  6107. }
  6108.  
  6109. .card_top_theme .card_top {
  6110. /* \u5427\u6807\u9898\u5BB9\u5668 */
  6111. }
  6112.  
  6113. .card_title_fname {
  6114. color: var(--tieba-theme-fore) !important;
  6115. }
  6116.  
  6117. .card_title_fname {
  6118. /* \u5427\u6807\u9898 */
  6119. font-weight: bold;
  6120. }
  6121.  
  6122. .card_slogan {
  6123. color: var(--light-fore) !important;
  6124. }
  6125.  
  6126. .card_slogan {
  6127. /* \u5427 slogan */
  6128. }
  6129.  
  6130. .islike_focus {
  6131. background-color: var(--tieba-theme-color) !important;
  6132. background-image: none !important;
  6133. }
  6134.  
  6135. .islike_focus {
  6136. /* \u5173\u6CE8\u5427\u6309\u94AE */
  6137. }
  6138.  
  6139. .cancel_focus {
  6140. background: none !important;
  6141. background-color: var(--tieba-theme-background) !important;
  6142. }
  6143.  
  6144. .cancel_focus {
  6145. /* \u53D6\u5173\u5427\u6309\u94AE */
  6146. }
  6147.  
  6148. .sign_box_bright,
  6149. .sign_box_bright_hover {
  6150. background: none !important;
  6151. background-color: var(--tieba-theme-color) !important;
  6152. }
  6153.  
  6154. .sign_box_bright,
  6155. .sign_box_bright_hover {
  6156. /* \u7B7E\u5230\u6309\u94AE */
  6157. }
  6158.  
  6159. .sign_box_bright_signed,
  6160. .sign_box_bright_noclass_hover {
  6161. background: none !important;
  6162. background-color: var(--tieba-theme-background) !important;
  6163. }
  6164.  
  6165. .sign_box_bright_signed,
  6166. .sign_box_bright_noclass_hover {
  6167. /* \u7B7E\u5230\u6309\u94AE\uFF1A\u5DF2\u7B7E\u5230 */
  6168. }
  6169.  
  6170. .sign_mod_bright .sign_keep_span {
  6171. margin: 0 !important;
  6172. margin: initial !important;
  6173. text-align: center !important;
  6174. }
  6175.  
  6176. .forum_content {
  6177. border-color: var(--border-color) !important;
  6178. border-right: none !important;
  6179. background: none !important;
  6180. background-color: var(--elem-color) !important;
  6181. }
  6182.  
  6183. .forum_content {
  6184. /* \u5BB9\u5668 */
  6185. }
  6186.  
  6187. .nav_wrap {
  6188. border-color: var(--border-color) !important;
  6189. }
  6190.  
  6191. .nav_wrap {
  6192. /* tab */
  6193. }
  6194.  
  6195. .nav_list li.focus {
  6196. background: none !important;
  6197. }
  6198.  
  6199. .nav_list li.focus {
  6200. /* \u7126\u70B9 tab */
  6201. }
  6202.  
  6203. .nav_list a {
  6204. color: inherit !important;
  6205. }
  6206.  
  6207. .j_tabnav_tab:hover {
  6208. background: none;
  6209. }
  6210.  
  6211. .nav_list a:hover,
  6212. .nav_list a:focus {
  6213. background-color: var(--elem-color) !important;
  6214. }
  6215.  
  6216. .nav_list a:hover,
  6217. .nav_list a:focus {
  6218. /* tab hover */
  6219. }
  6220.  
  6221. .search_internal_input {
  6222. height: 24px !important;
  6223. border-color: var(--border-color) !important;
  6224. color: var(--default-fore) !important;
  6225. }
  6226.  
  6227. .search_internal_input {
  6228. /* \u5427\u5185\u641C\u7D22 */
  6229. border-radius: 8px 0 0 8px;
  6230. }
  6231.  
  6232. .search_internal_btn {
  6233. height: 26px !important;
  6234. background-color: var(--tieba-theme-color) !important;
  6235. background-image: none !important;
  6236. vertical-align: middle !important;
  6237. }
  6238.  
  6239. .search_internal_btn {
  6240. /* \u5427\u5185\u641C\u7D22\u6309\u94AE */
  6241. border-radius: 0 8px 8px 0;
  6242. /* background-image: var(--svg-search) !important;
  6243. background-size: 16px !important;
  6244. background-repeat: no-repeat !important;
  6245. background-position: center !important; */
  6246. }
  6247.  
  6248. .search_internal_btn::after {
  6249. color: var(--default-background);
  6250. content: "search";
  6251. font-size: 18px;
  6252. font-weight: bold;
  6253. line-height: 26px;
  6254. text-align: center;
  6255. }
  6256.  
  6257. .aside_region {
  6258. border-bottom: none !important;
  6259. }
  6260.  
  6261. .aside_region {
  6262. /* \u53F3\u4FA7\u5185\u5BB9 */
  6263. }
  6264.  
  6265. .aside_region .region_header {
  6266. color: var(--default-fore) !important;
  6267. }
  6268.  
  6269. .my_tieba .media_left,
  6270. .my_tieba .media-left {
  6271. border: none !important;
  6272. }
  6273.  
  6274. .my_tieba .media_left,
  6275. .my_tieba .media-left {
  6276. /* \u6211\u7684\u5934\u50CF */
  6277. }
  6278.  
  6279. .my_current_forum .badge {
  6280. border: 1px solid var(--border-color) !important;
  6281. background-color: var(--light-background) !important;
  6282. color: var(--default-fore) !important;
  6283. }
  6284.  
  6285. .my_current_forum .badge {
  6286. /* \u6211\u7684\u7B49\u7EA7 */
  6287. }
  6288.  
  6289. .my_current_forum .badge_name {
  6290. color: var(--default-fore) !important;
  6291. }
  6292.  
  6293. .media_top img,
  6294. .media-top img {
  6295. /* \u53F3\u4FA7\u56FE\u7247 */
  6296. border-radius: 16px;
  6297. }
  6298.  
  6299. .aside_media_horizontal a,
  6300. .aside-media-horizontal a {
  6301. color: var(--tieba-theme-fore) !important;
  6302. }
  6303.  
  6304. .aside_media_horizontal a,
  6305. .aside-media-horizontal a {
  6306. /* \u53F3\u4FA7\u8D85\u94FE\u63A5 */
  6307. }
  6308.  
  6309. .threadlist_bright li.thread_top_list_folder,
  6310. .threadlist_bright li.thread_top_list_folder:hover {
  6311. background-color: var(--very-light-background) !important;
  6312. }
  6313.  
  6314. .threadlist_bright li.thread_top_list_folder,
  6315. .threadlist_bright li.thread_top_list_folder:hover {
  6316. /* \u7F6E\u9876\u8D34 */
  6317. }
  6318.  
  6319. .threadlist_bright > li {
  6320. border: none !important;
  6321. background-color: var(--default-background) !important;
  6322. }
  6323.  
  6324. .threadlist_bright > li {
  6325. /* \u8D34\u5B50 */
  6326. }
  6327.  
  6328. .threadlist_bright > li:hover {
  6329. background-color: var(--trans-light-background) !important;
  6330. }
  6331.  
  6332. .j_th_tit {
  6333. /* \u5E16\u5B50\u6807\u9898 */
  6334. color: var(--tieba-theme-fore);
  6335. font-weight: bold;
  6336. }
  6337.  
  6338. .threadlist_bright .threadlist_abs_onlyline,
  6339. .threadlist_bright .threadlist_abs {
  6340. color: var(--default-fore) !important;
  6341. }
  6342.  
  6343. .threadlist_bright .threadlist_abs_onlyline,
  6344. .threadlist_bright .threadlist_abs {
  6345. /* \u5E16\u5B50\u6458\u8981 */
  6346. }
  6347.  
  6348. /* \u9690\u85CF\u672A\u52A0\u8F7D\u5B8C\u6210\u7684\u56FE\u7247 */
  6349. .vpic_wrap img:not([style]) {
  6350. opacity: 0;
  6351. }
  6352.  
  6353. .threadlist_bright .threadlist_media li {
  6354. border-radius: 8px !important;
  6355. }
  6356.  
  6357. .threadlist_bright .threadlist_media li {
  6358. /* \u8D34\u5B50\u56FE\u7247 hover */
  6359. }
  6360.  
  6361. .threadlist_media li:hover .threadlist_pic_highlight {
  6362. display: none !important;
  6363. }
  6364.  
  6365. .threadlist_media li:hover .threadlist_pic_highlight {
  6366. border-radius: 8px;
  6367. }
  6368.  
  6369. .vpic_wrap img {
  6370. border-radius: 8px;
  6371. }
  6372.  
  6373. .threadlist_bright .media_disp {
  6374. border: none !important;
  6375. background: none !important;
  6376. }
  6377.  
  6378. .threadlist_bright .threadlist_video {
  6379. /* \u89C6\u9891\u9884\u89C8 */
  6380. border-radius: 8px;
  6381. }
  6382.  
  6383. .threadlist_rep_num {
  6384. height: auto !important;
  6385. height: initial !important;
  6386. background: none !important;
  6387. background-color: var(--tieba-theme-background) !important;
  6388. }
  6389.  
  6390. .threadlist_rep_num {
  6391. /* \u56DE\u8D34\u6570 */
  6392. border-radius: 24px;
  6393. color: var(--tieba-theme-fore);
  6394. font-weight: bold;
  6395. }
  6396.  
  6397. .pagination-default .pagination-item {
  6398. border: none !important;
  6399. background-color: var(--light-background) !important;
  6400. color: var(--light-fore) !important;
  6401. }
  6402.  
  6403. .pagination-default .pagination-item {
  6404. border-radius: 8px;
  6405. /* \u8DF3\u9875\u6309\u94AE */
  6406. }
  6407.  
  6408. .pagination-default .pagination-current {
  6409. border: none !important;
  6410. background-color: var(--tieba-theme-color) !important;
  6411. color: var(--default-background) !important;
  6412. }
  6413.  
  6414. .pagination-default .pagination-current {
  6415. /* \u8DF3\u9875\u6309\u94AE\uFF1A\u5F53\u524D */
  6416. }
  6417.  
  6418. .pagination-default .pagination-item:not(.pagination-current):hover {
  6419. border: none !important;
  6420. background-color: var(--trans-light-background) !important;
  6421. }
  6422.  
  6423. .pagination-default .pagination-item:not(.pagination-current):hover {
  6424. /* \u8DF3\u9875\u6309\u94AE\uFF1Ahover */
  6425. }
  6426.  
  6427. /* \u5E95\u90E8 */
  6428. #tb_rich_poster_container {
  6429. width: 982px !important;
  6430. background-color: var(--very-light-background) !important;
  6431. }
  6432. #tb_rich_poster_container {
  6433. border-radius: 0 0 24px 24px;
  6434. margin-left: -1px;
  6435. }
  6436.  
  6437. .tb_rich_poster .poster_body .editor_textfield {
  6438. border-color: var(--border-color) !important;
  6439. background-color: var(--default-background) !important;
  6440. color: var(--default-fore) !important;
  6441. }
  6442.  
  6443. .tb_rich_poster .poster_body .editor_textfield {
  6444. border-radius: 8px;
  6445. /* \u6807\u9898\u6587\u672C\u6846 */
  6446. }
  6447.  
  6448. .tb_rich_poster .poster_body .editor_textfield:focus {
  6449. border-color: var(--tieba-theme-color) !important;
  6450. }
  6451.  
  6452. .old_style_wrapper {
  6453. border-color: var(--border-color) !important;
  6454. background-color: var(--elem-color) !important;
  6455. }
  6456.  
  6457. .old_style_wrapper {
  6458. /* \u7F16\u8F91\u5668\u5BB9\u5668 */
  6459. }
  6460.  
  6461. .old_style_wrapper .edui-editor-body {
  6462. background: none !important;
  6463. }
  6464.  
  6465. .edui-container .edui-toolbar {
  6466. background: none !important;
  6467. }
  6468.  
  6469. .edui-container .edui-toolbar {
  6470. /* \u7F16\u8F91\u5668\u5DE5\u5177\u680F */
  6471. }
  6472.  
  6473. .edui-editor-body .edui-body-container {
  6474. border-color: var(--border-color) !important;
  6475. background-color: var(--default-background) !important;
  6476. }
  6477.  
  6478. .edui-editor-body .edui-body-container {
  6479. /* \u7F16\u8F91\u5668 */
  6480. }
  6481.  
  6482. .frs_content_footer_pagelet {
  6483. background: none !important;
  6484. }
  6485.  
  6486. .footer {
  6487. display: none !important;
  6488. }
  6489.  
  6490. .icon_author {
  6491. background-image: none !important;
  6492. }
  6493.  
  6494. .icon_author {
  6495. /* \u7528\u6237\u56FE\u6807 */
  6496. }
  6497.  
  6498. .icon_author::after {
  6499. content: "person";
  6500. font-style: normal;
  6501. }
  6502.  
  6503. .icon_replyer {
  6504. background-image: none !important;
  6505. }
  6506.  
  6507. .icon_replyer {
  6508. /* \u56DE\u8D34\u56FE\u6807 */
  6509. }
  6510.  
  6511. .icon_replyer::after {
  6512. content: "comment";
  6513. font-style: normal;
  6514. }@keyframes kf-fade-in-50de6ad2 {
  6515. 0% {
  6516. opacity: 0;
  6517. }
  6518. 100% {
  6519. opacity: 1;
  6520. }
  6521. }
  6522. @keyframes kf-fade-out-50de6ad2 {
  6523. 0% {
  6524. opacity: 1;
  6525. }
  6526. 100% {
  6527. opacity: 0;
  6528. }
  6529. }
  6530. @keyframes kf-dialog-in-50de6ad2 {
  6531. 0% {
  6532. opacity: 0;
  6533. transform: scale(1.2);
  6534. }
  6535. 100% {
  6536. opacity: 1;
  6537. transform: scale(1);
  6538. }
  6539. }
  6540. @keyframes kf-zoom-in-50de6ad2 {
  6541. 0% {
  6542. transform: scale(0.72);
  6543. }
  6544. 100% {
  6545. transform: scale(1);
  6546. }
  6547. }
  6548. @keyframes kf-fade-zoom-in-50de6ad2 {
  6549. 0% {
  6550. opacity: 0;
  6551. transform: scale(0.72);
  6552. }
  6553. 100% {
  6554. opacity: 1;
  6555. transform: scale(1);
  6556. }
  6557. }
  6558. html[data-v-50de6ad2] {
  6559. padding: 0;
  6560. margin: 0;
  6561. text-align: justify;
  6562. }
  6563. body[data-v-50de6ad2] {
  6564. overflow-x: hidden;
  6565. overflow-y: scroll;
  6566. overflow: hidden scroll;
  6567. padding: 0;
  6568. margin: 0;
  6569. font-family: var(--code-zh);
  6570. }
  6571. body[no-scrollbar][data-v-50de6ad2] {
  6572. overflow: hidden;
  6573. }
  6574. div[data-v-50de6ad2],
  6575. p[data-v-50de6ad2] {
  6576. margin: 0;
  6577. }
  6578. select[data-v-50de6ad2] {
  6579. padding: 1px 8px;
  6580. border: 1px solid var(--border-color);
  6581. border-radius: 8px;
  6582. cursor: pointer;
  6583. }
  6584. option[data-v-50de6ad2] {
  6585. cursor: pointer;
  6586. }
  6587. option[data-v-50de6ad2]:checked {
  6588. background-color: var(--tieba-theme-color);
  6589. color: var(--default-background);
  6590. }
  6591. a[data-v-50de6ad2] {
  6592. color: inherit;
  6593. -webkit-text-decoration: none;
  6594. text-decoration: none;
  6595. word-break: break-all;
  6596. }
  6597. .dialogJ[data-v-50de6ad2] {
  6598. position: fixed !important;
  6599. top: 50% !important;
  6600. left: 50% !important;
  6601. }
  6602. .dialogJ[data-v-50de6ad2] {
  6603. transform: translate(-50%, -50%);
  6604. }
  6605. @keyframes stretch-50de6ad2 {
  6606. 0% {
  6607. padding: 2px 14px;
  6608. }
  6609. 100% {
  6610. padding: 4px 14px;
  6611. }
  6612. }
  6613. a[data-v-50de6ad2] {
  6614. color: inherit;
  6615. }
  6616. .dropdown-menu[data-v-50de6ad2] {
  6617. position: fixed;
  6618. z-index: 1;
  6619. display: flex;
  6620. overflow: hidden;
  6621. width: -moz-max-content;
  6622. width: max-content;
  6623. min-width: 120px;
  6624. flex-direction: column;
  6625. padding: 4px;
  6626. border: 1px solid var(--border-color);
  6627. border-radius: 8px;
  6628. background-color: var(--default-background);
  6629. box-shadow: 0 0 20px rgba(0, 0, 0, 0.08);
  6630. animation: kf-fade-in-50de6ad2 0.2s;
  6631. font-size: 14px;
  6632. }
  6633. .dropdown-menu .menu-item[data-v-50de6ad2] {
  6634. display: flex;
  6635. width: 100%;
  6636. align-items: center;
  6637. padding: 4px 14px;
  6638. border: none;
  6639. border-radius: 6px;
  6640. animation: stretch-50de6ad2 0.2s cubic-bezier(0.22, 0.61, 0.36, 1);
  6641. background: none;
  6642. color: var(--default-fore);
  6643. font-size: 14px;
  6644. gap: 6px;
  6645. transition: 0.2s;
  6646. }
  6647. .dropdown-menu .menu-item .menu-title[data-v-50de6ad2] {
  6648. display: flex;
  6649. width: 100%;
  6650. gap: 12px;
  6651. text-align: justify;
  6652. }
  6653. .dropdown-menu .menu-item .menu-title .menu-inner[data-v-50de6ad2] {
  6654. margin-left: auto;
  6655. color: var(--minimal-fore);
  6656. }
  6657. .dropdown-menu .menu-item[data-v-50de6ad2]:hover {
  6658. background-color: var(--default-hover);
  6659. }
  6660. .dropdown-menu .menu-item[data-v-50de6ad2]:active {
  6661. background-color: var(--default-active);
  6662. }
  6663. .dropdown-menu .menu-separator[data-v-50de6ad2] {
  6664. width: calc(100% + 8px);
  6665. height: 1px;
  6666. margin: 6px 0 6px -4px;
  6667. background-color: var(--border-color);
  6668. }
  6669. .blur-effect[data-v-50de6ad2] {
  6670. background-color: var(--trans-default-background);
  6671. }
  6672. html:not([perf-saver]) .blur-effect[data-v-50de6ad2] {
  6673. -webkit-backdrop-filter: blur(24px);
  6674. backdrop-filter: blur(24px);
  6675. }
  6676. html.dark-theme .blur-effect[data-v-50de6ad2] {
  6677. -webkit-backdrop-filter: blur(24px) brightness(0.8);
  6678. backdrop-filter: blur(24px) brightness(0.8);
  6679. }@keyframes kf-fade-in-4cad486c {
  6680. 0% {
  6681. opacity: 0;
  6682. }
  6683. 100% {
  6684. opacity: 1;
  6685. }
  6686. }
  6687. @keyframes kf-fade-out-4cad486c {
  6688. 0% {
  6689. opacity: 1;
  6690. }
  6691. 100% {
  6692. opacity: 0;
  6693. }
  6694. }
  6695. @keyframes kf-dialog-in-4cad486c {
  6696. 0% {
  6697. opacity: 0;
  6698. transform: scale(1.2);
  6699. }
  6700. 100% {
  6701. opacity: 1;
  6702. transform: scale(1);
  6703. }
  6704. }
  6705. @keyframes kf-zoom-in-4cad486c {
  6706. 0% {
  6707. transform: scale(0.72);
  6708. }
  6709. 100% {
  6710. transform: scale(1);
  6711. }
  6712. }
  6713. @keyframes kf-fade-zoom-in-4cad486c {
  6714. 0% {
  6715. opacity: 0;
  6716. transform: scale(0.72);
  6717. }
  6718. 100% {
  6719. opacity: 1;
  6720. transform: scale(1);
  6721. }
  6722. }
  6723. html[data-v-4cad486c] {
  6724. padding: 0;
  6725. margin: 0;
  6726. text-align: justify;
  6727. }
  6728. body[data-v-4cad486c] {
  6729. overflow-x: hidden;
  6730. overflow-y: scroll;
  6731. overflow: hidden scroll;
  6732. padding: 0;
  6733. margin: 0;
  6734. font-family: var(--code-zh);
  6735. }
  6736. body[no-scrollbar][data-v-4cad486c] {
  6737. overflow: hidden;
  6738. }
  6739. div[data-v-4cad486c],
  6740. p[data-v-4cad486c] {
  6741. margin: 0;
  6742. }
  6743. select[data-v-4cad486c] {
  6744. padding: 1px 8px;
  6745. border: 1px solid var(--border-color);
  6746. border-radius: 8px;
  6747. cursor: pointer;
  6748. }
  6749. option[data-v-4cad486c] {
  6750. cursor: pointer;
  6751. }
  6752. option[data-v-4cad486c]:checked {
  6753. background-color: var(--tieba-theme-color);
  6754. color: var(--default-background);
  6755. }
  6756. a[data-v-4cad486c] {
  6757. color: inherit;
  6758. -webkit-text-decoration: none;
  6759. text-decoration: none;
  6760. word-break: break-all;
  6761. }
  6762. .dialogJ[data-v-4cad486c] {
  6763. position: fixed !important;
  6764. top: 50% !important;
  6765. left: 50% !important;
  6766. }
  6767. .dialogJ[data-v-4cad486c] {
  6768. transform: translate(-50%, -50%);
  6769. }
  6770. #nav-bar[data-v-4cad486c] {
  6771. position: fixed;
  6772. z-index: 1200;
  6773. top: 0;
  6774. left: 0;
  6775. display: flex;
  6776. width: 100%;
  6777. height: 48px;
  6778. align-items: center;
  6779. justify-content: center;
  6780. border-bottom: 1px solid var(--border-color);
  6781. background-color: var(--trans-page-background);
  6782. transition: 0.4s;
  6783. box-shadow: 0 10px 10px rgba(0, 0, 0, 0.01);
  6784. }
  6785. html.dark-theme #nav-bar[data-v-4cad486c] {
  6786. box-shadow: 0 10px 16px rgba(0, 0, 0, 0.2);
  6787. }
  6788. #nav-bar.fold[data-v-4cad486c] {
  6789. transform: translateY(-32px);
  6790. }
  6791. #nav-bar.fold[data-v-4cad486c]::after {
  6792. position: absolute;
  6793. top: 48px;
  6794. width: 100%;
  6795. height: 32px;
  6796. content: "";
  6797. }
  6798. #nav-bar.fold[data-v-4cad486c]:hover {
  6799. transform: translateY(0);
  6800. }
  6801. #nav-bar.fold:hover #nav-container[data-v-4cad486c] {
  6802. display: flex;
  6803. }
  6804. #nav-bar.fold:hover #fold-bar[data-v-4cad486c] {
  6805. display: none;
  6806. }
  6807. #nav-bar.fold #fold-bar[data-v-4cad486c] {
  6808. position: absolute;
  6809. bottom: 6.5px;
  6810. width: 60px;
  6811. height: 3px;
  6812. border-radius: 3px;
  6813. margin: 0 auto;
  6814. background-color: var(--border-color);
  6815. }
  6816. #nav-bar.fold #nav-container[data-v-4cad486c] {
  6817. display: none;
  6818. }
  6819. #nav-bar.hide[data-v-4cad486c] {
  6820. box-shadow: none !important;
  6821. }
  6822. #nav-bar.hide[data-v-4cad486c] {
  6823. transform: translateY(-100%);
  6824. }
  6825. #nav-bar.fixed-on-top[data-v-4cad486c] {
  6826. position: absolute;
  6827. }
  6828. #nav-bar #nav-container[data-v-4cad486c] {
  6829. display: flex;
  6830. width: 100%;
  6831. max-width: var(--content-max);
  6832. height: 100%;
  6833. justify-content: space-between;
  6834. }
  6835. .shrink-view #nav-bar #nav-container[data-v-4cad486c] {
  6836. justify-content: space-around;
  6837. }
  6838. #nav-bar #nav-container .left-container .nav-title-container[data-v-4cad486c] {
  6839. display: flex;
  6840. height: 100%;
  6841. align-items: center;
  6842. padding: 0;
  6843. border: none;
  6844. background: none;
  6845. gap: 8px;
  6846. -webkit-text-decoration: underline 3px var(--tieba-theme-color);
  6847. text-decoration: underline 3px var(--tieba-theme-color);
  6848. }
  6849. #nav-bar #nav-container .left-container .nav-title-container .nav-icon[data-v-4cad486c] {
  6850. width: 36px;
  6851. }
  6852. #nav-bar #nav-container .left-container .nav-title-container .nav-title[data-v-4cad486c] {
  6853. color: var(--default-fore);
  6854. font-size: 20px;
  6855. font-style: italic;
  6856. font-weight: bold;
  6857. transition: 0.2s;
  6858. }
  6859. #nav-bar #nav-container .left-container .nav-title-container:hover .nav-title[data-v-4cad486c], #nav-bar #nav-container .left-container .nav-title-container:active .nav-title[data-v-4cad486c], #nav-bar #nav-container .left-container .nav-title-container:focus .nav-title[data-v-4cad486c] {
  6860. color: var(--highlight-fore);
  6861. }
  6862. #nav-bar #nav-container .middle-container[data-v-4cad486c] {
  6863. display: flex;
  6864. height: 100%;
  6865. justify-content: center;
  6866. }
  6867. #nav-bar #nav-container .middle-container .middle-menu-trigger[data-v-4cad486c] {
  6868. height: 100%;
  6869. padding: 0 10px;
  6870. border: none;
  6871. color: var(--default-fore);
  6872. font-size: 15px;
  6873. font-weight: bold;
  6874. text-decoration: underline;
  6875. -webkit-text-decoration: underline solid rgba(0, 0, 0, 0);
  6876. text-decoration: underline solid rgba(0, 0, 0, 0);
  6877. text-decoration-thickness: 2px;
  6878. -webkit-text-decoration: underline 2px rgba(0, 0, 0, 0);
  6879. text-decoration: underline 2px rgba(0, 0, 0, 0);
  6880. }
  6881. #nav-bar #nav-container .middle-container .middle-menu-trigger[data-v-4cad486c]:hover {
  6882. -webkit-text-decoration: underline 2px var(--tieba-theme-color);
  6883. text-decoration: underline 2px var(--tieba-theme-color);
  6884. }
  6885. #nav-bar #nav-container .right-container[data-v-4cad486c] {
  6886. display: flex;
  6887. gap: 6px;
  6888. }
  6889. #nav-bar #nav-container .right-container .avatar-button[data-v-4cad486c] {
  6890. display: flex;
  6891. height: 100%;
  6892. align-items: center;
  6893. padding: 0;
  6894. padding: 0 2px;
  6895. border: 4px;
  6896. }
  6897. #nav-bar #nav-container .right-container .avatar-button .nav-avatar[data-v-4cad486c] {
  6898. width: 32px;
  6899. height: 32px;
  6900. border-radius: 24px;
  6901. box-shadow: 0 0 0 1px var(--border-color);
  6902. transition: 0.4s;
  6903. }
  6904. #nav-bar #nav-container .right-container .avatar-button:hover > .nav-avatar[data-v-4cad486c] {
  6905. box-shadow: 0 0 0 2px var(--tieba-theme-color);
  6906. }
  6907. #nav-bar #nav-container .right-container .menu-button[data-v-4cad486c] {
  6908. padding: 2px 8px;
  6909. border: none;
  6910. color: var(--highlight-fore);
  6911. font-size: 26px;
  6912. }
  6913. #nav-bar #nav-container .right-container .menu-button[data-v-4cad486c]:hover {
  6914. color: var(--tieba-theme-color);
  6915. }
  6916. .menu-trigger[data-v-4cad486c] {
  6917. border-radius: 0;
  6918. background-color: transparent;
  6919. }
  6920. .menu-trigger[data-v-4cad486c]:hover {
  6921. background-color: var(--default-hover);
  6922. }
  6923. .menu-trigger:hover > .nav-menu[data-v-4cad486c], .menu-trigger:active > .nav-menu[data-v-4cad486c] {
  6924. display: block;
  6925. }
  6926. .nav-menu[data-v-4cad486c] {
  6927. position: absolute;
  6928. z-index: 1201;
  6929. display: none;
  6930. cursor: default;
  6931. font-weight: normal;
  6932. }
  6933. .nav-menu[data-v-4cad486c]:hover {
  6934. display: block;
  6935. }.shield-container[data-v-64c498cf] {
  6936. display: flex;
  6937. width: 100%;
  6938. flex-direction: column;
  6939. gap: 16px;
  6940. }
  6941. .shield-container .words-container[data-v-64c498cf] {
  6942. display: flex;
  6943. flex-wrap: wrap;
  6944. padding: 12px;
  6945. border-radius: 12px;
  6946. background-color: var(--trans-light-background);
  6947. gap: 4px;
  6948. }
  6949. .shield-container .words-container .shield-elem[data-v-64c498cf] {
  6950. display: flex;
  6951. align-items: center;
  6952. padding: 4px 8px;
  6953. border: none;
  6954. border-radius: 8px;
  6955. font-size: 14px;
  6956. gap: 4px;
  6957. }
  6958. .shield-container .words-container .shield-elem .icon[data-v-64c498cf] {
  6959. color: var(--light-fore);
  6960. }
  6961. .shield-container .words-container .remove-all[data-v-64c498cf] {
  6962. background-color: #d62929;
  6963. color: var(--default-background);
  6964. font-variation-settings: "FILL" 0;
  6965. }
  6966. .shield-container .empty-list-container[data-v-64c498cf] {
  6967. color: var(--minimal-fore);
  6968. }
  6969. .shield-container .shield-controls[data-v-64c498cf] {
  6970. display: flex;
  6971. flex-direction: column;
  6972. gap: 8px;
  6973. }
  6974. .shield-container .shield-controls .shield-input[data-v-64c498cf] {
  6975. width: 100%;
  6976. height: auto;
  6977. max-height: 6em;
  6978. box-sizing: border-box;
  6979. padding: 6px;
  6980. font-size: 16px;
  6981. resize: none;
  6982. }
  6983. .shield-container .shield-controls .submit-controls[data-v-64c498cf] {
  6984. display: flex;
  6985. align-items: center;
  6986. justify-content: flex-end;
  6987. gap: 12px;
  6988. }
  6989. .shield-container .shield-controls .submit-controls label[data-v-64c498cf] {
  6990. margin-left: 4px;
  6991. -webkit-user-select: none;
  6992. -moz-user-select: none;
  6993. user-select: none;
  6994. }
  6995. .shield-container .shield-controls .submit-controls .regex-check[data-v-64c498cf] {
  6996. margin-right: 8px;
  6997. font-size: 16px;
  6998. }
  6999. .shield-container .shield-controls .submit-controls .submit-button[data-v-64c498cf] {
  7000. padding: 4px 12px;
  7001. font-size: 14px;
  7002. font-weight: bold;
  7003. } `);
  7004.  
  7005. (function () {
  7006. 'use strict';
  7007.  
  7008. var __defProp = Object.defineProperty;
  7009. var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  7010. var __publicField = (obj, key, value) => {
  7011. __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  7012. return value;
  7013. };
  7014. (function(vue, marked2, elementPlus) {
  7015. const cssLoader = (e) => {
  7016. const t = GM_getResourceText(e);
  7017. return GM_addStyle(t), t;
  7018. };
  7019. cssLoader("element-plus/dist/index.css");
  7020. var freeGlobal = typeof global == "object" && global && global.Object === Object && global;
  7021. var freeSelf = typeof self == "object" && self && self.Object === Object && self;
  7022. var root = freeGlobal || freeSelf || Function("return this")();
  7023. var Symbol$1 = root.Symbol;
  7024. var objectProto$g = Object.prototype;
  7025. var hasOwnProperty$d = objectProto$g.hasOwnProperty;
  7026. var nativeObjectToString$1 = objectProto$g.toString;
  7027. var symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : void 0;
  7028. function getRawTag(value) {
  7029. var isOwn = hasOwnProperty$d.call(value, symToStringTag$1), tag = value[symToStringTag$1];
  7030. try {
  7031. value[symToStringTag$1] = void 0;
  7032. var unmasked = true;
  7033. } catch (e) {
  7034. }
  7035. var result = nativeObjectToString$1.call(value);
  7036. if (unmasked) {
  7037. if (isOwn) {
  7038. value[symToStringTag$1] = tag;
  7039. } else {
  7040. delete value[symToStringTag$1];
  7041. }
  7042. }
  7043. return result;
  7044. }
  7045. var objectProto$f = Object.prototype;
  7046. var nativeObjectToString = objectProto$f.toString;
  7047. function objectToString(value) {
  7048. return nativeObjectToString.call(value);
  7049. }
  7050. var nullTag = "[object Null]", undefinedTag = "[object Undefined]";
  7051. var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : void 0;
  7052. function baseGetTag(value) {
  7053. if (value == null) {
  7054. return value === void 0 ? undefinedTag : nullTag;
  7055. }
  7056. return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);
  7057. }
  7058. function isObjectLike(value) {
  7059. return value != null && typeof value == "object";
  7060. }
  7061. var symbolTag$1 = "[object Symbol]";
  7062. function isSymbol(value) {
  7063. return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag$1;
  7064. }
  7065. function arrayMap(array, iteratee) {
  7066. var index2 = -1, length = array == null ? 0 : array.length, result = Array(length);
  7067. while (++index2 < length) {
  7068. result[index2] = iteratee(array[index2], index2, array);
  7069. }
  7070. return result;
  7071. }
  7072. var isArray = Array.isArray;
  7073. var INFINITY$3 = 1 / 0;
  7074. var symbolProto$1 = Symbol$1 ? Symbol$1.prototype : void 0, symbolToString = symbolProto$1 ? symbolProto$1.toString : void 0;
  7075. function baseToString(value) {
  7076. if (typeof value == "string") {
  7077. return value;
  7078. }
  7079. if (isArray(value)) {
  7080. return arrayMap(value, baseToString) + "";
  7081. }
  7082. if (isSymbol(value)) {
  7083. return symbolToString ? symbolToString.call(value) : "";
  7084. }
  7085. var result = value + "";
  7086. return result == "0" && 1 / value == -INFINITY$3 ? "-0" : result;
  7087. }
  7088. var reWhitespace = /\s/;
  7089. function trimmedEndIndex(string) {
  7090. var index2 = string.length;
  7091. while (index2-- && reWhitespace.test(string.charAt(index2))) {
  7092. }
  7093. return index2;
  7094. }
  7095. var reTrimStart$1 = /^\s+/;
  7096. function baseTrim(string) {
  7097. return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart$1, "") : string;
  7098. }
  7099. function isObject(value) {
  7100. var type = typeof value;
  7101. return value != null && (type == "object" || type == "function");
  7102. }
  7103. var NAN = 0 / 0;
  7104. var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
  7105. var reIsBinary = /^0b[01]+$/i;
  7106. var reIsOctal = /^0o[0-7]+$/i;
  7107. var freeParseInt = parseInt;
  7108. function toNumber(value) {
  7109. if (typeof value == "number") {
  7110. return value;
  7111. }
  7112. if (isSymbol(value)) {
  7113. return NAN;
  7114. }
  7115. if (isObject(value)) {
  7116. var other = typeof value.valueOf == "function" ? value.valueOf() : value;
  7117. value = isObject(other) ? other + "" : other;
  7118. }
  7119. if (typeof value != "string") {
  7120. return value === 0 ? value : +value;
  7121. }
  7122. value = baseTrim(value);
  7123. var isBinary = reIsBinary.test(value);
  7124. return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
  7125. }
  7126. var INFINITY$2 = 1 / 0, MAX_INTEGER = 17976931348623157e292;
  7127. function toFinite(value) {
  7128. if (!value) {
  7129. return value === 0 ? value : 0;
  7130. }
  7131. value = toNumber(value);
  7132. if (value === INFINITY$2 || value === -INFINITY$2) {
  7133. var sign = value < 0 ? -1 : 1;
  7134. return sign * MAX_INTEGER;
  7135. }
  7136. return value === value ? value : 0;
  7137. }
  7138. function toInteger(value) {
  7139. var result = toFinite(value), remainder = result % 1;
  7140. return result === result ? remainder ? result - remainder : result : 0;
  7141. }
  7142. function identity(value) {
  7143. return value;
  7144. }
  7145. var asyncTag = "[object AsyncFunction]", funcTag$1 = "[object Function]", genTag = "[object GeneratorFunction]", proxyTag = "[object Proxy]";
  7146. function isFunction(value) {
  7147. if (!isObject(value)) {
  7148. return false;
  7149. }
  7150. var tag = baseGetTag(value);
  7151. return tag == funcTag$1 || tag == genTag || tag == asyncTag || tag == proxyTag;
  7152. }
  7153. var coreJsData = root["__core-js_shared__"];
  7154. var maskSrcKey = function() {
  7155. var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || "");
  7156. return uid ? "Symbol(src)_1." + uid : "";
  7157. }();
  7158. function isMasked(func) {
  7159. return !!maskSrcKey && maskSrcKey in func;
  7160. }
  7161. var funcProto$2 = Function.prototype;
  7162. var funcToString$2 = funcProto$2.toString;
  7163. function toSource(func) {
  7164. if (func != null) {
  7165. try {
  7166. return funcToString$2.call(func);
  7167. } catch (e) {
  7168. }
  7169. try {
  7170. return func + "";
  7171. } catch (e) {
  7172. }
  7173. }
  7174. return "";
  7175. }
  7176. var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
  7177. var reIsHostCtor = /^\[object .+?Constructor\]$/;
  7178. var funcProto$1 = Function.prototype, objectProto$e = Object.prototype;
  7179. var funcToString$1 = funcProto$1.toString;
  7180. var hasOwnProperty$c = objectProto$e.hasOwnProperty;
  7181. var reIsNative = RegExp(
  7182. "^" + funcToString$1.call(hasOwnProperty$c).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"
  7183. );
  7184. function baseIsNative(value) {
  7185. if (!isObject(value) || isMasked(value)) {
  7186. return false;
  7187. }
  7188. var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
  7189. return pattern.test(toSource(value));
  7190. }
  7191. function getValue(object, key) {
  7192. return object == null ? void 0 : object[key];
  7193. }
  7194. function getNative(object, key) {
  7195. var value = getValue(object, key);
  7196. return baseIsNative(value) ? value : void 0;
  7197. }
  7198. var WeakMap = getNative(root, "WeakMap");
  7199. var objectCreate = Object.create;
  7200. var baseCreate = /* @__PURE__ */ function() {
  7201. function object() {
  7202. }
  7203. return function(proto) {
  7204. if (!isObject(proto)) {
  7205. return {};
  7206. }
  7207. if (objectCreate) {
  7208. return objectCreate(proto);
  7209. }
  7210. object.prototype = proto;
  7211. var result = new object();
  7212. object.prototype = void 0;
  7213. return result;
  7214. };
  7215. }();
  7216. function apply(func, thisArg, args) {
  7217. switch (args.length) {
  7218. case 0:
  7219. return func.call(thisArg);
  7220. case 1:
  7221. return func.call(thisArg, args[0]);
  7222. case 2:
  7223. return func.call(thisArg, args[0], args[1]);
  7224. case 3:
  7225. return func.call(thisArg, args[0], args[1], args[2]);
  7226. }
  7227. return func.apply(thisArg, args);
  7228. }
  7229. function copyArray(source, array) {
  7230. var index2 = -1, length = source.length;
  7231. array || (array = Array(length));
  7232. while (++index2 < length) {
  7233. array[index2] = source[index2];
  7234. }
  7235. return array;
  7236. }
  7237. var HOT_COUNT = 800, HOT_SPAN = 16;
  7238. var nativeNow = Date.now;
  7239. function shortOut(func) {
  7240. var count = 0, lastCalled = 0;
  7241. return function() {
  7242. var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled);
  7243. lastCalled = stamp;
  7244. if (remaining > 0) {
  7245. if (++count >= HOT_COUNT) {
  7246. return arguments[0];
  7247. }
  7248. } else {
  7249. count = 0;
  7250. }
  7251. return func.apply(void 0, arguments);
  7252. };
  7253. }
  7254. function constant(value) {
  7255. return function() {
  7256. return value;
  7257. };
  7258. }
  7259. var defineProperty = function() {
  7260. try {
  7261. var func = getNative(Object, "defineProperty");
  7262. func({}, "", {});
  7263. return func;
  7264. } catch (e) {
  7265. }
  7266. }();
  7267. var baseSetToString = !defineProperty ? identity : function(func, string) {
  7268. return defineProperty(func, "toString", {
  7269. "configurable": true,
  7270. "enumerable": false,
  7271. "value": constant(string),
  7272. "writable": true
  7273. });
  7274. };
  7275. const baseSetToString$1 = baseSetToString;
  7276. var setToString = shortOut(baseSetToString$1);
  7277. function arrayEach(array, iteratee) {
  7278. var index2 = -1, length = array == null ? 0 : array.length;
  7279. while (++index2 < length) {
  7280. if (iteratee(array[index2], index2, array) === false) {
  7281. break;
  7282. }
  7283. }
  7284. return array;
  7285. }
  7286. function baseFindIndex(array, predicate, fromIndex, fromRight) {
  7287. var length = array.length, index2 = fromIndex + (fromRight ? 1 : -1);
  7288. while (fromRight ? index2-- : ++index2 < length) {
  7289. if (predicate(array[index2], index2, array)) {
  7290. return index2;
  7291. }
  7292. }
  7293. return -1;
  7294. }
  7295. function baseIsNaN(value) {
  7296. return value !== value;
  7297. }
  7298. function strictIndexOf(array, value, fromIndex) {
  7299. var index2 = fromIndex - 1, length = array.length;
  7300. while (++index2 < length) {
  7301. if (array[index2] === value) {
  7302. return index2;
  7303. }
  7304. }
  7305. return -1;
  7306. }
  7307. function baseIndexOf(array, value, fromIndex) {
  7308. return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex);
  7309. }
  7310. var MAX_SAFE_INTEGER$2 = 9007199254740991;
  7311. var reIsUint = /^(?:0|[1-9]\d*)$/;
  7312. function isIndex(value, length) {
  7313. var type = typeof value;
  7314. length = length == null ? MAX_SAFE_INTEGER$2 : length;
  7315. return !!length && (type == "number" || type != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
  7316. }
  7317. function baseAssignValue(object, key, value) {
  7318. if (key == "__proto__" && defineProperty) {
  7319. defineProperty(object, key, {
  7320. "configurable": true,
  7321. "enumerable": true,
  7322. "value": value,
  7323. "writable": true
  7324. });
  7325. } else {
  7326. object[key] = value;
  7327. }
  7328. }
  7329. function eq(value, other) {
  7330. return value === other || value !== value && other !== other;
  7331. }
  7332. var objectProto$d = Object.prototype;
  7333. var hasOwnProperty$b = objectProto$d.hasOwnProperty;
  7334. function assignValue(object, key, value) {
  7335. var objValue = object[key];
  7336. if (!(hasOwnProperty$b.call(object, key) && eq(objValue, value)) || value === void 0 && !(key in object)) {
  7337. baseAssignValue(object, key, value);
  7338. }
  7339. }
  7340. function copyObject(source, props, object, customizer) {
  7341. var isNew = !object;
  7342. object || (object = {});
  7343. var index2 = -1, length = props.length;
  7344. while (++index2 < length) {
  7345. var key = props[index2];
  7346. var newValue = customizer ? customizer(object[key], source[key], key, object, source) : void 0;
  7347. if (newValue === void 0) {
  7348. newValue = source[key];
  7349. }
  7350. if (isNew) {
  7351. baseAssignValue(object, key, newValue);
  7352. } else {
  7353. assignValue(object, key, newValue);
  7354. }
  7355. }
  7356. return object;
  7357. }
  7358. var nativeMax$6 = Math.max;
  7359. function overRest(func, start, transform) {
  7360. start = nativeMax$6(start === void 0 ? func.length - 1 : start, 0);
  7361. return function() {
  7362. var args = arguments, index2 = -1, length = nativeMax$6(args.length - start, 0), array = Array(length);
  7363. while (++index2 < length) {
  7364. array[index2] = args[start + index2];
  7365. }
  7366. index2 = -1;
  7367. var otherArgs = Array(start + 1);
  7368. while (++index2 < start) {
  7369. otherArgs[index2] = args[index2];
  7370. }
  7371. otherArgs[start] = transform(array);
  7372. return apply(func, this, otherArgs);
  7373. };
  7374. }
  7375. function baseRest(func, start) {
  7376. return setToString(overRest(func, start, identity), func + "");
  7377. }
  7378. var MAX_SAFE_INTEGER$1 = 9007199254740991;
  7379. function isLength(value) {
  7380. return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;
  7381. }
  7382. function isArrayLike(value) {
  7383. return value != null && isLength(value.length) && !isFunction(value);
  7384. }
  7385. function isIterateeCall(value, index2, object) {
  7386. if (!isObject(object)) {
  7387. return false;
  7388. }
  7389. var type = typeof index2;
  7390. if (type == "number" ? isArrayLike(object) && isIndex(index2, object.length) : type == "string" && index2 in object) {
  7391. return eq(object[index2], value);
  7392. }
  7393. return false;
  7394. }
  7395. function createAssigner(assigner) {
  7396. return baseRest(function(object, sources) {
  7397. var index2 = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : void 0, guard = length > 2 ? sources[2] : void 0;
  7398. customizer = assigner.length > 3 && typeof customizer == "function" ? (length--, customizer) : void 0;
  7399. if (guard && isIterateeCall(sources[0], sources[1], guard)) {
  7400. customizer = length < 3 ? void 0 : customizer;
  7401. length = 1;
  7402. }
  7403. object = Object(object);
  7404. while (++index2 < length) {
  7405. var source = sources[index2];
  7406. if (source) {
  7407. assigner(object, source, index2, customizer);
  7408. }
  7409. }
  7410. return object;
  7411. });
  7412. }
  7413. var objectProto$c = Object.prototype;
  7414. function isPrototype(value) {
  7415. var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto$c;
  7416. return value === proto;
  7417. }
  7418. function baseTimes(n, iteratee) {
  7419. var index2 = -1, result = Array(n);
  7420. while (++index2 < n) {
  7421. result[index2] = iteratee(index2);
  7422. }
  7423. return result;
  7424. }
  7425. var argsTag$2 = "[object Arguments]";
  7426. function baseIsArguments(value) {
  7427. return isObjectLike(value) && baseGetTag(value) == argsTag$2;
  7428. }
  7429. var objectProto$b = Object.prototype;
  7430. var hasOwnProperty$a = objectProto$b.hasOwnProperty;
  7431. var propertyIsEnumerable$1 = objectProto$b.propertyIsEnumerable;
  7432. var isArguments = baseIsArguments(/* @__PURE__ */ function() {
  7433. return arguments;
  7434. }()) ? baseIsArguments : function(value) {
  7435. return isObjectLike(value) && hasOwnProperty$a.call(value, "callee") && !propertyIsEnumerable$1.call(value, "callee");
  7436. };
  7437. function stubFalse() {
  7438. return false;
  7439. }
  7440. var freeExports$2 = typeof exports == "object" && exports && !exports.nodeType && exports;
  7441. var freeModule$2 = freeExports$2 && typeof module == "object" && module && !module.nodeType && module;
  7442. var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
  7443. var Buffer$1 = moduleExports$2 ? root.Buffer : void 0;
  7444. var nativeIsBuffer = Buffer$1 ? Buffer$1.isBuffer : void 0;
  7445. var isBuffer = nativeIsBuffer || stubFalse;
  7446. var argsTag$1 = "[object Arguments]", arrayTag$1 = "[object Array]", boolTag$1 = "[object Boolean]", dateTag$1 = "[object Date]", errorTag$1 = "[object Error]", funcTag = "[object Function]", mapTag$2 = "[object Map]", numberTag$1 = "[object Number]", objectTag$3 = "[object Object]", regexpTag$2 = "[object RegExp]", setTag$2 = "[object Set]", stringTag$2 = "[object String]", weakMapTag$1 = "[object WeakMap]";
  7447. var arrayBufferTag$1 = "[object ArrayBuffer]", dataViewTag$2 = "[object DataView]", float32Tag = "[object Float32Array]", float64Tag = "[object Float64Array]", int8Tag = "[object Int8Array]", int16Tag = "[object Int16Array]", int32Tag = "[object Int32Array]", uint8Tag = "[object Uint8Array]", uint8ClampedTag = "[object Uint8ClampedArray]", uint16Tag = "[object Uint16Array]", uint32Tag = "[object Uint32Array]";
  7448. var typedArrayTags = {};
  7449. typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;
  7450. typedArrayTags[argsTag$1] = typedArrayTags[arrayTag$1] = typedArrayTags[arrayBufferTag$1] = typedArrayTags[boolTag$1] = typedArrayTags[dataViewTag$2] = typedArrayTags[dateTag$1] = typedArrayTags[errorTag$1] = typedArrayTags[funcTag] = typedArrayTags[mapTag$2] = typedArrayTags[numberTag$1] = typedArrayTags[objectTag$3] = typedArrayTags[regexpTag$2] = typedArrayTags[setTag$2] = typedArrayTags[stringTag$2] = typedArrayTags[weakMapTag$1] = false;
  7451. function baseIsTypedArray(value) {
  7452. return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
  7453. }
  7454. function baseUnary(func) {
  7455. return function(value) {
  7456. return func(value);
  7457. };
  7458. }
  7459. var freeExports$1 = typeof exports == "object" && exports && !exports.nodeType && exports;
  7460. var freeModule$1 = freeExports$1 && typeof module == "object" && module && !module.nodeType && module;
  7461. var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
  7462. var freeProcess = moduleExports$1 && freeGlobal.process;
  7463. var nodeUtil = function() {
  7464. try {
  7465. var types = freeModule$1 && freeModule$1.require && freeModule$1.require("util").types;
  7466. if (types) {
  7467. return types;
  7468. }
  7469. return freeProcess && freeProcess.binding && freeProcess.binding("util");
  7470. } catch (e) {
  7471. }
  7472. }();
  7473. var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
  7474. var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
  7475. var objectProto$a = Object.prototype;
  7476. var hasOwnProperty$9 = objectProto$a.hasOwnProperty;
  7477. function arrayLikeKeys(value, inherited) {
  7478. var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length;
  7479. for (var key in value) {
  7480. if ((inherited || hasOwnProperty$9.call(value, key)) && !(skipIndexes && // Safari 9 has enumerable `arguments.length` in strict mode.
  7481. (key == "length" || // Node.js 0.10 has enumerable non-index properties on buffers.
  7482. isBuff && (key == "offset" || key == "parent") || // PhantomJS 2 has enumerable non-index properties on typed arrays.
  7483. isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || // Skip index properties.
  7484. isIndex(key, length)))) {
  7485. result.push(key);
  7486. }
  7487. }
  7488. return result;
  7489. }
  7490. function overArg(func, transform) {
  7491. return function(arg) {
  7492. return func(transform(arg));
  7493. };
  7494. }
  7495. var nativeKeys = overArg(Object.keys, Object);
  7496. var objectProto$9 = Object.prototype;
  7497. var hasOwnProperty$8 = objectProto$9.hasOwnProperty;
  7498. function baseKeys(object) {
  7499. if (!isPrototype(object)) {
  7500. return nativeKeys(object);
  7501. }
  7502. var result = [];
  7503. for (var key in Object(object)) {
  7504. if (hasOwnProperty$8.call(object, key) && key != "constructor") {
  7505. result.push(key);
  7506. }
  7507. }
  7508. return result;
  7509. }
  7510. function keys(object) {
  7511. return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
  7512. }
  7513. var objectProto$8 = Object.prototype;
  7514. var hasOwnProperty$7 = objectProto$8.hasOwnProperty;
  7515. var assign = createAssigner(function(object, source) {
  7516. if (isPrototype(source) || isArrayLike(source)) {
  7517. copyObject(source, keys(source), object);
  7518. return;
  7519. }
  7520. for (var key in source) {
  7521. if (hasOwnProperty$7.call(source, key)) {
  7522. assignValue(object, key, source[key]);
  7523. }
  7524. }
  7525. });
  7526. const assign$1 = assign;
  7527. function nativeKeysIn(object) {
  7528. var result = [];
  7529. if (object != null) {
  7530. for (var key in Object(object)) {
  7531. result.push(key);
  7532. }
  7533. }
  7534. return result;
  7535. }
  7536. var objectProto$7 = Object.prototype;
  7537. var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
  7538. function baseKeysIn(object) {
  7539. if (!isObject(object)) {
  7540. return nativeKeysIn(object);
  7541. }
  7542. var isProto = isPrototype(object), result = [];
  7543. for (var key in object) {
  7544. if (!(key == "constructor" && (isProto || !hasOwnProperty$6.call(object, key)))) {
  7545. result.push(key);
  7546. }
  7547. }
  7548. return result;
  7549. }
  7550. function keysIn(object) {
  7551. return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
  7552. }
  7553. var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/;
  7554. function isKey(value, object) {
  7555. if (isArray(value)) {
  7556. return false;
  7557. }
  7558. var type = typeof value;
  7559. if (type == "number" || type == "symbol" || type == "boolean" || value == null || isSymbol(value)) {
  7560. return true;
  7561. }
  7562. return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object(object);
  7563. }
  7564. var nativeCreate = getNative(Object, "create");
  7565. function hashClear() {
  7566. this.__data__ = nativeCreate ? nativeCreate(null) : {};
  7567. this.size = 0;
  7568. }
  7569. function hashDelete(key) {
  7570. var result = this.has(key) && delete this.__data__[key];
  7571. this.size -= result ? 1 : 0;
  7572. return result;
  7573. }
  7574. var HASH_UNDEFINED$2 = "__lodash_hash_undefined__";
  7575. var objectProto$6 = Object.prototype;
  7576. var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
  7577. function hashGet(key) {
  7578. var data = this.__data__;
  7579. if (nativeCreate) {
  7580. var result = data[key];
  7581. return result === HASH_UNDEFINED$2 ? void 0 : result;
  7582. }
  7583. return hasOwnProperty$5.call(data, key) ? data[key] : void 0;
  7584. }
  7585. var objectProto$5 = Object.prototype;
  7586. var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
  7587. function hashHas(key) {
  7588. var data = this.__data__;
  7589. return nativeCreate ? data[key] !== void 0 : hasOwnProperty$4.call(data, key);
  7590. }
  7591. var HASH_UNDEFINED$1 = "__lodash_hash_undefined__";
  7592. function hashSet(key, value) {
  7593. var data = this.__data__;
  7594. this.size += this.has(key) ? 0 : 1;
  7595. data[key] = nativeCreate && value === void 0 ? HASH_UNDEFINED$1 : value;
  7596. return this;
  7597. }
  7598. function Hash(entries) {
  7599. var index2 = -1, length = entries == null ? 0 : entries.length;
  7600. this.clear();
  7601. while (++index2 < length) {
  7602. var entry = entries[index2];
  7603. this.set(entry[0], entry[1]);
  7604. }
  7605. }
  7606. Hash.prototype.clear = hashClear;
  7607. Hash.prototype["delete"] = hashDelete;
  7608. Hash.prototype.get = hashGet;
  7609. Hash.prototype.has = hashHas;
  7610. Hash.prototype.set = hashSet;
  7611. function listCacheClear() {
  7612. this.__data__ = [];
  7613. this.size = 0;
  7614. }
  7615. function assocIndexOf(array, key) {
  7616. var length = array.length;
  7617. while (length--) {
  7618. if (eq(array[length][0], key)) {
  7619. return length;
  7620. }
  7621. }
  7622. return -1;
  7623. }
  7624. var arrayProto$1 = Array.prototype;
  7625. var splice = arrayProto$1.splice;
  7626. function listCacheDelete(key) {
  7627. var data = this.__data__, index2 = assocIndexOf(data, key);
  7628. if (index2 < 0) {
  7629. return false;
  7630. }
  7631. var lastIndex = data.length - 1;
  7632. if (index2 == lastIndex) {
  7633. data.pop();
  7634. } else {
  7635. splice.call(data, index2, 1);
  7636. }
  7637. --this.size;
  7638. return true;
  7639. }
  7640. function listCacheGet(key) {
  7641. var data = this.__data__, index2 = assocIndexOf(data, key);
  7642. return index2 < 0 ? void 0 : data[index2][1];
  7643. }
  7644. function listCacheHas(key) {
  7645. return assocIndexOf(this.__data__, key) > -1;
  7646. }
  7647. function listCacheSet(key, value) {
  7648. var data = this.__data__, index2 = assocIndexOf(data, key);
  7649. if (index2 < 0) {
  7650. ++this.size;
  7651. data.push([key, value]);
  7652. } else {
  7653. data[index2][1] = value;
  7654. }
  7655. return this;
  7656. }
  7657. function ListCache(entries) {
  7658. var index2 = -1, length = entries == null ? 0 : entries.length;
  7659. this.clear();
  7660. while (++index2 < length) {
  7661. var entry = entries[index2];
  7662. this.set(entry[0], entry[1]);
  7663. }
  7664. }
  7665. ListCache.prototype.clear = listCacheClear;
  7666. ListCache.prototype["delete"] = listCacheDelete;
  7667. ListCache.prototype.get = listCacheGet;
  7668. ListCache.prototype.has = listCacheHas;
  7669. ListCache.prototype.set = listCacheSet;
  7670. var Map = getNative(root, "Map");
  7671. function mapCacheClear() {
  7672. this.size = 0;
  7673. this.__data__ = {
  7674. "hash": new Hash(),
  7675. "map": new (Map || ListCache)(),
  7676. "string": new Hash()
  7677. };
  7678. }
  7679. function isKeyable(value) {
  7680. var type = typeof value;
  7681. return type == "string" || type == "number" || type == "symbol" || type == "boolean" ? value !== "__proto__" : value === null;
  7682. }
  7683. function getMapData(map2, key) {
  7684. var data = map2.__data__;
  7685. return isKeyable(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map;
  7686. }
  7687. function mapCacheDelete(key) {
  7688. var result = getMapData(this, key)["delete"](key);
  7689. this.size -= result ? 1 : 0;
  7690. return result;
  7691. }
  7692. function mapCacheGet(key) {
  7693. return getMapData(this, key).get(key);
  7694. }
  7695. function mapCacheHas(key) {
  7696. return getMapData(this, key).has(key);
  7697. }
  7698. function mapCacheSet(key, value) {
  7699. var data = getMapData(this, key), size = data.size;
  7700. data.set(key, value);
  7701. this.size += data.size == size ? 0 : 1;
  7702. return this;
  7703. }
  7704. function MapCache(entries) {
  7705. var index2 = -1, length = entries == null ? 0 : entries.length;
  7706. this.clear();
  7707. while (++index2 < length) {
  7708. var entry = entries[index2];
  7709. this.set(entry[0], entry[1]);
  7710. }
  7711. }
  7712. MapCache.prototype.clear = mapCacheClear;
  7713. MapCache.prototype["delete"] = mapCacheDelete;
  7714. MapCache.prototype.get = mapCacheGet;
  7715. MapCache.prototype.has = mapCacheHas;
  7716. MapCache.prototype.set = mapCacheSet;
  7717. var FUNC_ERROR_TEXT$3 = "Expected a function";
  7718. function memoize(func, resolver) {
  7719. if (typeof func != "function" || resolver != null && typeof resolver != "function") {
  7720. throw new TypeError(FUNC_ERROR_TEXT$3);
  7721. }
  7722. var memoized = function() {
  7723. var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;
  7724. if (cache.has(key)) {
  7725. return cache.get(key);
  7726. }
  7727. var result = func.apply(this, args);
  7728. memoized.cache = cache.set(key, result) || cache;
  7729. return result;
  7730. };
  7731. memoized.cache = new (memoize.Cache || MapCache)();
  7732. return memoized;
  7733. }
  7734. memoize.Cache = MapCache;
  7735. var MAX_MEMOIZE_SIZE = 500;
  7736. function memoizeCapped(func) {
  7737. var result = memoize(func, function(key) {
  7738. if (cache.size === MAX_MEMOIZE_SIZE) {
  7739. cache.clear();
  7740. }
  7741. return key;
  7742. });
  7743. var cache = result.cache;
  7744. return result;
  7745. }
  7746. var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
  7747. var reEscapeChar = /\\(\\)?/g;
  7748. var stringToPath = memoizeCapped(function(string) {
  7749. var result = [];
  7750. if (string.charCodeAt(0) === 46) {
  7751. result.push("");
  7752. }
  7753. string.replace(rePropName, function(match, number, quote, subString) {
  7754. result.push(quote ? subString.replace(reEscapeChar, "$1") : number || match);
  7755. });
  7756. return result;
  7757. });
  7758. function toString(value) {
  7759. return value == null ? "" : baseToString(value);
  7760. }
  7761. function castPath(value, object) {
  7762. if (isArray(value)) {
  7763. return value;
  7764. }
  7765. return isKey(value, object) ? [value] : stringToPath(toString(value));
  7766. }
  7767. var INFINITY$1 = 1 / 0;
  7768. function toKey(value) {
  7769. if (typeof value == "string" || isSymbol(value)) {
  7770. return value;
  7771. }
  7772. var result = value + "";
  7773. return result == "0" && 1 / value == -INFINITY$1 ? "-0" : result;
  7774. }
  7775. function baseGet(object, path) {
  7776. path = castPath(path, object);
  7777. var index2 = 0, length = path.length;
  7778. while (object != null && index2 < length) {
  7779. object = object[toKey(path[index2++])];
  7780. }
  7781. return index2 && index2 == length ? object : void 0;
  7782. }
  7783. function get(object, path, defaultValue) {
  7784. var result = object == null ? void 0 : baseGet(object, path);
  7785. return result === void 0 ? defaultValue : result;
  7786. }
  7787. function arrayPush(array, values2) {
  7788. var index2 = -1, length = values2.length, offset = array.length;
  7789. while (++index2 < length) {
  7790. array[offset + index2] = values2[index2];
  7791. }
  7792. return array;
  7793. }
  7794. var spreadableSymbol = Symbol$1 ? Symbol$1.isConcatSpreadable : void 0;
  7795. function isFlattenable(value) {
  7796. return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]);
  7797. }
  7798. function baseFlatten(array, depth, predicate, isStrict, result) {
  7799. var index2 = -1, length = array.length;
  7800. predicate || (predicate = isFlattenable);
  7801. result || (result = []);
  7802. while (++index2 < length) {
  7803. var value = array[index2];
  7804. if (depth > 0 && predicate(value)) {
  7805. if (depth > 1) {
  7806. baseFlatten(value, depth - 1, predicate, isStrict, result);
  7807. } else {
  7808. arrayPush(result, value);
  7809. }
  7810. } else if (!isStrict) {
  7811. result[result.length] = value;
  7812. }
  7813. }
  7814. return result;
  7815. }
  7816. var getPrototype = overArg(Object.getPrototypeOf, Object);
  7817. var objectTag$2 = "[object Object]";
  7818. var funcProto = Function.prototype, objectProto$4 = Object.prototype;
  7819. var funcToString = funcProto.toString;
  7820. var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
  7821. var objectCtorString = funcToString.call(Object);
  7822. function isPlainObject(value) {
  7823. if (!isObjectLike(value) || baseGetTag(value) != objectTag$2) {
  7824. return false;
  7825. }
  7826. var proto = getPrototype(value);
  7827. if (proto === null) {
  7828. return true;
  7829. }
  7830. var Ctor = hasOwnProperty$3.call(proto, "constructor") && proto.constructor;
  7831. return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
  7832. }
  7833. var FUNC_ERROR_TEXT$2 = "Expected a function";
  7834. function before(n, func) {
  7835. var result;
  7836. if (typeof func != "function") {
  7837. throw new TypeError(FUNC_ERROR_TEXT$2);
  7838. }
  7839. n = toInteger(n);
  7840. return function() {
  7841. if (--n > 0) {
  7842. result = func.apply(this, arguments);
  7843. }
  7844. if (n <= 1) {
  7845. func = void 0;
  7846. }
  7847. return result;
  7848. };
  7849. }
  7850. function baseSlice(array, start, end) {
  7851. var index2 = -1, length = array.length;
  7852. if (start < 0) {
  7853. start = -start > length ? 0 : length + start;
  7854. }
  7855. end = end > length ? length : end;
  7856. if (end < 0) {
  7857. end += length;
  7858. }
  7859. length = start > end ? 0 : end - start >>> 0;
  7860. start >>>= 0;
  7861. var result = Array(length);
  7862. while (++index2 < length) {
  7863. result[index2] = array[index2 + start];
  7864. }
  7865. return result;
  7866. }
  7867. function castSlice(array, start, end) {
  7868. var length = array.length;
  7869. end = end === void 0 ? length : end;
  7870. return !start && end >= length ? array : baseSlice(array, start, end);
  7871. }
  7872. var rsAstralRange$2 = "\\ud800-\\udfff", rsComboMarksRange$3 = "\\u0300-\\u036f", reComboHalfMarksRange$3 = "\\ufe20-\\ufe2f", rsComboSymbolsRange$3 = "\\u20d0-\\u20ff", rsComboRange$3 = rsComboMarksRange$3 + reComboHalfMarksRange$3 + rsComboSymbolsRange$3, rsVarRange$2 = "\\ufe0e\\ufe0f";
  7873. var rsZWJ$2 = "\\u200d";
  7874. var reHasUnicode = RegExp("[" + rsZWJ$2 + rsAstralRange$2 + rsComboRange$3 + rsVarRange$2 + "]");
  7875. function hasUnicode(string) {
  7876. return reHasUnicode.test(string);
  7877. }
  7878. function asciiToArray(string) {
  7879. return string.split("");
  7880. }
  7881. var rsAstralRange$1 = "\\ud800-\\udfff", rsComboMarksRange$2 = "\\u0300-\\u036f", reComboHalfMarksRange$2 = "\\ufe20-\\ufe2f", rsComboSymbolsRange$2 = "\\u20d0-\\u20ff", rsComboRange$2 = rsComboMarksRange$2 + reComboHalfMarksRange$2 + rsComboSymbolsRange$2, rsVarRange$1 = "\\ufe0e\\ufe0f";
  7882. var rsAstral = "[" + rsAstralRange$1 + "]", rsCombo$2 = "[" + rsComboRange$2 + "]", rsFitz$1 = "\\ud83c[\\udffb-\\udfff]", rsModifier$1 = "(?:" + rsCombo$2 + "|" + rsFitz$1 + ")", rsNonAstral$1 = "[^" + rsAstralRange$1 + "]", rsRegional$1 = "(?:\\ud83c[\\udde6-\\uddff]){2}", rsSurrPair$1 = "[\\ud800-\\udbff][\\udc00-\\udfff]", rsZWJ$1 = "\\u200d";
  7883. var reOptMod$1 = rsModifier$1 + "?", rsOptVar$1 = "[" + rsVarRange$1 + "]?", rsOptJoin$1 = "(?:" + rsZWJ$1 + "(?:" + [rsNonAstral$1, rsRegional$1, rsSurrPair$1].join("|") + ")" + rsOptVar$1 + reOptMod$1 + ")*", rsSeq$1 = rsOptVar$1 + reOptMod$1 + rsOptJoin$1, rsSymbol = "(?:" + [rsNonAstral$1 + rsCombo$2 + "?", rsCombo$2, rsRegional$1, rsSurrPair$1, rsAstral].join("|") + ")";
  7884. var reUnicode = RegExp(rsFitz$1 + "(?=" + rsFitz$1 + ")|" + rsSymbol + rsSeq$1, "g");
  7885. function unicodeToArray(string) {
  7886. return string.match(reUnicode) || [];
  7887. }
  7888. function stringToArray(string) {
  7889. return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string);
  7890. }
  7891. function arrayReduce(array, iteratee, accumulator, initAccum) {
  7892. var index2 = -1, length = array == null ? 0 : array.length;
  7893. if (initAccum && length) {
  7894. accumulator = array[++index2];
  7895. }
  7896. while (++index2 < length) {
  7897. accumulator = iteratee(accumulator, array[index2], index2, array);
  7898. }
  7899. return accumulator;
  7900. }
  7901. function basePropertyOf(object) {
  7902. return function(key) {
  7903. return object == null ? void 0 : object[key];
  7904. };
  7905. }
  7906. var deburredLetters = {
  7907. // Latin-1 Supplement block.
  7908. "À": "A",
  7909. "Á": "A",
  7910. "Â": "A",
  7911. "Ã": "A",
  7912. "Ä": "A",
  7913. "Å": "A",
  7914. "à": "a",
  7915. "á": "a",
  7916. "â": "a",
  7917. "ã": "a",
  7918. "ä": "a",
  7919. "å": "a",
  7920. "Ç": "C",
  7921. "ç": "c",
  7922. "Ð": "D",
  7923. "ð": "d",
  7924. "È": "E",
  7925. "É": "E",
  7926. "Ê": "E",
  7927. "Ë": "E",
  7928. "è": "e",
  7929. "é": "e",
  7930. "ê": "e",
  7931. "ë": "e",
  7932. "Ì": "I",
  7933. "Í": "I",
  7934. "Î": "I",
  7935. "Ï": "I",
  7936. "ì": "i",
  7937. "í": "i",
  7938. "î": "i",
  7939. "ï": "i",
  7940. "Ñ": "N",
  7941. "ñ": "n",
  7942. "Ò": "O",
  7943. "Ó": "O",
  7944. "Ô": "O",
  7945. "Õ": "O",
  7946. "Ö": "O",
  7947. "Ø": "O",
  7948. "ò": "o",
  7949. "ó": "o",
  7950. "ô": "o",
  7951. "õ": "o",
  7952. "ö": "o",
  7953. "ø": "o",
  7954. "Ù": "U",
  7955. "Ú": "U",
  7956. "Û": "U",
  7957. "Ü": "U",
  7958. "ù": "u",
  7959. "ú": "u",
  7960. "û": "u",
  7961. "ü": "u",
  7962. "Ý": "Y",
  7963. "ý": "y",
  7964. "ÿ": "y",
  7965. "Æ": "Ae",
  7966. "æ": "ae",
  7967. "Þ": "Th",
  7968. "þ": "th",
  7969. "ß": "ss",
  7970. // Latin Extended-A block.
  7971. "Ā": "A",
  7972. "Ă": "A",
  7973. "Ą": "A",
  7974. "ā": "a",
  7975. "ă": "a",
  7976. "ą": "a",
  7977. "Ć": "C",
  7978. "Ĉ": "C",
  7979. "Ċ": "C",
  7980. "Č": "C",
  7981. "ć": "c",
  7982. "ĉ": "c",
  7983. "ċ": "c",
  7984. "č": "c",
  7985. "Ď": "D",
  7986. "Đ": "D",
  7987. "ď": "d",
  7988. "đ": "d",
  7989. "Ē": "E",
  7990. "Ĕ": "E",
  7991. "Ė": "E",
  7992. "Ę": "E",
  7993. "Ě": "E",
  7994. "ē": "e",
  7995. "ĕ": "e",
  7996. "ė": "e",
  7997. "ę": "e",
  7998. "ě": "e",
  7999. "Ĝ": "G",
  8000. "Ğ": "G",
  8001. "Ġ": "G",
  8002. "Ģ": "G",
  8003. "ĝ": "g",
  8004. "ğ": "g",
  8005. "ġ": "g",
  8006. "ģ": "g",
  8007. "Ĥ": "H",
  8008. "Ħ": "H",
  8009. "ĥ": "h",
  8010. "ħ": "h",
  8011. "Ĩ": "I",
  8012. "Ī": "I",
  8013. "Ĭ": "I",
  8014. "Į": "I",
  8015. "İ": "I",
  8016. "ĩ": "i",
  8017. "ī": "i",
  8018. "ĭ": "i",
  8019. "į": "i",
  8020. "ı": "i",
  8021. "Ĵ": "J",
  8022. "ĵ": "j",
  8023. "Ķ": "K",
  8024. "ķ": "k",
  8025. "ĸ": "k",
  8026. "Ĺ": "L",
  8027. "Ļ": "L",
  8028. "Ľ": "L",
  8029. "Ŀ": "L",
  8030. "Ł": "L",
  8031. "ĺ": "l",
  8032. "ļ": "l",
  8033. "ľ": "l",
  8034. "ŀ": "l",
  8035. "ł": "l",
  8036. "Ń": "N",
  8037. "Ņ": "N",
  8038. "Ň": "N",
  8039. "Ŋ": "N",
  8040. "ń": "n",
  8041. "ņ": "n",
  8042. "ň": "n",
  8043. "ŋ": "n",
  8044. "Ō": "O",
  8045. "Ŏ": "O",
  8046. "Ő": "O",
  8047. "ō": "o",
  8048. "ŏ": "o",
  8049. "ő": "o",
  8050. "Ŕ": "R",
  8051. "Ŗ": "R",
  8052. "Ř": "R",
  8053. "ŕ": "r",
  8054. "ŗ": "r",
  8055. "ř": "r",
  8056. "Ś": "S",
  8057. "Ŝ": "S",
  8058. "Ş": "S",
  8059. "Š": "S",
  8060. "ś": "s",
  8061. "ŝ": "s",
  8062. "ş": "s",
  8063. "š": "s",
  8064. "Ţ": "T",
  8065. "Ť": "T",
  8066. "Ŧ": "T",
  8067. "ţ": "t",
  8068. "ť": "t",
  8069. "ŧ": "t",
  8070. "Ũ": "U",
  8071. "Ū": "U",
  8072. "Ŭ": "U",
  8073. "Ů": "U",
  8074. "Ű": "U",
  8075. "Ų": "U",
  8076. "ũ": "u",
  8077. "ū": "u",
  8078. "ŭ": "u",
  8079. "ů": "u",
  8080. "ű": "u",
  8081. "ų": "u",
  8082. "Ŵ": "W",
  8083. "ŵ": "w",
  8084. "Ŷ": "Y",
  8085. "ŷ": "y",
  8086. "Ÿ": "Y",
  8087. "Ź": "Z",
  8088. "Ż": "Z",
  8089. "Ž": "Z",
  8090. "ź": "z",
  8091. "ż": "z",
  8092. "ž": "z",
  8093. "IJ": "IJ",
  8094. "ij": "ij",
  8095. "Œ": "Oe",
  8096. "œ": "oe",
  8097. "ʼn": "'n",
  8098. "ſ": "s"
  8099. };
  8100. var deburrLetter = basePropertyOf(deburredLetters);
  8101. const deburrLetter$1 = deburrLetter;
  8102. var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
  8103. var rsComboMarksRange$1 = "\\u0300-\\u036f", reComboHalfMarksRange$1 = "\\ufe20-\\ufe2f", rsComboSymbolsRange$1 = "\\u20d0-\\u20ff", rsComboRange$1 = rsComboMarksRange$1 + reComboHalfMarksRange$1 + rsComboSymbolsRange$1;
  8104. var rsCombo$1 = "[" + rsComboRange$1 + "]";
  8105. var reComboMark = RegExp(rsCombo$1, "g");
  8106. function deburr(string) {
  8107. string = toString(string);
  8108. return string && string.replace(reLatin, deburrLetter$1).replace(reComboMark, "");
  8109. }
  8110. var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
  8111. function asciiWords(string) {
  8112. return string.match(reAsciiWord) || [];
  8113. }
  8114. var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
  8115. function hasUnicodeWord(string) {
  8116. return reHasUnicodeWord.test(string);
  8117. }
  8118. var rsAstralRange = "\\ud800-\\udfff", rsComboMarksRange = "\\u0300-\\u036f", reComboHalfMarksRange = "\\ufe20-\\ufe2f", rsComboSymbolsRange = "\\u20d0-\\u20ff", rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsDingbatRange = "\\u2700-\\u27bf", rsLowerRange = "a-z\\xdf-\\xf6\\xf8-\\xff", rsMathOpRange = "\\xac\\xb1\\xd7\\xf7", rsNonCharRange = "\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf", rsPunctuationRange = "\\u2000-\\u206f", rsSpaceRange = " \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000", rsUpperRange = "A-Z\\xc0-\\xd6\\xd8-\\xde", rsVarRange = "\\ufe0e\\ufe0f", rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
  8119. var rsApos$1 = "['’]", rsBreak = "[" + rsBreakRange + "]", rsCombo = "[" + rsComboRange + "]", rsDigits = "\\d+", rsDingbat = "[" + rsDingbatRange + "]", rsLower = "[" + rsLowerRange + "]", rsMisc = "[^" + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + "]", rsFitz = "\\ud83c[\\udffb-\\udfff]", rsModifier = "(?:" + rsCombo + "|" + rsFitz + ")", rsNonAstral = "[^" + rsAstralRange + "]", rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}", rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]", rsUpper = "[" + rsUpperRange + "]", rsZWJ = "\\u200d";
  8120. var rsMiscLower = "(?:" + rsLower + "|" + rsMisc + ")", rsMiscUpper = "(?:" + rsUpper + "|" + rsMisc + ")", rsOptContrLower = "(?:" + rsApos$1 + "(?:d|ll|m|re|s|t|ve))?", rsOptContrUpper = "(?:" + rsApos$1 + "(?:D|LL|M|RE|S|T|VE))?", reOptMod = rsModifier + "?", rsOptVar = "[" + rsVarRange + "]?", rsOptJoin = "(?:" + rsZWJ + "(?:" + [rsNonAstral, rsRegional, rsSurrPair].join("|") + ")" + rsOptVar + reOptMod + ")*", rsOrdLower = "\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])", rsOrdUpper = "\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])", rsSeq = rsOptVar + reOptMod + rsOptJoin, rsEmoji = "(?:" + [rsDingbat, rsRegional, rsSurrPair].join("|") + ")" + rsSeq;
  8121. var reUnicodeWord = RegExp([
  8122. rsUpper + "?" + rsLower + "+" + rsOptContrLower + "(?=" + [rsBreak, rsUpper, "$"].join("|") + ")",
  8123. rsMiscUpper + "+" + rsOptContrUpper + "(?=" + [rsBreak, rsUpper + rsMiscLower, "$"].join("|") + ")",
  8124. rsUpper + "?" + rsMiscLower + "+" + rsOptContrLower,
  8125. rsUpper + "+" + rsOptContrUpper,
  8126. rsOrdUpper,
  8127. rsOrdLower,
  8128. rsDigits,
  8129. rsEmoji
  8130. ].join("|"), "g");
  8131. function unicodeWords(string) {
  8132. return string.match(reUnicodeWord) || [];
  8133. }
  8134. function words(string, pattern, guard) {
  8135. string = toString(string);
  8136. pattern = guard ? void 0 : pattern;
  8137. if (pattern === void 0) {
  8138. return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
  8139. }
  8140. return string.match(pattern) || [];
  8141. }
  8142. var rsApos = "['’]";
  8143. var reApos = RegExp(rsApos, "g");
  8144. function createCompounder(callback) {
  8145. return function(string) {
  8146. return arrayReduce(words(deburr(string).replace(reApos, "")), callback, "");
  8147. };
  8148. }
  8149. var nativeIsFinite = root.isFinite, nativeMin$1 = Math.min;
  8150. function createRound(methodName) {
  8151. var func = Math[methodName];
  8152. return function(number, precision) {
  8153. number = toNumber(number);
  8154. precision = precision == null ? 0 : nativeMin$1(toInteger(precision), 292);
  8155. if (precision && nativeIsFinite(number)) {
  8156. var pair = (toString(number) + "e").split("e"), value = func(pair[0] + "e" + (+pair[1] + precision));
  8157. pair = (toString(value) + "e").split("e");
  8158. return +(pair[0] + "e" + (+pair[1] - precision));
  8159. }
  8160. return func(number);
  8161. };
  8162. }
  8163. var nativeCeil$1 = Math.ceil, nativeMax$5 = Math.max;
  8164. function chunk(array, size, guard) {
  8165. if (guard ? isIterateeCall(array, size, guard) : size === void 0) {
  8166. size = 1;
  8167. } else {
  8168. size = nativeMax$5(toInteger(size), 0);
  8169. }
  8170. var length = array == null ? 0 : array.length;
  8171. if (!length || size < 1) {
  8172. return [];
  8173. }
  8174. var index2 = 0, resIndex = 0, result = Array(nativeCeil$1(length / size));
  8175. while (index2 < length) {
  8176. result[resIndex++] = baseSlice(array, index2, index2 += size);
  8177. }
  8178. return result;
  8179. }
  8180. function baseClamp(number, lower, upper) {
  8181. if (number === number) {
  8182. if (upper !== void 0) {
  8183. number = number <= upper ? number : upper;
  8184. }
  8185. if (lower !== void 0) {
  8186. number = number >= lower ? number : lower;
  8187. }
  8188. }
  8189. return number;
  8190. }
  8191. function stackClear() {
  8192. this.__data__ = new ListCache();
  8193. this.size = 0;
  8194. }
  8195. function stackDelete(key) {
  8196. var data = this.__data__, result = data["delete"](key);
  8197. this.size = data.size;
  8198. return result;
  8199. }
  8200. function stackGet(key) {
  8201. return this.__data__.get(key);
  8202. }
  8203. function stackHas(key) {
  8204. return this.__data__.has(key);
  8205. }
  8206. var LARGE_ARRAY_SIZE = 200;
  8207. function stackSet(key, value) {
  8208. var data = this.__data__;
  8209. if (data instanceof ListCache) {
  8210. var pairs = data.__data__;
  8211. if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) {
  8212. pairs.push([key, value]);
  8213. this.size = ++data.size;
  8214. return this;
  8215. }
  8216. data = this.__data__ = new MapCache(pairs);
  8217. }
  8218. data.set(key, value);
  8219. this.size = data.size;
  8220. return this;
  8221. }
  8222. function Stack(entries) {
  8223. var data = this.__data__ = new ListCache(entries);
  8224. this.size = data.size;
  8225. }
  8226. Stack.prototype.clear = stackClear;
  8227. Stack.prototype["delete"] = stackDelete;
  8228. Stack.prototype.get = stackGet;
  8229. Stack.prototype.has = stackHas;
  8230. Stack.prototype.set = stackSet;
  8231. var freeExports = typeof exports == "object" && exports && !exports.nodeType && exports;
  8232. var freeModule = freeExports && typeof module == "object" && module && !module.nodeType && module;
  8233. var moduleExports = freeModule && freeModule.exports === freeExports;
  8234. var Buffer2 = moduleExports ? root.Buffer : void 0, allocUnsafe = Buffer2 ? Buffer2.allocUnsafe : void 0;
  8235. function cloneBuffer(buffer, isDeep) {
  8236. if (isDeep) {
  8237. return buffer.slice();
  8238. }
  8239. var length = buffer.length, result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
  8240. buffer.copy(result);
  8241. return result;
  8242. }
  8243. function arrayFilter(array, predicate) {
  8244. var index2 = -1, length = array == null ? 0 : array.length, resIndex = 0, result = [];
  8245. while (++index2 < length) {
  8246. var value = array[index2];
  8247. if (predicate(value, index2, array)) {
  8248. result[resIndex++] = value;
  8249. }
  8250. }
  8251. return result;
  8252. }
  8253. function stubArray() {
  8254. return [];
  8255. }
  8256. var objectProto$3 = Object.prototype;
  8257. var propertyIsEnumerable = objectProto$3.propertyIsEnumerable;
  8258. var nativeGetSymbols = Object.getOwnPropertySymbols;
  8259. var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
  8260. if (object == null) {
  8261. return [];
  8262. }
  8263. object = Object(object);
  8264. return arrayFilter(nativeGetSymbols(object), function(symbol) {
  8265. return propertyIsEnumerable.call(object, symbol);
  8266. });
  8267. };
  8268. const getSymbols$1 = getSymbols;
  8269. function baseGetAllKeys(object, keysFunc, symbolsFunc) {
  8270. var result = keysFunc(object);
  8271. return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
  8272. }
  8273. function getAllKeys(object) {
  8274. return baseGetAllKeys(object, keys, getSymbols$1);
  8275. }
  8276. var DataView = getNative(root, "DataView");
  8277. var Promise$1 = getNative(root, "Promise");
  8278. var Set$1 = getNative(root, "Set");
  8279. var mapTag$1 = "[object Map]", objectTag$1 = "[object Object]", promiseTag = "[object Promise]", setTag$1 = "[object Set]", weakMapTag = "[object WeakMap]";
  8280. var dataViewTag$1 = "[object DataView]";
  8281. var dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map), promiseCtorString = toSource(Promise$1), setCtorString = toSource(Set$1), weakMapCtorString = toSource(WeakMap);
  8282. var getTag = baseGetTag;
  8283. if (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1 || Map && getTag(new Map()) != mapTag$1 || Promise$1 && getTag(Promise$1.resolve()) != promiseTag || Set$1 && getTag(new Set$1()) != setTag$1 || WeakMap && getTag(new WeakMap()) != weakMapTag) {
  8284. getTag = function(value) {
  8285. var result = baseGetTag(value), Ctor = result == objectTag$1 ? value.constructor : void 0, ctorString = Ctor ? toSource(Ctor) : "";
  8286. if (ctorString) {
  8287. switch (ctorString) {
  8288. case dataViewCtorString:
  8289. return dataViewTag$1;
  8290. case mapCtorString:
  8291. return mapTag$1;
  8292. case promiseCtorString:
  8293. return promiseTag;
  8294. case setCtorString:
  8295. return setTag$1;
  8296. case weakMapCtorString:
  8297. return weakMapTag;
  8298. }
  8299. }
  8300. return result;
  8301. };
  8302. }
  8303. const getTag$1 = getTag;
  8304. var Uint8Array2 = root.Uint8Array;
  8305. const Uint8Array$1 = Uint8Array2;
  8306. function cloneArrayBuffer(arrayBuffer) {
  8307. var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
  8308. new Uint8Array$1(result).set(new Uint8Array$1(arrayBuffer));
  8309. return result;
  8310. }
  8311. function cloneTypedArray(typedArray, isDeep) {
  8312. var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
  8313. return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
  8314. }
  8315. function initCloneObject(object) {
  8316. return typeof object.constructor == "function" && !isPrototype(object) ? baseCreate(getPrototype(object)) : {};
  8317. }
  8318. var HASH_UNDEFINED = "__lodash_hash_undefined__";
  8319. function setCacheAdd(value) {
  8320. this.__data__.set(value, HASH_UNDEFINED);
  8321. return this;
  8322. }
  8323. function setCacheHas(value) {
  8324. return this.__data__.has(value);
  8325. }
  8326. function SetCache(values2) {
  8327. var index2 = -1, length = values2 == null ? 0 : values2.length;
  8328. this.__data__ = new MapCache();
  8329. while (++index2 < length) {
  8330. this.add(values2[index2]);
  8331. }
  8332. }
  8333. SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
  8334. SetCache.prototype.has = setCacheHas;
  8335. function arraySome(array, predicate) {
  8336. var index2 = -1, length = array == null ? 0 : array.length;
  8337. while (++index2 < length) {
  8338. if (predicate(array[index2], index2, array)) {
  8339. return true;
  8340. }
  8341. }
  8342. return false;
  8343. }
  8344. function cacheHas(cache, key) {
  8345. return cache.has(key);
  8346. }
  8347. var COMPARE_PARTIAL_FLAG$5 = 1, COMPARE_UNORDERED_FLAG$3 = 2;
  8348. function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
  8349. var isPartial = bitmask & COMPARE_PARTIAL_FLAG$5, arrLength = array.length, othLength = other.length;
  8350. if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
  8351. return false;
  8352. }
  8353. var arrStacked = stack.get(array);
  8354. var othStacked = stack.get(other);
  8355. if (arrStacked && othStacked) {
  8356. return arrStacked == other && othStacked == array;
  8357. }
  8358. var index2 = -1, result = true, seen = bitmask & COMPARE_UNORDERED_FLAG$3 ? new SetCache() : void 0;
  8359. stack.set(array, other);
  8360. stack.set(other, array);
  8361. while (++index2 < arrLength) {
  8362. var arrValue = array[index2], othValue = other[index2];
  8363. if (customizer) {
  8364. var compared = isPartial ? customizer(othValue, arrValue, index2, other, array, stack) : customizer(arrValue, othValue, index2, array, other, stack);
  8365. }
  8366. if (compared !== void 0) {
  8367. if (compared) {
  8368. continue;
  8369. }
  8370. result = false;
  8371. break;
  8372. }
  8373. if (seen) {
  8374. if (!arraySome(other, function(othValue2, othIndex) {
  8375. if (!cacheHas(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) {
  8376. return seen.push(othIndex);
  8377. }
  8378. })) {
  8379. result = false;
  8380. break;
  8381. }
  8382. } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
  8383. result = false;
  8384. break;
  8385. }
  8386. }
  8387. stack["delete"](array);
  8388. stack["delete"](other);
  8389. return result;
  8390. }
  8391. function mapToArray(map2) {
  8392. var index2 = -1, result = Array(map2.size);
  8393. map2.forEach(function(value, key) {
  8394. result[++index2] = [key, value];
  8395. });
  8396. return result;
  8397. }
  8398. function setToArray(set) {
  8399. var index2 = -1, result = Array(set.size);
  8400. set.forEach(function(value) {
  8401. result[++index2] = value;
  8402. });
  8403. return result;
  8404. }
  8405. var COMPARE_PARTIAL_FLAG$4 = 1, COMPARE_UNORDERED_FLAG$2 = 2;
  8406. var boolTag = "[object Boolean]", dateTag = "[object Date]", errorTag = "[object Error]", mapTag = "[object Map]", numberTag = "[object Number]", regexpTag$1 = "[object RegExp]", setTag = "[object Set]", stringTag$1 = "[object String]", symbolTag = "[object Symbol]";
  8407. var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]";
  8408. var symbolProto = Symbol$1 ? Symbol$1.prototype : void 0, symbolValueOf = symbolProto ? symbolProto.valueOf : void 0;
  8409. function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
  8410. switch (tag) {
  8411. case dataViewTag:
  8412. if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {
  8413. return false;
  8414. }
  8415. object = object.buffer;
  8416. other = other.buffer;
  8417. case arrayBufferTag:
  8418. if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array$1(object), new Uint8Array$1(other))) {
  8419. return false;
  8420. }
  8421. return true;
  8422. case boolTag:
  8423. case dateTag:
  8424. case numberTag:
  8425. return eq(+object, +other);
  8426. case errorTag:
  8427. return object.name == other.name && object.message == other.message;
  8428. case regexpTag$1:
  8429. case stringTag$1:
  8430. return object == other + "";
  8431. case mapTag:
  8432. var convert = mapToArray;
  8433. case setTag:
  8434. var isPartial = bitmask & COMPARE_PARTIAL_FLAG$4;
  8435. convert || (convert = setToArray);
  8436. if (object.size != other.size && !isPartial) {
  8437. return false;
  8438. }
  8439. var stacked = stack.get(object);
  8440. if (stacked) {
  8441. return stacked == other;
  8442. }
  8443. bitmask |= COMPARE_UNORDERED_FLAG$2;
  8444. stack.set(object, other);
  8445. var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
  8446. stack["delete"](object);
  8447. return result;
  8448. case symbolTag:
  8449. if (symbolValueOf) {
  8450. return symbolValueOf.call(object) == symbolValueOf.call(other);
  8451. }
  8452. }
  8453. return false;
  8454. }
  8455. var COMPARE_PARTIAL_FLAG$3 = 1;
  8456. var objectProto$2 = Object.prototype;
  8457. var hasOwnProperty$2 = objectProto$2.hasOwnProperty;
  8458. function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
  8459. var isPartial = bitmask & COMPARE_PARTIAL_FLAG$3, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length;
  8460. if (objLength != othLength && !isPartial) {
  8461. return false;
  8462. }
  8463. var index2 = objLength;
  8464. while (index2--) {
  8465. var key = objProps[index2];
  8466. if (!(isPartial ? key in other : hasOwnProperty$2.call(other, key))) {
  8467. return false;
  8468. }
  8469. }
  8470. var objStacked = stack.get(object);
  8471. var othStacked = stack.get(other);
  8472. if (objStacked && othStacked) {
  8473. return objStacked == other && othStacked == object;
  8474. }
  8475. var result = true;
  8476. stack.set(object, other);
  8477. stack.set(other, object);
  8478. var skipCtor = isPartial;
  8479. while (++index2 < objLength) {
  8480. key = objProps[index2];
  8481. var objValue = object[key], othValue = other[key];
  8482. if (customizer) {
  8483. var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);
  8484. }
  8485. if (!(compared === void 0 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
  8486. result = false;
  8487. break;
  8488. }
  8489. skipCtor || (skipCtor = key == "constructor");
  8490. }
  8491. if (result && !skipCtor) {
  8492. var objCtor = object.constructor, othCtor = other.constructor;
  8493. if (objCtor != othCtor && ("constructor" in object && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) {
  8494. result = false;
  8495. }
  8496. }
  8497. stack["delete"](object);
  8498. stack["delete"](other);
  8499. return result;
  8500. }
  8501. var COMPARE_PARTIAL_FLAG$2 = 1;
  8502. var argsTag = "[object Arguments]", arrayTag = "[object Array]", objectTag = "[object Object]";
  8503. var objectProto$1 = Object.prototype;
  8504. var hasOwnProperty$1 = objectProto$1.hasOwnProperty;
  8505. function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
  8506. var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : getTag$1(object), othTag = othIsArr ? arrayTag : getTag$1(other);
  8507. objTag = objTag == argsTag ? objectTag : objTag;
  8508. othTag = othTag == argsTag ? objectTag : othTag;
  8509. var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag;
  8510. if (isSameTag && isBuffer(object)) {
  8511. if (!isBuffer(other)) {
  8512. return false;
  8513. }
  8514. objIsArr = true;
  8515. objIsObj = false;
  8516. }
  8517. if (isSameTag && !objIsObj) {
  8518. stack || (stack = new Stack());
  8519. return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
  8520. }
  8521. if (!(bitmask & COMPARE_PARTIAL_FLAG$2)) {
  8522. var objIsWrapped = objIsObj && hasOwnProperty$1.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty$1.call(other, "__wrapped__");
  8523. if (objIsWrapped || othIsWrapped) {
  8524. var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other;
  8525. stack || (stack = new Stack());
  8526. return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
  8527. }
  8528. }
  8529. if (!isSameTag) {
  8530. return false;
  8531. }
  8532. stack || (stack = new Stack());
  8533. return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
  8534. }
  8535. function baseIsEqual(value, other, bitmask, customizer, stack) {
  8536. if (value === other) {
  8537. return true;
  8538. }
  8539. if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) {
  8540. return value !== value && other !== other;
  8541. }
  8542. return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
  8543. }
  8544. var COMPARE_PARTIAL_FLAG$1 = 1, COMPARE_UNORDERED_FLAG$1 = 2;
  8545. function baseIsMatch(object, source, matchData, customizer) {
  8546. var index2 = matchData.length, length = index2, noCustomizer = !customizer;
  8547. if (object == null) {
  8548. return !length;
  8549. }
  8550. object = Object(object);
  8551. while (index2--) {
  8552. var data = matchData[index2];
  8553. if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {
  8554. return false;
  8555. }
  8556. }
  8557. while (++index2 < length) {
  8558. data = matchData[index2];
  8559. var key = data[0], objValue = object[key], srcValue = data[1];
  8560. if (noCustomizer && data[2]) {
  8561. if (objValue === void 0 && !(key in object)) {
  8562. return false;
  8563. }
  8564. } else {
  8565. var stack = new Stack();
  8566. if (customizer) {
  8567. var result = customizer(objValue, srcValue, key, object, source, stack);
  8568. }
  8569. if (!(result === void 0 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$1 | COMPARE_UNORDERED_FLAG$1, customizer, stack) : result)) {
  8570. return false;
  8571. }
  8572. }
  8573. }
  8574. return true;
  8575. }
  8576. function isStrictComparable(value) {
  8577. return value === value && !isObject(value);
  8578. }
  8579. function getMatchData(object) {
  8580. var result = keys(object), length = result.length;
  8581. while (length--) {
  8582. var key = result[length], value = object[key];
  8583. result[length] = [key, value, isStrictComparable(value)];
  8584. }
  8585. return result;
  8586. }
  8587. function matchesStrictComparable(key, srcValue) {
  8588. return function(object) {
  8589. if (object == null) {
  8590. return false;
  8591. }
  8592. return object[key] === srcValue && (srcValue !== void 0 || key in Object(object));
  8593. };
  8594. }
  8595. function baseMatches(source) {
  8596. var matchData = getMatchData(source);
  8597. if (matchData.length == 1 && matchData[0][2]) {
  8598. return matchesStrictComparable(matchData[0][0], matchData[0][1]);
  8599. }
  8600. return function(object) {
  8601. return object === source || baseIsMatch(object, source, matchData);
  8602. };
  8603. }
  8604. function baseHasIn(object, key) {
  8605. return object != null && key in Object(object);
  8606. }
  8607. function hasPath(object, path, hasFunc) {
  8608. path = castPath(path, object);
  8609. var index2 = -1, length = path.length, result = false;
  8610. while (++index2 < length) {
  8611. var key = toKey(path[index2]);
  8612. if (!(result = object != null && hasFunc(object, key))) {
  8613. break;
  8614. }
  8615. object = object[key];
  8616. }
  8617. if (result || ++index2 != length) {
  8618. return result;
  8619. }
  8620. length = object == null ? 0 : object.length;
  8621. return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object));
  8622. }
  8623. function hasIn(object, path) {
  8624. return object != null && hasPath(object, path, baseHasIn);
  8625. }
  8626. var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;
  8627. function baseMatchesProperty(path, srcValue) {
  8628. if (isKey(path) && isStrictComparable(srcValue)) {
  8629. return matchesStrictComparable(toKey(path), srcValue);
  8630. }
  8631. return function(object) {
  8632. var objValue = get(object, path);
  8633. return objValue === void 0 && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
  8634. };
  8635. }
  8636. function baseProperty(key) {
  8637. return function(object) {
  8638. return object == null ? void 0 : object[key];
  8639. };
  8640. }
  8641. function basePropertyDeep(path) {
  8642. return function(object) {
  8643. return baseGet(object, path);
  8644. };
  8645. }
  8646. function property(path) {
  8647. return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
  8648. }
  8649. function baseIteratee(value) {
  8650. if (typeof value == "function") {
  8651. return value;
  8652. }
  8653. if (value == null) {
  8654. return identity;
  8655. }
  8656. if (typeof value == "object") {
  8657. return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);
  8658. }
  8659. return property(value);
  8660. }
  8661. function createBaseFor(fromRight) {
  8662. return function(object, iteratee, keysFunc) {
  8663. var index2 = -1, iterable = Object(object), props = keysFunc(object), length = props.length;
  8664. while (length--) {
  8665. var key = props[fromRight ? length : ++index2];
  8666. if (iteratee(iterable[key], key, iterable) === false) {
  8667. break;
  8668. }
  8669. }
  8670. return object;
  8671. };
  8672. }
  8673. var baseFor = createBaseFor();
  8674. function baseForOwn(object, iteratee) {
  8675. return object && baseFor(object, iteratee, keys);
  8676. }
  8677. function createBaseEach(eachFunc, fromRight) {
  8678. return function(collection, iteratee) {
  8679. if (collection == null) {
  8680. return collection;
  8681. }
  8682. if (!isArrayLike(collection)) {
  8683. return eachFunc(collection, iteratee);
  8684. }
  8685. var length = collection.length, index2 = fromRight ? length : -1, iterable = Object(collection);
  8686. while (fromRight ? index2-- : ++index2 < length) {
  8687. if (iteratee(iterable[index2], index2, iterable) === false) {
  8688. break;
  8689. }
  8690. }
  8691. return collection;
  8692. };
  8693. }
  8694. var baseEach = createBaseEach(baseForOwn);
  8695. const baseEach$1 = baseEach;
  8696. var now = function() {
  8697. return root.Date.now();
  8698. };
  8699. var FUNC_ERROR_TEXT$1 = "Expected a function";
  8700. var nativeMax$4 = Math.max, nativeMin = Math.min;
  8701. function debounce(func, wait, options) {
  8702. var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
  8703. if (typeof func != "function") {
  8704. throw new TypeError(FUNC_ERROR_TEXT$1);
  8705. }
  8706. wait = toNumber(wait) || 0;
  8707. if (isObject(options)) {
  8708. leading = !!options.leading;
  8709. maxing = "maxWait" in options;
  8710. maxWait = maxing ? nativeMax$4(toNumber(options.maxWait) || 0, wait) : maxWait;
  8711. trailing = "trailing" in options ? !!options.trailing : trailing;
  8712. }
  8713. function invokeFunc(time) {
  8714. var args = lastArgs, thisArg = lastThis;
  8715. lastArgs = lastThis = void 0;
  8716. lastInvokeTime = time;
  8717. result = func.apply(thisArg, args);
  8718. return result;
  8719. }
  8720. function leadingEdge(time) {
  8721. lastInvokeTime = time;
  8722. timerId = setTimeout(timerExpired, wait);
  8723. return leading ? invokeFunc(time) : result;
  8724. }
  8725. function remainingWait(time) {
  8726. var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;
  8727. return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
  8728. }
  8729. function shouldInvoke(time) {
  8730. var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
  8731. return lastCallTime === void 0 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
  8732. }
  8733. function timerExpired() {
  8734. var time = now();
  8735. if (shouldInvoke(time)) {
  8736. return trailingEdge(time);
  8737. }
  8738. timerId = setTimeout(timerExpired, remainingWait(time));
  8739. }
  8740. function trailingEdge(time) {
  8741. timerId = void 0;
  8742. if (trailing && lastArgs) {
  8743. return invokeFunc(time);
  8744. }
  8745. lastArgs = lastThis = void 0;
  8746. return result;
  8747. }
  8748. function cancel() {
  8749. if (timerId !== void 0) {
  8750. clearTimeout(timerId);
  8751. }
  8752. lastInvokeTime = 0;
  8753. lastArgs = lastCallTime = lastThis = timerId = void 0;
  8754. }
  8755. function flush() {
  8756. return timerId === void 0 ? result : trailingEdge(now());
  8757. }
  8758. function debounced() {
  8759. var time = now(), isInvoking = shouldInvoke(time);
  8760. lastArgs = arguments;
  8761. lastThis = this;
  8762. lastCallTime = time;
  8763. if (isInvoking) {
  8764. if (timerId === void 0) {
  8765. return leadingEdge(lastCallTime);
  8766. }
  8767. if (maxing) {
  8768. clearTimeout(timerId);
  8769. timerId = setTimeout(timerExpired, wait);
  8770. return invokeFunc(lastCallTime);
  8771. }
  8772. }
  8773. if (timerId === void 0) {
  8774. timerId = setTimeout(timerExpired, wait);
  8775. }
  8776. return result;
  8777. }
  8778. debounced.cancel = cancel;
  8779. debounced.flush = flush;
  8780. return debounced;
  8781. }
  8782. function defaultTo(value, defaultValue) {
  8783. return value == null || value !== value ? defaultValue : value;
  8784. }
  8785. var objectProto = Object.prototype;
  8786. var hasOwnProperty = objectProto.hasOwnProperty;
  8787. var defaults = baseRest(function(object, sources) {
  8788. object = Object(object);
  8789. var index2 = -1;
  8790. var length = sources.length;
  8791. var guard = length > 2 ? sources[2] : void 0;
  8792. if (guard && isIterateeCall(sources[0], sources[1], guard)) {
  8793. length = 1;
  8794. }
  8795. while (++index2 < length) {
  8796. var source = sources[index2];
  8797. var props = keysIn(source);
  8798. var propsIndex = -1;
  8799. var propsLength = props.length;
  8800. while (++propsIndex < propsLength) {
  8801. var key = props[propsIndex];
  8802. var value = object[key];
  8803. if (value === void 0 || eq(value, objectProto[key]) && !hasOwnProperty.call(object, key)) {
  8804. object[key] = source[key];
  8805. }
  8806. }
  8807. }
  8808. return object;
  8809. });
  8810. function assignMergeValue(object, key, value) {
  8811. if (value !== void 0 && !eq(object[key], value) || value === void 0 && !(key in object)) {
  8812. baseAssignValue(object, key, value);
  8813. }
  8814. }
  8815. function isArrayLikeObject(value) {
  8816. return isObjectLike(value) && isArrayLike(value);
  8817. }
  8818. function safeGet(object, key) {
  8819. if (key === "constructor" && typeof object[key] === "function") {
  8820. return;
  8821. }
  8822. if (key == "__proto__") {
  8823. return;
  8824. }
  8825. return object[key];
  8826. }
  8827. function toPlainObject(value) {
  8828. return copyObject(value, keysIn(value));
  8829. }
  8830. function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
  8831. var objValue = safeGet(object, key), srcValue = safeGet(source, key), stacked = stack.get(srcValue);
  8832. if (stacked) {
  8833. assignMergeValue(object, key, stacked);
  8834. return;
  8835. }
  8836. var newValue = customizer ? customizer(objValue, srcValue, key + "", object, source, stack) : void 0;
  8837. var isCommon = newValue === void 0;
  8838. if (isCommon) {
  8839. var isArr = isArray(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue);
  8840. newValue = srcValue;
  8841. if (isArr || isBuff || isTyped) {
  8842. if (isArray(objValue)) {
  8843. newValue = objValue;
  8844. } else if (isArrayLikeObject(objValue)) {
  8845. newValue = copyArray(objValue);
  8846. } else if (isBuff) {
  8847. isCommon = false;
  8848. newValue = cloneBuffer(srcValue, true);
  8849. } else if (isTyped) {
  8850. isCommon = false;
  8851. newValue = cloneTypedArray(srcValue, true);
  8852. } else {
  8853. newValue = [];
  8854. }
  8855. } else if (isPlainObject(srcValue) || isArguments(srcValue)) {
  8856. newValue = objValue;
  8857. if (isArguments(objValue)) {
  8858. newValue = toPlainObject(objValue);
  8859. } else if (!isObject(objValue) || isFunction(objValue)) {
  8860. newValue = initCloneObject(srcValue);
  8861. }
  8862. } else {
  8863. isCommon = false;
  8864. }
  8865. }
  8866. if (isCommon) {
  8867. stack.set(srcValue, newValue);
  8868. mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
  8869. stack["delete"](srcValue);
  8870. }
  8871. assignMergeValue(object, key, newValue);
  8872. }
  8873. function baseMerge(object, source, srcIndex, customizer, stack) {
  8874. if (object === source) {
  8875. return;
  8876. }
  8877. baseFor(source, function(srcValue, key) {
  8878. stack || (stack = new Stack());
  8879. if (isObject(srcValue)) {
  8880. baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
  8881. } else {
  8882. var newValue = customizer ? customizer(safeGet(object, key), srcValue, key + "", object, source, stack) : void 0;
  8883. if (newValue === void 0) {
  8884. newValue = srcValue;
  8885. }
  8886. assignMergeValue(object, key, newValue);
  8887. }
  8888. }, keysIn);
  8889. }
  8890. function castFunction(value) {
  8891. return typeof value == "function" ? value : identity;
  8892. }
  8893. function forEach(collection, iteratee) {
  8894. var func = isArray(collection) ? arrayEach : baseEach$1;
  8895. return func(collection, castFunction(iteratee));
  8896. }
  8897. function baseFilter(collection, predicate) {
  8898. var result = [];
  8899. baseEach$1(collection, function(value, index2, collection2) {
  8900. if (predicate(value, index2, collection2)) {
  8901. result.push(value);
  8902. }
  8903. });
  8904. return result;
  8905. }
  8906. function filter(collection, predicate) {
  8907. var func = isArray(collection) ? arrayFilter : baseFilter;
  8908. return func(collection, baseIteratee(predicate));
  8909. }
  8910. function createFind(findIndexFunc) {
  8911. return function(collection, predicate, fromIndex) {
  8912. var iterable = Object(collection);
  8913. if (!isArrayLike(collection)) {
  8914. var iteratee = baseIteratee(predicate);
  8915. collection = keys(collection);
  8916. predicate = function(key) {
  8917. return iteratee(iterable[key], key, iterable);
  8918. };
  8919. }
  8920. var index2 = findIndexFunc(collection, predicate, fromIndex);
  8921. return index2 > -1 ? iterable[iteratee ? collection[index2] : index2] : void 0;
  8922. };
  8923. }
  8924. var nativeMax$3 = Math.max;
  8925. function findIndex(array, predicate, fromIndex) {
  8926. var length = array == null ? 0 : array.length;
  8927. if (!length) {
  8928. return -1;
  8929. }
  8930. var index2 = fromIndex == null ? 0 : toInteger(fromIndex);
  8931. if (index2 < 0) {
  8932. index2 = nativeMax$3(length + index2, 0);
  8933. }
  8934. return baseFindIndex(array, baseIteratee(predicate), index2);
  8935. }
  8936. var find = createFind(findIndex);
  8937. const find$1 = find;
  8938. function baseFindKey(collection, predicate, eachFunc) {
  8939. var result;
  8940. eachFunc(collection, function(value, key, collection2) {
  8941. if (predicate(value, key, collection2)) {
  8942. result = key;
  8943. return false;
  8944. }
  8945. });
  8946. return result;
  8947. }
  8948. function findKey(object, predicate) {
  8949. return baseFindKey(object, baseIteratee(predicate), baseForOwn);
  8950. }
  8951. function baseMap(collection, iteratee) {
  8952. var index2 = -1, result = isArrayLike(collection) ? Array(collection.length) : [];
  8953. baseEach$1(collection, function(value, key, collection2) {
  8954. result[++index2] = iteratee(value, key, collection2);
  8955. });
  8956. return result;
  8957. }
  8958. function map(collection, iteratee) {
  8959. var func = isArray(collection) ? arrayMap : baseMap;
  8960. return func(collection, baseIteratee(iteratee));
  8961. }
  8962. var INFINITY = 1 / 0;
  8963. function flatMapDeep(collection, iteratee) {
  8964. return baseFlatten(map(collection, iteratee), INFINITY);
  8965. }
  8966. function forOwn(object, iteratee) {
  8967. return object && baseForOwn(object, castFunction(iteratee));
  8968. }
  8969. var stringTag = "[object String]";
  8970. function isString(value) {
  8971. return typeof value == "string" || !isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag;
  8972. }
  8973. function baseValues(object, props) {
  8974. return arrayMap(props, function(key) {
  8975. return object[key];
  8976. });
  8977. }
  8978. function values(object) {
  8979. return object == null ? [] : baseValues(object, keys(object));
  8980. }
  8981. var nativeMax$2 = Math.max;
  8982. function includes(collection, value, fromIndex, guard) {
  8983. collection = isArrayLike(collection) ? collection : values(collection);
  8984. fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;
  8985. var length = collection.length;
  8986. if (fromIndex < 0) {
  8987. fromIndex = nativeMax$2(length + fromIndex, 0);
  8988. }
  8989. return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
  8990. }
  8991. var nativeMax$1 = Math.max;
  8992. function indexOf(array, value, fromIndex) {
  8993. var length = array == null ? 0 : array.length;
  8994. if (!length) {
  8995. return -1;
  8996. }
  8997. var index2 = fromIndex == null ? 0 : toInteger(fromIndex);
  8998. if (index2 < 0) {
  8999. index2 = nativeMax$1(length + index2, 0);
  9000. }
  9001. return baseIndexOf(array, value, index2);
  9002. }
  9003. function isNil(value) {
  9004. return value == null;
  9005. }
  9006. var regexpTag = "[object RegExp]";
  9007. function baseIsRegExp(value) {
  9008. return isObjectLike(value) && baseGetTag(value) == regexpTag;
  9009. }
  9010. var nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;
  9011. var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
  9012. var arrayProto = Array.prototype;
  9013. var nativeJoin = arrayProto.join;
  9014. function join(array, separator) {
  9015. return array == null ? "" : nativeJoin.call(array, separator);
  9016. }
  9017. var kebabCase = createCompounder(function(result, word, index2) {
  9018. return result + (index2 ? "-" : "") + word.toLowerCase();
  9019. });
  9020. var merge = createAssigner(function(object, source, srcIndex) {
  9021. baseMerge(object, source, srcIndex);
  9022. });
  9023. function once(func) {
  9024. return before(2, func);
  9025. }
  9026. var MAX_SAFE_INTEGER = 9007199254740991;
  9027. var nativeFloor = Math.floor;
  9028. function baseRepeat(string, n) {
  9029. var result = "";
  9030. if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
  9031. return result;
  9032. }
  9033. do {
  9034. if (n % 2) {
  9035. result += string;
  9036. }
  9037. n = nativeFloor(n / 2);
  9038. if (n) {
  9039. string += string;
  9040. }
  9041. } while (n);
  9042. return result;
  9043. }
  9044. var nativeCeil = Math.ceil, nativeMax = Math.max;
  9045. function baseRange(start, end, step, fromRight) {
  9046. var index2 = -1, length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), result = Array(length);
  9047. while (length--) {
  9048. result[fromRight ? length : ++index2] = start;
  9049. start += step;
  9050. }
  9051. return result;
  9052. }
  9053. function createRange(fromRight) {
  9054. return function(start, end, step) {
  9055. if (step && typeof step != "number" && isIterateeCall(start, end, step)) {
  9056. end = step = void 0;
  9057. }
  9058. start = toFinite(start);
  9059. if (end === void 0) {
  9060. end = start;
  9061. start = 0;
  9062. } else {
  9063. end = toFinite(end);
  9064. }
  9065. step = step === void 0 ? start < end ? 1 : -1 : toFinite(step);
  9066. return baseRange(start, end, step, fromRight);
  9067. };
  9068. }
  9069. var range = createRange();
  9070. const range$1 = range;
  9071. function repeat(string, n, guard) {
  9072. if (guard ? isIterateeCall(string, n, guard) : n === void 0) {
  9073. n = 1;
  9074. } else {
  9075. n = toInteger(n);
  9076. }
  9077. return baseRepeat(toString(string), n);
  9078. }
  9079. var round = createRound("round");
  9080. function baseSome(collection, predicate) {
  9081. var result;
  9082. baseEach$1(collection, function(value, index2, collection2) {
  9083. result = predicate(value, index2, collection2);
  9084. return !result;
  9085. });
  9086. return !!result;
  9087. }
  9088. function some(collection, predicate, guard) {
  9089. var func = isArray(collection) ? arraySome : baseSome;
  9090. if (guard && isIterateeCall(collection, predicate, guard)) {
  9091. predicate = void 0;
  9092. }
  9093. return func(collection, baseIteratee(predicate));
  9094. }
  9095. var MAX_ARRAY_LENGTH = 4294967295;
  9096. function split(string, separator, limit) {
  9097. if (limit && typeof limit != "number" && isIterateeCall(string, separator, limit)) {
  9098. separator = limit = void 0;
  9099. }
  9100. limit = limit === void 0 ? MAX_ARRAY_LENGTH : limit >>> 0;
  9101. if (!limit) {
  9102. return [];
  9103. }
  9104. string = toString(string);
  9105. if (string && (typeof separator == "string" || separator != null && !isRegExp(separator))) {
  9106. separator = baseToString(separator);
  9107. if (!separator && hasUnicode(string)) {
  9108. return castSlice(stringToArray(string), 0, limit);
  9109. }
  9110. }
  9111. return string.split(separator, limit);
  9112. }
  9113. function startsWith(string, target, position) {
  9114. string = toString(string);
  9115. position = position == null ? 0 : baseClamp(toInteger(position), 0, string.length);
  9116. target = baseToString(target);
  9117. return string.slice(position, position + target.length) == target;
  9118. }
  9119. function take(array, n, guard) {
  9120. if (!(array && array.length)) {
  9121. return [];
  9122. }
  9123. n = guard || n === void 0 ? 1 : toInteger(n);
  9124. return baseSlice(array, 0, n < 0 ? 0 : n);
  9125. }
  9126. var FUNC_ERROR_TEXT = "Expected a function";
  9127. function throttle(func, wait, options) {
  9128. var leading = true, trailing = true;
  9129. if (typeof func != "function") {
  9130. throw new TypeError(FUNC_ERROR_TEXT);
  9131. }
  9132. if (isObject(options)) {
  9133. leading = "leading" in options ? !!options.leading : leading;
  9134. trailing = "trailing" in options ? !!options.trailing : trailing;
  9135. }
  9136. return debounce(func, wait, {
  9137. "leading": leading,
  9138. "maxWait": wait,
  9139. "trailing": trailing
  9140. });
  9141. }
  9142. function charsStartIndex(strSymbols, chrSymbols) {
  9143. var index2 = -1, length = strSymbols.length;
  9144. while (++index2 < length && baseIndexOf(chrSymbols, strSymbols[index2], 0) > -1) {
  9145. }
  9146. return index2;
  9147. }
  9148. var reTrimStart = /^\s+/;
  9149. function trimStart(string, chars, guard) {
  9150. string = toString(string);
  9151. if (string && (guard || chars === void 0)) {
  9152. return string.replace(reTrimStart, "");
  9153. }
  9154. if (!string || !(chars = baseToString(chars))) {
  9155. return string;
  9156. }
  9157. var strSymbols = stringToArray(string), start = charsStartIndex(strSymbols, stringToArray(chars));
  9158. return castSlice(strSymbols, start).join("");
  9159. }
  9160. function baseZipObject(props, values2, assignFunc) {
  9161. var index2 = -1, length = props.length, valsLength = values2.length, result = {};
  9162. while (++index2 < length) {
  9163. var value = index2 < valsLength ? values2[index2] : void 0;
  9164. assignFunc(result, props[index2], value);
  9165. }
  9166. return result;
  9167. }
  9168. function zipObject(props, values2) {
  9169. return baseZipObject(props || [], values2 || [], assignValue);
  9170. }
  9171. var _GM_addStyle = /* @__PURE__ */ (() => typeof GM_addStyle != "undefined" ? GM_addStyle : void 0)();
  9172. var _GM_deleteValue = /* @__PURE__ */ (() => typeof GM_deleteValue != "undefined" ? GM_deleteValue : void 0)();
  9173. var _GM_getValue = /* @__PURE__ */ (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)();
  9174. var _GM_info = /* @__PURE__ */ (() => typeof GM_info != "undefined" ? GM_info : void 0)();
  9175. var _GM_listValues = /* @__PURE__ */ (() => typeof GM_listValues != "undefined" ? GM_listValues : void 0)();
  9176. var _GM_openInTab = /* @__PURE__ */ (() => typeof GM_openInTab != "undefined" ? GM_openInTab : void 0)();
  9177. var _GM_setValue = /* @__PURE__ */ (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)();
  9178. const _sfc_main$m = /* @__PURE__ */ vue.defineComponent({
  9179. __name: "user-button",
  9180. props: {
  9181. isAnchor: { type: Boolean },
  9182. shadowBorder: { type: Boolean },
  9183. unsetBackground: { type: Boolean },
  9184. themeStyle: { type: Boolean },
  9185. noBorder: { type: [Boolean, String] }
  9186. },
  9187. setup(__props) {
  9188. const props = __props;
  9189. return (_ctx, _cache) => {
  9190. return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(_ctx.isAnchor ? "a" : "button"), {
  9191. class: vue.normalizeClass(["user-button", { "shadow-border": props.shadowBorder, "unset-background": props.unsetBackground, "theme-style": props.themeStyle, "no-border": props.noBorder, "no-border-all": props.noBorder === "all" }]),
  9192. type: "button"
  9193. }, {
  9194. default: vue.withCtx(() => [
  9195. vue.renderSlot(_ctx.$slots, "default")
  9196. ]),
  9197. _: 3
  9198. }, 8, ["class"]);
  9199. };
  9200. }
  9201. });
  9202. const _withScopeId$9 = (n) => (vue.pushScopeId("data-v-db54e64e"), n = n(), vue.popScopeId(), n);
  9203. const _hoisted_1$g = /* @__PURE__ */ _withScopeId$9(() => /* @__PURE__ */ vue.createElementVNode("span", null, "|", -1));
  9204. const _hoisted_2$f = { class: "toast-controls" };
  9205. const _sfc_main$l = /* @__PURE__ */ vue.defineComponent({
  9206. __name: "toast",
  9207. props: {
  9208. message: {},
  9209. duration: { default: 6e3 },
  9210. icon: {},
  9211. type: {},
  9212. blurEffect: { type: Boolean }
  9213. },
  9214. setup(__props) {
  9215. const props = __props;
  9216. const toastContainer = vue.ref();
  9217. function chooseIcon() {
  9218. if (props.icon) {
  9219. return props.icon;
  9220. } else {
  9221. if (props.type) {
  9222. switch (props.type) {
  9223. case "basic":
  9224. return void 0;
  9225. case "check":
  9226. return "check";
  9227. case "warning":
  9228. return "warning";
  9229. case "error":
  9230. return "error";
  9231. default:
  9232. return void 0;
  9233. }
  9234. }
  9235. }
  9236. }
  9237. return (_ctx, _cache) => {
  9238. return vue.openBlock(), vue.createElementBlock("div", {
  9239. ref_key: "toastContainer",
  9240. ref: toastContainer,
  9241. class: vue.normalizeClass(["toast-container", { "blur-effect": props.blurEffect }])
  9242. }, [
  9243. chooseIcon() ? (vue.openBlock(), vue.createElementBlock("div", {
  9244. key: 0,
  9245. class: vue.normalizeClass(["toast-icon icon", props.type])
  9246. }, vue.toDisplayString(chooseIcon()), 3)) : vue.createCommentVNode("", true),
  9247. vue.createElementVNode("div", {
  9248. class: vue.normalizeClass(["toast-content", props.type])
  9249. }, vue.toDisplayString(props.message), 3),
  9250. _hoisted_1$g,
  9251. vue.createElementVNode("div", _hoisted_2$f, [
  9252. vue.createVNode(_sfc_main$m, {
  9253. class: "close-button icon",
  9254. "shadow-border": true,
  9255. onClick: vue.unref(passToNextToast)
  9256. }, {
  9257. default: vue.withCtx(() => [
  9258. vue.createTextVNode("close")
  9259. ]),
  9260. _: 1
  9261. }, 8, ["onClick"])
  9262. ])
  9263. ], 2);
  9264. };
  9265. }
  9266. });
  9267. const _export_sfc = (sfc, props) => {
  9268. const target = sfc.__vccOpts || sfc;
  9269. for (const [key, val] of props) {
  9270. target[key] = val;
  9271. }
  9272. return target;
  9273. };
  9274. const toastVue = /* @__PURE__ */ _export_sfc(_sfc_main$l, [["__scopeId", "data-v-db54e64e"]]);
  9275. class Queue {
  9276. constructor(items) {
  9277. __publicField(this, "items", []);
  9278. if (items)
  9279. this.items = items;
  9280. }
  9281. /** 队首 */
  9282. peek() {
  9283. return this.items[0] ? this.items[0] : void 0;
  9284. }
  9285. /** 队列长度 */
  9286. length() {
  9287. return this.items.length;
  9288. }
  9289. /** 入队 */
  9290. enqueue(...elements) {
  9291. this.items.push(...elements);
  9292. }
  9293. /** 出队 */
  9294. dequeue() {
  9295. return this.items.shift();
  9296. }
  9297. /** 队列是否为空 */
  9298. isEmpty() {
  9299. return this.items.length === 0;
  9300. }
  9301. /** 清空队列 */
  9302. clear() {
  9303. this.items = [];
  9304. }
  9305. }
  9306. let publicToastInstance;
  9307. let isToasting = false;
  9308. const toastsQueue = new Queue();
  9309. function toast(props) {
  9310. toastsQueue.enqueue([{
  9311. blurEffect: perfProfile.get() === "performance",
  9312. ...props
  9313. }, -1]);
  9314. const interval = setInterval(() => {
  9315. if (!isToasting) {
  9316. const peek = toastsQueue.peek();
  9317. if (peek)
  9318. renderToast(peek[0]);
  9319. clearInterval(interval);
  9320. }
  9321. }, 100);
  9322. }
  9323. function renderToast(toastProps) {
  9324. isToasting = true;
  9325. publicToastInstance = vue.createApp(toastVue, toastProps);
  9326. if (!document.getElementById(
  9327. "t-wrapper"
  9328. /* toast-wrapper */
  9329. )) {
  9330. document.body.insertBefore(templateCreate("div", {
  9331. "id": "t-wrapper"
  9332. }), document.body.firstChild);
  9333. }
  9334. const vm = publicToastInstance.mount("#t-wrapper");
  9335. const peek = toastsQueue.peek();
  9336. if (!peek)
  9337. return;
  9338. peek[1] = setTimeout(() => {
  9339. publicToastInstance.unmount();
  9340. toastsQueue.dequeue();
  9341. isToasting = false;
  9342. }, toastProps.duration ? toastProps.duration : 6e3);
  9343. return vm;
  9344. }
  9345. function passToNextToast() {
  9346. publicToastInstance.unmount();
  9347. const peek = toastsQueue.peek();
  9348. if (peek) {
  9349. clearTimeout(peek[1]);
  9350. }
  9351. toastsQueue.dequeue();
  9352. isToasting = false;
  9353. const next = toastsQueue.peek();
  9354. if (next) {
  9355. setTimeout(() => {
  9356. renderToast(next[0]);
  9357. }, 10);
  9358. }
  9359. }
  9360. async function requestInstance(api) {
  9361. try {
  9362. const response = await api;
  9363. if (response.ok) {
  9364. return await response.json();
  9365. }
  9366. } catch (error) {
  9367. toast({
  9368. message: errorMessage(error),
  9369. type: "error",
  9370. duration: 6e3
  9371. });
  9372. }
  9373. }
  9374. const modules = [];
  9375. function AllModules() {
  9376. return modules;
  9377. }
  9378. function errorMessage(error) {
  9379. const errBody = error.stack ? error.stack : error.message;
  9380. return `${_GM_info.script.name} ${_GM_info.script.version}
  9381. ${errBody}`;
  9382. }
  9383. function spawnOffsetTS(year = 0, month = 0, day = 0, hours = 0, minutes = 0, seconds = 0) {
  9384. const now2 = /* @__PURE__ */ new Date();
  9385. const offset = new Date(
  9386. now2.getFullYear() + year,
  9387. now2.getMonth() + month,
  9388. now2.getDate() + day,
  9389. now2.getHours() + hours,
  9390. now2.getMinutes() + minutes,
  9391. now2.getSeconds() + seconds,
  9392. 0
  9393. );
  9394. return offset.getTime();
  9395. }
  9396. function requestBody(body) {
  9397. let reqBody = "";
  9398. forOwn(body, (value, key) => {
  9399. if (!value)
  9400. value = "";
  9401. reqBody += `${key}=${value}&`;
  9402. });
  9403. return reqBody.slice(0, -1);
  9404. }
  9405. function waitUntil(pred, timeout = Infinity) {
  9406. return new Promise((resolve, reject) => {
  9407. const startTime = performance.now();
  9408. let id = -1;
  9409. function tick() {
  9410. if (pred()) {
  9411. cancelAnimationFrame(id);
  9412. resolve();
  9413. } else if (performance.now() - startTime >= timeout) {
  9414. cancelAnimationFrame(id);
  9415. reject(new Error("等待超时"));
  9416. console.warn("[waitUntil] 等待超时,该函数未在指定时间内得到期望值:", pred);
  9417. console.trace("发生错误的调用者:");
  9418. if (_GM_info.script.version === "developer-only") {
  9419. alert(`等待超时,该函数未在指定时间内得到期望值:${pred}`);
  9420. }
  9421. } else {
  9422. id = requestAnimationFrame(tick);
  9423. }
  9424. }
  9425. id = requestAnimationFrame(tick);
  9426. });
  9427. }
  9428. function isLiteralObject(obj) {
  9429. return obj && typeof obj === "object" && !Array.isArray(obj);
  9430. }
  9431. function outputFile(filename, content) {
  9432. const blob = new Blob([content], { type: "text/plain" });
  9433. const url = URL.createObjectURL(blob);
  9434. const link = document.createElement("a");
  9435. link.href = url;
  9436. link.download = filename;
  9437. link.click();
  9438. URL.revokeObjectURL(url);
  9439. }
  9440. async function selectLocalFile(mode = "text") {
  9441. return new Promise((resolve, reject) => {
  9442. const input = document.createElement("input");
  9443. input.type = "file";
  9444. input.addEventListener("change", function() {
  9445. if (!input.files)
  9446. return;
  9447. const file = input.files[0];
  9448. const reader = new FileReader();
  9449. reader.addEventListener("loadend", function() {
  9450. const base64String = reader.result;
  9451. resolve(base64String);
  9452. });
  9453. reader.addEventListener("error", function() {
  9454. reject(new Error());
  9455. });
  9456. switch (mode) {
  9457. case "text": {
  9458. reader.readAsText(file);
  9459. break;
  9460. }
  9461. case "base64": {
  9462. reader.readAsDataURL(file);
  9463. break;
  9464. }
  9465. }
  9466. });
  9467. input.click();
  9468. });
  9469. }
  9470. const fadeInElems = [];
  9471. const fadeInClass = "fade-in-elem";
  9472. function DOMS(...args) {
  9473. const single = args[0] === true;
  9474. const selector = single ? args[1] : args[0];
  9475. switch (args.length) {
  9476. case 1:
  9477. return document.querySelectorAll(selector);
  9478. case 2:
  9479. if (single)
  9480. return document.querySelector(selector);
  9481. if (args[1] instanceof Element) {
  9482. return args[1].querySelectorAll(selector);
  9483. }
  9484. return document.querySelectorAll(selector);
  9485. case 3:
  9486. if (single) {
  9487. if (args[2] instanceof Element)
  9488. return args[2].querySelector(selector);
  9489. return document.querySelector(selector);
  9490. }
  9491. return args[2].querySelectorAll(selector);
  9492. case 4:
  9493. return args[3].querySelector(selector);
  9494. }
  9495. }
  9496. function afterHead(callbackfn) {
  9497. callbackfn();
  9498. }
  9499. function mergeNodeAttrs(node, attrs) {
  9500. forOwn(attrs, (value, key) => {
  9501. if (value !== node.getAttribute(key)) {
  9502. if (isLiteralObject(value)) {
  9503. node.setAttribute(key, JSON.stringify(attrs[key]));
  9504. } else {
  9505. node.setAttribute(key, attrs[key]);
  9506. }
  9507. }
  9508. });
  9509. }
  9510. function templateCreate(tag, attrs, children = [], doc) {
  9511. const DOC = doc ? doc : document;
  9512. const elem = DOC.createElement(tag);
  9513. if (attrs) {
  9514. mergeNodeAttrs(elem, attrs);
  9515. }
  9516. if (typeof children === "string") {
  9517. elem.appendChild(document.createTextNode(children));
  9518. } else {
  9519. forEach(children, (child) => {
  9520. if (typeof child === "string") {
  9521. elem.appendChild(document.createTextNode(child));
  9522. } else {
  9523. elem.appendChild(child);
  9524. }
  9525. });
  9526. }
  9527. return elem;
  9528. }
  9529. function findParent(el, trait, mode = "className") {
  9530. const verifier = (() => {
  9531. switch (mode) {
  9532. case "selector": {
  9533. const allValid = new Set(DOMS(trait));
  9534. return (parent) => {
  9535. return allValid.has(parent);
  9536. };
  9537. }
  9538. case "className": {
  9539. return (parent) => parent.classList.contains(trait) ?? false;
  9540. }
  9541. case "id": {
  9542. return (parent) => parent.id === trait;
  9543. }
  9544. case "tagName": {
  9545. return (parent) => parent.tagName.toLowerCase() === trait.toLowerCase();
  9546. }
  9547. }
  9548. })();
  9549. while (el.parentElement && !verifier(el.parentElement)) {
  9550. el = el.parentElement;
  9551. }
  9552. return el.parentElement;
  9553. }
  9554. function fadeInLoad(selector) {
  9555. DOMS(selector).forEach((elem) => {
  9556. elem.classList.add(fadeInClass);
  9557. elem.addEventListener("animationend", () => {
  9558. elem.style.opacity = "1";
  9559. elem.classList.remove(fadeInClass);
  9560. });
  9561. });
  9562. }
  9563. class TbObserver {
  9564. constructor(selector, options, initEvent) {
  9565. __publicField(this, "selector");
  9566. __publicField(this, "options");
  9567. __publicField(this, "initEvent");
  9568. __publicField(this, "events", []);
  9569. this.selector = selector;
  9570. this.options = options;
  9571. this.initEvent = initEvent;
  9572. }
  9573. observe() {
  9574. const eventFuncs = () => {
  9575. this.events.forEach((func) => {
  9576. func();
  9577. });
  9578. };
  9579. if (typeof this.initEvent === "undefined") {
  9580. eventFuncs();
  9581. } else {
  9582. window.addEventListener(this.initEvent, eventFuncs);
  9583. }
  9584. const observer = new MutationObserver(eventFuncs);
  9585. const obsElem = DOMS(this.selector)[0];
  9586. if (obsElem)
  9587. observer.observe(obsElem, this.options);
  9588. }
  9589. addEvent(...events) {
  9590. forEach(events, (event) => {
  9591. if (this.events.includes(event))
  9592. return;
  9593. if (typeof this.initEvent === "undefined") {
  9594. event();
  9595. } else {
  9596. window.addEventListener(this.initEvent, event);
  9597. }
  9598. this.events.push(event);
  9599. });
  9600. }
  9601. }
  9602. const threadFloorsObserver = new TbObserver("#j_p_postlist", { childList: true });
  9603. const threadCommentsObserver = new TbObserver("#j_p_postlist", { childList: true, subtree: true });
  9604. const legacyIndexFeedsObserver = new TbObserver("#new_list", { childList: true });
  9605. const forumThreadsObserver = new TbObserver("#pagelet_frs-list\\/pagelet\\/thread", { attributes: true }, "load");
  9606. function loadPerf() {
  9607. setPerfAttr();
  9608. setThreadLazyload();
  9609. }
  9610. function setPerfAttr() {
  9611. const perfAttr = {
  9612. default: "perf-default",
  9613. saver: "perf-saver",
  9614. performance: "perf-performance"
  9615. };
  9616. forEach(document.documentElement.attributes, (attr) => {
  9617. if (startsWith(attr.name, "perf-")) {
  9618. document.documentElement.removeAttribute(attr.name);
  9619. }
  9620. });
  9621. document.documentElement.toggleAttribute(perfAttr[perfProfile.get()]);
  9622. }
  9623. async function setThreadLazyload() {
  9624. if (currentPageType() !== "thread")
  9625. return;
  9626. const lazyloadDiff = {
  9627. default: 1e3,
  9628. saver: 500,
  9629. performance: 9999
  9630. };
  9631. await waitUntil(() => typeof datalazyload !== "undefined");
  9632. threadFloorsObserver.addEvent(setDiff);
  9633. function setDiff() {
  9634. setTimeout(() => {
  9635. datalazyload.userConfig.diff = lazyloadDiff[perfProfile.get()];
  9636. }, 500);
  9637. }
  9638. }
  9639. const defaultStyle = document.createElement("style");
  9640. defaultStyle.id = "default-stylesheet";
  9641. afterHead(() => {
  9642. document.head.appendChild(defaultStyle);
  9643. });
  9644. function parseMultiCSS(cssObject) {
  9645. return flatMapDeep(cssObject, (value, key) => {
  9646. return [
  9647. `${key} {`,
  9648. ...flatMapDeep(value, (v, k) => `${startsWith(k, "--") ? k : kebabCase(k)}: ${v};`),
  9649. "}",
  9650. ""
  9651. ];
  9652. }).join("\n");
  9653. }
  9654. function parseCSSRule(cssRule) {
  9655. let css = "";
  9656. forOwn(cssRule, (value, key) => {
  9657. css += `${kebabCase(key)}:${value};`;
  9658. });
  9659. return css;
  9660. }
  9661. function injectCSSList(css) {
  9662. const cssElem = document.createElement("style");
  9663. cssElem.textContent = css;
  9664. afterHead(() => {
  9665. document.head.appendChild(cssElem);
  9666. });
  9667. return cssElem;
  9668. }
  9669. function injectCSSRule(selector, cssRule) {
  9670. if (selector === "")
  9671. return;
  9672. if (cssRule.length === 0)
  9673. return;
  9674. if (!defaultStyle.sheet)
  9675. return;
  9676. const css = `${selector}{${parseCSSRule(cssRule)}}`;
  9677. return defaultStyle.sheet.insertRule(css);
  9678. }
  9679. function removeCSSRule(index2) {
  9680. if (!defaultStyle.sheet)
  9681. return;
  9682. defaultStyle.sheet.deleteRule(index2);
  9683. }
  9684. function assignCSSRule(el, cssRule) {
  9685. assign$1(el.style, cssRule);
  9686. }
  9687. function hexToRGBA(hex) {
  9688. const hexValue = startsWith(hex, "#") ? trimStart(hex, "#") : hex;
  9689. const tokenConverter = hexValue.length <= 4 ? (chunk2) => parseInt(repeat(chunk2[0], 2), 16) : (chunk2) => parseInt(join(chunk2, ""), 16);
  9690. const chunkSize = hexValue.length <= 4 ? 1 : 2;
  9691. const chunks = chunk(hexValue, chunkSize);
  9692. return {
  9693. r: tokenConverter(chunks[0]),
  9694. g: tokenConverter(chunks[1]),
  9695. b: tokenConverter(chunks[2]),
  9696. a: chunks.length === 4 ? tokenConverter(chunks[3]) : 1
  9697. };
  9698. }
  9699. function rgbaToHSLA(rgba) {
  9700. const normalizedR = rgba.r / 255;
  9701. const normalizedG = rgba.g / 255;
  9702. const normalizedB = rgba.b / 255;
  9703. const minValue = Math.min(normalizedR, normalizedG, normalizedB);
  9704. const maxValue = Math.max(normalizedR, normalizedG, normalizedB);
  9705. const lightness = (maxValue + minValue) / 2;
  9706. let saturation;
  9707. if (lightness <= 0.5) {
  9708. saturation = (maxValue - minValue) / (maxValue + minValue);
  9709. } else {
  9710. saturation = (maxValue - minValue) / (2 - maxValue - minValue);
  9711. }
  9712. let hue;
  9713. if (maxValue === minValue) {
  9714. hue = 0;
  9715. } else if (maxValue === normalizedR) {
  9716. hue = (normalizedG - normalizedB) / (maxValue - minValue);
  9717. } else if (maxValue === normalizedG) {
  9718. hue = 2 + (normalizedB - normalizedR) / (maxValue - minValue);
  9719. } else {
  9720. hue = 4 + (normalizedR - normalizedG) / (maxValue - minValue);
  9721. }
  9722. hue *= 60;
  9723. if (hue < 0) {
  9724. hue += 360;
  9725. }
  9726. return {
  9727. h: round(hue, 2),
  9728. s: `${round(saturation * 100)}%`,
  9729. l: `${round(lightness * 100)}%`,
  9730. a: rgba.a
  9731. };
  9732. }
  9733. const darkPrefers = matchMedia("(prefers-color-scheme: dark)");
  9734. const dynCSSRules = {
  9735. customBackground: () => {
  9736. var _a;
  9737. return findIndex(Array.from(((_a = defaultStyle.sheet) == null ? void 0 : _a.cssRules) ?? { length: 0 }), (rule) => rule.selectorText === "body.custom-background");
  9738. }
  9739. };
  9740. async function loadDynamicCSS() {
  9741. const theme = themeColor.get();
  9742. const darkRGBA = hexToRGBA(theme.dark);
  9743. const lightRGBA = hexToRGBA(theme.light);
  9744. const darkHSLA = rgbaToHSLA(darkRGBA);
  9745. const lightHSLA = rgbaToHSLA(lightRGBA);
  9746. const dynCSS = parseMultiCSS({
  9747. ":root": {
  9748. "--content-max": wideScreen.get().noLimit ? "100vw" : `${wideScreen.get().maxWidth}px`,
  9749. "--code-zh": `${join(userFonts.get(), ",")}`,
  9750. "--code-monospace": `${join(monospaceFonts.get(), ",")}`
  9751. },
  9752. "html.dark-theme": {
  9753. "--tieba-theme-color": theme.dark,
  9754. "--trans-tieba-theme-color": `rgb(${darkRGBA.r} ${darkRGBA.g} ${darkRGBA.b} / 80%)`,
  9755. "--tieba-theme-hover": `hsl(${darkHSLA.h}deg ${parseInt(darkHSLA.s) + 40}% ${parseInt(darkHSLA.l) + 10}%)`,
  9756. "--tieba-theme-active": `hsl(${darkHSLA.h}deg ${parseInt(darkHSLA.s) + 50}% ${parseInt(darkHSLA.l) + 20}%)`,
  9757. "--tieba-theme-background": `rgb(${darkRGBA.r} ${darkRGBA.g} ${darkRGBA.b} / 24%)`,
  9758. "--tieba-theme-fore": `hsl(${darkHSLA.h}deg 100% 75%)`
  9759. },
  9760. "html.light-theme": {
  9761. "--tieba-theme-color": theme.light,
  9762. "--trans-tieba-theme-color": `rgb(${lightRGBA.r} ${lightRGBA.g} ${lightRGBA.b} / 80%)`,
  9763. "--tieba-theme-hover": `hsl(${lightHSLA.h}deg ${parseInt(lightHSLA.s) - 40}% ${parseInt(lightHSLA.l) - 10}%)`,
  9764. "--tieba-theme-active": `hsl(${lightHSLA.h}deg ${parseInt(lightHSLA.s) - 50}% ${parseInt(lightHSLA.l) - 20}%)`,
  9765. "--tieba-theme-background": `rgb(${lightRGBA.r} ${lightRGBA.g} ${lightRGBA.b} / 24%)`,
  9766. "--tieba-theme-fore": `hsl(${lightHSLA.h}deg 60% 32%)`
  9767. }
  9768. });
  9769. _GM_addStyle(dynCSS);
  9770. }
  9771. async function loadTiebaCSS() {
  9772. switch (currentPageType()) {
  9773. case "forum":
  9774. Promise.resolve().then(() => tiebaForum);
  9775. break;
  9776. }
  9777. document.head.appendChild(templateCreate("link", {
  9778. type: "image/icon",
  9779. rel: "shortcut icon",
  9780. href: getResource("/assets/images/main/favicon32.ico")
  9781. }));
  9782. }
  9783. async function setCustomBackground() {
  9784. afterHead(function() {
  9785. if (dynCSSRules.customBackground() !== -1) {
  9786. removeCSSRule(dynCSSRules.customBackground());
  9787. }
  9788. injectCSSRule("body.custom-background", {
  9789. backgroundImage: `url('${customBackground.get()}') !important`,
  9790. backgroundRepeat: "no-repeat !important",
  9791. backgroundAttachment: "fixed !important",
  9792. backgroundSize: "cover !important"
  9793. }) ?? -1;
  9794. waitUntil(() => !isNil(document.body)).then(function() {
  9795. if (customBackground.get()) {
  9796. document.body.classList.add("custom-background");
  9797. } else {
  9798. document.body.classList.remove("custom-background");
  9799. }
  9800. });
  9801. });
  9802. }
  9803. const MainTitle = "Tieba Remix";
  9804. const Owner = "HacksawBlade";
  9805. const RepoName = "Tieba-Remix";
  9806. const GithubRepo = `https://github.com/${Owner}/${RepoName}`;
  9807. const GiteeRepo = `https://gitee.com/${Owner}/${RepoName}`;
  9808. const BaiduPassport = "https://passport.baidu.com/";
  9809. const REMIXED = "\n██████╗ ███████╗███╗ ███╗██╗██╗ ██╗███████╗██████╗ \n██╔══██╗██╔════╝████╗ ████║██║╚██╗██╔╝██╔════╝██╔══██╗\n██████╔╝█████╗ ██╔████╔██║██║ ╚███╔╝ █████╗ ██║ ██║\n██╔══██╗██╔══╝ ██║╚██╔╝██║██║ ██╔██╗ ██╔══╝ ██║ ██║\n██║ ██║███████╗██║ ╚═╝ ██║██║██╔╝ ██╗███████╗██████╔╝\n╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝╚═╝ ╚═╝╚══════╝╚═════╝ \n";
  9810. class UserKey {
  9811. constructor(key, defaultValue, listeners) {
  9812. __publicField(this, "key");
  9813. __publicField(this, "defaultValue");
  9814. __publicField(this, "listeners");
  9815. this.key = key;
  9816. this.defaultValue = defaultValue;
  9817. this.listeners = {
  9818. getter: (listeners == null ? void 0 : listeners.getter) ? [listeners.getter] : [],
  9819. setter: (listeners == null ? void 0 : listeners.setter) ? [listeners.setter] : []
  9820. };
  9821. }
  9822. dispatchEvent(event, value) {
  9823. forEach(this.listeners[event], (listener) => listener(value));
  9824. }
  9825. get() {
  9826. let value = _GM_getValue(this.key, this.defaultValue);
  9827. if (isLiteralObject(value) && keys(value).length < keys(this.defaultValue).length) {
  9828. value = merge(this.defaultValue, value);
  9829. }
  9830. this.dispatchEvent("getter", value);
  9831. return value;
  9832. }
  9833. set(value) {
  9834. _GM_setValue(this.key, value);
  9835. this.dispatchEvent("setter", value);
  9836. }
  9837. remove() {
  9838. _GM_deleteValue(this.key);
  9839. }
  9840. merge(value) {
  9841. if (isLiteralObject(value)) {
  9842. const merged = { ...this.get(), ...value };
  9843. this.set(merged);
  9844. this.dispatchEvent("setter", merged);
  9845. }
  9846. }
  9847. mergeDeeply(value) {
  9848. if (isLiteralObject(value)) {
  9849. const merged = merge(this.get(), value);
  9850. this.set(merged);
  9851. this.dispatchEvent("setter", merged);
  9852. }
  9853. }
  9854. }
  9855. class UserKeyTS extends UserKey {
  9856. constructor(key, defaultValue, invalidfn, listeners) {
  9857. super(key, defaultValue, listeners);
  9858. __publicField(this, "defaultInvalid", () => spawnOffsetTS(0, 0, 0, 12));
  9859. this.defaultInvalid = invalidfn ? invalidfn : this.defaultInvalid;
  9860. }
  9861. get() {
  9862. let value = getUserValueTS(this.key, this.defaultValue);
  9863. if (isLiteralObject(value) && keys(value).length < keys(this.defaultValue).length) {
  9864. value = merge(this.defaultValue, value);
  9865. }
  9866. this.dispatchEvent("getter", value);
  9867. return value;
  9868. }
  9869. /**
  9870. * 设置时间敏感的用户 key
  9871. * @param value 需要设置的值
  9872. * @param invalidTime 失效时间,默认为函数执行 12 小时后
  9873. */
  9874. set(value, invalidTime) {
  9875. setUserValueTS(this.key, value, invalidTime ? invalidTime : this.defaultInvalid());
  9876. this.dispatchEvent("setter", value);
  9877. }
  9878. merge(value, invalidTime) {
  9879. if (isLiteralObject(value)) {
  9880. const merged = { ...this.get(), ...value };
  9881. this.set(merged, invalidTime ? invalidTime : this.defaultInvalid());
  9882. this.dispatchEvent("setter", merged);
  9883. }
  9884. }
  9885. mergeDeeply(value, invalidTime) {
  9886. if (isLiteralObject(value)) {
  9887. const merged = merge(this.get(), value);
  9888. this.set(merged, invalidTime ? invalidTime : this.defaultInvalid());
  9889. this.dispatchEvent("setter", merged);
  9890. }
  9891. }
  9892. }
  9893. const perfProfile = new UserKey("perfProfile", "default", {
  9894. setter() {
  9895. setPerfAttr();
  9896. }
  9897. });
  9898. const disabledModules = new UserKey("disabledModules", []);
  9899. const unreadFeeds = new UserKeyTS("unreadFeeds", []);
  9900. const experimental = new UserKey("experimental", {
  9901. moreBlurEffect: false,
  9902. rasterEffect: false
  9903. });
  9904. const latestRelease = new UserKeyTS("latestRelease", void 0);
  9905. const updateConfig = new UserKey("updateConfig", {
  9906. time: "6h",
  9907. notify: true
  9908. });
  9909. const showUpdateToday = new UserKeyTS("showUpdateToday", true, () => (/* @__PURE__ */ new Date()).setHours(0, 0, 0, 0) + 24 * 60 * 60 * 1e3);
  9910. const ignoredTag = new UserKey("ignoredTag", "");
  9911. const themeType = new UserKey(
  9912. "themeType",
  9913. "auto",
  9914. {
  9915. setter(value) {
  9916. setTheme(value);
  9917. }
  9918. }
  9919. );
  9920. const compactLayout = new UserKey("compactLayout", false);
  9921. const wideScreen = new UserKey("wideScreen", {
  9922. maxWidth: 1080,
  9923. noLimit: false
  9924. });
  9925. const themeColor = new UserKey("themeColor", {
  9926. light: "#614ec2",
  9927. dark: "#7161c1"
  9928. });
  9929. const customBackground = new UserKey(
  9930. "customBackground",
  9931. void 0,
  9932. {
  9933. setter() {
  9934. setCustomBackground();
  9935. }
  9936. }
  9937. );
  9938. const pageExtension = new UserKey("pageExtension", {
  9939. index: true,
  9940. thread: true
  9941. });
  9942. const userFonts = new UserKey("userFonts", []);
  9943. const monospaceFonts = new UserKey("monospaceFonts", [
  9944. "Consolas",
  9945. "JetBrains Mono",
  9946. "Fira Code",
  9947. "Menlo",
  9948. "monospace"
  9949. ]);
  9950. const navBarHideMode = new UserKey("navBarHideMode", "fold");
  9951. function getUserValueTS(key, def) {
  9952. try {
  9953. const valueTS = _GM_getValue(key, {
  9954. value: def,
  9955. invalidTime: 0
  9956. });
  9957. const timeStamp = Date.now();
  9958. if (valueTS.invalidTime >= timeStamp) {
  9959. return valueTS.value;
  9960. } else {
  9961. return def;
  9962. }
  9963. } catch (error) {
  9964. return def;
  9965. }
  9966. }
  9967. function setUserValueTS(key, value, invalidTime) {
  9968. try {
  9969. if (invalidTime) {
  9970. _GM_setValue(key, {
  9971. value,
  9972. invalidTime
  9973. });
  9974. } else {
  9975. _GM_setValue(key, value);
  9976. }
  9977. } catch (error) {
  9978. console.warn("setUserValueTS", error);
  9979. }
  9980. }
  9981. const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
  9982. __name: "dialog-wrapper",
  9983. props: {
  9984. dialog: {},
  9985. childProps: {},
  9986. blurEffect: { type: Boolean, default: perfProfile.get() === "performance" && experimental.get().moreBlurEffect },
  9987. forced: { type: Boolean, default: false },
  9988. darker: { type: Boolean, default: true }
  9989. },
  9990. emits: ["RequestClose"],
  9991. setup(__props, { emit: __emit }) {
  9992. const props = __props;
  9993. const emit = __emit;
  9994. const dialog = vue.createApp(props.dialog, props.childProps);
  9995. vue.onMounted(() => {
  9996. dialog.mount(".dialog-wrapper");
  9997. });
  9998. function onClick(e) {
  9999. if (!includes(e.target.classList, "dialog-toggle"))
  10000. return;
  10001. if (!props.forced) {
  10002. emit("RequestClose");
  10003. dialog.unmount();
  10004. unloadDialog();
  10005. }
  10006. }
  10007. return (_ctx, _cache) => {
  10008. return vue.openBlock(), vue.createElementBlock("div", {
  10009. class: vue.normalizeClass(["dialog-wrapper dialog-toggle", { "blur-effect": props.blurEffect, "darker": props.darker }]),
  10010. onClick
  10011. }, null, 2);
  10012. };
  10013. }
  10014. });
  10015. const dialogWrapperVue = /* @__PURE__ */ _export_sfc(_sfc_main$k, [["__scopeId", "data-v-f9deea39"]]);
  10016. let publicDialogInstance;
  10017. const dialogQueue = new Queue();
  10018. function renderComponent(root2, container, rootProps) {
  10019. const app = vue.createApp(root2, rootProps);
  10020. return {
  10021. app,
  10022. instance: app.mount(container)
  10023. };
  10024. }
  10025. const scrollbarWidth = once(function() {
  10026. const temp = templateCreate("div");
  10027. assignCSSRule(temp, {
  10028. width: "100px",
  10029. height: "100px",
  10030. overflow: "scroll",
  10031. position: "absolute",
  10032. top: "-9999px"
  10033. });
  10034. document.body.appendChild(temp);
  10035. const scrollbarWidth2 = temp.offsetWidth - temp.clientWidth;
  10036. document.body.removeChild(temp);
  10037. return scrollbarWidth2;
  10038. });
  10039. function renderPage(root2, rootProps) {
  10040. if (document.getElementsByTagName("body").length === 0) {
  10041. document.documentElement.appendChild(templateCreate("body"));
  10042. }
  10043. removeDefault();
  10044. const page = templateCreate("div", {
  10045. id: "remixed-page"
  10046. });
  10047. document.body.insertBefore(page, document.body.firstChild);
  10048. document.body.appendChild(templateCreate("div", {
  10049. "id": "carousel_wrap"
  10050. }));
  10051. injectCSSRule("#spage-tbshare-container, .tbui_aside_float_bar", {
  10052. display: "none !important"
  10053. });
  10054. return renderComponent(root2, page, rootProps);
  10055. }
  10056. async function renderDialog(dialog, dialogProps, wrapperProps) {
  10057. const dialogWrapper = document.getElementById("dialog-wrapper");
  10058. if (!dialogWrapper) {
  10059. document.body.insertBefore(templateCreate("div", {
  10060. "id": "dialog-wrapper"
  10061. }), document.body.firstChild);
  10062. }
  10063. document.body.setAttribute("no-scrollbar", "");
  10064. document.body.style.paddingRight = `${scrollbarWidth()}px`;
  10065. if (dialogWrapper == null ? void 0 : dialogWrapper.hasChildNodes()) {
  10066. dialogQueue.enqueue([dialog, dialogProps, wrapperProps]);
  10067. return new Promise((resolve) => {
  10068. const peek = dialogQueue.peek();
  10069. const interval = setInterval(() => {
  10070. if (dialogQueue.peek() !== peek) {
  10071. clearInterval(interval);
  10072. resolve("");
  10073. }
  10074. });
  10075. });
  10076. } else {
  10077. publicDialogInstance = vue.createApp(dialogWrapperVue, {
  10078. dialog,
  10079. childProps: dialogProps,
  10080. ...wrapperProps
  10081. });
  10082. const vm = publicDialogInstance.mount("#dialog-wrapper");
  10083. return vm;
  10084. }
  10085. }
  10086. function unloadDialog() {
  10087. document.body.removeAttribute("no-scrollbar");
  10088. document.body.style.paddingRight = "";
  10089. if (publicDialogInstance)
  10090. publicDialogInstance.unmount();
  10091. const next = dialogQueue.dequeue();
  10092. if (next) {
  10093. renderDialog(next[0], next[1], next[2]);
  10094. }
  10095. }
  10096. function removeDefault() {
  10097. forEach(document.head.children, (el) => {
  10098. if (el && el.tagName.toUpperCase() === "LINK" && includes(el.getAttribute("href"), "static-common/style")) {
  10099. el.remove();
  10100. }
  10101. if (el && el.tagName.toUpperCase() === "SCRIPT" && includes(el.getAttribute("src"), "static-common/lib")) {
  10102. el.remove();
  10103. }
  10104. });
  10105. forEach(document.body.children, (el) => {
  10106. if (el && el.tagName.toUpperCase() === "STYLE") {
  10107. el.remove();
  10108. }
  10109. if (el && el.tagName.toUpperCase() === "SCRIPT") {
  10110. el.remove();
  10111. }
  10112. if (el && el.tagName.toUpperCase() === "IFRAME") {
  10113. el.remove();
  10114. }
  10115. if (el && includes(el.className, "translatorExtension")) {
  10116. el.remove();
  10117. }
  10118. if (el && includes(el.className, "dialogJ")) {
  10119. el.remove();
  10120. }
  10121. });
  10122. }
  10123. const _hoisted_1$f = { class: "message-box remove-default" };
  10124. const _hoisted_2$e = {
  10125. key: 0,
  10126. class: "title"
  10127. };
  10128. const _hoisted_3$d = {
  10129. key: 0,
  10130. class: "message-controls"
  10131. };
  10132. const _hoisted_4$c = {
  10133. key: 1,
  10134. class: "message-controls"
  10135. };
  10136. const _sfc_main$j = /* @__PURE__ */ vue.defineComponent({
  10137. __name: "message-box",
  10138. props: {
  10139. title: {},
  10140. message: {},
  10141. type: { default: "basic" },
  10142. embedded: { type: Boolean },
  10143. buttons: {}
  10144. },
  10145. emits: ["positive", "cancel", "negative"],
  10146. setup(__props, { emit: __emit }) {
  10147. const props = __props;
  10148. const messageWrapper = vue.ref();
  10149. const messageContent = vue.ref();
  10150. const emit = __emit;
  10151. vue.onMounted(function() {
  10152. if (props.embedded) {
  10153. if (messageContent.value) {
  10154. if (props.message) {
  10155. messageContent.value.innerHTML = props.message;
  10156. }
  10157. }
  10158. }
  10159. });
  10160. function defaultClose(event) {
  10161. event();
  10162. emitAndClose("positive");
  10163. }
  10164. function emitAndClose(emitName) {
  10165. emit(emitName, emitName);
  10166. setMessageInbox(emitName);
  10167. unloadDialog();
  10168. }
  10169. return (_ctx, _cache) => {
  10170. return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$f, [
  10171. vue.createElementVNode("div", {
  10172. ref_key: "messageWrapper",
  10173. ref: messageWrapper,
  10174. class: "message-wrapper"
  10175. }, [
  10176. props.title ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$e, vue.toDisplayString(props.title), 1)) : vue.createCommentVNode("", true),
  10177. props.message ? (vue.openBlock(), vue.createElementBlock("div", {
  10178. key: 1,
  10179. ref_key: "messageContent",
  10180. ref: messageContent,
  10181. class: "message markdown"
  10182. }, vue.toDisplayString(props.message), 513)) : vue.createCommentVNode("", true),
  10183. vue.renderSlot(_ctx.$slots, "default", {}, void 0, true)
  10184. ], 512),
  10185. !props.buttons || props.buttons.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$d, [
  10186. vue.createVNode(_sfc_main$m, {
  10187. class: "message-button",
  10188. "shadow-border": true,
  10189. "theme-style": true,
  10190. onClick: _cache[0] || (_cache[0] = ($event) => emitAndClose("positive"))
  10191. }, {
  10192. default: vue.withCtx(() => [
  10193. vue.createTextVNode(" 确定")
  10194. ]),
  10195. _: 1
  10196. }),
  10197. props.type === "OkCancel" ? (vue.openBlock(), vue.createBlock(_sfc_main$m, {
  10198. key: 0,
  10199. class: "message-button",
  10200. "shadow-border": true,
  10201. onClick: _cache[1] || (_cache[1] = ($event) => emitAndClose("cancel"))
  10202. }, {
  10203. default: vue.withCtx(() => [
  10204. vue.createTextVNode("取消")
  10205. ]),
  10206. _: 1
  10207. })) : vue.createCommentVNode("", true),
  10208. props.type === "forceTrueFalse" ? (vue.openBlock(), vue.createBlock(_sfc_main$m, {
  10209. key: 1,
  10210. class: "message-button",
  10211. "shadow-border": true,
  10212. onClick: _cache[2] || (_cache[2] = ($event) => emitAndClose("cancel"))
  10213. }, {
  10214. default: vue.withCtx(() => [
  10215. vue.createTextVNode("拒绝")
  10216. ]),
  10217. _: 1
  10218. })) : vue.createCommentVNode("", true)
  10219. ])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$c, [
  10220. (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(props.buttons, (button, index2) => {
  10221. return vue.openBlock(), vue.createBlock(_sfc_main$m, {
  10222. class: "message-button",
  10223. "shadow-border": "",
  10224. "theme-style": index2 == 0,
  10225. onClick: ($event) => defaultClose(button.event)
  10226. }, {
  10227. default: vue.withCtx(() => [
  10228. vue.createTextVNode(vue.toDisplayString(button.title), 1)
  10229. ]),
  10230. _: 2
  10231. }, 1032, ["theme-style", "onClick"]);
  10232. }), 256))
  10233. ]))
  10234. ]);
  10235. };
  10236. }
  10237. });
  10238. const messageBoxVue = /* @__PURE__ */ _export_sfc(_sfc_main$j, [["__scopeId", "data-v-8df9d0bc"]]);
  10239. let messageInbox;
  10240. function messageBox(messageBoxProps) {
  10241. renderDialog(messageBoxVue, {
  10242. message: messageBoxProps.message,
  10243. title: messageBoxProps.title,
  10244. type: messageBoxProps.type,
  10245. embedded: messageBoxProps.embedded,
  10246. buttons: messageBoxProps.buttons
  10247. }, {
  10248. forced: messageBoxProps.type === "forceTrueFalse"
  10249. });
  10250. return new Promise((resolve) => {
  10251. const interval = setInterval(() => {
  10252. const inbox = getMessageInbox();
  10253. if (inbox) {
  10254. clearInterval(interval);
  10255. resolve(inbox);
  10256. }
  10257. }, 10);
  10258. });
  10259. }
  10260. function getMessageInbox() {
  10261. const inbox = messageInbox;
  10262. messageInbox = void 0;
  10263. return inbox;
  10264. }
  10265. function setMessageInbox(value) {
  10266. messageInbox = value;
  10267. }
  10268. marked2.marked.setOptions({});
  10269. function currentPageType() {
  10270. if (location.hostname.toLowerCase() !== "tieba.baidu.com")
  10271. return "unhandled";
  10272. const pathname = location.pathname.toLocaleLowerCase();
  10273. if (includes(["/", "/index.html"], pathname))
  10274. return "index";
  10275. if (/\/p\/\d+/.test(pathname))
  10276. return "thread";
  10277. if (pathname === "/f")
  10278. return "forum";
  10279. if (pathname === "/home/main")
  10280. return "user";
  10281. return "unhandled";
  10282. }
  10283. async function getLatestReleaseFromGitee(forceUpdate = false) {
  10284. if (latestRelease.get() && !forceUpdate) {
  10285. return latestRelease.get();
  10286. } else {
  10287. const TTL = function() {
  10288. switch (updateConfig.get().time) {
  10289. case "1h":
  10290. return 1;
  10291. case "3h":
  10292. return 3;
  10293. case "6h":
  10294. return 6;
  10295. case "never":
  10296. return -1;
  10297. }
  10298. }();
  10299. if (TTL < 0)
  10300. return;
  10301. const updateUrl = `https://gitee.com/api/v5/repos/${Owner}/${RepoName}/releases/latest/`;
  10302. const response = await fetch(updateUrl);
  10303. if (response.ok) {
  10304. const result = await response.json();
  10305. if (result.message)
  10306. return;
  10307. latestRelease.set(result, spawnOffsetTS(0, 0, 0, TTL));
  10308. return result;
  10309. } else {
  10310. return;
  10311. }
  10312. }
  10313. }
  10314. function checkUpdateAndNotify(showLatest = false) {
  10315. if (updateConfig.get().time === "never")
  10316. return;
  10317. if (!updateConfig.get().notify)
  10318. return;
  10319. if (!showUpdateToday.get())
  10320. return;
  10321. if (_GM_info.script.version === "developer-only")
  10322. return;
  10323. getLatestReleaseFromGitee().then((latestRelease2) => {
  10324. if (latestRelease2 && latestRelease2.tag_name.slice(1) !== _GM_info.script.version) {
  10325. if (ignoredTag.get() === latestRelease2.tag_name)
  10326. return;
  10327. messageBox({
  10328. title: latestRelease2.name,
  10329. message: marked2.marked(latestRelease2.body),
  10330. embedded: true,
  10331. type: "OkCancel",
  10332. buttons: [
  10333. {
  10334. title: "安装",
  10335. event() {
  10336. installFromRelease(latestRelease2);
  10337. }
  10338. },
  10339. {
  10340. title: "今日不再提醒",
  10341. event() {
  10342. showUpdateToday.set(false);
  10343. }
  10344. },
  10345. {
  10346. title: "跳过该版本",
  10347. event() {
  10348. ignoredTag.set(latestRelease2.tag_name);
  10349. }
  10350. }
  10351. ]
  10352. });
  10353. } else {
  10354. if (showLatest)
  10355. messageBox({
  10356. title: "检查更新",
  10357. message: "当前已是最新版本",
  10358. type: "OkCancel"
  10359. });
  10360. }
  10361. });
  10362. }
  10363. function installFromRelease(release) {
  10364. function notFound() {
  10365. toast({
  10366. message: "安装失败:未找到可用的资源",
  10367. type: "error",
  10368. duration: 6e3,
  10369. blurEffect: true
  10370. });
  10371. }
  10372. if (!release.assets || release.assets.length <= 0) {
  10373. notFound();
  10374. return;
  10375. }
  10376. const asset = function() {
  10377. for (const asset2 of release.assets) {
  10378. if (asset2.name && asset2.name.endsWith(".user.js")) {
  10379. return asset2.browser_download_url;
  10380. }
  10381. }
  10382. }();
  10383. if (asset) {
  10384. _GM_openInTab(asset, {
  10385. active: true
  10386. });
  10387. } else {
  10388. notFound();
  10389. return;
  10390. }
  10391. }
  10392. function getResource(path) {
  10393. return `${GiteeRepo}/raw/beta/${path}`;
  10394. }
  10395. function setTheme(theme) {
  10396. switch (theme) {
  10397. case "dark":
  10398. darkTheme();
  10399. break;
  10400. case "light":
  10401. lightTheme();
  10402. break;
  10403. case "auto":
  10404. default:
  10405. darkPrefers.matches ? darkTheme() : lightTheme();
  10406. break;
  10407. }
  10408. function lightTheme() {
  10409. document.documentElement.classList.add("light-theme");
  10410. document.documentElement.classList.remove("dark-theme");
  10411. document.documentElement.classList.remove("dark");
  10412. }
  10413. function darkTheme() {
  10414. document.documentElement.classList.add("dark-theme");
  10415. document.documentElement.classList.remove("light-theme");
  10416. document.documentElement.classList.add("dark");
  10417. }
  10418. }
  10419. function backupUserConfigs() {
  10420. const excluded = ["unreadFeeds", "latestRelease", "showUpdateToday"];
  10421. const userKeys = filter(_GM_listValues(), (key) => !includes(excluded, key));
  10422. const userValues = map(userKeys, (key) => {
  10423. return _GM_getValue(key);
  10424. });
  10425. const configs = zipObject(userKeys, userValues);
  10426. outputFile(`tieba-remix-backup@${(/* @__PURE__ */ new Date()).getTime()}.json`, JSON.stringify(configs));
  10427. }
  10428. async function restoreUserConfigs() {
  10429. const backupData = JSON.parse(await selectLocalFile());
  10430. forEach(Object.entries(backupData), ([key, value]) => {
  10431. _GM_setValue(key, value);
  10432. });
  10433. }
  10434. function parseUserModules(glob, callbackfn) {
  10435. const modules2 = [];
  10436. forEach(glob, async (moduleExport) => {
  10437. const currentModule = (await moduleExport()).default;
  10438. const disabledSet = new Set(disabledModules.get());
  10439. const runnable = (() => {
  10440. if (currentModule.switch || currentModule.switch === void 0) {
  10441. if (disabledSet.has(currentModule.id)) {
  10442. return false;
  10443. }
  10444. if (currentModule.scope === true) {
  10445. return true;
  10446. }
  10447. if (Array.isArray(currentModule.scope)) {
  10448. for (let i = 0; i < currentModule.scope.length; i++) {
  10449. const scope = currentModule.scope[i];
  10450. if (currentPageType() === scope) {
  10451. return true;
  10452. }
  10453. }
  10454. }
  10455. if (currentModule.scope instanceof RegExp) {
  10456. if (currentModule.scope.test(location.href)) {
  10457. return true;
  10458. }
  10459. }
  10460. }
  10461. return false;
  10462. })();
  10463. const runModule = {
  10464. "immediately": () => {
  10465. currentModule.entry();
  10466. },
  10467. "afterHead": () => {
  10468. afterHead(() => {
  10469. currentModule.entry();
  10470. });
  10471. },
  10472. "DOMLoaded": () => {
  10473. document.addEventListener("DOMContentLoaded", () => {
  10474. currentModule.entry();
  10475. });
  10476. },
  10477. "loaded": () => {
  10478. window.addEventListener("load", () => {
  10479. currentModule.entry();
  10480. });
  10481. }
  10482. };
  10483. currentModule.runnable = runnable;
  10484. if (runnable) {
  10485. runModule[currentModule.runAt]();
  10486. }
  10487. modules2.push(currentModule);
  10488. if (callbackfn)
  10489. callbackfn(currentModule);
  10490. });
  10491. return modules2;
  10492. }
  10493. const tiebaAPI = {
  10494. /** 首页推荐 */
  10495. feedlist: () => fetch(`/f/index/feedlist?${requestBody({
  10496. "is_new": 1,
  10497. "tag_id": "like"
  10498. })}`),
  10499. /** 用户头像 */
  10500. URL_profile: (portrait) => `https://gss0.baidu.com/7Ls0a8Sm2Q5IlBGlnYG/sys/portrait/item/${portrait}`,
  10501. /** 当前登录(不可用)用户信息 */
  10502. userInfo: (serverTime) => fetch(`/f/user/json_userinfo?${requestBody({
  10503. "_": serverTime
  10504. })}`),
  10505. /** 用户主页 */
  10506. URL_userHome: (portrait) => `/home/main?id=${portrait}&fr=index`,
  10507. /** 搜索建议 */
  10508. suggestions: (query, encoding = "UTF-8", serverTime) => fetch(`/suggestion?${requestBody({
  10509. "query": query,
  10510. "ie": encoding,
  10511. "_": serverTime
  10512. })}`),
  10513. /** 贴吧热议 */
  10514. topicList: () => fetch("/hottopic/browse/topicList"),
  10515. /** 吧跳转 */
  10516. URL_forum: (keywords, encoding = "utf-8") => `/f?ie=${encoding}&kw=${keywords}`,
  10517. /** 未读消息 */
  10518. unreadMessages: (serverTime) => fetch(`/im/pcmsg/query/getAllUnread?${requestBody({
  10519. "_": serverTime
  10520. })}`),
  10521. /** 收藏更新 */
  10522. favUpdateNum: () => fetch("/sysmsg/userpost/queryStoreUpdateNum"),
  10523. /** 获取 tbs */
  10524. tbs: () => fetch("/dc/common/tbs"),
  10525. /** imgtbs */
  10526. imgtbs: () => fetch("/dc/common/imgtbs"),
  10527. /** 获取已关注的吧 */
  10528. followedForums: () => fetch("/mo/q/newmoindex"),
  10529. /** 更详细的用户信息 */
  10530. userInfoAll: (un, encoding = "UTF-8") => fetch(`/home/get/panel?${requestBody({
  10531. "ie": encoding,
  10532. "un": un
  10533. })}`),
  10534. /** 关注吧 */
  10535. followForum: (tbs, forumId, forumName) => fetch(`/mo/q/favolike?${requestBody({
  10536. "itb_tbs": tbs,
  10537. "fid": forumId,
  10538. "kw": forumName
  10539. })}`),
  10540. /** 取消关注吧 */
  10541. unfollowForum: (tbs, forumName) => fetch(`/mo/q/delmylike?${requestBody({
  10542. "itb_tbs": tbs,
  10543. "forum_name": forumName
  10544. })}`),
  10545. /** 通过 `uid` 查找用户 */
  10546. getUserFromUID: (uid) => fetch(`/im/pcmsg/query/getUserInfo?${requestBody({
  10547. "chatUid": uid
  10548. })}`),
  10549. /** 一键签到(Web 端) */
  10550. oneKeySign: () => fetch("/tbmall/onekeySignin1"),
  10551. /** 热门动态 */
  10552. hotFeeds: (un, pn, encoding = "utf-8", serverTime) => fetch(`/mo/q/newmoindex?${requestBody({
  10553. "un": un,
  10554. "pn": pn,
  10555. "ie": encoding,
  10556. "_": serverTime
  10557. })}`),
  10558. /** 获取当前页所有楼中楼数据 */
  10559. totalComments: (timeStamp, tid, fid, pn, lzOnly = false) => fetch(`/p/totalComment?${requestBody({
  10560. "t": timeStamp,
  10561. "tid": tid,
  10562. "fid": fid,
  10563. "pn": pn,
  10564. "see_lz": Number(lzOnly)
  10565. })}`),
  10566. /** 获取热门话题相关贴 */
  10567. topicRelatedThreads: (topicName, page, lastId, topicId, sortType = 1) => fetch(`/hottopic/browse/getTopicRelateThread?${requestBody({
  10568. "topic_name": topicName,
  10569. "page_no": page,
  10570. "last_id": lastId,
  10571. "topic_id": topicId,
  10572. "sort_type": sortType
  10573. })}`),
  10574. /** 将贴子添加到收藏 */
  10575. addFavoritePost: (tbs, tid, fid, encoding = "utf-8") => fetch("/i/submit/open_storethread", {
  10576. method: "POST",
  10577. body: JSON.stringify({ tbs, tid, fid, encoding })
  10578. }),
  10579. forumSignInfo: (forumName, encoding = "utf-8") => fetch(`/sign/info?${requestBody({
  10580. "kw": forumName,
  10581. "ie": encoding
  10582. })}`),
  10583. forumLoadMonth: (forumName, encoding = "utf-8") => fetch(`/sign/loadmonth?${requestBody({
  10584. "kw": forumName,
  10585. "ie": encoding
  10586. })}`),
  10587. addFloor: (tbs, forum, forumId, threadId, content, floorNum, richText, ev = "comment", __type__ = "reply") => fetch("/f/commit/post/add", {
  10588. method: "POST",
  10589. body: JSON.stringify({
  10590. "ie": "utf-8",
  10591. "kw": forum,
  10592. "fid": forumId,
  10593. "tid": threadId,
  10594. "floor_num": floorNum,
  10595. "rich_text": Number(richText),
  10596. "tbs": tbs,
  10597. "content": content,
  10598. "basilisk": 1,
  10599. "nick_name": PageData.user.user_nickname,
  10600. "ev": ev,
  10601. "biz[po]": PageData.user.portrait.split("?")[0],
  10602. "__type__": __type__,
  10603. "geetest_success": 0
  10604. })
  10605. })
  10606. };
  10607. function parsePostFromElement(elem) {
  10608. const titleTagWrapperAnch = DOMS(".title-tag-wraper a", "a", elem)[0];
  10609. const threadNameWrapper = elem.getElementsByClassName("thread-name-wraper")[0];
  10610. const threadNameWrapperAnch = threadNameWrapper.getElementsByTagName("a")[0];
  10611. const listPostNum = DOMS(".list-post-num em", threadNameWrapper)[0];
  10612. const imgs = DOMS("img:not(.nicknameEmoji)", "img", elem);
  10613. const nReply = elem.getElementsByClassName("n_reply")[0];
  10614. const nReplyAnch = nReply.getElementsByTagName("a")[0];
  10615. const imgArray = [];
  10616. if (imgs.length > 0) {
  10617. forEach(imgs, (img) => {
  10618. imgArray.push({
  10619. thumb: img.src,
  10620. original: defaultTo(img.getAttribute("original"), "")
  10621. });
  10622. });
  10623. }
  10624. return {
  10625. id: defaultTo(elem.getAttribute("data-thread-id"), ""),
  10626. forum: {
  10627. id: defaultTo(elem.getAttribute("data-forum-id"), ""),
  10628. name: titleTagWrapperAnch.title,
  10629. href: titleTagWrapperAnch.href
  10630. },
  10631. author: {
  10632. portrait: split(nReplyAnch.href, /(\?id=)|&/)[2],
  10633. name: transEmojiFromDOMString(nReplyAnch.innerHTML),
  10634. href: nReplyAnch.href
  10635. },
  10636. time: defaultTo(elem.getElementsByClassName("time")[0].textContent, ""),
  10637. title: threadNameWrapperAnch.title,
  10638. content: defaultTo(elem.getElementsByClassName("n_txt")[0].textContent, ""),
  10639. replies: defaultTo(listPostNum.getAttribute("data-num"), 0),
  10640. images: imgArray
  10641. };
  10642. }
  10643. function parsePostsFromString(responseString, callbackfn) {
  10644. const feedList = [];
  10645. const dom = new DOMParser().parseFromString(responseString, "text/html");
  10646. const threads = dom.getElementsByClassName("j_feed_li");
  10647. const undesired = "home-place-item";
  10648. forEach(threads, (thread2) => {
  10649. if (thread2.classList.contains(undesired))
  10650. return;
  10651. const post = parsePostFromElement(thread2);
  10652. if (callbackfn)
  10653. callbackfn(post);
  10654. feedList.push(post);
  10655. });
  10656. return feedList;
  10657. }
  10658. function transEmojiFromDOMString(str) {
  10659. const indexRegex = new RegExp("(?<=nickemoji\\/).*?(?=.png)", "gi");
  10660. if (!str.match(indexRegex))
  10661. return str;
  10662. const emojis = [
  10663. "º",
  10664. "◎",
  10665. "▫",
  10666. "◆",
  10667. "♤",
  10668. "♀",
  10669. "♂",
  10670. "ლ",
  10671. "♬",
  10672. "☞",
  10673. "☜",
  10674. "✆",
  10675. "☎",
  10676. "♋",
  10677. "Ω",
  10678. "℃",
  10679. "℉",
  10680. "😄",
  10681. "😍",
  10682. "😘",
  10683. "😚",
  10684. "😜",
  10685. "😳",
  10686. "😁",
  10687. "😞",
  10688. "😢",
  10689. "😂",
  10690. "😫",
  10691. "😨",
  10692. "😱",
  10693. "😡",
  10694. "😷",
  10695. "😲",
  10696. "😈",
  10697. "🐷",
  10698. "🐶",
  10699. "🐑",
  10700. "🐵",
  10701. "🐨",
  10702. "🐴",
  10703. "🐼",
  10704. "🐯",
  10705. "🍪",
  10706. "🍺",
  10707. "🍦",
  10708. "🍭",
  10709. "🍗",
  10710. "🍼",
  10711. "🔯",
  10712. "🍒",
  10713. "👀",
  10714. "🐭",
  10715. "😇",
  10716. "😺",
  10717. "😻",
  10718. "🙀",
  10719. "😿",
  10720. "😹",
  10721. "😾",
  10722. "👹",
  10723. "👺",
  10724. "🌞",
  10725. "🌝",
  10726. "🌚",
  10727. "🌜",
  10728. "🌛",
  10729. "👦",
  10730. "👧",
  10731. "🎎",
  10732. "🌸",
  10733. "🍀",
  10734. "🌹",
  10735. "🌻",
  10736. "🌺",
  10737. "🍁",
  10738. "🌿",
  10739. "🍄",
  10740. "🌵",
  10741. "🌴",
  10742. "🌳",
  10743. "🌰",
  10744. "🌱",
  10745. "🌼",
  10746. "🌐",
  10747. "🌙",
  10748. "🌋",
  10749. "🌌",
  10750. "⛅",
  10751. "⚡",
  10752. "☔",
  10753. "⛄",
  10754. "🌀",
  10755. "🌈",
  10756. "🌊",
  10757. "🔥",
  10758. "✨",
  10759. "🌟",
  10760. "💥",
  10761. "💫",
  10762. "💢",
  10763. "💦",
  10764. "💧",
  10765. "💤",
  10766. "💨",
  10767. "🎀",
  10768. "🌂",
  10769. "💄",
  10770. "💕",
  10771. "💖",
  10772. "💞",
  10773. "💘",
  10774. "💌",
  10775. "💋",
  10776. "💝",
  10777. "🎒",
  10778. "🎓",
  10779. "🎏",
  10780. "🎃",
  10781. "👻",
  10782. "🎅",
  10783. "🎄",
  10784. "🎁",
  10785. "🙈",
  10786. "🐒",
  10787. "💯",
  10788. "👯",
  10789. "💍"
  10790. ];
  10791. const transformed = [
  10792. "1-1.png",
  10793. "1-2.png",
  10794. "1-4.png",
  10795. "1-5.png",
  10796. "1-6.png",
  10797. "1-7.png",
  10798. "1-8.png",
  10799. "1-9.png",
  10800. "1-10.png",
  10801. "1-11.png",
  10802. "1-12.png",
  10803. "1-13.png",
  10804. "1-14.png",
  10805. "1-15.png",
  10806. "1-16.png",
  10807. "1-17.png",
  10808. "1-18.png",
  10809. "1-19.png",
  10810. "1-20.png",
  10811. "1-21.png",
  10812. "1-22.png",
  10813. "1-23.png",
  10814. "1-24.png",
  10815. "1-25.png",
  10816. "1-26.png",
  10817. "1-27.png",
  10818. "1-28.png",
  10819. "1-29.png",
  10820. "1-30.png",
  10821. "1-31.png",
  10822. "1-32.png",
  10823. "1-33.png",
  10824. "1-34.png",
  10825. "1-35.png",
  10826. "2-1.png",
  10827. "2-2.png",
  10828. "2-3.png",
  10829. "2-4.png",
  10830. "2-5.png",
  10831. "2-6.png",
  10832. "2-7.png",
  10833. "2-8.png",
  10834. "2-9.png",
  10835. "2-10.png",
  10836. "2-11.png",
  10837. "2-12.png",
  10838. "2-13.png",
  10839. "2-14.png",
  10840. "2-15.png",
  10841. "2-16.png",
  10842. "2-17.png",
  10843. "2-18.png",
  10844. "2-19.png",
  10845. "2-20.png",
  10846. "2-21.png",
  10847. "2-22.png",
  10848. "2-23.png",
  10849. "2-24.png",
  10850. "2-25.png",
  10851. "2-26.png",
  10852. "2-27.png",
  10853. "2-28.png",
  10854. "2-29.png",
  10855. "2-30.png",
  10856. "2-31.png",
  10857. "2-32.png",
  10858. "2-33.png",
  10859. "2-34.png",
  10860. "2-35.png",
  10861. "3-1.png",
  10862. "3-2.png",
  10863. "3-3.png",
  10864. "3-4.png",
  10865. "3-5.png",
  10866. "3-6.png",
  10867. "3-7.png",
  10868. "3-8.png",
  10869. "3-9.png",
  10870. "3-10.png",
  10871. "3-11.png",
  10872. "3-12.png",
  10873. "3-13.png",
  10874. "3-14.png",
  10875. "3-15.png",
  10876. "3-16.png",
  10877. "3-17.png",
  10878. "3-18.png",
  10879. "3-19.png",
  10880. "3-20.png",
  10881. "3-21.png",
  10882. "3-22.png",
  10883. "3-23.png",
  10884. "3-24.png",
  10885. "3-25.png",
  10886. "3-26.png",
  10887. "3-27.png",
  10888. "3-28.png",
  10889. "3-29.png",
  10890. "3-30.png",
  10891. "3-31.png",
  10892. "3-32.png",
  10893. "3-33.png",
  10894. "3-34.png",
  10895. "3-35.png",
  10896. "4-1.png",
  10897. "4-2.png",
  10898. "4-3.png",
  10899. "4-4.png",
  10900. "4-5.png",
  10901. "4-6.png",
  10902. "4-7.png",
  10903. "4-8.png",
  10904. "4-9.png",
  10905. "4-10.png",
  10906. "4-11.png",
  10907. "4-12.png",
  10908. "4-13.png",
  10909. "4-14.png",
  10910. "4-15.png",
  10911. "4-16.png",
  10912. "4-17.png",
  10913. "4-18.png",
  10914. "4-19.png",
  10915. "4-20.png",
  10916. "4-21.png",
  10917. "4-22.png",
  10918. "4-23.png"
  10919. ];
  10920. const arrIndex = str.match(indexRegex);
  10921. arrIndex == null ? void 0 : arrIndex.forEach((index2) => {
  10922. const emoji = emojis[transformed.indexOf(`${index2}.png`)];
  10923. const arrInner = split(str, RegExp(
  10924. `<img[^>]*?${index2}.png(?:[^>]*?)*>`,
  10925. "g"
  10926. ));
  10927. str = join(arrInner, decodeURIComponent(emoji));
  10928. });
  10929. return str;
  10930. }
  10931. function levelToClass(level) {
  10932. if (level < 0)
  10933. return;
  10934. if (level >= 1 && level <= 3)
  10935. return "green";
  10936. if (level >= 4 && level <= 9)
  10937. return "blue";
  10938. if (level >= 9 && level <= 15)
  10939. return "yellow";
  10940. if (level >= 16)
  10941. return "orange";
  10942. }
  10943. const _sfc_main$i = {};
  10944. const _hoisted_1$e = { class: "block-panel blur-if-custom-background" };
  10945. function _sfc_render(_ctx, _cache) {
  10946. return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$e, [
  10947. vue.renderSlot(_ctx.$slots, "default")
  10948. ]);
  10949. }
  10950. const BlockPanel = /* @__PURE__ */ _export_sfc(_sfc_main$i, [["render", _sfc_render]]);
  10951. /**
  10952. * Flex Masonry
  10953. * @author @HacksawBlade
  10954. * @version 1.1
  10955. * @license MIT
  10956. */
  10957. class FlexMasonry {
  10958. constructor(options) {
  10959. __publicField(this, "container");
  10960. __publicField(this, "items");
  10961. __publicField(this, "columnContainers", []);
  10962. __publicField(this, "columnWidth");
  10963. __publicField(this, "gap");
  10964. __publicField(this, "options");
  10965. __publicField(this, "containerSelector");
  10966. __publicField(this, "itemsSelector");
  10967. __publicField(this, "columnSelector", ".masonry-column");
  10968. __publicField(this, "columnsHeight", []);
  10969. __publicField(this, "fragment");
  10970. /** 当前布局的列数 */
  10971. __publicField(this, "_columns");
  10972. options = parseOptions(options);
  10973. this.container = (() => {
  10974. if (typeof options.container === "string") {
  10975. this.containerSelector = options.container;
  10976. const _container = document.querySelector(options.container);
  10977. if (_container) {
  10978. return _container;
  10979. } else {
  10980. throw new Error("Can't find container element.");
  10981. }
  10982. } else {
  10983. return options.container;
  10984. }
  10985. })();
  10986. if (options.items) {
  10987. this.items = (() => {
  10988. if (typeof options.items === "string") {
  10989. this.itemsSelector = options.items;
  10990. const _items = document.querySelectorAll(options.items);
  10991. if (_items) {
  10992. return Array.from(_items);
  10993. } else {
  10994. return [];
  10995. }
  10996. } else {
  10997. return options.items;
  10998. }
  10999. })().map((el) => {
  11000. el.style.visibility = "hidden";
  11001. return { element: el, cachedHeight: el.clientHeight };
  11002. });
  11003. } else {
  11004. this.items = [];
  11005. }
  11006. this.columnWidth = options.columnWidth;
  11007. if (options.gap) {
  11008. if (Array.isArray(options.gap)) {
  11009. this.gap = options.gap;
  11010. } else {
  11011. this.gap = [options.gap, options.gap];
  11012. }
  11013. } else {
  11014. this.gap = [0, 0];
  11015. }
  11016. this._columns = 0;
  11017. this.options = options;
  11018. this.initStyle();
  11019. if (options.autoExec)
  11020. this.exec();
  11021. }
  11022. initStyle() {
  11023. this.container.style.display = "flex";
  11024. this.container.style.alignItems = "flex-start";
  11025. this.container.style.justifyContent = "center";
  11026. this.container.style.gap = `${this.gap[0]}px`;
  11027. }
  11028. get columns() {
  11029. return this._columns;
  11030. }
  11031. /** 执行布局 */
  11032. exec() {
  11033. this.calcColumns();
  11034. const originalPosition = window.scrollY;
  11035. this.calc();
  11036. this.layout();
  11037. if (this.options.fixScrollOffset)
  11038. window.scrollTo(0, originalPosition);
  11039. }
  11040. adjustWidth() {
  11041. const elColumns = this.container.querySelectorAll(this.columnSelector);
  11042. const width = (this.container.clientWidth - this.gap[0] * (this._columns - 1)) / this._columns;
  11043. elColumns.forEach((el) => {
  11044. el.style.width = `${width}px`;
  11045. });
  11046. }
  11047. /** 仅计算布局 */
  11048. calc() {
  11049. this.columnsHeight = Array(this.calcColumns()).fill(0);
  11050. const fragment = document.createDocumentFragment();
  11051. const _col = this.container.querySelectorAll(this.columnSelector);
  11052. _col.forEach((col) => {
  11053. col.remove();
  11054. });
  11055. this.columnContainers.length = 0;
  11056. for (let i = 0; i < this._columns; i++) {
  11057. this.columnContainers.push(
  11058. fragment.appendChild(createNewElement("div", {
  11059. class: this.columnSelector.substring(1),
  11060. style: `width: ${(this.container.clientWidth - this.gap[0] * (this._columns - 1)) / this._columns}px;`
  11061. }))
  11062. );
  11063. }
  11064. this.columnContainers.forEach((ccontainer) => {
  11065. ccontainer.style.display = "flex";
  11066. ccontainer.style.flexDirection = "column";
  11067. ccontainer.style.gap = `${this.gap[1]}px`;
  11068. });
  11069. this.items.forEach((el) => {
  11070. this._appendElement(el);
  11071. });
  11072. this.fragment = fragment;
  11073. }
  11074. /**
  11075. * 仅应用布局
  11076. *
  11077. * 调用该函数前需要已经至少计算过一次布局
  11078. */
  11079. layout() {
  11080. if (this.fragment) {
  11081. this.container.appendChild(this.fragment);
  11082. } else {
  11083. throw Error("Never conducted layout calculations before. You should use exec() or calc() first.");
  11084. }
  11085. }
  11086. removeUnusedColumns() {
  11087. const _col = this.container.querySelectorAll(this.columnSelector);
  11088. _col.forEach((col) => {
  11089. if (col.children.length === 0)
  11090. col.remove();
  11091. });
  11092. }
  11093. /**
  11094. * 清空布局中的所有 `items`
  11095. *
  11096. * 该操作并不会将元素从文档中移除
  11097. */
  11098. clear() {
  11099. this.items.length = 0;
  11100. this.columnsHeight = Array(this.calcColumns()).fill(0);
  11101. }
  11102. /** 仅计算当前需要的列数 */
  11103. calcColumns() {
  11104. this._columns = Math.ceil((this.container.clientWidth - this.columnWidth) / (this.columnWidth + this.gap[0]));
  11105. return this._columns;
  11106. }
  11107. /**
  11108. * 向布局中加入元素
  11109. * @param el 要添加的元素
  11110. */
  11111. appendElement(...elems) {
  11112. const masonryElements = elems.map((el) => {
  11113. return {
  11114. element: el,
  11115. cachedHeight: el.clientHeight
  11116. };
  11117. });
  11118. this._appendElement(...masonryElements);
  11119. this.items.push(...masonryElements);
  11120. }
  11121. _appendElement(...elems) {
  11122. elems.forEach((el) => {
  11123. const minIndex = this.columnsHeight.indexOf(Math.min(...this.columnsHeight));
  11124. this.columnsHeight[minIndex] += el.cachedHeight;
  11125. this.columnContainers[minIndex].appendChild(el.element);
  11126. el.element.style.visibility = "visible";
  11127. const clientHeight = this.columnContainers[minIndex].clientHeight;
  11128. if (clientHeight !== 0) {
  11129. this.columnsHeight[minIndex] = this.columnContainers[minIndex].clientHeight;
  11130. }
  11131. });
  11132. }
  11133. /**
  11134. * 在原有子项的基础上追加子项
  11135. * @param newItems 要添加的新元素,接受 CSS选择器
  11136. * @param interval 插入每个元素间的时间间隔
  11137. */
  11138. append(newItems, interval) {
  11139. const appended = (() => {
  11140. if (newItems) {
  11141. if (typeof newItems === "string") {
  11142. const _items = document.querySelectorAll(newItems);
  11143. return Array.from(_items);
  11144. } else {
  11145. return newItems;
  11146. }
  11147. } else {
  11148. if (this.itemsSelector) {
  11149. const _items = Array.from(document.querySelectorAll(this.itemsSelector));
  11150. const appendCount = _items.length - this.items.length;
  11151. if (appendCount > 0) {
  11152. const _appended = _items.slice(-appendCount);
  11153. return _appended;
  11154. }
  11155. }
  11156. }
  11157. })();
  11158. if (appended) {
  11159. if (!interval || interval <= 0) {
  11160. appended.forEach((el) => {
  11161. this.appendElement(el);
  11162. });
  11163. } else {
  11164. appended.forEach((el, index2) => {
  11165. setTimeout(() => {
  11166. this.appendElement(el);
  11167. }, interval * index2);
  11168. });
  11169. }
  11170. }
  11171. }
  11172. refreshContainer() {
  11173. if (this.containerSelector) {
  11174. const newContainer = document.querySelector(this.containerSelector);
  11175. if (newContainer) {
  11176. this.container = newContainer;
  11177. }
  11178. }
  11179. }
  11180. }
  11181. function parseOptions(options) {
  11182. options.gap = options.gap || 0;
  11183. options.autoExec = options.autoExec === void 0 ? true : options.autoExec;
  11184. options.fixScrollOffset = options.fixScrollOffset === void 0 ? false : options.fixScrollOffset;
  11185. return options;
  11186. }
  11187. function createNewElement(tag, attrs) {
  11188. const el = document.createElement(tag);
  11189. for (const key in attrs) {
  11190. el.setAttribute(key, attrs[key]);
  11191. }
  11192. return el;
  11193. }
  11194. class FrameInterval {
  11195. constructor(callback) {
  11196. __publicField(this, "id");
  11197. __publicField(this, "callback");
  11198. __publicField(this, "thenfn", () => void 0);
  11199. __publicField(this, "stopCondition");
  11200. this.callback = callback ?? (() => void 0);
  11201. this.stopCondition = () => false;
  11202. this.id = requestAnimationFrame(this.tick.bind(this));
  11203. }
  11204. tick() {
  11205. if (this.stopCondition()) {
  11206. this.cancel();
  11207. return;
  11208. }
  11209. this.callback();
  11210. this.id = requestAnimationFrame(this.tick.bind(this));
  11211. }
  11212. cancel() {
  11213. if (this.id) {
  11214. cancelAnimationFrame(this.id);
  11215. this.id = void 0;
  11216. }
  11217. this.thenfn();
  11218. }
  11219. until(stopCondition) {
  11220. this.stopCondition = stopCondition;
  11221. return this;
  11222. }
  11223. then(thenfn) {
  11224. this.thenfn = thenfn;
  11225. }
  11226. }
  11227. const _sfc_main$h = /* @__PURE__ */ vue.defineComponent({
  11228. __name: "header-progress",
  11229. props: {
  11230. calc: { type: Function }
  11231. },
  11232. setup(__props) {
  11233. const props = __props;
  11234. const headerProgress2 = vue.ref();
  11235. const valueRef = vue.ref(0);
  11236. vue.onMounted(function() {
  11237. if (headerProgress2.value) {
  11238. new FrameInterval(calcValue).until(() => valueRef.value >= 100);
  11239. }
  11240. });
  11241. function calcValue() {
  11242. valueRef.value = props.calc();
  11243. }
  11244. return (_ctx, _cache) => {
  11245. return vue.openBlock(), vue.createElementBlock("div", {
  11246. ref_key: "headerProgress",
  11247. ref: headerProgress2,
  11248. id: "header-progress",
  11249. class: vue.normalizeClass({ "complete": valueRef.value >= 100 }),
  11250. style: vue.normalizeStyle(`width: ${valueRef.value}vw;`)
  11251. }, null, 6);
  11252. };
  11253. }
  11254. });
  11255. const HeaderProgress = /* @__PURE__ */ _export_sfc(_sfc_main$h, [["__scopeId", "data-v-bedddce2"]]);
  11256. const TOGGLE_ON_CLASS = "toggle-on";
  11257. const TOGGLE_OFF_CLASS = "toggle-off";
  11258. const _sfc_main$g = /* @__PURE__ */ vue.defineComponent({
  11259. __name: "toggle-button",
  11260. props: {
  11261. "modelValue": { type: Boolean, ...{
  11262. required: true,
  11263. default: false
  11264. } },
  11265. "modelModifiers": {}
  11266. },
  11267. emits: ["update:modelValue"],
  11268. setup(__props) {
  11269. const model = vue.useModel(__props, "modelValue");
  11270. const toggleClass = vue.computed(() => {
  11271. return model.value ? TOGGLE_ON_CLASS : TOGGLE_OFF_CLASS;
  11272. });
  11273. function toggle() {
  11274. model.value = !model.value;
  11275. }
  11276. return (_ctx, _cache) => {
  11277. return vue.openBlock(), vue.createBlock(_sfc_main$m, {
  11278. class: vue.normalizeClass(["toggle-button", toggleClass.value]),
  11279. onClick: toggle
  11280. }, {
  11281. default: vue.withCtx(() => [
  11282. vue.renderSlot(_ctx.$slots, "default", {}, void 0, true)
  11283. ]),
  11284. _: 3
  11285. }, 8, ["class"]);
  11286. };
  11287. }
  11288. });
  11289. const ToggleButton = /* @__PURE__ */ _export_sfc(_sfc_main$g, [["__scopeId", "data-v-6728dba5"]]);
  11290. const _withScopeId$8 = (n) => (vue.pushScopeId("data-v-b1e43839"), n = n(), vue.popScopeId(), n);
  11291. const _hoisted_1$d = { class: "image-container dialog-toggle" };
  11292. const _hoisted_2$d = ["src"];
  11293. const _hoisted_3$c = /* @__PURE__ */ _withScopeId$8(() => /* @__PURE__ */ vue.createElementVNode("span", null, "|", -1));
  11294. const _hoisted_4$b = { class: "zoom-size" };
  11295. const _hoisted_5$a = /* @__PURE__ */ _withScopeId$8(() => /* @__PURE__ */ vue.createElementVNode("span", null, "|", -1));
  11296. const _hoisted_6$7 = /* @__PURE__ */ _withScopeId$8(() => /* @__PURE__ */ vue.createElementVNode("span", null, "|", -1));
  11297. const _hoisted_7$7 = ["src", "onClick"];
  11298. const MIN_SIZE = 0.1;
  11299. const MAX_SIZE = 8;
  11300. const VLI_THRESHOLD = 5;
  11301. const VLI_WIDTH_SCALE = 2;
  11302. const _sfc_main$f = /* @__PURE__ */ vue.defineComponent({
  11303. __name: "images-viewer",
  11304. props: {
  11305. content: {},
  11306. defaultIndex: { default: 0 }
  11307. },
  11308. emits: ["RequestClose"],
  11309. setup(__props, { emit: __emit }) {
  11310. vue.useCssVars((_ctx) => ({
  11311. "487af7f1": imageTransition.value
  11312. }));
  11313. const props = __props;
  11314. const imageArray = [];
  11315. if (typeof props.content === "string") {
  11316. imageArray.push(props.content);
  11317. } else if (Array.isArray(props.content)) {
  11318. imageArray.push(...props.content);
  11319. } else {
  11320. map(props.content.images, (value) => {
  11321. imageArray.push(value.original);
  11322. });
  11323. }
  11324. const emit = __emit;
  11325. const imageViewer = vue.ref();
  11326. const currImage = vue.ref();
  11327. const curr = vue.ref(props.defaultIndex);
  11328. const scale = vue.ref(1);
  11329. const deg = vue.ref(0);
  11330. const imageLeft = vue.ref(void 0);
  11331. const imageTop = vue.ref(void 0);
  11332. const showControls = vue.ref(true);
  11333. const vliMode = vue.ref(false);
  11334. const imageStyle = vue.computed(() => {
  11335. return {
  11336. transform: `scale(${scale.value}) rotate(${deg.value}deg)`,
  11337. left: `${imageLeft.value}px`,
  11338. top: `${imageTop.value}px`
  11339. };
  11340. });
  11341. const imageTransition = vue.computed(function() {
  11342. return vliMode.value ? "all 0.4s ease, left 0s, top 0.1s ease-out" : "all 0.4s ease, left 0s, top 0s";
  11343. });
  11344. const imageProps = {
  11345. naturalHeight: 0,
  11346. scaledHeight: 0,
  11347. vliMaxTop: 0,
  11348. vliMinTop: 0
  11349. };
  11350. vue.onMounted(() => {
  11351. var _a, _b, _c;
  11352. let offsetX = 0, offsetY = 0;
  11353. (_a = currImage.value) == null ? void 0 : _a.addEventListener("mousedown", (e) => {
  11354. if (!currImage.value)
  11355. return;
  11356. e.preventDefault();
  11357. if (vliMode.value)
  11358. return;
  11359. offsetX = e.clientX - currImage.value.offsetLeft;
  11360. offsetY = e.clientY - currImage.value.offsetTop;
  11361. document.addEventListener("mousemove", moveHandler);
  11362. });
  11363. document.addEventListener("mouseup", (e) => {
  11364. e.preventDefault();
  11365. document.removeEventListener("mousemove", moveHandler);
  11366. });
  11367. (_b = currImage.value) == null ? void 0 : _b.addEventListener("load", function() {
  11368. if (!currImage.value)
  11369. return;
  11370. vliMode.value = false;
  11371. (() => {
  11372. if (currImage.value.naturalHeight < window.innerHeight && currImage.value.naturalWidth < window.innerWidth) {
  11373. scale.value = 1;
  11374. return;
  11375. }
  11376. if (currImage.value.naturalHeight / currImage.value.naturalWidth >= VLI_THRESHOLD) {
  11377. vliMode.value = true;
  11378. scale.value = window.innerWidth / VLI_WIDTH_SCALE / currImage.value.naturalWidth;
  11379. imageLeft.value = void 0;
  11380. return;
  11381. }
  11382. vliMode.value = false;
  11383. scale.value = Math.min(
  11384. window.innerWidth / currImage.value.naturalWidth,
  11385. window.innerHeight / currImage.value.naturalHeight
  11386. );
  11387. })();
  11388. imageProps.naturalHeight = currImage.value.naturalHeight;
  11389. imageProps.scaledHeight = imageProps.naturalHeight * scale.value;
  11390. imageProps.vliMaxTop = -(imageProps.naturalHeight * (1 - scale.value) / 2) + window.innerHeight / 2;
  11391. imageProps.vliMinTop = -imageProps.scaledHeight - imageProps.naturalHeight * (1 - scale.value) / 2 + window.innerHeight / 2;
  11392. currImage.value.classList.remove("changing");
  11393. });
  11394. (_c = currImage.value) == null ? void 0 : _c.addEventListener("transitionend", function() {
  11395. var _a2, _b2, _c2;
  11396. if (Math.abs(deg.value) >= 360) {
  11397. (_a2 = currImage.value) == null ? void 0 : _a2.classList.add("changing");
  11398. deg.value = Math.abs(deg.value) % 360;
  11399. (_b2 = currImage.value) == null ? void 0 : _b2.offsetHeight;
  11400. (_c2 = currImage.value) == null ? void 0 : _c2.classList.remove("changing");
  11401. }
  11402. });
  11403. function moveHandler(e) {
  11404. if (!currImage.value)
  11405. return;
  11406. imageLeft.value = e.clientX - offsetX;
  11407. imageTop.value = e.clientY - offsetY;
  11408. }
  11409. });
  11410. vue.watch(curr, function() {
  11411. var _a;
  11412. (_a = currImage.value) == null ? void 0 : _a.classList.add("changing");
  11413. deg.value = 0;
  11414. imageLeft.value = void 0;
  11415. imageTop.value = void 0;
  11416. });
  11417. vue.watch(imageTop, function(newTop) {
  11418. if (vliMode.value) {
  11419. if (!currImage.value || !imageTop.value || !newTop)
  11420. return;
  11421. if (newTop > imageProps.vliMaxTop) {
  11422. imageTop.value = imageProps.vliMaxTop;
  11423. }
  11424. if (newTop < imageProps.vliMinTop) {
  11425. imageTop.value = imageProps.vliMinTop;
  11426. }
  11427. }
  11428. });
  11429. vue.watch(vliMode, function(newMode) {
  11430. if (newMode && currImage.value && !imageTop.value) {
  11431. imageTop.value = Math.max(
  11432. imageProps.vliMinTop,
  11433. -(currImage.value.naturalHeight * (1 - scale.value) / 2)
  11434. );
  11435. }
  11436. });
  11437. function unload() {
  11438. emit("RequestClose");
  11439. unloadDialog();
  11440. }
  11441. function listBack() {
  11442. if (curr.value > 0)
  11443. curr.value--;
  11444. }
  11445. function listForward() {
  11446. if (curr.value < imageArray.length - 1)
  11447. curr.value++;
  11448. }
  11449. function zoomImage(delta) {
  11450. scale.value += delta;
  11451. if (scale.value < MIN_SIZE) {
  11452. scale.value = MIN_SIZE;
  11453. }
  11454. if (scale.value > MAX_SIZE) {
  11455. scale.value = MAX_SIZE;
  11456. }
  11457. }
  11458. function rotateImage(delta) {
  11459. deg.value += delta;
  11460. }
  11461. function imageWheel(event) {
  11462. event.preventDefault();
  11463. if (!currImage.value)
  11464. return;
  11465. if (!vliMode.value) {
  11466. zoomImage(-event.deltaY / 1e3);
  11467. showControls.value = event.deltaY > 0;
  11468. } else {
  11469. if (!imageTop.value)
  11470. imageTop.value = 0;
  11471. imageTop.value += -event.deltaY / 1e3 * window.innerHeight;
  11472. showControls.value = event.deltaY < 0;
  11473. }
  11474. }
  11475. return (_ctx, _cache) => {
  11476. return vue.openBlock(), vue.createElementBlock("div", {
  11477. ref_key: "imageViewer",
  11478. ref: imageViewer,
  11479. class: "images-viewer dialog-toggle",
  11480. onWheel: imageWheel
  11481. }, [
  11482. vue.createElementVNode("div", _hoisted_1$d, [
  11483. vue.createElementVNode("img", {
  11484. ref_key: "currImage",
  11485. ref: currImage,
  11486. class: "curr-image changing",
  11487. src: imageArray[curr.value],
  11488. style: vue.normalizeStyle(vue.unref(parseCSSRule)(imageStyle.value))
  11489. }, null, 12, _hoisted_2$d)
  11490. ]),
  11491. vue.createElementVNode("div", {
  11492. class: vue.normalizeClass(["control-panel head-controls", { "hide": !showControls.value }])
  11493. }, [
  11494. vue.createVNode(ToggleButton, {
  11495. class: "vli-mode head-btn icon",
  11496. title: "长图模式",
  11497. modelValue: vliMode.value,
  11498. "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => vliMode.value = $event)
  11499. }, {
  11500. default: vue.withCtx(() => [
  11501. vue.createTextVNode("chrome_reader_mode ")
  11502. ]),
  11503. _: 1
  11504. }, 8, ["modelValue"]),
  11505. _hoisted_3$c,
  11506. vue.createVNode(_sfc_main$m, {
  11507. class: "zoom-in head-btn icon",
  11508. title: "缩小",
  11509. onClick: _cache[1] || (_cache[1] = ($event) => zoomImage(0.5))
  11510. }, {
  11511. default: vue.withCtx(() => [
  11512. vue.createTextVNode(" zoom_in ")
  11513. ]),
  11514. _: 1
  11515. }),
  11516. vue.createVNode(_sfc_main$m, {
  11517. class: "zoom-out head-btn icon",
  11518. title: "放大",
  11519. onClick: _cache[2] || (_cache[2] = ($event) => zoomImage(-0.5))
  11520. }, {
  11521. default: vue.withCtx(() => [
  11522. vue.createTextVNode(" zoom_out ")
  11523. ]),
  11524. _: 1
  11525. }),
  11526. vue.createElementVNode("span", _hoisted_4$b, vue.toDisplayString(vue.unref(round)(scale.value * 100) + "%"), 1),
  11527. _hoisted_5$a,
  11528. vue.createVNode(_sfc_main$m, {
  11529. class: "turn-left head-btn icon",
  11530. title: "逆时针旋转",
  11531. onClick: _cache[3] || (_cache[3] = ($event) => rotateImage(-90))
  11532. }, {
  11533. default: vue.withCtx(() => [
  11534. vue.createTextVNode(" undo ")
  11535. ]),
  11536. _: 1
  11537. }),
  11538. vue.createVNode(_sfc_main$m, {
  11539. class: "turn-right head-btn icon",
  11540. title: "顺时针旋转",
  11541. onClick: _cache[4] || (_cache[4] = ($event) => rotateImage(90))
  11542. }, {
  11543. default: vue.withCtx(() => [
  11544. vue.createTextVNode(" redo ")
  11545. ]),
  11546. _: 1
  11547. }),
  11548. _hoisted_6$7,
  11549. vue.createVNode(_sfc_main$m, {
  11550. class: "close head-btn icon",
  11551. title: "关闭",
  11552. onClick: unload
  11553. }, {
  11554. default: vue.withCtx(() => [
  11555. vue.createTextVNode(" close ")
  11556. ]),
  11557. _: 1
  11558. })
  11559. ], 2),
  11560. imageArray.length > 1 ? (vue.openBlock(), vue.createBlock(_sfc_main$m, {
  11561. key: 0,
  11562. class: vue.normalizeClass(["control-panel back icon", { "hide": !showControls.value }]),
  11563. title: "上一张",
  11564. onClick: listBack
  11565. }, {
  11566. default: vue.withCtx(() => [
  11567. vue.createTextVNode(" chevron_left ")
  11568. ]),
  11569. _: 1
  11570. }, 8, ["class"])) : vue.createCommentVNode("", true),
  11571. imageArray.length > 1 ? (vue.openBlock(), vue.createBlock(_sfc_main$m, {
  11572. key: 1,
  11573. class: vue.normalizeClass(["control-panel forward icon", { "hide": !showControls.value }]),
  11574. title: "下一张",
  11575. onClick: listForward
  11576. }, {
  11577. default: vue.withCtx(() => [
  11578. vue.createTextVNode(" chevron_right ")
  11579. ]),
  11580. _: 1
  11581. }, 8, ["class"])) : vue.createCommentVNode("", true),
  11582. vue.createElementVNode("div", {
  11583. class: vue.normalizeClass(["control-panel bottom-controls", { "hide": !showControls.value }])
  11584. }, [
  11585. (vue.openBlock(), vue.createElementBlock(vue.Fragment, null, vue.renderList(imageArray, (image, index2) => {
  11586. return vue.createVNode(_sfc_main$m, {
  11587. class: vue.normalizeClass(["bottom-btn", { "selected": index2 === curr.value }]),
  11588. "no-border": "all"
  11589. }, {
  11590. default: vue.withCtx(() => [
  11591. vue.createElementVNode("img", {
  11592. class: "image-list",
  11593. src: image,
  11594. alt: "",
  11595. onClick: ($event) => curr.value = index2
  11596. }, null, 8, _hoisted_7$7)
  11597. ]),
  11598. _: 2
  11599. }, 1032, ["class"]);
  11600. }), 64))
  11601. ], 2)
  11602. ], 544);
  11603. };
  11604. }
  11605. });
  11606. const imagesViewerVue = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["__scopeId", "data-v-b1e43839"]]);
  11607. function getFloatCoord(...args) {
  11608. if (args[0] instanceof HTMLElement)
  11609. return getFloatCoord1(args[0], args[1], args[2]);
  11610. if (typeof args[0] === "number" && typeof args[1] === "number")
  11611. return getFloatCoord2(args[0], args[1], args[2], args[3]);
  11612. return { x: 0, y: 0 };
  11613. }
  11614. function getFloatCoord1(el, coord, mode) {
  11615. const clientRect = el.getBoundingClientRect();
  11616. return getFloatCoord2(clientRect.width, clientRect.height, coord, mode);
  11617. }
  11618. function getFloatCoord2(width, height, coord, mode) {
  11619. const offsetX = (() => {
  11620. switch (mode) {
  11621. case "baseline":
  11622. return 0;
  11623. case "middle":
  11624. return width / 2;
  11625. }
  11626. })();
  11627. const x = Math.min(
  11628. coord.x - offsetX,
  11629. window.innerWidth - scrollbarWidth() - Math.ceil(width)
  11630. // 修正误差
  11631. );
  11632. const y = Math.ceil(coord.y + height) > window.innerHeight ? coord.y - height : coord.y;
  11633. return { x, y };
  11634. }
  11635. function renderJSX(jsxel, parent) {
  11636. const vnode = vue.createVNode(jsxel);
  11637. vue.render(vnode, parent);
  11638. return {
  11639. el: parent.firstChild,
  11640. vnode
  11641. };
  11642. }
  11643. function insertJSX(jsxel, parent, position) {
  11644. const tempContainer = templateCreate("div");
  11645. const vnode = renderJSX(jsxel, parent.appendChild(tempContainer));
  11646. forEach(tempContainer.children, (el) => {
  11647. parent.insertBefore(el, position ?? null);
  11648. });
  11649. tempContainer.remove();
  11650. return vnode;
  11651. }
  11652. function appendJSX(jsxel, parent) {
  11653. const tempContainer = templateCreate("div");
  11654. const vnode = renderJSX(jsxel, parent.appendChild(tempContainer));
  11655. forEach(tempContainer.children, (el) => {
  11656. parent.appendChild(el);
  11657. });
  11658. tempContainer.remove();
  11659. return vnode;
  11660. }
  11661. function imagesViewer(props) {
  11662. renderDialog(imagesViewerVue, props, {
  11663. blurEffect: false
  11664. });
  11665. }
  11666. function headerProgress(props, delay = 2e3, timeout = 1e4) {
  11667. const progressBar = vue.createVNode(HeaderProgress, {
  11668. "calc": props.calc
  11669. }, null);
  11670. const rendered = insertJSX(progressBar, document.body, document.body.firstChild ?? void 0);
  11671. const timeoutTimer = setTimeout(() => {
  11672. rendered.el.remove();
  11673. }, timeout);
  11674. waitUntil(() => rendered.el.style.width === "100vw", timeout).then(function() {
  11675. setTimeout(() => {
  11676. rendered.el.remove();
  11677. clearTimeout(timeoutTimer);
  11678. }, delay);
  11679. });
  11680. return rendered;
  11681. }
  11682. function bindFloatMessage(target, message, delay = 500) {
  11683. const CursorMargin = 4;
  11684. if (DOMS(".float-message").length <= 0) {
  11685. appendJSX(vue.createVNode("div", {
  11686. "class": "float-message"
  11687. }, [vue.createVNode("div", {
  11688. "class": "float-content"
  11689. }, null)]), document.body);
  11690. }
  11691. const floatMessage = DOMS(true, ".float-message", "div");
  11692. let timeout = -1;
  11693. target.addEventListener("mouseenter", function() {
  11694. if (timeout >= 0)
  11695. clearTimeout(timeout);
  11696. });
  11697. target.addEventListener("mouseleave", function() {
  11698. if (timeout >= 0)
  11699. clearTimeout(timeout);
  11700. floatMessage.style.display = "none";
  11701. });
  11702. target.addEventListener("mousemove", function(e) {
  11703. if (timeout >= 0)
  11704. clearTimeout(timeout);
  11705. timeout = setTimeout(() => {
  11706. if (floatMessage.style.display !== "block") {
  11707. floatMessage.innerText = message;
  11708. floatMessage.style.display = "block";
  11709. floatMessage.style.top = "0";
  11710. floatMessage.style.left = "0";
  11711. const coord = getFloatCoord(floatMessage, {
  11712. x: e.clientX + CursorMargin,
  11713. y: e.clientY + CursorMargin
  11714. }, "baseline");
  11715. console.log(coord);
  11716. floatMessage.style.left = `${coord.x}px`;
  11717. floatMessage.style.top = `${coord.y < e.clientY ? coord.y - CursorMargin * 2 : coord.y}px`;
  11718. }
  11719. }, delay);
  11720. });
  11721. }
  11722. const _hoisted_1$c = { class: "main-content" };
  11723. const _hoisted_2$c = { class: "title" };
  11724. const _hoisted_3$b = {
  11725. key: 0,
  11726. class: "content"
  11727. };
  11728. const _hoisted_4$a = {
  11729. key: 0,
  11730. class: "img-container"
  11731. };
  11732. const _hoisted_5$9 = ["src"];
  11733. const _hoisted_6$6 = { class: "bottom-controls" };
  11734. const _hoisted_7$6 = ["src"];
  11735. const _hoisted_8$5 = { class: "author-info" };
  11736. const _hoisted_9$5 = { class: "author-name" };
  11737. const _hoisted_10$5 = { class: "post-time" };
  11738. const _hoisted_11$4 = { class: "replies" };
  11739. const _sfc_main$e = /* @__PURE__ */ vue.defineComponent({
  11740. __name: "post-container",
  11741. props: {
  11742. post: {},
  11743. lazyLoad: { type: Boolean, default: false },
  11744. dynamic: { type: Boolean, default: false }
  11745. },
  11746. emits: ["clickImage", "assetsLoaded"],
  11747. setup(__props, { emit: __emit }) {
  11748. const props = __props;
  11749. const emit = __emit;
  11750. const postContainer = vue.ref();
  11751. const isIntersecting = vue.ref(!props.lazyLoad);
  11752. const loadedAssets = vue.ref(0);
  11753. vue.onMounted(() => {
  11754. if (!postContainer.value)
  11755. return;
  11756. if (props.post.images.length === 0) {
  11757. emit("assetsLoaded", postContainer.value);
  11758. }
  11759. if (!props.lazyLoad)
  11760. return;
  11761. const iObs = new IntersectionObserver((entries) => {
  11762. entries.forEach((entry) => {
  11763. if (entry.isIntersecting) {
  11764. isIntersecting.value = true;
  11765. iObs.disconnect();
  11766. }
  11767. });
  11768. });
  11769. iObs.observe(postContainer.value.$el);
  11770. });
  11771. function showImage(e, index2) {
  11772. e.preventDefault();
  11773. emit("clickImage", (() => {
  11774. const output = [];
  11775. map(props.post.images, (value) => {
  11776. output.push(value.original);
  11777. });
  11778. return output;
  11779. })(), index2);
  11780. }
  11781. function addLoadedPost() {
  11782. loadedAssets.value += 1;
  11783. if (loadedAssets.value === props.post.images.length) {
  11784. emit("assetsLoaded", postContainer.value);
  11785. }
  11786. }
  11787. return (_ctx, _cache) => {
  11788. return vue.openBlock(), vue.createBlock(_sfc_main$m, {
  11789. ref_key: "postContainer",
  11790. ref: postContainer,
  11791. "is-anchor": true,
  11792. class: vue.normalizeClass(["post-container", { "dynamic": props.dynamic, "assets-loaded": loadedAssets.value === props.post.images.length }]),
  11793. href: "/p/" + props.post.id,
  11794. target: "_blank"
  11795. }, {
  11796. default: vue.withCtx(() => [
  11797. vue.createElementVNode("div", null, [
  11798. vue.createVNode(_sfc_main$m, {
  11799. "is-anchor": true,
  11800. class: "forum-btn",
  11801. "shadow-border": true,
  11802. href: props.post.forum.href,
  11803. target: "_blank"
  11804. }, {
  11805. default: vue.withCtx(() => [
  11806. vue.createTextVNode(vue.toDisplayString(props.post.forum.name + " 吧"), 1)
  11807. ]),
  11808. _: 1
  11809. }, 8, ["href"])
  11810. ]),
  11811. vue.createElementVNode("div", _hoisted_1$c, [
  11812. vue.createElementVNode("p", _hoisted_2$c, vue.toDisplayString(props.post.title), 1),
  11813. props.post.content && props.post.content !== " " ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_3$b, vue.toDisplayString(props.post.content), 1)) : vue.createCommentVNode("", true)
  11814. ]),
  11815. props.post.images.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$a, [
  11816. (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(props.post.images, (image, index2) => {
  11817. return vue.openBlock(), vue.createBlock(_sfc_main$m, {
  11818. class: "img-button",
  11819. onClick: ($event) => showImage($event, index2),
  11820. "no-border": "all"
  11821. }, {
  11822. default: vue.withCtx(() => [
  11823. vue.createElementVNode("img", {
  11824. class: "post-img",
  11825. src: isIntersecting.value ? image.original : "",
  11826. onLoad: addLoadedPost
  11827. }, null, 40, _hoisted_5$9)
  11828. ]),
  11829. _: 2
  11830. }, 1032, ["onClick"]);
  11831. }), 256))
  11832. ])) : vue.createCommentVNode("", true),
  11833. vue.createElementVNode("div", _hoisted_6$6, [
  11834. vue.createVNode(_sfc_main$m, {
  11835. class: "author",
  11836. "is-anchor": true,
  11837. href: props.post.author.href,
  11838. target: "_blank",
  11839. "shadow-border": true
  11840. }, {
  11841. default: vue.withCtx(() => [
  11842. vue.createElementVNode("img", {
  11843. class: "author-portrait",
  11844. src: isIntersecting.value ? vue.unref(tiebaAPI).URL_profile(props.post.author.portrait) : ""
  11845. }, null, 8, _hoisted_7$6),
  11846. vue.createElementVNode("div", _hoisted_8$5, [
  11847. vue.createElementVNode("div", _hoisted_9$5, vue.toDisplayString(props.post.author.name), 1),
  11848. vue.createElementVNode("div", _hoisted_10$5, vue.toDisplayString(props.post.time), 1)
  11849. ])
  11850. ]),
  11851. _: 1
  11852. }, 8, ["href"]),
  11853. vue.createElementVNode("div", _hoisted_11$4, vue.toDisplayString(props.post.replies), 1)
  11854. ])
  11855. ]),
  11856. _: 1
  11857. }, 8, ["href", "class"]);
  11858. };
  11859. }
  11860. });
  11861. const PostContainer = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["__scopeId", "data-v-b160e8b2"]]);
  11862. const maxFeeds = 1e3;
  11863. const nextFeedsMargin = 320;
  11864. const unreadTTL = 2;
  11865. const _sfc_main$d = /* @__PURE__ */ vue.defineComponent({
  11866. __name: "feeds-masonry",
  11867. props: {
  11868. initFeeds: { default: Array },
  11869. showProgress: { type: Boolean, default: false }
  11870. },
  11871. setup(__props, { expose: __expose }) {
  11872. const props = __props;
  11873. const feeds = vue.ref([]);
  11874. const masonryWrapper = vue.ref();
  11875. const masonryContainer = vue.ref();
  11876. const hasMoreFeeds = vue.ref(true);
  11877. let currentLoadedFeeds = [];
  11878. let isFetchingFeeds = false;
  11879. const debAddFeeds = debounce(addFeeds, 1e3, { leading: true });
  11880. let flexMasonry;
  11881. window.addEventListener("resize", throttle(function() {
  11882. flexMasonry.adjustWidth();
  11883. if (flexMasonry.columns !== flexMasonry.calcColumns())
  11884. flexMasonry.exec();
  11885. }, 100), { passive: true });
  11886. vue.onMounted(() => {
  11887. if (!masonryWrapper.value)
  11888. return;
  11889. if (!masonryContainer.value)
  11890. return;
  11891. debAddFeeds(props.initFeeds);
  11892. renderMasonry();
  11893. window.addEventListener("scroll", () => {
  11894. if (isFetchingFeeds)
  11895. return;
  11896. const scrollHeight = document.documentElement.scrollHeight;
  11897. const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
  11898. const clientHeight = document.documentElement.clientHeight;
  11899. if (scrollTop + clientHeight >= scrollHeight - nextFeedsMargin) {
  11900. if (feeds.value.length < maxFeeds) {
  11901. debAddFeeds();
  11902. }
  11903. }
  11904. });
  11905. });
  11906. vue.watch(hasMoreFeeds, (newVal) => {
  11907. if (!newVal) {
  11908. toast({
  11909. message: "没有更多推送了",
  11910. type: "warning"
  11911. });
  11912. }
  11913. });
  11914. async function addFeeds(newFeeds) {
  11915. if (!newFeeds)
  11916. newFeeds = [];
  11917. if (isFetchingFeeds)
  11918. return;
  11919. isFetchingFeeds = true;
  11920. if (newFeeds.length <= 0) {
  11921. const response = await requestInstance(tiebaAPI.feedlist());
  11922. if (response) {
  11923. newFeeds = parsePostsFromString(response.data.html);
  11924. hasMoreFeeds.value = Boolean(response.data.has_more);
  11925. if (props.showProgress) {
  11926. headerProgress({ calc: () => currentLoadedFeeds.length / response.data.total * 100 });
  11927. }
  11928. }
  11929. }
  11930. feeds.value.push(...newFeeds);
  11931. await waitUntil(() => currentLoadedFeeds.length >= (newFeeds ?? []).length);
  11932. renderMasonry().then(function() {
  11933. unreadFeeds.set(newFeeds ? newFeeds : [], spawnOffsetTS(0, 0, 0, unreadTTL));
  11934. currentLoadedFeeds.length = 0;
  11935. isFetchingFeeds = false;
  11936. });
  11937. }
  11938. async function renderMasonry() {
  11939. await vue.nextTick(() => {
  11940. if (!masonryContainer.value)
  11941. return;
  11942. if (!flexMasonry) {
  11943. flexMasonry = new FlexMasonry({
  11944. container: masonryContainer.value,
  11945. // items: ".post-elem.assets-loaded",
  11946. columnWidth: 320,
  11947. gap: 12,
  11948. fixScrollOffset: true
  11949. });
  11950. } else {
  11951. flexMasonry.append(".masonry-wrapper > .post-elem.assets-loaded", 60);
  11952. }
  11953. });
  11954. }
  11955. function addToLoaded(payload) {
  11956. currentLoadedFeeds.push(payload.$el);
  11957. }
  11958. function showImages(images, index2) {
  11959. imagesViewer({
  11960. content: images,
  11961. defaultIndex: index2
  11962. });
  11963. }
  11964. function refresh() {
  11965. if (!isFetchingFeeds) {
  11966. feeds.value.length = 0;
  11967. flexMasonry.clear();
  11968. debAddFeeds();
  11969. }
  11970. }
  11971. function refreshAndMove() {
  11972. var _a;
  11973. window.scrollTo({ top: (_a = masonryContainer.value) == null ? void 0 : _a.offsetTop, behavior: "smooth" });
  11974. refresh();
  11975. }
  11976. __expose({
  11977. feeds,
  11978. isFetchingFeeds,
  11979. refresh,
  11980. refreshAndMove
  11981. });
  11982. return (_ctx, _cache) => {
  11983. return vue.openBlock(), vue.createElementBlock("div", {
  11984. ref_key: "masonryWrapper",
  11985. ref: masonryWrapper,
  11986. class: "masonry-wrapper"
  11987. }, [
  11988. vue.createElementVNode("div", {
  11989. ref_key: "masonryContainer",
  11990. ref: masonryContainer,
  11991. class: "masonry-container"
  11992. }, null, 512),
  11993. (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(feeds.value, (post) => {
  11994. return vue.openBlock(), vue.createBlock(PostContainer, {
  11995. key: post.id,
  11996. post,
  11997. class: "post-elem",
  11998. dynamic: "",
  11999. "shadow-border": "",
  12000. onClickImage: showImages,
  12001. onAssetsLoaded: addToLoaded
  12002. }, null, 8, ["post"]);
  12003. }), 128))
  12004. ], 512);
  12005. };
  12006. }
  12007. });
  12008. const FeedsMasonry = /* @__PURE__ */ _export_sfc(_sfc_main$d, [["__scopeId", "data-v-0a8673bc"]]);
  12009. const _withScopeId$7 = (n) => (vue.pushScopeId("data-v-8c03e998"), n = n(), vue.popScopeId(), n);
  12010. const _hoisted_1$b = { class: "about-wrapper" };
  12011. const _hoisted_2$b = { class: "main-title" };
  12012. const _hoisted_3$a = ["src"];
  12013. const _hoisted_4$9 = { class: "title" };
  12014. const _hoisted_5$8 = { class: "script-info" };
  12015. const _hoisted_6$5 = { class: "author-info" };
  12016. const _hoisted_7$5 = { class: "version" };
  12017. const _hoisted_8$4 = { class: "author" };
  12018. const _hoisted_9$4 = { class: "about-desc" };
  12019. const _hoisted_10$4 = { class: "line" };
  12020. const _hoisted_11$3 = { class: "about-controls" };
  12021. const _hoisted_12$3 = /* @__PURE__ */ _withScopeId$7(() => /* @__PURE__ */ vue.createElementVNode("div", { class: "about-desc" }, null, -1));
  12022. const _sfc_main$c = /* @__PURE__ */ vue.defineComponent({
  12023. __name: "about.detail",
  12024. emits: ["changeView"],
  12025. setup(__props, { emit: __emit }) {
  12026. const scriptInfo = _GM_info;
  12027. const emit = __emit;
  12028. return (_ctx, _cache) => {
  12029. return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$b, [
  12030. vue.createElementVNode("div", _hoisted_2$b, [
  12031. vue.createElementVNode("img", {
  12032. src: vue.unref(getResource)("/assets/images/main/icon.png"),
  12033. alt: "icon",
  12034. class: "main-icon"
  12035. }, null, 8, _hoisted_3$a),
  12036. vue.createElementVNode("div", _hoisted_4$9, vue.toDisplayString(vue.unref(MainTitle)), 1)
  12037. ]),
  12038. vue.createElementVNode("div", _hoisted_5$8, [
  12039. vue.createElementVNode("div", _hoisted_6$5, [
  12040. vue.createElementVNode("div", _hoisted_7$5, vue.toDisplayString(vue.unref(scriptInfo).script.version), 1),
  12041. vue.createElementVNode("div", _hoisted_8$4, "@" + vue.toDisplayString(vue.unref(scriptInfo).script.author), 1)
  12042. ]),
  12043. vue.createElementVNode("div", _hoisted_9$4, [
  12044. (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(`本开源项目使用 MIT 协议`.split("\n"), (line) => {
  12045. return vue.openBlock(), vue.createElementBlock("div", _hoisted_10$4, vue.toDisplayString(line), 1);
  12046. }), 256))
  12047. ])
  12048. ]),
  12049. vue.createElementVNode("div", _hoisted_11$3, [
  12050. vue.createVNode(_sfc_main$m, {
  12051. class: "about-button github",
  12052. "is-anchor": true,
  12053. href: vue.unref(GithubRepo),
  12054. "shadow-border": true,
  12055. target: "_balnk"
  12056. }, {
  12057. default: vue.withCtx(() => [
  12058. vue.createTextVNode("开放源代码 ")
  12059. ]),
  12060. _: 1
  12061. }, 8, ["href"]),
  12062. vue.createVNode(_sfc_main$m, {
  12063. class: "about-button update",
  12064. "shadow-border": true,
  12065. onClick: _cache[0] || (_cache[0] = ($event) => emit("changeView", "about", "update"))
  12066. }, {
  12067. default: vue.withCtx(() => [
  12068. vue.createTextVNode(" 检查更新 ")
  12069. ]),
  12070. _: 1
  12071. })
  12072. ]),
  12073. _hoisted_12$3
  12074. ]);
  12075. };
  12076. }
  12077. });
  12078. const AboutDetail = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["__scopeId", "data-v-8c03e998"]]);
  12079. const _withScopeId$6 = (n) => (vue.pushScopeId("data-v-8906d00c"), n = n(), vue.popScopeId(), n);
  12080. const _hoisted_1$a = {
  12081. key: 0,
  12082. class: "update-wrapper"
  12083. };
  12084. const _hoisted_2$a = { class: "icon" };
  12085. const _hoisted_3$9 = { class: "content" };
  12086. const _hoisted_4$8 = { class: "title-container" };
  12087. const _hoisted_5$7 = { class: "title" };
  12088. const _hoisted_6$4 = {
  12089. key: 0,
  12090. class: "is-pre-release"
  12091. };
  12092. const _hoisted_7$4 = { class: "main-info" };
  12093. const _hoisted_8$3 = ["src"];
  12094. const _hoisted_9$3 = { class: "owner" };
  12095. const _hoisted_10$3 = ["innerHTML"];
  12096. const _hoisted_11$2 = { class: "update-controls" };
  12097. const _hoisted_12$2 = {
  12098. key: 1,
  12099. class: "forbidden-wrapper"
  12100. };
  12101. const _hoisted_13$2 = /* @__PURE__ */ _withScopeId$6(() => /* @__PURE__ */ vue.createElementVNode("div", { class: "icon" }, "warning", -1));
  12102. const _hoisted_14$2 = /* @__PURE__ */ _withScopeId$6(() => /* @__PURE__ */ vue.createElementVNode("div", { class: "forbidden-text" }, "请求过于频繁,请稍后重试", -1));
  12103. const _hoisted_15$2 = [
  12104. _hoisted_13$2,
  12105. _hoisted_14$2
  12106. ];
  12107. const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
  12108. __name: "about.update",
  12109. setup(__props) {
  12110. const release = vue.ref();
  12111. const forbidden = vue.ref(false);
  12112. const isLatest = vue.ref();
  12113. const scriptInfo = _GM_info;
  12114. marked2.marked.setOptions({});
  12115. vue.onMounted(async () => {
  12116. const latest = await getLatestReleaseFromGitee();
  12117. if (latest) {
  12118. forbidden.value = false;
  12119. release.value = latest;
  12120. isLatest.value = `v${scriptInfo.script.version}` >= release.value.tag_name;
  12121. } else {
  12122. forbidden.value = true;
  12123. }
  12124. });
  12125. return (_ctx, _cache) => {
  12126. var _a, _b, _c, _d, _e, _f, _g, _h;
  12127. return !forbidden.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$a, [
  12128. isLatest.value !== void 0 ? (vue.openBlock(), vue.createElementBlock("div", {
  12129. key: 0,
  12130. class: vue.normalizeClass(["latest-info", { "is-latest": isLatest.value }])
  12131. }, [
  12132. vue.createElementVNode("div", _hoisted_2$a, vue.toDisplayString(isLatest.value ? "check" : "warning"), 1),
  12133. vue.createElementVNode("div", _hoisted_3$9, vue.toDisplayString(isLatest.value ? "当前是最新版本" : "检测到新版本"), 1)
  12134. ], 2)) : vue.createCommentVNode("", true),
  12135. vue.createElementVNode("div", _hoisted_4$8, [
  12136. vue.createElementVNode("div", _hoisted_5$7, vue.toDisplayString((_a = release.value) == null ? void 0 : _a.name), 1),
  12137. ((_b = release.value) == null ? void 0 : _b.prerelease) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_6$4, "预览版")) : vue.createCommentVNode("", true)
  12138. ]),
  12139. vue.createElementVNode("div", _hoisted_7$4, [
  12140. ((_c = release.value) == null ? void 0 : _c.author.avatar_url) ? (vue.openBlock(), vue.createElementBlock("img", {
  12141. key: 0,
  12142. src: (_d = release.value) == null ? void 0 : _d.author.avatar_url,
  12143. alt: "",
  12144. class: "avatar"
  12145. }, null, 8, _hoisted_8$3)) : vue.createCommentVNode("", true),
  12146. vue.createElementVNode("div", _hoisted_9$3, vue.toDisplayString((_e = release.value) == null ? void 0 : _e.author.name), 1)
  12147. ]),
  12148. vue.createElementVNode("div", {
  12149. class: "release-body markdown",
  12150. innerHTML: ((_f = release.value) == null ? void 0 : _f.body) ? vue.unref(marked2.marked)((_g = release.value) == null ? void 0 : _g.body) : ""
  12151. }, null, 8, _hoisted_10$3),
  12152. vue.createElementVNode("div", _hoisted_11$2, [
  12153. vue.createVNode(_sfc_main$m, {
  12154. class: "up-button download-button",
  12155. "shadow-border": "",
  12156. "theme-style": "",
  12157. "is-anchor": "",
  12158. href: (_h = release.value) == null ? void 0 : _h.assets[0].browser_download_url
  12159. }, {
  12160. default: vue.withCtx(() => [
  12161. vue.createTextVNode("安装更新 ")
  12162. ]),
  12163. _: 1
  12164. }, 8, ["href"])
  12165. ])
  12166. ])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_12$2, _hoisted_15$2));
  12167. };
  12168. }
  12169. });
  12170. const AboutUpdate = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["__scopeId", "data-v-8906d00c"]]);
  12171. const _hoisted_1$9 = { class: "layout-custom-back" };
  12172. const _hoisted_2$9 = ["src"];
  12173. const _hoisted_3$8 = { class: "custom-back-buttons" };
  12174. const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
  12175. __name: "layout.custom-back",
  12176. setup(__props) {
  12177. const imageData = vue.ref(customBackground.get());
  12178. const alphaValue = vue.ref("100");
  12179. const imageAlphaInput = vue.ref();
  12180. vue.watch(imageData, (newValue) => {
  12181. customBackground.set(newValue);
  12182. });
  12183. vue.watch(alphaValue, (newValue) => {
  12184. var _a;
  12185. const inputElement = (_a = imageAlphaInput.value) == null ? void 0 : _a.$el;
  12186. if (newValue === "" || +newValue < 0)
  12187. alphaValue.value = "0", inputElement.value = "0";
  12188. if (+newValue > 100)
  12189. alphaValue.value = "100", inputElement.value = "100";
  12190. });
  12191. vue.onMounted(async function() {
  12192. imageData.value = customBackground.get();
  12193. });
  12194. async function clearImage() {
  12195. imageData.value = void 0;
  12196. }
  12197. async function selectImageFile() {
  12198. imageData.value = await selectLocalFile("base64");
  12199. }
  12200. return (_ctx, _cache) => {
  12201. return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$9, [
  12202. vue.withDirectives(vue.createElementVNode("img", {
  12203. class: "custom-image",
  12204. src: imageData.value ?? "",
  12205. title: "自定义背景",
  12206. alt: "自定义背景",
  12207. style: vue.normalizeStyle(`opacity: ${+alphaValue.value / 100}`)
  12208. }, null, 12, _hoisted_2$9), [
  12209. [vue.vShow, imageData.value]
  12210. ]),
  12211. vue.createElementVNode("div", _hoisted_3$8, [
  12212. vue.createVNode(_sfc_main$m, { onClick: clearImage }, {
  12213. default: vue.withCtx(() => [
  12214. vue.createTextVNode("清除")
  12215. ]),
  12216. _: 1
  12217. }),
  12218. vue.createVNode(_sfc_main$m, { onClick: selectImageFile }, {
  12219. default: vue.withCtx(() => [
  12220. vue.createTextVNode("上传图片")
  12221. ]),
  12222. _: 1
  12223. })
  12224. ])
  12225. ]);
  12226. };
  12227. }
  12228. });
  12229. const LayoutCustomBack = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__scopeId", "data-v-fcb5c431"]]);
  12230. var zhCn = {
  12231. name: "zh-cn",
  12232. el: {
  12233. colorpicker: {
  12234. confirm: "确定",
  12235. clear: "清空"
  12236. },
  12237. datepicker: {
  12238. now: "此刻",
  12239. today: "今天",
  12240. cancel: "取消",
  12241. clear: "清空",
  12242. confirm: "确定",
  12243. selectDate: "选择日期",
  12244. selectTime: "选择时间",
  12245. startDate: "开始日期",
  12246. startTime: "开始时间",
  12247. endDate: "结束日期",
  12248. endTime: "结束时间",
  12249. prevYear: "前一年",
  12250. nextYear: "后一年",
  12251. prevMonth: "上个月",
  12252. nextMonth: "下个月",
  12253. year: "年",
  12254. month1: "1 月",
  12255. month2: "2 月",
  12256. month3: "3 月",
  12257. month4: "4 月",
  12258. month5: "5 月",
  12259. month6: "6 月",
  12260. month7: "7 月",
  12261. month8: "8 月",
  12262. month9: "9 月",
  12263. month10: "10 月",
  12264. month11: "11 月",
  12265. month12: "12 月",
  12266. weeks: {
  12267. sun: "日",
  12268. mon: "一",
  12269. tue: "二",
  12270. wed: "三",
  12271. thu: "四",
  12272. fri: "五",
  12273. sat: "六"
  12274. },
  12275. months: {
  12276. jan: "一月",
  12277. feb: "二月",
  12278. mar: "三月",
  12279. apr: "四月",
  12280. may: "五月",
  12281. jun: "六月",
  12282. jul: "七月",
  12283. aug: "八月",
  12284. sep: "九月",
  12285. oct: "十月",
  12286. nov: "十一月",
  12287. dec: "十二月"
  12288. }
  12289. },
  12290. select: {
  12291. loading: "加载中",
  12292. noMatch: "无匹配数据",
  12293. noData: "无数据",
  12294. placeholder: "请选择"
  12295. },
  12296. cascader: {
  12297. noMatch: "无匹配数据",
  12298. loading: "加载中",
  12299. placeholder: "请选择",
  12300. noData: "暂无数据"
  12301. },
  12302. pagination: {
  12303. goto: "前往",
  12304. pagesize: "条/页",
  12305. total: "共 {total} 条",
  12306. pageClassifier: "页",
  12307. page: "页",
  12308. prev: "上一页",
  12309. next: "下一页",
  12310. currentPage: "第 {pager} 页",
  12311. prevPages: "向前 {pager} 页",
  12312. nextPages: "向后 {pager} 页",
  12313. deprecationWarning: "你使用了一些已被废弃的用法,请参考 el-pagination 的官方文档"
  12314. },
  12315. messagebox: {
  12316. title: "提示",
  12317. confirm: "确定",
  12318. cancel: "取消",
  12319. error: "输入的数据不合法!"
  12320. },
  12321. upload: {
  12322. deleteTip: "按 delete 键可删除",
  12323. delete: "删除",
  12324. preview: "查看图片",
  12325. continue: "继续上传"
  12326. },
  12327. table: {
  12328. emptyText: "暂无数据",
  12329. confirmFilter: "筛选",
  12330. resetFilter: "重置",
  12331. clearFilter: "全部",
  12332. sumText: "合计"
  12333. },
  12334. tour: {
  12335. next: "下一步",
  12336. previous: "上一步",
  12337. finish: "结束导览"
  12338. },
  12339. tree: {
  12340. emptyText: "暂无数据"
  12341. },
  12342. transfer: {
  12343. noMatch: "无匹配数据",
  12344. noData: "无数据",
  12345. titles: ["列表 1", "列表 2"],
  12346. filterPlaceholder: "请输入搜索内容",
  12347. noCheckedFormat: "共 {total} 项",
  12348. hasCheckedFormat: "已选 {checked}/{total} 项"
  12349. },
  12350. image: {
  12351. error: "加载失败"
  12352. },
  12353. pageHeader: {
  12354. title: "返回"
  12355. },
  12356. popconfirm: {
  12357. confirmButtonText: "确定",
  12358. cancelButtonText: "取消"
  12359. }
  12360. }
  12361. };
  12362. const _withScopeId$5 = (n) => (vue.pushScopeId("data-v-54fb2e9b"), n = n(), vue.popScopeId(), n);
  12363. const _hoisted_1$8 = { class: "theme-color-component" };
  12364. const _hoisted_2$8 = { class: "picker" };
  12365. const _hoisted_3$7 = /* @__PURE__ */ _withScopeId$5(() => /* @__PURE__ */ vue.createElementVNode("label", { for: "light-theme" }, "浅色主题", -1));
  12366. const _hoisted_4$7 = { class: "picker" };
  12367. const _hoisted_5$6 = /* @__PURE__ */ _withScopeId$5(() => /* @__PURE__ */ vue.createElementVNode("label", { for: "dark-theme" }, "深色主题", -1));
  12368. const _sfc_main$9 = /* @__PURE__ */ vue.defineComponent({
  12369. __name: "theme.color",
  12370. setup(__props) {
  12371. const lightTheme = vue.ref(themeColor.get().light);
  12372. const darkTheme = vue.ref(themeColor.get().dark);
  12373. function changeThemeColor() {
  12374. themeColor.set({
  12375. dark: darkTheme.value,
  12376. light: lightTheme.value
  12377. });
  12378. }
  12379. function resetThemeColor() {
  12380. themeColor.remove();
  12381. lightTheme.value = themeColor.get().light;
  12382. darkTheme.value = themeColor.get().dark;
  12383. }
  12384. return (_ctx, _cache) => {
  12385. return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$8, [
  12386. vue.createVNode(vue.unref(elementPlus.ElConfigProvider), { locale: vue.unref(zhCn) }, {
  12387. default: vue.withCtx(() => [
  12388. vue.createElementVNode("div", _hoisted_2$8, [
  12389. vue.createVNode(vue.unref(elementPlus.ElColorPicker), {
  12390. modelValue: lightTheme.value,
  12391. "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => lightTheme.value = $event),
  12392. id: "light-theme",
  12393. "popper-class": "theme-picker",
  12394. size: "small",
  12395. onChange: changeThemeColor
  12396. }, null, 8, ["modelValue"]),
  12397. _hoisted_3$7
  12398. ]),
  12399. vue.createElementVNode("div", _hoisted_4$7, [
  12400. vue.createVNode(vue.unref(elementPlus.ElColorPicker), {
  12401. modelValue: darkTheme.value,
  12402. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => darkTheme.value = $event),
  12403. id: "dark-theme",
  12404. "popper-class": "theme-picker",
  12405. size: "small",
  12406. onChange: changeThemeColor
  12407. }, null, 8, ["modelValue"]),
  12408. _hoisted_5$6
  12409. ]),
  12410. vue.createVNode(_sfc_main$m, {
  12411. class: "reset-button",
  12412. onClick: resetThemeColor
  12413. }, {
  12414. default: vue.withCtx(() => [
  12415. vue.createTextVNode("重置")
  12416. ]),
  12417. _: 1
  12418. })
  12419. ]),
  12420. _: 1
  12421. }, 8, ["locale"])
  12422. ]);
  12423. };
  12424. }
  12425. });
  12426. const ThemeColor = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["__scopeId", "data-v-54fb2e9b"]]);
  12427. const getUserSettings = once(() => ({
  12428. "visibility": {
  12429. name: "显示",
  12430. icon: "visibility",
  12431. description: "主题、显示设置",
  12432. sub: {
  12433. "theme": {
  12434. name: "主题",
  12435. content: {
  12436. "switch-theme": {
  12437. title: "主题偏好设置",
  12438. description: `在自动模式下,将根据当前系统设置自动选择合适的主题。你也可以手动应用某一种主题。`,
  12439. widgets: [{
  12440. type: "select",
  12441. content: {
  12442. "自动": "auto",
  12443. "深色": "dark",
  12444. "浅色": "light"
  12445. },
  12446. init() {
  12447. return themeType.get();
  12448. },
  12449. event(e) {
  12450. const newValue = e.target.value;
  12451. themeType.set(newValue);
  12452. }
  12453. }]
  12454. },
  12455. "color": {
  12456. title: "主题颜色",
  12457. description: `自定义主题色。由于存在深浅两种主题,需要设置两种主题色。`,
  12458. widgets: [{
  12459. type: "component",
  12460. component: vue.markRaw(ThemeColor)
  12461. }]
  12462. }
  12463. }
  12464. },
  12465. "layout": {
  12466. name: "页面布局",
  12467. content: {
  12468. "compact-layout": {
  12469. title: "紧凑布局",
  12470. description: `在尽量保证视觉观感的请款下,针对部分页面应用更加紧凑的布局,以提高信息密度。当前会受到影响的页面有:新版看贴页面。`,
  12471. widgets: [{
  12472. type: "toggle",
  12473. init() {
  12474. return compactLayout.get();
  12475. },
  12476. event() {
  12477. compactLayout.set(!compactLayout.get());
  12478. document.body.toggleAttribute("compact-layout");
  12479. return compactLayout.get();
  12480. }
  12481. }]
  12482. },
  12483. "custom-background": {
  12484. title: "自定义背景图",
  12485. description: `上传图片作为页面背景图`,
  12486. widgets: [{
  12487. type: "component",
  12488. component: vue.markRaw(LayoutCustomBack)
  12489. }]
  12490. },
  12491. "wide-screen-title": {
  12492. title: "宽屏设置",
  12493. description: `针对宽屏设备进行配置`,
  12494. widgets: [{
  12495. type: "subTitle",
  12496. content: "强制拉伸画幅"
  12497. }, {
  12498. type: "desc",
  12499. content: `对于宽屏设备,不一定需要页面内容宽度始终等于屏幕宽度。如果你想应用强制宽屏,可以开启此项。`
  12500. }, {
  12501. type: "toggle",
  12502. init() {
  12503. return wideScreen.get().noLimit;
  12504. },
  12505. event() {
  12506. const value = wideScreen.get().noLimit;
  12507. wideScreen.merge({
  12508. noLimit: !value
  12509. });
  12510. return !value;
  12511. }
  12512. }, {
  12513. type: "subTitle",
  12514. content: "最大宽度"
  12515. }, {
  12516. type: "desc",
  12517. content: `配置页面元素跟随屏幕拉伸的最大宽度,若开启了 “强制拉伸画幅” 则此项失效`
  12518. }, {
  12519. type: "textbox",
  12520. placeHolder: "输入最大宽度像素值",
  12521. init() {
  12522. return String(wideScreen.get().maxWidth);
  12523. },
  12524. event(e) {
  12525. const newValue = e.target.value;
  12526. if (!isNaN(+newValue)) {
  12527. wideScreen.merge({
  12528. maxWidth: +newValue
  12529. });
  12530. }
  12531. }
  12532. }]
  12533. }
  12534. }
  12535. },
  12536. "page-extension": {
  12537. name: "页面扩展",
  12538. content: {
  12539. "index": {
  12540. title: "新版主页",
  12541. description: `新版主页旨在提供纯粹的浏览体验,它通过 Vue 构建。
  12542. 在新版主页上我们目前会更激进地测试一些新功能,包括尚未被广泛使用的新 Web API,以及自构建的 JavaScript 库。`,
  12543. widgets: [{
  12544. type: "toggle",
  12545. init() {
  12546. return pageExtension.get().index;
  12547. },
  12548. event() {
  12549. pageExtension.merge({
  12550. index: !pageExtension.get().index
  12551. });
  12552. return pageExtension.get().index;
  12553. }
  12554. }]
  12555. },
  12556. "thread": {
  12557. title: "新版看帖页面",
  12558. description: `新版看帖页面使用了全新的 UI 界面,并试图改进屏幕空间利用率。`,
  12559. widgets: [{
  12560. type: "toggle",
  12561. init() {
  12562. return pageExtension.get().thread;
  12563. },
  12564. event() {
  12565. pageExtension.merge({
  12566. thread: !pageExtension.get().thread
  12567. });
  12568. return pageExtension.get().thread;
  12569. }
  12570. }]
  12571. }
  12572. }
  12573. },
  12574. "fonts": {
  12575. name: "字体",
  12576. content: {
  12577. "code-zh": {
  12578. title: "主要字体组合",
  12579. description: `应用在贴吧绝大多数场景的字体组合。`,
  12580. widgets: [{
  12581. type: "textarea",
  12582. placeHolder: "写入字体名,以换行分隔。若需要中英文混排,需将英文字体写在中文字体之前。",
  12583. init() {
  12584. return join(userFonts.get(), "\n");
  12585. },
  12586. event(e) {
  12587. userFonts.set(split(e.target.value, "\n"));
  12588. return join(userFonts.get(), "\n");
  12589. }
  12590. }]
  12591. },
  12592. "code-monospace": {
  12593. title: "等宽字体组合",
  12594. description: `应用在数据显示等场景的等宽字体组合。`,
  12595. widgets: [{
  12596. type: "textarea",
  12597. placeHolder: "写入字体名,以换行分隔。建议在此处写入等宽字体。",
  12598. init() {
  12599. return join(monospaceFonts.get(), "\n");
  12600. },
  12601. event(e) {
  12602. monospaceFonts.set(split(e.target.value, "\n"));
  12603. return join(monospaceFonts.get(), "\n");
  12604. }
  12605. }]
  12606. }
  12607. }
  12608. },
  12609. "nav-bar": {
  12610. name: "导航栏",
  12611. content: {
  12612. "nav-bar-mode": {
  12613. title: "导航栏隐藏模式",
  12614. description: `设置导航栏的隐藏模式。`,
  12615. widgets: [{
  12616. type: "select",
  12617. content: {
  12618. "滚动折叠": "fold",
  12619. "始终折叠": "alwaysFold",
  12620. "滚动隐藏": "hideWhenScroll",
  12621. "顶部固定": "fixedOnTop",
  12622. "始终显示": "never"
  12623. },
  12624. init() {
  12625. return navBarHideMode.get();
  12626. },
  12627. event(e) {
  12628. const newValue = e.target.value;
  12629. navBarHideMode.set(newValue);
  12630. }
  12631. }]
  12632. }
  12633. }
  12634. }
  12635. }
  12636. },
  12637. "modules": {
  12638. name: "模块",
  12639. icon: "deployed_code",
  12640. description: "用户模块管理及部署",
  12641. sub: AllModules().reduce((accu, curr, index2) => {
  12642. function toSubSettingKey(module2) {
  12643. return {
  12644. name: module2.name,
  12645. description: module2.brief,
  12646. content: {
  12647. "module-info": {
  12648. title: module2.name,
  12649. description: `${module2.id} ${module2.version}
  12650. ${module2.description}`,
  12651. widgets: [{
  12652. type: "toggle",
  12653. init() {
  12654. return includes(disabledModules.get(), module2.id) ? false : true;
  12655. },
  12656. event() {
  12657. if (includes(disabledModules.get(), module2.id)) {
  12658. const newSet = new Set(disabledModules.get());
  12659. newSet.delete(module2.id);
  12660. disabledModules.set([...newSet]);
  12661. return true;
  12662. } else {
  12663. disabledModules.set([module2.id, ...disabledModules.get()]);
  12664. return false;
  12665. }
  12666. }
  12667. }]
  12668. },
  12669. ...module2.settings
  12670. }
  12671. };
  12672. }
  12673. if (index2 === 1) {
  12674. const accuObject = toSubSettingKey(accu);
  12675. accu = {};
  12676. accu[accuObject.name] = accuObject;
  12677. }
  12678. accu[curr.name] = toSubSettingKey(curr);
  12679. return accu;
  12680. })
  12681. },
  12682. "performance": {
  12683. name: "性能",
  12684. icon: "speed",
  12685. description: "硬件性能与流量相关",
  12686. sub: {
  12687. "perfPresets": {
  12688. name: "性能预设",
  12689. content: {
  12690. "persets": {
  12691. title: "性能预设",
  12692. description: "从以下预设性能等级选择其一,将会自动对相关场景进行行为调整。",
  12693. widgets: [{
  12694. type: "select",
  12695. content: {
  12696. "默认": "default",
  12697. "节能": "saver",
  12698. "高性能": "performance"
  12699. },
  12700. init() {
  12701. return perfProfile.get();
  12702. },
  12703. event(e) {
  12704. const newValue = e.target.value;
  12705. perfProfile.set(newValue);
  12706. }
  12707. }]
  12708. }
  12709. }
  12710. }
  12711. }
  12712. },
  12713. "enhanced": {
  12714. name: "高级",
  12715. icon: "labs",
  12716. description: "提前测试一些尚不稳定的新功能",
  12717. sub: {
  12718. "experimental": {
  12719. name: "实验性功能",
  12720. content: {
  12721. "title": {
  12722. title: "实验室",
  12723. description: `本版块列举了一些实验性功能,这些功能正处于开发阶段,它们当中的大部分都是默认关闭的。
  12724. 这些功能可能会产生已知、未知的错误或性能问题,如果这些问题能被更及时全面地反馈,将有助于整个项目的发展。
  12725. 需要注意的是,这些特性并不保证会保留到后续版本中。`,
  12726. widgets: [{
  12727. type: "icon",
  12728. content: "lab_research"
  12729. }]
  12730. },
  12731. "moreBlurEffect": {
  12732. title: "更多模糊效果",
  12733. description: `优先考虑提供更多的模糊效果。
  12734. 仅当性能预设为“高性能”时,才会生效。`,
  12735. widgets: [{
  12736. type: "toggle",
  12737. init() {
  12738. return experimental.get().moreBlurEffect;
  12739. },
  12740. event() {
  12741. experimental.merge({
  12742. moreBlurEffect: !experimental.get().moreBlurEffect
  12743. });
  12744. }
  12745. }]
  12746. },
  12747. "rasterEffect": {
  12748. title: "栅格特效",
  12749. description: `将部分场景的模糊效果替换为栅格特效。
  12750. 可能会使文字可见度降低。存在性能问题。`,
  12751. widgets: [{
  12752. type: "toggle",
  12753. init() {
  12754. return experimental.get().rasterEffect;
  12755. },
  12756. event() {
  12757. experimental.merge({
  12758. rasterEffect: !experimental.get().rasterEffect
  12759. });
  12760. }
  12761. }]
  12762. }
  12763. }
  12764. },
  12765. "backup-recover": {
  12766. name: "备份与恢复",
  12767. content: {
  12768. "data-backup": {
  12769. title: "数据备份",
  12770. description: `备份脚本所有自定义配置`,
  12771. widgets: [{
  12772. type: "button",
  12773. content: "备份",
  12774. event() {
  12775. backupUserConfigs();
  12776. }
  12777. }]
  12778. },
  12779. "recover-backup": {
  12780. title: "数据恢复",
  12781. description: `从备份文件中恢复脚本所有自定义配置`,
  12782. widgets: [{
  12783. type: "button",
  12784. content: "恢复",
  12785. event() {
  12786. restoreUserConfigs();
  12787. }
  12788. }]
  12789. }
  12790. }
  12791. },
  12792. "factory-reset": {
  12793. name: "重置所有配置",
  12794. content: {
  12795. "title": {
  12796. title: "重置所有配置",
  12797. description: `如果你需要将脚本的一切配置恢复默认,请使用此功能。`
  12798. },
  12799. "reset": {
  12800. widgets: [{
  12801. type: "button",
  12802. content: "重置",
  12803. event() {
  12804. if (confirm("该操作是不可逆的,请做最后一次确认")) {
  12805. forEach(_GM_listValues(), (key) => {
  12806. _GM_deleteValue(key);
  12807. });
  12808. location.reload();
  12809. }
  12810. }
  12811. }]
  12812. }
  12813. }
  12814. }
  12815. }
  12816. },
  12817. "about": {
  12818. name: "关于",
  12819. icon: "person",
  12820. description: "开发信息与检查更新",
  12821. sub: {
  12822. "update": {
  12823. name: "检查更新",
  12824. content: {
  12825. "update-time": {
  12826. title: "检查更新设置",
  12827. description: `发行信息追踪频率`,
  12828. widgets: [{
  12829. type: "select",
  12830. content: {
  12831. "1 小时": "1h",
  12832. "3 小时": "3h",
  12833. "6 小时": "6h",
  12834. "从不": "never"
  12835. },
  12836. init() {
  12837. return updateConfig.get().time;
  12838. },
  12839. event(e) {
  12840. const newValue = e.target.value;
  12841. updateConfig.merge({
  12842. time: newValue
  12843. });
  12844. }
  12845. }]
  12846. },
  12847. "update-notify": {
  12848. description: `启用一个对话框提示用户更新。该对话框可以立即安装更新,也可以推迟更新操作。`,
  12849. widgets: [{
  12850. type: "toggle",
  12851. init() {
  12852. return updateConfig.get().notify;
  12853. },
  12854. event() {
  12855. updateConfig.merge({
  12856. notify: !updateConfig.get().notify
  12857. });
  12858. }
  12859. }]
  12860. },
  12861. "update-component": {
  12862. widgets: [{
  12863. type: "component",
  12864. component: vue.markRaw(AboutUpdate)
  12865. }]
  12866. }
  12867. }
  12868. },
  12869. "about": {
  12870. name: "关于项目",
  12871. content: {
  12872. "about-component": {
  12873. widgets: [{
  12874. type: "component",
  12875. component: vue.markRaw(AboutDetail)
  12876. }]
  12877. }
  12878. }
  12879. }
  12880. }
  12881. }
  12882. }));
  12883. const _sfc_main$8 = /* @__PURE__ */ vue.defineComponent({
  12884. __name: "user-textbox",
  12885. props: {
  12886. modelValue: { default: "" },
  12887. mutiLines: { type: Boolean },
  12888. lodashStyle: { type: Boolean, default: false }
  12889. },
  12890. emits: ["update:modelValue"],
  12891. setup(__props) {
  12892. const props = __props;
  12893. return (_ctx, _cache) => {
  12894. return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(props.mutiLines ? "textarea" : "input"), {
  12895. class: vue.normalizeClass(["user-textbox", { "lodash-style": props.lodashStyle }]),
  12896. type: "text",
  12897. value: _ctx.modelValue,
  12898. onInput: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("update:modelValue", $event.target.value)),
  12899. autocomplete: "off"
  12900. }, null, 40, ["class", "value"]);
  12901. };
  12902. }
  12903. });
  12904. const UserTextbox = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__scopeId", "data-v-a690d550"]]);
  12905. const _withScopeId$4 = (n) => (vue.pushScopeId("data-v-8c694269"), n = n(), vue.popScopeId(), n);
  12906. const _hoisted_1$7 = {
  12907. class: "settings-wrapper remove-default"
  12908. };
  12909. const _hoisted_2$7 = {
  12910. class: "left-container"
  12911. };
  12912. const _hoisted_3$6 = {
  12913. class: "search-controls"
  12914. };
  12915. const _hoisted_4$6 = /* @__PURE__ */ _withScopeId$4(() => /* @__PURE__ */ vue.createElementVNode("div", {
  12916. class: "title"
  12917. }, "设置", -1));
  12918. const _hoisted_5$5 = {
  12919. class: "left-panel"
  12920. };
  12921. const _hoisted_6$3 = {
  12922. class: "icon"
  12923. };
  12924. const _hoisted_7$3 = {
  12925. class: "key-info"
  12926. };
  12927. const _hoisted_8$2 = {
  12928. class: "key-title"
  12929. };
  12930. const _hoisted_9$2 = {
  12931. class: "key-desc"
  12932. };
  12933. const _hoisted_10$2 = {
  12934. class: "middle-container"
  12935. };
  12936. const _hoisted_11$1 = {
  12937. class: "key-title"
  12938. };
  12939. const _hoisted_12$1 = {
  12940. key: 0,
  12941. class: "right-container"
  12942. };
  12943. const _hoisted_13$1 = {
  12944. class: "setting-content"
  12945. };
  12946. const _hoisted_14$1 = {
  12947. key: 0,
  12948. class: "content-title"
  12949. };
  12950. const _hoisted_15$1 = {
  12951. key: 1,
  12952. class: "content-desc"
  12953. };
  12954. const _hoisted_16$1 = {
  12955. class: "line"
  12956. };
  12957. const _hoisted_17$1 = {
  12958. class: "setting-control"
  12959. };
  12960. const _hoisted_18$1 = {
  12961. key: 1,
  12962. class: "icon-component icon"
  12963. };
  12964. const _hoisted_19$1 = ["onChange"];
  12965. const _hoisted_20$1 = ["value", "selected"];
  12966. const _hoisted_21$1 = {
  12967. key: 4,
  12968. class: "content-sub-title"
  12969. };
  12970. const _hoisted_22$1 = {
  12971. key: 5,
  12972. class: "content-desc"
  12973. };
  12974. const _hoisted_23$1 = {
  12975. class: "line"
  12976. };
  12977. const _hoisted_24$1 = ["src", "alt", "title", "onLoad"];
  12978. const _hoisted_25$1 = {
  12979. key: 1,
  12980. class: "empty-container filled-icon"
  12981. };
  12982. const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
  12983. __name: "settings",
  12984. setup(__props) {
  12985. const userSettings = getUserSettings();
  12986. const searchText = vue.ref("");
  12987. const selectedKey = vue.ref();
  12988. const selectedSubKey = vue.ref();
  12989. function selectMainKey(key) {
  12990. selectedKey.value = key;
  12991. selectedSubKey.value = void 0;
  12992. }
  12993. function selectSubKey(key) {
  12994. selectedSubKey.value = key;
  12995. }
  12996. function changeView(key, sub) {
  12997. selectedKey.value = userSettings[key];
  12998. selectedSubKey.value = userSettings[key].sub[sub];
  12999. }
  13000. function clearSelections() {
  13001. selectedKey.value = void 0;
  13002. selectedSubKey.value = void 0;
  13003. }
  13004. function searchKey() {
  13005. if (searchText.value.length <= 0) {
  13006. clearSelections();
  13007. return;
  13008. }
  13009. if (!find$1(userSettings, (mainKey) => {
  13010. if (find$1(mainKey.sub, (subKey) => {
  13011. if (subKey.name.toLowerCase().includes(searchText.value.toLowerCase())) {
  13012. selectedKey.value = mainKey;
  13013. selectedSubKey.value = subKey;
  13014. return true;
  13015. } else {
  13016. return false;
  13017. }
  13018. }))
  13019. return true;
  13020. else
  13021. return false;
  13022. }))
  13023. clearSelections();
  13024. }
  13025. const debSearchKey = debounce(searchKey, 500);
  13026. return (_ctx, _cache) => {
  13027. var _a, _b, _c;
  13028. return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$7, [vue.createElementVNode("div", _hoisted_2$7, [vue.createElementVNode("div", _hoisted_3$6, [_hoisted_4$6, vue.createVNode(UserTextbox, {
  13029. modelValue: searchText.value,
  13030. "onUpdate:modelValue": [_cache[0] || (_cache[0] = ($event) => searchText.value = $event), vue.unref(debSearchKey)],
  13031. class: "search-box",
  13032. placeholder: "输入需要搜索的设置"
  13033. }, null, 8, ["modelValue", "onUpdate:modelValue"])]), vue.createElementVNode("div", _hoisted_5$5, [(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(vue.unref(userSettings), (setting) => {
  13034. var _a2;
  13035. return vue.openBlock(), vue.createBlock(_sfc_main$m, {
  13036. class: vue.normalizeClass(["key-button main-key", {
  13037. "selected": ((_a2 = selectedKey.value) == null ? void 0 : _a2.name) === setting.name
  13038. }]),
  13039. onClick: ($event) => selectMainKey(setting),
  13040. "no-border": "all"
  13041. }, {
  13042. default: vue.withCtx(() => [vue.createElementVNode("div", _hoisted_6$3, vue.toDisplayString(setting.icon), 1), vue.createElementVNode("div", _hoisted_7$3, [vue.createElementVNode("div", _hoisted_8$2, vue.toDisplayString(setting.name), 1), vue.createElementVNode("div", _hoisted_9$2, vue.toDisplayString(setting.description), 1)])]),
  13043. _: 2
  13044. }, 1032, ["class", "onClick"]);
  13045. }), 256))])]), vue.createElementVNode("div", _hoisted_10$2, [(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList((_a = selectedKey.value) == null ? void 0 : _a.sub, (setting) => {
  13046. var _a2;
  13047. return vue.openBlock(), vue.createBlock(_sfc_main$m, {
  13048. class: vue.normalizeClass(["key-button sub-key", {
  13049. "selected": ((_a2 = selectedSubKey.value) == null ? void 0 : _a2.name) === setting.name
  13050. }]),
  13051. onClick: ($event) => selectSubKey(setting),
  13052. "no-border": "all"
  13053. }, {
  13054. default: vue.withCtx(() => [vue.createElementVNode("div", _hoisted_11$1, vue.toDisplayString(setting.name), 1)]),
  13055. _: 2
  13056. }, 1032, ["class", "onClick"]);
  13057. }), 256))]), ((_b = selectedSubKey.value) == null ? void 0 : _b.name) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_12$1, [((_c = selectedSubKey.value) == null ? void 0 : _c.name) ? (vue.openBlock(true), vue.createElementBlock(vue.Fragment, {
  13058. key: 0
  13059. }, vue.renderList(selectedSubKey.value.content, (content) => {
  13060. return vue.openBlock(), vue.createElementBlock("div", _hoisted_13$1, [(content == null ? void 0 : content.title) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_14$1, vue.toDisplayString(content == null ? void 0 : content.title), 1)) : vue.createCommentVNode("", true), (content == null ? void 0 : content.description) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_15$1, [(content == null ? void 0 : content.description) ? (vue.openBlock(true), vue.createElementBlock(vue.Fragment, {
  13061. key: 0
  13062. }, vue.renderList(content.description.split("\n"), (line) => {
  13063. return vue.openBlock(), vue.createElementBlock("div", _hoisted_16$1, vue.toDisplayString(line), 1);
  13064. }), 256)) : vue.createCommentVNode("", true)])) : vue.createCommentVNode("", true), (content == null ? void 0 : content.widgets) ? (vue.openBlock(true), vue.createElementBlock(vue.Fragment, {
  13065. key: 2
  13066. }, vue.renderList(content.widgets, (widget) => {
  13067. var _a2;
  13068. return vue.openBlock(), vue.createElementBlock("div", _hoisted_17$1, [widget.type === "toggle" ? (vue.openBlock(), vue.createBlock(ToggleButton, {
  13069. key: 0,
  13070. class: "settings-toggle-button icon",
  13071. "model-value": widget.init ? widget.init() : void 0,
  13072. onClick: widget.event,
  13073. "icon-type": "",
  13074. "no-border": "all"
  13075. }, null, 8, ["model-value", "onClick"])) : vue.createCommentVNode("", true), widget.type === "icon" ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_18$1, vue.toDisplayString(widget.content), 1)) : vue.createCommentVNode("", true), widget.type === "button" ? (vue.openBlock(), vue.createBlock(_sfc_main$m, {
  13076. key: 2,
  13077. onClick: widget.event,
  13078. "shadow-border": ""
  13079. }, {
  13080. default: vue.withCtx(() => [vue.createTextVNode(vue.toDisplayString(widget.content), 1)]),
  13081. _: 2
  13082. }, 1032, ["onClick"])) : vue.createCommentVNode("", true), widget.type === "select" && vue.unref(isLiteralObject)(widget.content) ? (vue.openBlock(), vue.createElementBlock("select", {
  13083. key: 3,
  13084. onChange: widget.event
  13085. }, [(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(widget.content, (value, key) => {
  13086. return vue.openBlock(), vue.createElementBlock("option", {
  13087. value,
  13088. selected: widget.init && value === widget.init()
  13089. }, vue.toDisplayString(key), 9, _hoisted_20$1);
  13090. }), 256))], 40, _hoisted_19$1)) : vue.createCommentVNode("", true), widget.type === "subTitle" ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_21$1, vue.toDisplayString(widget.content), 1)) : vue.createCommentVNode("", true), widget.type === "desc" ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_22$1, [widget.content ? (vue.openBlock(true), vue.createElementBlock(vue.Fragment, {
  13091. key: 0
  13092. }, vue.renderList(widget.content.split("\n"), (line) => {
  13093. return vue.openBlock(), vue.createElementBlock("div", _hoisted_23$1, vue.toDisplayString(line), 1);
  13094. }), 256)) : vue.createCommentVNode("", true)])) : vue.createCommentVNode("", true), vue.unref(includes)(["textbox", "textarea"], widget.type) ? (vue.openBlock(), vue.createBlock(UserTextbox, {
  13095. key: 6,
  13096. class: vue.normalizeClass(["content-textbox", {
  13097. "textarea": widget.type === "textarea"
  13098. }]),
  13099. value: widget.init ? widget.init() : "",
  13100. "muti-lines": widget.type === "textarea",
  13101. placeholder: widget.placeHolder,
  13102. onChange: widget.event
  13103. }, null, 8, ["class", "value", "muti-lines", "placeholder", "onChange"])) : vue.createCommentVNode("", true), widget.type === "image" ? (vue.openBlock(), vue.createElementBlock("img", {
  13104. key: 7,
  13105. class: "content-image",
  13106. src: (_a2 = widget.content) == null ? void 0 : _a2.toString(),
  13107. alt: widget.altContent,
  13108. title: widget.altContent,
  13109. onLoad: widget.init
  13110. }, null, 40, _hoisted_24$1)) : vue.createCommentVNode("", true), widget.component ? (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(widget == null ? void 0 : widget.component), {
  13111. key: 8,
  13112. onChangeView: changeView
  13113. }, null, 32)) : vue.createCommentVNode("", true)]);
  13114. }), 256)) : vue.createCommentVNode("", true)]);
  13115. }), 256)) : vue.createCommentVNode("", true)])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_25$1, "settings"))]);
  13116. };
  13117. }
  13118. });
  13119. const Settings = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-8c694269"]]);
  13120. const _withScopeId$3 = (n) => (vue.pushScopeId("data-v-b3af10bd"), n = n(), vue.popScopeId(), n);
  13121. const _hoisted_1$6 = { class: "index-wrapper" };
  13122. const _hoisted_2$6 = { class: "grid-container" };
  13123. const _hoisted_3$5 = { class: "head-controls" };
  13124. const _hoisted_4$5 = { class: "search-controls" };
  13125. const _hoisted_5$4 = { class: "search-suggestions" };
  13126. const _hoisted_6$2 = ["src"];
  13127. const _hoisted_7$2 = { class: "sugg-content" };
  13128. const _hoisted_8$1 = { class: "sugg-title" };
  13129. const _hoisted_9$1 = { class: "sugg-desc" };
  13130. const _hoisted_10$1 = {
  13131. key: 0,
  13132. class: "block-wrapper followed-container"
  13133. };
  13134. const _hoisted_11 = { class: "block-controls followed" };
  13135. const _hoisted_12 = /* @__PURE__ */ _withScopeId$3(() => /* @__PURE__ */ vue.createElementVNode("p", { class: "block-title" }, "关注的吧", -1));
  13136. const _hoisted_13 = { class: "block-container followed-list" };
  13137. const _hoisted_14 = {
  13138. key: 0,
  13139. class: "icon signed"
  13140. };
  13141. const _hoisted_15 = { class: "forum-title" };
  13142. const _hoisted_16 = {
  13143. key: 1,
  13144. class: "block-wrapper topic-container"
  13145. };
  13146. const _hoisted_17 = { class: "block-controls topics" };
  13147. const _hoisted_18 = /* @__PURE__ */ _withScopeId$3(() => /* @__PURE__ */ vue.createElementVNode("p", { class: "block-title" }, "贴吧热议", -1));
  13148. const _hoisted_19 = { class: "block-container topic-list" };
  13149. const _hoisted_20 = ["src"];
  13150. const _hoisted_21 = { class: "topic-content" };
  13151. const _hoisted_22 = { class: "topic-title" };
  13152. const _hoisted_23 = { class: "topic-name" };
  13153. const _hoisted_24 = { class: "topic-desc" };
  13154. const _hoisted_25 = /* @__PURE__ */ _withScopeId$3(() => /* @__PURE__ */ vue.createElementVNode("div", { id: "carousel_wrap" }, null, -1));
  13155. const _hoisted_26 = { class: "block-controls feeds" };
  13156. const _hoisted_27 = /* @__PURE__ */ _withScopeId$3(() => /* @__PURE__ */ vue.createElementVNode("p", { class: "block-title" }, "推送", -1));
  13157. const _hoisted_28 = {
  13158. key: 0,
  13159. class: "empty-container"
  13160. };
  13161. const _hoisted_29 = /* @__PURE__ */ _withScopeId$3(() => /* @__PURE__ */ vue.createElementVNode("p", { class: "no-feed-content" }, "没有更多了", -1));
  13162. const _hoisted_30 = [
  13163. _hoisted_29
  13164. ];
  13165. const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
  13166. __name: "index",
  13167. setup(__props) {
  13168. const initFeeds = vue.ref([]);
  13169. const userInfo = vue.ref();
  13170. const followed = vue.ref();
  13171. const masonryContainer = vue.ref();
  13172. const feedsContainer = vue.ref();
  13173. const searchText = vue.ref("");
  13174. const suggToggle = vue.ref(false);
  13175. const suggestions = vue.ref([]);
  13176. vue.ref(false);
  13177. const configMenu = vue.ref();
  13178. vue.ref(false);
  13179. const profileMenu = vue.ref();
  13180. const topicList = vue.ref([]);
  13181. const feedsIntersecting = vue.ref(false);
  13182. const feedsMasonry = vue.ref({});
  13183. let signedForums = 0;
  13184. initFeeds.value = unreadFeeds.get();
  13185. vue.onMounted(async () => {
  13186. init().then(() => {
  13187. if (masonryContainer.value) {
  13188. const iObs = new IntersectionObserver((entries) => {
  13189. if (entries[0].isIntersecting) {
  13190. feedsIntersecting.value = true;
  13191. } else {
  13192. feedsIntersecting.value = false;
  13193. }
  13194. });
  13195. iObs.observe(masonryContainer.value);
  13196. }
  13197. });
  13198. });
  13199. window.addEventListener("focusin", (ev) => toggleSuggControls(ev));
  13200. window.addEventListener("mousedown", (ev) => toggleSuggControls(ev));
  13201. async function init() {
  13202. userInfo.value = await (async () => {
  13203. try {
  13204. const userInfoResp = await (await tiebaAPI.userInfo()).json();
  13205. if (userInfoResp) {
  13206. return userInfoResp.data;
  13207. }
  13208. } catch (error) {
  13209. toast({
  13210. message: errorMessage(error),
  13211. type: "error",
  13212. duration: 6e3
  13213. });
  13214. }
  13215. })();
  13216. configMenu.value = [
  13217. {
  13218. title: "设置",
  13219. click() {
  13220. renderDialog(Settings);
  13221. }
  13222. },
  13223. "separator",
  13224. {
  13225. title: "源代码 (GitHub)",
  13226. href: GithubRepo
  13227. },
  13228. {
  13229. title: "源代码 (Gitee)",
  13230. href: GiteeRepo
  13231. }
  13232. ];
  13233. profileMenu.value = [
  13234. {
  13235. title: "登录(不可用)",
  13236. icon: "login",
  13237. href: BaiduPassport
  13238. }
  13239. ];
  13240. if (userInfo.value) {
  13241. profileMenu.value = [
  13242. {
  13243. title: "我的收藏",
  13244. icon: "star"
  13245. },
  13246. "separator",
  13247. {
  13248. title: "主页",
  13249. icon: "home",
  13250. href: tiebaAPI.URL_userHome(userInfo.value.user_portrait)
  13251. },
  13252. {
  13253. title: "修改",
  13254. icon: "settings"
  13255. },
  13256. "separator",
  13257. {
  13258. title: "退出登录(不可用)",
  13259. icon: "logout"
  13260. }
  13261. ];
  13262. }
  13263. if (userInfo.value) {
  13264. getFollowedInstance();
  13265. }
  13266. requestInstance(tiebaAPI.topicList()).then((response) => {
  13267. if (response) {
  13268. topicList.value.push(...response.data.bang_topic.topic_list);
  13269. }
  13270. });
  13271. if (!feedsContainer.value)
  13272. return;
  13273. }
  13274. function toggleSuggControls(e) {
  13275. const el = e.target;
  13276. const pt = findParent(el, "search-controls");
  13277. if (pt) {
  13278. suggToggle.value = true;
  13279. } else {
  13280. suggToggle.value = false;
  13281. }
  13282. }
  13283. async function loadSuggestions(query) {
  13284. const response = await tiebaAPI.suggestions(query);
  13285. if (response.ok) {
  13286. response.json().then((value) => {
  13287. if (!query || query === "") {
  13288. const topicList2 = value.hottopic_list.search_data;
  13289. if (topicList2)
  13290. suggestions.value = map(topicList2, (topic) => ({
  13291. image: topic.topic_pic,
  13292. title: topic.topic_name,
  13293. desc: topic.topic_desc,
  13294. href: topic.topic_url
  13295. }));
  13296. } else {
  13297. const matchList = value.query_match.search_data;
  13298. if (matchList)
  13299. suggestions.value = map(matchList, (match) => ({
  13300. image: match.fpic,
  13301. title: match.fname,
  13302. desc: match.forum_desc,
  13303. href: tiebaAPI.URL_forum(match.fname)
  13304. }));
  13305. }
  13306. });
  13307. }
  13308. }
  13309. function searchBoxFocus() {
  13310. if (suggestions.value.length <= 0) {
  13311. loadSuggestions().then(() => {
  13312. suggToggle.value = true;
  13313. });
  13314. } else {
  13315. suggToggle.value = true;
  13316. }
  13317. }
  13318. function searchTextChange() {
  13319. loadSuggestions(searchText.value);
  13320. }
  13321. const searchMatch = debounce(searchTextChange, 500);
  13322. function getFollowedInstance() {
  13323. requestInstance(tiebaAPI.followedForums()).then((response) => {
  13324. if (response) {
  13325. signedForums = 0;
  13326. followed.value = response.data;
  13327. forEach(followed.value.like_forum, (forum) => {
  13328. if (forum.is_sign === 1)
  13329. signedForums++;
  13330. });
  13331. followed.value.like_forum.sort((a, b) => parseInt(b.user_exp) - parseInt(a.user_exp));
  13332. }
  13333. });
  13334. }
  13335. async function oneKeySignInstance() {
  13336. messageBox({
  13337. title: "一键签到",
  13338. message: "需要注意,Web端签到获取到的经验远少于移动端,建议使用其他设备进行签到。",
  13339. type: "OkCancel"
  13340. }).then((tag) => {
  13341. if (tag === "positive") {
  13342. requestInstance(tiebaAPI.oneKeySign()).then((response) => {
  13343. toast({
  13344. message: `本次共签到成功 ${response.data.signedForumAmount} 个吧,未签到 ${response.data.unsignedForumAmount} 个吧,签到失败 ${response.data.signedForumAmountFail} 个吧,共获得 ${response.data.gradeNoVip} 经验。`,
  13345. type: "check",
  13346. blurEffect: true
  13347. });
  13348. getFollowedInstance();
  13349. });
  13350. }
  13351. });
  13352. }
  13353. return (_ctx, _cache) => {
  13354. return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$6, [
  13355. vue.createElementVNode("div", _hoisted_2$6, [
  13356. vue.createElementVNode("div", _hoisted_3$5, [
  13357. vue.createElementVNode("div", _hoisted_4$5, [
  13358. vue.createVNode(UserTextbox, {
  13359. modelValue: searchText.value,
  13360. "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchText.value = $event),
  13361. class: "search-box",
  13362. placeholder: "搜索 贴吧",
  13363. autocomplete: "none",
  13364. onFocus: searchBoxFocus,
  13365. onInput: vue.unref(searchMatch)
  13366. }, null, 8, ["modelValue", "onInput"]),
  13367. vue.createVNode(_sfc_main$m, {
  13368. class: "search-button",
  13369. "theme-style": true,
  13370. "no-border": ""
  13371. }, {
  13372. default: vue.withCtx(() => [
  13373. vue.createTextVNode("搜索")
  13374. ]),
  13375. _: 1
  13376. }),
  13377. vue.withDirectives(vue.createElementVNode("div", _hoisted_5$4, [
  13378. (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(suggestions.value, (sugg) => {
  13379. return vue.openBlock(), vue.createBlock(_sfc_main$m, {
  13380. "is-anchor": true,
  13381. class: "search-elem",
  13382. href: sugg.href,
  13383. target: "_blank",
  13384. "no-border": ""
  13385. }, {
  13386. default: vue.withCtx(() => [
  13387. vue.createElementVNode("img", {
  13388. class: "sugg-img",
  13389. src: sugg.image,
  13390. alt: ""
  13391. }, null, 8, _hoisted_6$2),
  13392. vue.createElementVNode("div", _hoisted_7$2, [
  13393. vue.createElementVNode("p", _hoisted_8$1, vue.toDisplayString(sugg.title), 1),
  13394. vue.createElementVNode("p", _hoisted_9$1, vue.toDisplayString(sugg.desc), 1)
  13395. ])
  13396. ]),
  13397. _: 2
  13398. }, 1032, ["href"]);
  13399. }), 256))
  13400. ], 512), [
  13401. [vue.vShow, suggToggle.value && suggestions.value.length > 0]
  13402. ])
  13403. ])
  13404. ]),
  13405. followed.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_10$1, [
  13406. vue.createElementVNode("div", _hoisted_11, [
  13407. _hoisted_12,
  13408. vue.createVNode(BlockPanel, { class: "signed-count left-align" }, {
  13409. default: vue.withCtx(() => {
  13410. var _a;
  13411. return [
  13412. vue.createTextVNode(vue.toDisplayString(vue.unref(signedForums)) + " / " + vue.toDisplayString((_a = followed.value) == null ? void 0 : _a.like_forum.length), 1)
  13413. ];
  13414. }),
  13415. _: 1
  13416. }),
  13417. vue.createVNode(BlockPanel, { class: "followed" }, {
  13418. default: vue.withCtx(() => [
  13419. vue.createVNode(_sfc_main$m, {
  13420. class: "panel-btn icon sign-btn",
  13421. onClick: oneKeySignInstance,
  13422. "unset-background": "",
  13423. "no-border": ""
  13424. }, {
  13425. default: vue.withCtx(() => [
  13426. vue.createTextVNode(" task_alt")
  13427. ]),
  13428. _: 1
  13429. }),
  13430. vue.createVNode(_sfc_main$m, {
  13431. class: "panel-btn icon settings",
  13432. "unset-background": "",
  13433. "no-border": ""
  13434. }, {
  13435. default: vue.withCtx(() => [
  13436. vue.createTextVNode("settings")
  13437. ]),
  13438. _: 1
  13439. })
  13440. ]),
  13441. _: 1
  13442. })
  13443. ]),
  13444. vue.createElementVNode("div", _hoisted_13, [
  13445. (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(followed.value.like_forum, (forum) => {
  13446. return vue.openBlock(), vue.createBlock(_sfc_main$m, {
  13447. "is-anchor": true,
  13448. class: "followed-btn",
  13449. "shadow-border": true,
  13450. href: vue.unref(tiebaAPI).URL_forum(forum.forum_name),
  13451. target: "_blank",
  13452. "no-border": ""
  13453. }, {
  13454. default: vue.withCtx(() => [
  13455. forum.is_sign === 1 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_14, "check")) : vue.createCommentVNode("", true),
  13456. vue.createElementVNode("div", _hoisted_15, vue.toDisplayString(forum.forum_name), 1),
  13457. vue.createElementVNode("div", {
  13458. class: vue.normalizeClass(["forum-level", "level-" + vue.unref(levelToClass)(forum.user_level)])
  13459. }, vue.toDisplayString(forum.user_level), 3)
  13460. ]),
  13461. _: 2
  13462. }, 1032, ["href"]);
  13463. }), 256))
  13464. ])
  13465. ])) : vue.createCommentVNode("", true),
  13466. topicList.value.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_16, [
  13467. vue.createElementVNode("div", _hoisted_17, [
  13468. _hoisted_18,
  13469. vue.createVNode(BlockPanel, { class: "topics" }, {
  13470. default: vue.withCtx(() => [
  13471. vue.createVNode(_sfc_main$m, {
  13472. class: "panel-btn icon switch",
  13473. "unset-background": true,
  13474. "no-border": ""
  13475. }, {
  13476. default: vue.withCtx(() => [
  13477. vue.createTextVNode("tune")
  13478. ]),
  13479. _: 1
  13480. }),
  13481. vue.createVNode(_sfc_main$m, {
  13482. class: "panel-btn icon more",
  13483. "unset-background": true,
  13484. "no-border": ""
  13485. }, {
  13486. default: vue.withCtx(() => [
  13487. vue.createTextVNode("more_horiz ")
  13488. ]),
  13489. _: 1
  13490. }),
  13491. vue.createVNode(_sfc_main$m, {
  13492. class: "panel-btn icon settings",
  13493. "unset-background": true,
  13494. "no-border": ""
  13495. }, {
  13496. default: vue.withCtx(() => [
  13497. vue.createTextVNode("settings ")
  13498. ]),
  13499. _: 1
  13500. })
  13501. ]),
  13502. _: 1
  13503. })
  13504. ]),
  13505. vue.createElementVNode("div", _hoisted_19, [
  13506. (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(vue.unref(take)(topicList.value, 10), (topic) => {
  13507. return vue.openBlock(), vue.createBlock(_sfc_main$m, {
  13508. "is-anchor": true,
  13509. class: "topic-btn",
  13510. "shadow-border": true,
  13511. href: topic.topic_url,
  13512. target: "_blank"
  13513. }, {
  13514. default: vue.withCtx(() => [
  13515. vue.createElementVNode("img", {
  13516. class: "topic-img",
  13517. src: topic.topic_pic
  13518. }, null, 8, _hoisted_20),
  13519. vue.createElementVNode("div", _hoisted_21, [
  13520. vue.createElementVNode("div", _hoisted_22, [
  13521. vue.createElementVNode("div", {
  13522. class: vue.normalizeClass("topic-rank-" + topic.idx_num)
  13523. }, vue.toDisplayString(topic.idx_num), 3),
  13524. vue.createElementVNode("div", _hoisted_23, vue.toDisplayString(topic.topic_name), 1)
  13525. ]),
  13526. vue.createElementVNode("div", _hoisted_24, vue.toDisplayString(topic.topic_desc), 1)
  13527. ])
  13528. ]),
  13529. _: 2
  13530. }, 1032, ["href"]);
  13531. }), 256))
  13532. ])
  13533. ])) : vue.createCommentVNode("", true),
  13534. _hoisted_25
  13535. ]),
  13536. vue.createElementVNode("div", {
  13537. ref_key: "masonryContainer",
  13538. ref: masonryContainer,
  13539. class: "masonry-container"
  13540. }, [
  13541. vue.createElementVNode("div", _hoisted_26, [
  13542. _hoisted_27,
  13543. feedsMasonry.value && feedsMasonry.value.feeds && (feedsMasonry.value.feeds.length > 0 || feedsMasonry.value.isFetchingFeeds) ? (vue.openBlock(), vue.createBlock(BlockPanel, { key: 0 }, {
  13544. default: vue.withCtx(() => [
  13545. vue.createVNode(_sfc_main$m, {
  13546. class: "panel-button icon refresh",
  13547. "unset-background": "",
  13548. onClick: feedsMasonry.value.refreshAndMove,
  13549. "no-border": ""
  13550. }, {
  13551. default: vue.withCtx(() => [
  13552. vue.createTextVNode("refresh ")
  13553. ]),
  13554. _: 1
  13555. }, 8, ["onClick"]),
  13556. vue.createVNode(_sfc_main$m, {
  13557. class: "panel-button icon settings",
  13558. "unset-background": "",
  13559. "no-border": ""
  13560. }, {
  13561. default: vue.withCtx(() => [
  13562. vue.createTextVNode("settings")
  13563. ]),
  13564. _: 1
  13565. })
  13566. ]),
  13567. _: 1
  13568. })) : vue.createCommentVNode("", true)
  13569. ]),
  13570. vue.createVNode(FeedsMasonry, {
  13571. ref_key: "feedsMasonry",
  13572. ref: feedsMasonry,
  13573. "init-feeds": initFeeds.value,
  13574. "show-progress": ""
  13575. }, null, 8, ["init-feeds"]),
  13576. initFeeds.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_28, _hoisted_30)) : vue.createCommentVNode("", true)
  13577. ], 512)
  13578. ]);
  13579. };
  13580. }
  13581. });
  13582. const indexVue = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-b3af10bd"]]);
  13583. async function index$g() {
  13584. if (currentPageType() !== "index")
  13585. return;
  13586. if (!pageExtension.get().index)
  13587. return;
  13588. const bodyMask = _GM_addStyle(parseMultiCSS({
  13589. "body": {
  13590. display: "none"
  13591. }
  13592. }));
  13593. await waitUntil(() => !isNil(DOMS(true, ".wrap1")));
  13594. renderPage(indexVue);
  13595. DOMS(true, ".wrap1").remove();
  13596. bodyMask.remove();
  13597. }
  13598. const _hoisted_1$5 = { class: "pager-wrapper" };
  13599. const _hoisted_2$5 = {
  13600. key: 0,
  13601. class: "pager-button-container"
  13602. };
  13603. const _hoisted_3$4 = {
  13604. key: 1,
  13605. class: "pager-separactor"
  13606. };
  13607. const _hoisted_4$4 = {
  13608. key: 2,
  13609. class: "jumper-container"
  13610. };
  13611. const _hoisted_5$3 = { class: "tail-slot" };
  13612. const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
  13613. __name: "pager",
  13614. props: {
  13615. total: {},
  13616. current: {},
  13617. jumperValue: {},
  13618. maxDisplay: { default: 9 },
  13619. fill: { type: Boolean, default: false },
  13620. showPagers: { type: Boolean, default: true },
  13621. head: { type: Boolean, default: true },
  13622. tail: { type: Boolean, default: true },
  13623. jumper: { type: Boolean, default: true },
  13624. pagerClick: {},
  13625. headClick: {},
  13626. tailClick: {},
  13627. prevClick: {},
  13628. nextClick: {},
  13629. pagerChange: {},
  13630. jumperEnter: {}
  13631. },
  13632. emits: [
  13633. "update:current",
  13634. "update:jumperValue"
  13635. ],
  13636. setup(__props, { expose: __expose, emit: __emit }) {
  13637. const props = __props;
  13638. const current = vue.ref(props.current);
  13639. const jumperValue = vue.ref(props.jumperValue ?? "");
  13640. const emit = __emit;
  13641. const pagerCount = Math.min(props.maxDisplay, props.total);
  13642. const pagerStart = vue.computed(
  13643. () => current.value + pagerCount / 2 > props.total ? props.total - pagerCount + 1 : Math.max(1, current.value - Math.floor(props.maxDisplay / 2))
  13644. );
  13645. const pagerEnd = vue.computed(() => Math.min(props.total, pagerStart.value + props.maxDisplay - 1) + 1);
  13646. __expose({
  13647. current,
  13648. jumperValue
  13649. });
  13650. function pagerChange(type, page) {
  13651. if (props.pagerChange && page !== current.value)
  13652. props.pagerChange(page);
  13653. current.value = page;
  13654. emit("update:current", page);
  13655. switch (type) {
  13656. case "page":
  13657. if (props.pagerClick)
  13658. props.pagerClick(page);
  13659. break;
  13660. case "head":
  13661. if (props.headClick)
  13662. props.headClick();
  13663. break;
  13664. case "tail":
  13665. if (props.tailClick)
  13666. props.tailClick();
  13667. break;
  13668. case "prev":
  13669. if (props.prevClick)
  13670. props.prevClick(page);
  13671. break;
  13672. case "next":
  13673. if (props.nextClick)
  13674. props.nextClick(page);
  13675. break;
  13676. }
  13677. }
  13678. function handleJumperEnter() {
  13679. if (!jumperValue.value)
  13680. return;
  13681. const page = +jumperValue.value;
  13682. if (page < 1 || page > props.total)
  13683. return;
  13684. pagerChange(null, page);
  13685. if (props.jumperEnter)
  13686. props.jumperEnter(page);
  13687. jumperValue.value = "";
  13688. }
  13689. return (_ctx, _cache) => {
  13690. return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$5, [
  13691. _ctx.showPagers ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$5, [
  13692. vue.withDirectives(vue.createVNode(_sfc_main$m, {
  13693. class: "pager-button pager-head-button",
  13694. "no-border": "",
  13695. onClick: _cache[0] || (_cache[0] = ($event) => pagerChange("head", 1))
  13696. }, {
  13697. default: vue.withCtx(() => [
  13698. vue.createTextVNode("1")
  13699. ]),
  13700. _: 1
  13701. }, 512), [
  13702. [vue.vShow, current.value > Math.ceil(vue.unref(pagerCount) / 2) && current.value > 1 && _ctx.total > vue.unref(pagerCount)]
  13703. ]),
  13704. vue.withDirectives(vue.createVNode(_sfc_main$m, {
  13705. class: "pager-button pager-back-button icon",
  13706. "no-border": "",
  13707. onClick: _cache[1] || (_cache[1] = ($event) => pagerChange("prev", Math.max(1, current.value - vue.unref(pagerCount))))
  13708. }, {
  13709. default: vue.withCtx(() => [
  13710. vue.createTextVNode(" keyboard_double_arrow_left ")
  13711. ]),
  13712. _: 1
  13713. }, 512), [
  13714. [vue.vShow, current.value > Math.ceil(vue.unref(pagerCount) / 2) && current.value > 1 && _ctx.total > vue.unref(pagerCount)]
  13715. ]),
  13716. (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(vue.unref(range$1)(pagerStart.value, pagerEnd.value), (displayNumber, i) => {
  13717. return vue.openBlock(), vue.createBlock(_sfc_main$m, {
  13718. key: i,
  13719. class: vue.normalizeClass(["pager-button", { "fill": _ctx.fill, "curr-pager-button": displayNumber === current.value }]),
  13720. onClick: ($event) => pagerChange("page", displayNumber),
  13721. "no-border": "all",
  13722. disabled: displayNumber === current.value
  13723. }, {
  13724. default: vue.withCtx(() => [
  13725. vue.createTextVNode(vue.toDisplayString(displayNumber), 1)
  13726. ]),
  13727. _: 2
  13728. }, 1032, ["class", "onClick", "disabled"]);
  13729. }), 128)),
  13730. vue.withDirectives(vue.createVNode(_sfc_main$m, {
  13731. class: "pager-button pager-forward-button icon",
  13732. "no-border": "",
  13733. onClick: _cache[2] || (_cache[2] = ($event) => pagerChange("next", Math.min(_ctx.total, current.value + vue.unref(pagerCount))))
  13734. }, {
  13735. default: vue.withCtx(() => [
  13736. vue.createTextVNode(" keyboard_double_arrow_right ")
  13737. ]),
  13738. _: 1
  13739. }, 512), [
  13740. [vue.vShow, _ctx.total - vue.unref(pagerCount) > 1 && _ctx.total - current.value > vue.unref(pagerCount) / 2]
  13741. ]),
  13742. vue.withDirectives(vue.createVNode(_sfc_main$m, {
  13743. class: "pager-button pager-tail-button",
  13744. "no-border": "",
  13745. onClick: _cache[3] || (_cache[3] = ($event) => pagerChange("tail", _ctx.total))
  13746. }, {
  13747. default: vue.withCtx(() => [
  13748. vue.createTextVNode(vue.toDisplayString(_ctx.total), 1)
  13749. ]),
  13750. _: 1
  13751. }, 512), [
  13752. [vue.vShow, _ctx.tail && _ctx.total - vue.unref(pagerCount) > 1 && _ctx.total - current.value > vue.unref(pagerCount) / 2]
  13753. ])
  13754. ])) : vue.createCommentVNode("", true),
  13755. _ctx.showPagers && _ctx.jumper ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$4, "|")) : vue.createCommentVNode("", true),
  13756. _ctx.showPagers && _ctx.jumper ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$4, [
  13757. vue.createTextVNode(" 转到 "),
  13758. vue.createVNode(UserTextbox, {
  13759. modelValue: jumperValue.value,
  13760. "onUpdate:modelValue": [
  13761. _cache[4] || (_cache[4] = ($event) => jumperValue.value = $event),
  13762. _cache[5] || (_cache[5] = ($event) => emit("update:jumperValue", jumperValue.value))
  13763. ],
  13764. class: "jumper",
  13765. onKeydown: vue.withKeys(handleJumperEnter, ["enter"])
  13766. }, null, 8, ["modelValue"]),
  13767. vue.createTextVNode(" 页 ")
  13768. ])) : vue.createCommentVNode("", true),
  13769. vue.createElementVNode("div", _hoisted_5$3, [
  13770. vue.renderSlot(_ctx.$slots, "tailSlot", {}, void 0, true)
  13771. ])
  13772. ]);
  13773. };
  13774. }
  13775. });
  13776. const Pager$1 = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-88fc5825"]]);
  13777. const _hoisted_1$4 = { id: "thread-editor" };
  13778. const _hoisted_2$4 = { id: "thread-editor-toolbar" };
  13779. const _sfc_main$4 = /* @__PURE__ */ vue.defineComponent({
  13780. __name: "thread-editor",
  13781. props: {
  13782. ueditor: {},
  13783. type: { default: "thread" }
  13784. },
  13785. setup(__props) {
  13786. const props = __props;
  13787. const editorSlot = vue.ref();
  13788. const originParent = vue.ref();
  13789. vue.onMounted(async function() {
  13790. var _a;
  13791. if (!editorSlot.value)
  13792. return;
  13793. originParent.value = props.ueditor.parentElement;
  13794. editorSlot.value.appendChild(props.ueditor);
  13795. await waitUntil(() => DOMS(".edui-editor-body").length > 0);
  13796. const toolbar = DOMS(".edui-toolbar")[0];
  13797. const editorBody = DOMS(".edui-editor-body")[0];
  13798. if (toolbar.compareDocumentPosition(editorBody) & Node.DOCUMENT_POSITION_FOLLOWING) {
  13799. (_a = toolbar.parentNode) == null ? void 0 : _a.insertBefore(editorBody, toolbar);
  13800. }
  13801. DOMS("#ueditor_replace")[0].focus();
  13802. });
  13803. vue.onUnmounted(async function() {
  13804. unload();
  13805. });
  13806. function submit() {
  13807. DOMS(".j_submit", "a")[0].click();
  13808. unload();
  13809. }
  13810. function unload() {
  13811. if (!originParent.value)
  13812. return;
  13813. if (!editorSlot.value)
  13814. return;
  13815. originParent.value.appendChild(DOMS(".edui-container")[0]);
  13816. unloadDialog();
  13817. }
  13818. return (_ctx, _cache) => {
  13819. return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$4, [
  13820. vue.createVNode(_sfc_main$m, {
  13821. id: "thread-editor-exit",
  13822. class: "icon",
  13823. "shadow-border": "",
  13824. onClick: unload
  13825. }, {
  13826. default: vue.withCtx(() => [
  13827. vue.createTextVNode("close ")
  13828. ]),
  13829. _: 1
  13830. }),
  13831. _ctx.type === "thread" ? (vue.openBlock(), vue.createBlock(UserTextbox, {
  13832. key: 0,
  13833. class: "title-editor",
  13834. placeholder: "输入标题",
  13835. "lodash-style": ""
  13836. })) : vue.createCommentVNode("", true),
  13837. vue.createElementVNode("div", {
  13838. ref_key: "editorSlot",
  13839. ref: editorSlot,
  13840. id: "thread-editor-slot"
  13841. }, null, 512),
  13842. vue.createElementVNode("div", _hoisted_2$4, [
  13843. vue.createVNode(_sfc_main$m, {
  13844. id: "thread-editor-submit",
  13845. "shadow-border": "",
  13846. "theme-style": "",
  13847. onClick: submit
  13848. }, {
  13849. default: vue.withCtx(() => [
  13850. vue.createTextVNode("发表")
  13851. ]),
  13852. _: 1
  13853. })
  13854. ])
  13855. ]);
  13856. };
  13857. }
  13858. });
  13859. const ThreadEditor = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-217ff1bf"]]);
  13860. const _withScopeId$2 = (n) => (vue.pushScopeId("data-v-e01667c9"), n = n(), vue.popScopeId(), n);
  13861. const _hoisted_1$3 = {
  13862. id: "toggle-panel",
  13863. class: "toggle-panel"
  13864. };
  13865. const _hoisted_2$3 = /* @__PURE__ */ _withScopeId$2(() => /* @__PURE__ */ vue.createElementVNode("div", { class: "panel-info" }, [
  13866. /* @__PURE__ */ vue.createElementVNode("div", { class: "panel-title" }),
  13867. /* @__PURE__ */ vue.createElementVNode("div", { class: "panel-desc" })
  13868. ], -1));
  13869. const _hoisted_3$3 = { class: "toggle-wrapper" };
  13870. const _hoisted_4$3 = { class: "toggle-container" };
  13871. const _hoisted_5$2 = { class: "toggle-name" };
  13872. const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
  13873. __name: "toggle-panel",
  13874. props: {
  13875. toggles: {}
  13876. },
  13877. setup(__props) {
  13878. const props = __props;
  13879. return (_ctx, _cache) => {
  13880. return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$3, [
  13881. _hoisted_2$3,
  13882. vue.createElementVNode("div", _hoisted_3$3, [
  13883. (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(props.toggles, (toggle) => {
  13884. return vue.openBlock(), vue.createElementBlock("div", _hoisted_4$3, [
  13885. vue.createVNode(ToggleButton, {
  13886. class: "panel-button",
  13887. "model-value": toggle.defaultValue ?? false,
  13888. "icon-type": "",
  13889. "shadow-border": "",
  13890. onClick: toggle.event
  13891. }, {
  13892. default: vue.withCtx(() => [
  13893. vue.createTextVNode(vue.toDisplayString(toggle.icon), 1)
  13894. ]),
  13895. _: 2
  13896. }, 1032, ["model-value", "onClick"]),
  13897. vue.createElementVNode("div", _hoisted_5$2, vue.toDisplayString(toggle.name), 1)
  13898. ]);
  13899. }), 256))
  13900. ])
  13901. ]);
  13902. };
  13903. }
  13904. });
  13905. const TogglePanel = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-e01667c9"]]);
  13906. class TiebaComponent {
  13907. constructor(selector, type, parent) {
  13908. __publicField(this, "selector");
  13909. __publicField(this, "type");
  13910. __publicField(this, "parent");
  13911. this.selector = selector;
  13912. this.type = type;
  13913. this.parent = parent;
  13914. }
  13915. get() {
  13916. if (!this.parent)
  13917. return DOMS(this.selector, this.type)[0];
  13918. else
  13919. return DOMS(this.selector, this.type, this.parent)[0];
  13920. }
  13921. }
  13922. const floatButtonMap = {
  13923. "auxiliary": "tbui_fbar_auxiliaryCare",
  13924. "down": "tbui_fbar_down",
  13925. "post": "tbui_fbar_post",
  13926. "props": "tbui_fbar_props",
  13927. "tsukkomi": "tbui_fbar_tsukkomi",
  13928. "share": "tbui_fbar_share",
  13929. "favor": "tbui_fbar_favor",
  13930. "feedback": "tbui_fbar_feedback",
  13931. "top": "tbui_fbar_top",
  13932. "other": "*"
  13933. };
  13934. class FloatBar extends TiebaComponent {
  13935. /**
  13936. * 获取当前页面的 float buttons
  13937. * @returns FloatBarButton[]
  13938. */
  13939. buttons() {
  13940. if (!this.get())
  13941. return [];
  13942. return Array.from(DOMS(".tbui_aside_fbar_button", "li", floatBar.get())).map((el) => ({
  13943. el,
  13944. type: function() {
  13945. for (let i = 0; i < el.classList.length; i++) {
  13946. const cls = el.classList[i];
  13947. if (!cls.includes("tbui_fbar_"))
  13948. continue;
  13949. const key = findKey(floatButtonMap, (value) => value === cls);
  13950. if (key) {
  13951. return key;
  13952. }
  13953. }
  13954. return "other";
  13955. }()
  13956. }));
  13957. }
  13958. add(type, event, className, icon, index2 = 0) {
  13959. const anchor = templateCreate("a", {
  13960. href: "javascript:;"
  13961. });
  13962. const el = templateCreate("li", {
  13963. class: "tbui_aside_fbar_button"
  13964. }, [anchor]);
  13965. el.addEventListener("click", event);
  13966. if (type !== "other") {
  13967. el.classList.add(floatButtonMap[type]);
  13968. }
  13969. if (className)
  13970. el.classList.add(className);
  13971. floatBar.get().insertBefore(el, floatBar.get().children[index2]);
  13972. setFloatButtonIcon(anchor, icon);
  13973. return {
  13974. el,
  13975. type
  13976. };
  13977. function setFloatButtonIcon(el2, icon2) {
  13978. el2.classList.add("icon");
  13979. el2.classList.add("tbui_aside_fbar_button");
  13980. el2.innerHTML = icon2 ? icon2 : "";
  13981. }
  13982. }
  13983. remove(param) {
  13984. switch (typeof param) {
  13985. case "string": {
  13986. const el = DOMS(param, "li", floatBar.get())[0];
  13987. el.remove();
  13988. break;
  13989. }
  13990. case "number": {
  13991. const el = floatBar.get().children[param];
  13992. el.remove();
  13993. break;
  13994. }
  13995. }
  13996. }
  13997. }
  13998. const floatBar = new FloatBar(".tbui_aside_float_bar", "ul");
  13999. class Pager extends TiebaComponent {
  14000. allPagerButtons() {
  14001. return DOMS("a, .tP", this.get());
  14002. }
  14003. getPagerButton(pagerType, index2 = 0) {
  14004. const allButtons = this.allPagerButtons();
  14005. switch (pagerType) {
  14006. case "prev": {
  14007. return this.findMatchingButton(allButtons, "上一页");
  14008. }
  14009. case "next": {
  14010. return this.findMatchingButton(allButtons, "下一页", true);
  14011. }
  14012. case "head": {
  14013. return this.findMatchingButton(allButtons, "首页");
  14014. }
  14015. case "tail": {
  14016. return this.findMatchingButton(allButtons, "尾页", true);
  14017. }
  14018. case "page": {
  14019. let count = 0;
  14020. for (const el of allButtons) {
  14021. if (/^\d+$/.test(el.innerText)) {
  14022. if (count === index2 && el instanceof HTMLAnchorElement) {
  14023. return el;
  14024. }
  14025. count++;
  14026. }
  14027. }
  14028. return null;
  14029. }
  14030. default:
  14031. return null;
  14032. }
  14033. }
  14034. getByPage(page) {
  14035. return this.findMatchingButton(this.allPagerButtons(), page.toString());
  14036. }
  14037. jumpTo(page) {
  14038. const permKeys = ["pn", "see_lz"];
  14039. const params = new URLSearchParams(location.search);
  14040. const newParams = new URLSearchParams();
  14041. for (const [key, value] of params) {
  14042. if (includes(permKeys, key)) {
  14043. newParams.set(key, value);
  14044. }
  14045. }
  14046. const url = new URL(location.href);
  14047. url.search = newParams.toString();
  14048. history.pushState({}, "", url);
  14049. const jumperBox = DOMS(true, "#jumpPage4, #jumpPage6", "input");
  14050. const jumperButton = DOMS(true, "#pager_go4, #pager_go6", "button");
  14051. jumperBox.value = page.toString();
  14052. jumperButton.click();
  14053. }
  14054. findMatchingButton(buttons, text, reverse = false) {
  14055. const iterator = reverse ? Array.from(buttons).reverse() : buttons;
  14056. for (const el of iterator) {
  14057. if (el.innerText === text) {
  14058. return el;
  14059. }
  14060. }
  14061. return null;
  14062. }
  14063. }
  14064. const pager = new Pager(".l_pager", "li");
  14065. const compactCSS = "body[compact-layout] #j_p_postlist {\n gap: 0;\n}\nbody[compact-layout] .core_reply_content li.first_no_border {\n margin-top: -4px;\n}";
  14066. function threadParser() {
  14067. const postWrappers = DOMS(".l_post", "div");
  14068. const contents = DOMS(".d_post_content", "div");
  14069. const dAuthors = DOMS(".d_author", "div");
  14070. const avatars = DOMS(".p_author_face", "a");
  14071. const nameAnchors = DOMS(".p_author_name", "a");
  14072. const levels = DOMS(".d_badge_lv", "div");
  14073. const badgeTitles = DOMS(".d_badge_title", "div");
  14074. const replyButtons = DOMS(".lzl_link_unfold", "a");
  14075. const locations = map(DOMS(".post-tail-wrap span:first-child, .ip-location", "span"), (el) => el.innerText);
  14076. const platforms = map(DOMS(".tail-info a, .p_tail_wap", "a"), (el) => el.innerText);
  14077. const floors = map(DOMS(".j_jb_ele + .tail-info + .tail-info, .p_tail li:first-child span", "span"), (el) => el.innerText);
  14078. const times = map(DOMS(".post-tail-wrap span:nth-last-child(2), .p_tail li:last-child span", "span"), (el) => el.innerText);
  14079. const threadContents = [];
  14080. for (let i = 0; i < contents.length; i++) {
  14081. contents[i].classList.add("floor-content");
  14082. avatars[i].classList.add("floor-avatar");
  14083. nameAnchors[i].classList.add("floor-name");
  14084. threadContents.push({
  14085. post: contents[i],
  14086. replyButton: replyButtons[i],
  14087. dataField: defaults(postWrappers[i].getAttribute("data-field"), ""),
  14088. isLouzhu: DOMS(".louzhubiaoshi_wrap", dAuthors[i]).length > 0,
  14089. profile: {
  14090. avatar: avatars[i],
  14091. nameAnchor: nameAnchors[i],
  14092. level: parseInt(levels[i].innerText),
  14093. badgeTitle: badgeTitles[i].innerText
  14094. },
  14095. tail: {
  14096. location: locations[i],
  14097. platform: platforms[i],
  14098. floor: floors[i],
  14099. time: times[i]
  14100. }
  14101. });
  14102. }
  14103. const thread2 = {
  14104. displayWrapper: DOMS(true, ".wrap2", "div"),
  14105. title: PageData.thread.title,
  14106. reply: parseInt(DOMS(true, ".l_reply_num span:nth-child(1)", "span").innerText),
  14107. pages: PageData.pager.total_page,
  14108. lzOnlyButton: DOMS(true, "#lzonly_cntn", "a"),
  14109. favorButton: DOMS(true, ".j_favor", "a"),
  14110. cotents: threadContents,
  14111. forum: {
  14112. info: {
  14113. name: PageData.forum.forum_name
  14114. // followersDisplay: DOMS(true, ".card_menNum", "span").innerText,
  14115. // postsDisplay: DOMS(true, ".card_infoNum", "span").innerText,
  14116. },
  14117. components: {
  14118. nameAnchor: DOMS(true, ".card_title_fname", "a"),
  14119. iconContainer: DOMS(true, ".card_head a, .plat_picbox", "a"),
  14120. followButton: DOMS(true, ".card_head .focus_btn", "a"),
  14121. signButton: DOMS(true, ".j_sign_box", "a")
  14122. }
  14123. },
  14124. pager: {
  14125. listPager: DOMS(true, ".pb_list_pager", "li"),
  14126. jumper: {
  14127. textbox: DOMS(true, ".jump_input_bright", "input"),
  14128. submitButton: DOMS(true, ".jump_btn_bright", "button")
  14129. }
  14130. }
  14131. };
  14132. return thread2;
  14133. }
  14134. const threadCSS = '@keyframes kf-fade-in {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes kf-fade-out {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n@keyframes kf-dialog-in {\n 0% {\n opacity: 0;\n transform: scale(1.2);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes kf-zoom-in {\n 0% {\n transform: scale(0.72);\n }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes kf-fade-zoom-in {\n 0% {\n opacity: 0;\n transform: scale(0.72);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\nhtml {\n padding: 0;\n margin: 0;\n text-align: justify;\n}\n\nbody {\n overflow-x: hidden;\n overflow-y: scroll;\n overflow: hidden scroll;\n padding: 0;\n margin: 0;\n font-family: var(--code-zh);\n}\nbody[no-scrollbar] {\n overflow: hidden;\n}\n\ndiv,\np {\n margin: 0;\n}\n\nselect {\n padding: 1px 8px;\n border: 1px solid var(--border-color);\n border-radius: 8px;\n cursor: pointer;\n}\n\noption {\n cursor: pointer;\n}\n\noption:checked {\n background-color: var(--tieba-theme-color);\n color: var(--default-background);\n}\n\na {\n color: inherit;\n -webkit-text-decoration: none;\n text-decoration: none;\n word-break: break-all;\n}\n\n.dialogJ {\n position: fixed !important;\n top: 50% !important;\n left: 50% !important;\n}\n\n.dialogJ {\n transform: translate(-50%, -50%);\n}\n\n.lzl_cnt .at, .lzl_cnt .lzl_content_main a, .content-wrapper .author-container .floor-name, .d_post_content a,\n.lzl_cnt .lzl_content_main a:not(.at) {\n color: var(--tieba-theme-fore);\n cursor: pointer;\n -webkit-text-decoration: none;\n text-decoration: none;\n transition: 0.4s;\n}\n\n.d_post_content a,\n.lzl_cnt .lzl_content_main a:not(.at) {\n text-decoration: underline;\n -webkit-text-decoration: underline solid currentColor;\n text-decoration: underline solid currentColor;\n text-decoration-thickness: 1.2px;\n -webkit-text-decoration: underline 1.2px;\n text-decoration: underline 1.2px;\n}\n\n.lzl_cnt .at:hover, .lzl_cnt .lzl_content_main a:hover, .content-wrapper .author-container .floor-name:hover, .d_post_content a:hover {\n background-color: var(--default-hover);\n}\n\n.d_post_content a:hover,\n.lzl_cnt .lzl_content_main a:hover:not(.at) {\n text-decoration: underline;\n -webkit-text-decoration: underline solid rgba(0, 0, 0, 0);\n text-decoration: underline solid rgba(0, 0, 0, 0);\n text-decoration-thickness: 1.2px;\n -webkit-text-decoration: underline 1.2px rgba(0, 0, 0, 0);\n text-decoration: underline 1.2px rgba(0, 0, 0, 0);\n}\n\n.lzl_cnt .at:active, .lzl_cnt .lzl_content_main a:active, .content-wrapper .author-container .floor-name:active, .d_post_content a:active {\n background-color: var(--default-active);\n}\n\n.lzl_p_p img, .content-wrapper .author-container .floor-avatar img {\n -o-object-fit: contain;\n object-fit: contain;\n}\n\nbody {\n background-color: var(--page-background);\n overflow-x: hidden;\n}\n\nbody.special_conf_skin {\n background: var(--page-background);\n}\n\n.wrap1 {\n background: none !important;\n background-color: transparent !important;\n}\n.wrap1 .wrap2 {\n background: none !important;\n background-color: transparent !important;\n}\n\n.head_inner {\n display: none;\n}\n\n#container {\n width: 100%;\n max-width: 100%;\n max-width: var(--content-max);\n box-sizing: border-box;\n margin-top: 120px;\n}\n#container .content {\n width: 100%;\n}\n#container .content .pb_content {\n position: relative;\n width: 100%;\n box-sizing: border-box;\n padding: 24px 48px;\n border-radius: 6px 6px 0 0;\n border-top: 6px solid var(--tieba-theme-color);\n background-color: var(--default-background);\n box-shadow: 0 12px 80px -32px rgba(0, 0, 0, 0.4);\n}\n#container .tittle_fill_dom {\n display: none;\n}\n\n.card_top_wrap,\n.nav_wrap,\n.p_thread {\n display: none;\n}\n\n.core_title_wrap_bright {\n display: none !important;\n}\n\n.lzl_cnt .at {\n padding: 2px 0;\n color: var(--default-fore);\n font-size: 14px;\n font-weight: bold;\n}\n.lzl_cnt .lzl_content_main img {\n vertical-align: text-bottom;\n}\n\n#j_p_postlist {\n display: flex;\n box-sizing: border-box;\n flex-direction: column;\n gap: 16px;\n}\n#j_p_postlist .save_face_bg {\n display: none;\n}\n#j_p_postlist .l_post_bright {\n border: none;\n}\n#j_p_postlist .l_post_bright .d_post_content_main {\n background-color: transparent !important;\n background-color: initial !important;\n}\n#j_p_postlist .l_post_bright .d_post_content_main {\n width: 100%;\n padding: 0;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .p_content {\n min-height: 0;\n min-height: initial;\n padding: 0;\n margin-bottom: -42px;\n background-color: transparent;\n background-color: initial;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .p_content .shield-tip {\n background: none;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .p_content .d_post_content {\n background-color: transparent !important;\n background-color: initial !important;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .p_content .d_post_content {\n padding: 0;\n font-size: 16px;\n grid-area: content;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .p_content .replace_div {\n width: auto !important;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .p_content .BDE_Smiley {\n width: 24px;\n height: 24px;\n vertical-align: text-bottom;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .p_content .BDE_Image {\n display: flex;\n width: -moz-max-content;\n width: max-content;\n max-width: 100%;\n height: auto;\n border-radius: 12px;\n margin: 6px auto;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply {\n margin-right: 0;\n margin-right: initial;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply .core_reply_tail {\n margin-top: 0;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply .core_reply_wrapper {\n border: none !important;\n background-color: transparent !important;\n background-color: initial !important;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply .core_reply_wrapper {\n width: 100%;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply .core_reply_wrapper .core_reply_content {\n padding: 0 0 0 36px;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply .core_reply_wrapper .core_reply_content .lzl_single_post {\n animation: kf-fade-in 0.4s;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply .core_reply_wrapper .core_reply_content .lzl_single_post:not(.first_no_border) {\n padding-top: 0;\n margin-top: 0;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply .core_reply_wrapper .core_reply_content .edui-container {\n width: auto !important;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply .core_reply_wrapper .core_reply_content .edui-container {\n max-height: 64px;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply .core_reply_wrapper .core_reply_content .edui-container .edui-editor-body {\n height: -moz-max-content !important;\n height: max-content !important;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply .core_reply_wrapper .core_reply_content .edui-container .edui-editor-body {\n overflow: hidden;\n max-height: 72px;\n padding: 6px;\n border-radius: 6px;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply .core_reply_wrapper .core_reply_content .edui-container .edui-editor-body .edui-body-container {\n min-height: 16px !important;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply .core_reply_wrapper .core_reply_content .edui-container .edui-editor-body .edui-body-container {\n max-height: 64px;\n padding-left: 0;\n border-radius: 6px;\n font-size: 14px;\n overflow-y: auto;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply .core_reply_wrapper .core_reply_content .lzl_panel_wrapper {\n width: 100%;\n}\n#j_p_postlist .l_post_bright .d_post_content_main .core_reply .core_reply_wrapper .core_reply_content .lzl_panel_wrapper .lzl_panel_submit {\n background: none;\n}\n\n.main-wrapper {\n display: flex;\n max-width: 80%;\n flex-direction: column;\n padding: 8px;\n margin: auto;\n margin-top: 48px;\n}\n@media (min-width: 1200px) {\n .main-wrapper {\n max-width: 60%;\n }\n}\n\n.left_section {\n width: 100%;\n}\n\n.right_section {\n display: none;\n}\n\n#title-wrapper {\n display: flex;\n box-sizing: border-box;\n align-items: flex-end;\n justify-content: space-between;\n margin: 24px 0;\n gap: 8px;\n}\n.shrink-view #title-wrapper {\n padding: 0 48px;\n}\n#title-wrapper .thread-title {\n max-width: 60%;\n font-size: 32px;\n line-height: 36px;\n text-align: left;\n}\n#title-wrapper .forum-wrapper-button {\n background-color: var(--trans-light-background) !important;\n}\n#title-wrapper .forum-wrapper-button {\n display: flex;\n overflow: hidden;\n width: -moz-max-content;\n width: max-content;\n height: -moz-max-content;\n height: max-content;\n align-items: center;\n padding: 0;\n border-radius: 8px;\n gap: 8px;\n}\nhtml:not([perf-saver]) body.custom-background #title-wrapper .forum-wrapper-button {\n -webkit-backdrop-filter: blur(24px);\n backdrop-filter: blur(24px);\n}\nhtml.dark-theme body.custom-background #title-wrapper .forum-wrapper-button {\n -webkit-backdrop-filter: blur(24px) brightness(0.8);\n backdrop-filter: blur(24px) brightness(0.8);\n}\n#title-wrapper .forum-wrapper-button:last-child {\n padding-right: 8px;\n}\n#title-wrapper .forum-wrapper-button .forum-icon {\n width: 36px;\n height: 36px;\n}\n#title-wrapper .forum-wrapper-button .forum-name {\n color: var(--highlight-fore);\n font-size: 14px;\n font-weight: bold;\n}\n#title-wrapper .forum-wrapper-button .forum-info {\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n#title-wrapper .forum-wrapper-button .forum-info .forum-members {\n display: flex;\n gap: 8px;\n}\n#title-wrapper .forum-wrapper-button .button-container {\n display: flex;\n align-items: center;\n}\n#title-wrapper .forum-wrapper-button .button-container .forum-button {\n padding: 0 4px;\n color: var(--tieba-theme-color);\n font-size: 16px;\n font-weight: bold;\n}\n#title-wrapper .forum-wrapper-button .button-container .forum-button:not(:hover):not(:active):not(:focus) {\n background-color: transparent;\n}\n\n.forum-mask-wrapper {\n position: relative;\n z-index: -1;\n display: flex;\n justify-content: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n@keyframes mask-fade-in {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 0.1;\n }\n}\n.forum-mask-wrapper .forum-mask {\n position: absolute;\n top: -320px;\n width: 480px;\n height: 480px;\n border-radius: 480px;\n animation: mask-fade-in 1s ease-in-out;\n filter: blur(60px);\n opacity: 0.1;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n\n.content-wrapper {\n display: flex;\n width: 100%;\n flex-direction: column;\n gap: 16px;\n}\n.content-wrapper .author-container {\n display: grid;\n margin-bottom: 8px;\n grid-gap: 6px;\n gap: 6px;\n grid-template: "avatar name" auto "avatar tags" auto/36px 1fr;\n}\n.content-wrapper .author-container .floor-avatar {\n width: -moz-max-content !important;\n width: max-content !important;\n height: -moz-max-content !important;\n height: max-content !important;\n padding: 0 !important;\n}\n.content-wrapper .author-container .floor-avatar {\n overflow: hidden;\n grid-area: avatar;\n}\n.content-wrapper .author-container .floor-avatar img {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n}\n.content-wrapper .author-container .floor-name {\n width: -moz-fit-content;\n width: fit-content;\n color: var(--highlight-fore);\n font-size: 14px;\n font-weight: bold;\n grid-area: name;\n}\n.content-wrapper .author-container .badge-container {\n display: flex;\n margin-top: -4px;\n gap: 4px;\n grid-area: tags;\n}\n.content-wrapper .author-container .badge-container .floor-badge {\n display: flex;\n width: -moz-fit-content;\n width: fit-content;\n padding: 0 6px;\n border-radius: 6px;\n background-color: var(--trans-light-background);\n color: var(--light-fore);\n gap: 6px;\n}\n.content-wrapper .author-container .badge-container .floor-badge .badge-level {\n font-weight: bold;\n}\n.content-wrapper .floor-wrapper {\n display: grid;\n grid-template: "avatar name" auto "avatar tags" auto "content content" 1fr "footer footer" auto "comments comments" auto/36px 1fr;\n}\n.content-wrapper .floor-wrapper .floor-avatar {\n width: -moz-max-content !important;\n width: max-content !important;\n height: -moz-max-content !important;\n height: max-content !important;\n padding: 0 !important;\n}\n.content-wrapper .floor-wrapper .floor-avatar {\n overflow: hidden;\n grid-area: avatar;\n}\n.content-wrapper .floor-wrapper .floor-avatar img {\n width: 36px;\n border-radius: 8px;\n}\n.content-wrapper .floor-wrapper .floor-name {\n width: -moz-fit-content;\n width: fit-content;\n margin: 0 8px 4px;\n font-size: 14px;\n grid-area: name;\n}\n.content-wrapper .floor-wrapper .floor-badge {\n display: flex;\n width: -moz-fit-content;\n width: fit-content;\n padding: 0 6px;\n border-radius: 6px;\n margin: 0 8px 8px;\n background-color: var(--trans-light-background);\n color: var(--light-fore);\n gap: 6px;\n grid-area: tags;\n}\n.content-wrapper .floor-wrapper .floor-badge .badge-level {\n font-weight: bold;\n}\n.content-wrapper .floor-wrapper .floor-content {\n padding: 8px 0;\n font-size: 16px;\n grid-area: content;\n}\n.content-wrapper .floor-wrapper .floor-content .BDE_Smiley {\n width: 24px;\n height: 24px;\n vertical-align: sub;\n}\n.content-wrapper .floor-wrapper .floor-info {\n display: flex;\n justify-content: flex-end;\n color: var(--light-fore);\n gap: 12px;\n grid-area: footer;\n}\n.content-wrapper .floor-wrapper .floor-comments {\n width: 100%;\n grid-area: comments;\n}\n.content-wrapper .floor-wrapper .floor-comments .core_reply_wrapper {\n width: 100%;\n}\n\n#ueditor_replace {\n overflow: hidden;\n}\n\n#thread-jsx-components {\n display: flex;\n box-sizing: border-box;\n flex-direction: column;\n gap: 12px;\n}\n#thread-jsx-components .dummy-button {\n width: 100%;\n padding: 8px 0 0;\n border: none;\n border-radius: 0;\n border-bottom: 3px solid var(--border-color);\n margin-top: 8px;\n background-color: transparent;\n box-shadow: none;\n color: var(--minimal-fore);\n cursor: text;\n font-size: 16px;\n text-align: justify;\n}\n#thread-jsx-components .dummy-button:hover {\n border-color: var(--light-background);\n}\n#thread-jsx-components .dummy-button:focus {\n border-color: var(--tieba-theme-color);\n}\n\n.pb_footer {\n display: none;\n}\n\n.svelte-zmnt4x {\n display: none;\n}\n\n.wrap2 {\n padding-bottom: 0 !important;\n}\n\n.head_ad_pop {\n display: none !important;\n}\n\n.plat_head,\n.star_nav_wrap {\n display: none;\n}';
  14135. async function thread() {
  14136. if (!pageExtension.get().thread)
  14137. return;
  14138. if (currentPageType() !== "thread")
  14139. return;
  14140. injectCSSList(threadCSS);
  14141. injectCSSList(compactCSS);
  14142. await waitUntil(() => !isNil(document.body)).then(function() {
  14143. if (compactLayout.get()) {
  14144. document.body.toggleAttribute("compact-layout");
  14145. }
  14146. });
  14147. waitUntil(() => !isNil(floatBar.get())).then(function() {
  14148. floatBar.add("other", function() {
  14149. renderDialog(TogglePanel, {
  14150. toggles: [{
  14151. icon: "favorite",
  14152. name: "收藏",
  14153. defaultValue: function() {
  14154. return DOMS(true, ".j_favor, #j_favthread .p_favthr_main").innerText === "收藏" ? false : true;
  14155. }(),
  14156. event() {
  14157. DOMS(true, ".j_favor, #j_favthread .p_favthr_main").click();
  14158. }
  14159. }, {
  14160. icon: "face_6",
  14161. name: "只看楼主",
  14162. defaultValue: function() {
  14163. return DOMS(true, "#lzonly_cntn").innerText === "只看楼主" ? false : true;
  14164. }(),
  14165. event() {
  14166. DOMS(true, "#lzonly_cntn").click();
  14167. }
  14168. }, {
  14169. icon: "compare_arrows",
  14170. name: "紧凑布局",
  14171. defaultValue: (() => compactLayout.get())(),
  14172. event() {
  14173. document.body.toggleAttribute("compact-layout");
  14174. compactLayout.set(!compactLayout.get());
  14175. }
  14176. }]
  14177. });
  14178. }, "module-settings", "menu");
  14179. document.body.insertBefore(templateCreate("div", {
  14180. class: "vue-module-control",
  14181. style: "display: none;"
  14182. }), document.body.firstChild);
  14183. });
  14184. const pbContent = await waitUntil(() => !isNil(DOMS(true, "#pb_content"))).then(() => DOMS(true, "#pb_content", "div"));
  14185. if (perfProfile.get() === "performance" && experimental.get().moreBlurEffect) {
  14186. pbContent.classList.add("blur-effect");
  14187. pbContent.style.backgroundColor = "var(--trans-default-background)";
  14188. }
  14189. createContents();
  14190. async function createContents() {
  14191. var _a;
  14192. const threadList = await waitUntil(() => !isNil(DOMS(true, "#j_p_postlist"))).then(() => DOMS(true, "#j_p_postlist"));
  14193. threadList.classList.add("content-wrapper");
  14194. let thread2 = threadParser();
  14195. const forumIconLink = thread2.forum.components.iconContainer.children[0].src;
  14196. insertJSX(vue.createVNode("div", {
  14197. "id": "title-wrapper"
  14198. }, [vue.createVNode("h3", {
  14199. "class": "thread-title"
  14200. }, [PageData.thread.title]), vue.createVNode(_sfc_main$m, {
  14201. "class": "forum-wrapper-button",
  14202. "noBorder": true
  14203. }, {
  14204. default: () => [vue.createVNode("img", {
  14205. "class": "forum-icon",
  14206. "src": forumIconLink,
  14207. "alt": ""
  14208. }, null), vue.createVNode("a", {
  14209. "class": "forum-name",
  14210. "href": `/f?kw=${PageData.forum.name_url}`,
  14211. "target": "_blank"
  14212. }, [PageData.forum.forum_name, vue.createTextVNode(" 吧")]), vue.createVNode("div", {
  14213. "class": "button-container"
  14214. }, [vue.createVNode(_sfc_main$m, {
  14215. "class": "icon forum-button add-forum-button",
  14216. "noBorder": true
  14217. }, {
  14218. default: () => [PageData.user.is_like ? "check" : "add"]
  14219. })])]
  14220. })]), DOMS(true, ".content"), DOMS(true, "#pb_content"));
  14221. bindFloatMessage(DOMS(true, ".forum-wrapper-button"), `关注 ${PageData.forum.member_count},帖子 ${PageData.forum.post_num}`);
  14222. DOMS(true, ".add-forum-button", "button").addEventListener("click", function() {
  14223. DOMS(true, "#j_head_focus_btn", "button").click();
  14224. });
  14225. (_a = DOMS(true, ".sign-in-button", "button")) == null ? void 0 : _a.addEventListener("click", function() {
  14226. DOMS(true, ".j_signbtn", "button").click();
  14227. });
  14228. threadFloorsObserver.addEvent(function() {
  14229. if (DOMS(".d_author").length === 0)
  14230. return;
  14231. thread2 = threadParser();
  14232. forEach(DOMS(".d_post_content_main", "div", threadList), (floor, i) => {
  14233. const authorContainer = createAuthorContainer(i);
  14234. floor.insertBefore(authorContainer, floor.firstChild);
  14235. });
  14236. forEach(DOMS(".d_author"), (el) => el.remove());
  14237. });
  14238. function createAuthorContainer(index2) {
  14239. const authorContainer = templateCreate("div", {
  14240. class: "author-container"
  14241. });
  14242. thread2.cotents[index2].profile.nameAnchor.classList.add("anchor");
  14243. authorContainer.appendChild(thread2.cotents[index2].profile.avatar);
  14244. authorContainer.appendChild(thread2.cotents[index2].profile.nameAnchor);
  14245. const badgeContainer = appendJSX(vue.createVNode("div", {
  14246. "class": "badge-container"
  14247. }, null), authorContainer);
  14248. appendJSX(vue.createVNode("div", {
  14249. "class": `floor-badge level-${levelToClass(thread2.cotents[index2].profile.level)}`
  14250. }, [vue.createVNode("div", {
  14251. "class": "badge-level"
  14252. }, [thread2.cotents[index2].profile.level]), vue.createVNode("div", {
  14253. "class": "badge-title"
  14254. }, [thread2.cotents[index2].profile.badgeTitle])]), badgeContainer.el);
  14255. if (thread2.cotents[index2].isLouzhu)
  14256. appendJSX(vue.createVNode("div", {
  14257. "class": "floor-badge"
  14258. }, [vue.createTextVNode("楼主")]), badgeContainer.el);
  14259. return authorContainer;
  14260. }
  14261. const avatarObserver = new IntersectionObserver(function(entries, observer) {
  14262. forEach(entries, function(entry) {
  14263. if (entry.isIntersecting) {
  14264. const avatar = entry.target.children[0];
  14265. const lazyLink = avatar.getAttribute("data-tb-lazyload");
  14266. if (avatar.src !== lazyLink) {
  14267. if (lazyLink)
  14268. avatar.src = lazyLink;
  14269. else
  14270. observer.unobserve(entry.target);
  14271. } else {
  14272. observer.unobserve(entry.target);
  14273. }
  14274. }
  14275. });
  14276. }, {
  14277. root: null,
  14278. rootMargin: "0px",
  14279. threshold: 0.5
  14280. });
  14281. forEach(thread2.cotents, (content) => {
  14282. avatarObserver.observe(content.profile.avatar);
  14283. });
  14284. threadCommentsObserver.addEvent(() => {
  14285. forEach(DOMS(".lzl_cnt"), (el) => {
  14286. forEach(el.childNodes, (node) => {
  14287. if (node)
  14288. node.nodeType === 3 ? node.remove() : void 0;
  14289. });
  14290. });
  14291. });
  14292. }
  14293. const pagerVNodes = [];
  14294. const insertPager = (parent, position, additionalStyles) => {
  14295. const {
  14296. vnode: pagerVNode
  14297. } = insertJSX(createPager(additionalStyles), parent, position ?? void 0);
  14298. pagerVNodes.push(pagerVNode);
  14299. function createPager(additionalStyles2) {
  14300. const pagerComponent = vue.createVNode(Pager$1, {
  14301. "total": PageData.pager.total_page,
  14302. "current": PageData.pager.cur_page,
  14303. "showPagers": PageData.pager.total_page > 1,
  14304. "pagerChange": function(page) {
  14305. pager.jumpTo(page);
  14306. forEach(pagerVNodes, (pagerVNode2) => {
  14307. pagerVNode2.component.exposeProxy.current = page;
  14308. });
  14309. },
  14310. "style": parseCSSRule({
  14311. width: "100%",
  14312. padding: "0",
  14313. ...additionalStyles2
  14314. })
  14315. }, {
  14316. tailSlot: () => `回帖 ${PageData.thread.reply_num}`
  14317. });
  14318. return pagerComponent;
  14319. }
  14320. };
  14321. insertPager(pbContent, pbContent.firstChild, {
  14322. marginBottom: "24px",
  14323. position: PageData.pager.total_page <= 1 ? "absolute" : "",
  14324. right: PageData.pager.total_page <= 1 ? "48px" : ""
  14325. });
  14326. createTextbox();
  14327. async function createTextbox() {
  14328. await waitUntil(() => !isNil(floatBar.get()));
  14329. await waitUntil(() => !isNil(DOMS(true, "#ueditor_replace")));
  14330. if (!some(floatBar.buttons(), {
  14331. type: "post"
  14332. })) {
  14333. floatBar.add("post", showEditor, void 0, void 0, 2);
  14334. }
  14335. const postButton = find$1(floatBar.buttons(), (button) => {
  14336. return button.type === "post";
  14337. });
  14338. postButton == null ? void 0 : postButton.el.addEventListener("click", showEditor);
  14339. insertPager(pbContent, pbContent.lastChild, {
  14340. paddingTop: "24px"
  14341. });
  14342. appendJSX(vue.createVNode("div", {
  14343. "id": "thread-jsx-components"
  14344. }, [vue.createVNode(_sfc_main$m, {
  14345. "class": "dummy-button",
  14346. "noBorder": true,
  14347. "onClick": showEditor
  14348. }, {
  14349. default: () => [vue.createTextVNode("回复帖子")]
  14350. })]), pbContent);
  14351. function showEditor() {
  14352. const ueditor = function() {
  14353. if (DOMS(".edui-container").length > 0)
  14354. return DOMS(true, ".edui-container");
  14355. return DOMS(true, "#ueditor_replace");
  14356. }();
  14357. renderDialog(ThreadEditor, {
  14358. ueditor,
  14359. type: "reply"
  14360. }, {
  14361. forced: true,
  14362. blurEffect: false,
  14363. darker: true
  14364. });
  14365. }
  14366. }
  14367. }
  14368. setTheme(themeType.get());
  14369. darkPrefers.addEventListener("change", () => setTheme(themeType.get()));
  14370. Promise.all([
  14371. loadDynamicCSS(),
  14372. loadTiebaCSS(),
  14373. index$g(),
  14374. thread(),
  14375. parseUserModules(
  14376. /* @__PURE__ */ Object.assign({ "./modules/easy-jump/index.ts": () => Promise.resolve().then(() => index$f), "./modules/no-login/index.ts": () => Promise.resolve().then(() => index$d), "./modules/notrans-emojis/index.ts": () => Promise.resolve().then(() => index$b), "./modules/portal/index.ts": () => Promise.resolve().then(() => index$9), "./modules/remixed-theme/index.ts": () => Promise.resolve().then(() => index$7), "./modules/shield/index.ts": () => Promise.resolve().then(() => index$5), "./modules/tieba-tags/index.ts": () => Promise.resolve().then(() => index$3), "./modules/toolkit/index.ts": () => Promise.resolve().then(() => index$1) }),
  14377. (module2) => {
  14378. AllModules().push(module2);
  14379. }
  14380. ),
  14381. document.addEventListener("DOMContentLoaded", function() {
  14382. if (currentPageType() === "thread") {
  14383. threadFloorsObserver.observe();
  14384. threadCommentsObserver.observe();
  14385. }
  14386. if (currentPageType() === "index") {
  14387. if (!pageExtension.get().index)
  14388. legacyIndexFeedsObserver.observe();
  14389. }
  14390. if (currentPageType() === "forum") {
  14391. forumThreadsObserver.observe();
  14392. }
  14393. })
  14394. ]);
  14395. window.addEventListener("load", function() {
  14396. checkUpdateAndNotify();
  14397. });
  14398. waitUntil(() => !isNil(document.body)).then(function() {
  14399. if (wideScreen.get().noLimit) {
  14400. document.body.classList.add("shrink-view");
  14401. } else {
  14402. const shrinkListener = throttle(function() {
  14403. if (window.innerWidth <= wideScreen.get().maxWidth) {
  14404. document.body.classList.add("shrink-view");
  14405. } else {
  14406. document.body.classList.remove("shrink-view");
  14407. }
  14408. }, 200);
  14409. shrinkListener();
  14410. window.addEventListener("resize", shrinkListener);
  14411. }
  14412. });
  14413. loadPerf();
  14414. console.info(REMIXED);
  14415. const tiebaForum = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
  14416. __proto__: null
  14417. }, Symbol.toStringTag, { value: "Module" }));
  14418. const index$e = {
  14419. id: "easy-jump",
  14420. name: "直链跳转",
  14421. author: "锯条",
  14422. version: "1.0.2",
  14423. brief: "链接跳转避免二次确认",
  14424. description: `自动跳转至分享链接的原始地址,不再进行中转(不处理被严重警告的链接)`,
  14425. scope: /jump2?.bdimg.com\/safecheck\//,
  14426. runAt: "immediately",
  14427. entry: main$6
  14428. };
  14429. function main$6() {
  14430. afterHead(function() {
  14431. injectCSSRule("html", {
  14432. backgroundColor: "var(--page-background)"
  14433. });
  14434. injectCSSRule("body", {
  14435. display: "none"
  14436. });
  14437. });
  14438. waitUntil(() => DOMS(".link").length > 0).then(function() {
  14439. const link = DOMS(".link")[0].innerText;
  14440. location.href = link;
  14441. });
  14442. }
  14443. const index$f = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
  14444. __proto__: null,
  14445. default: index$e
  14446. }, Symbol.toStringTag, { value: "Module" }));
  14447. const index$c = {
  14448. id: "nologin-tieba",
  14449. name: "免登录(不可用)浏览",
  14450. author: "锯条",
  14451. version: "1.0",
  14452. brief: "免登录(不可用)浏览贴吧",
  14453. description: `始终伪装为已登录(不可用)状态,让免登录(不可用)浏览和已登录(不可用)基本一致`,
  14454. scope: ["thread"],
  14455. runAt: "DOMLoaded",
  14456. entry: main$5
  14457. };
  14458. function main$5() {
  14459. if (PageData.user.is_login)
  14460. return;
  14461. PageData.user.is_login = 1;
  14462. }
  14463. const index$d = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
  14464. __proto__: null,
  14465. default: index$c
  14466. }, Symbol.toStringTag, { value: "Module" }));
  14467. const index$a = {
  14468. id: "notrans-emojis",
  14469. name: "别动我的 emoji😠",
  14470. author: "锯条",
  14471. version: "1.0",
  14472. brief: "拒绝替换我的 emoji",
  14473. description: "原版贴吧会将部分emoji表情替换为旧版,该模块会让这些emoji重新跟随系统样式",
  14474. scope: true,
  14475. runAt: "afterHead",
  14476. entry: main$4
  14477. };
  14478. function main$4() {
  14479. const indexRegExp = new RegExp("(?<=nickemoji\\/).*?(?=.png)", "gi");
  14480. const emojis = [
  14481. "º",
  14482. "◎",
  14483. "▫",
  14484. "◆",
  14485. "♤",
  14486. "♀",
  14487. "♂",
  14488. "ლ",
  14489. "♬",
  14490. "☞",
  14491. "☜",
  14492. "✆",
  14493. "☎",
  14494. "♋",
  14495. "Ω",
  14496. "℃",
  14497. "℉",
  14498. "😄",
  14499. "😍",
  14500. "😘",
  14501. "😚",
  14502. "😜",
  14503. "😳",
  14504. "😁",
  14505. "😞",
  14506. "😢",
  14507. "😂",
  14508. "😫",
  14509. "😨",
  14510. "😱",
  14511. "😡",
  14512. "😷",
  14513. "😲",
  14514. "😈",
  14515. "🐷",
  14516. "🐶",
  14517. "🐑",
  14518. "🐵",
  14519. "🐨",
  14520. "🐴",
  14521. "🐼",
  14522. "🐯",
  14523. "🍪",
  14524. "🍺",
  14525. "🍦",
  14526. "🍭",
  14527. "🍗",
  14528. "🍼",
  14529. "🔯",
  14530. "🍒",
  14531. "👀",
  14532. "🐭",
  14533. "😇",
  14534. "😺",
  14535. "😻",
  14536. "🙀",
  14537. "😿",
  14538. "😹",
  14539. "😾",
  14540. "👹",
  14541. "👺",
  14542. "🌞",
  14543. "🌝",
  14544. "🌚",
  14545. "🌜",
  14546. "🌛",
  14547. "👦",
  14548. "👧",
  14549. "🎎",
  14550. "🌸",
  14551. "🍀",
  14552. "🌹",
  14553. "🌻",
  14554. "🌺",
  14555. "🍁",
  14556. "🌿",
  14557. "🍄",
  14558. "🌵",
  14559. "🌴",
  14560. "🌳",
  14561. "🌰",
  14562. "🌱",
  14563. "🌼",
  14564. "🌐",
  14565. "🌙",
  14566. "🌋",
  14567. "🌌",
  14568. "⛅",
  14569. "⚡",
  14570. "☔",
  14571. "⛄",
  14572. "🌀",
  14573. "🌈",
  14574. "🌊",
  14575. "🔥",
  14576. "✨",
  14577. "🌟",
  14578. "💥",
  14579. "💫",
  14580. "💢",
  14581. "💦",
  14582. "💧",
  14583. "💤",
  14584. "💨",
  14585. "🎀",
  14586. "🌂",
  14587. "💄",
  14588. "💕",
  14589. "💖",
  14590. "💞",
  14591. "💘",
  14592. "💌",
  14593. "💋",
  14594. "💝",
  14595. "🎒",
  14596. "🎓",
  14597. "🎏",
  14598. "🎃",
  14599. "👻",
  14600. "🎅",
  14601. "🎄",
  14602. "🎁",
  14603. "🙈",
  14604. "🐒",
  14605. "💯",
  14606. "👯",
  14607. "💍"
  14608. ];
  14609. const transformed = [
  14610. "1-1.png",
  14611. "1-2.png",
  14612. "1-4.png",
  14613. "1-5.png",
  14614. "1-6.png",
  14615. "1-7.png",
  14616. "1-8.png",
  14617. "1-9.png",
  14618. "1-10.png",
  14619. "1-11.png",
  14620. "1-12.png",
  14621. "1-13.png",
  14622. "1-14.png",
  14623. "1-15.png",
  14624. "1-16.png",
  14625. "1-17.png",
  14626. "1-18.png",
  14627. "1-19.png",
  14628. "1-20.png",
  14629. "1-21.png",
  14630. "1-22.png",
  14631. "1-23.png",
  14632. "1-24.png",
  14633. "1-25.png",
  14634. "1-26.png",
  14635. "1-27.png",
  14636. "1-28.png",
  14637. "1-29.png",
  14638. "1-30.png",
  14639. "1-31.png",
  14640. "1-32.png",
  14641. "1-33.png",
  14642. "1-34.png",
  14643. "1-35.png",
  14644. "2-1.png",
  14645. "2-2.png",
  14646. "2-3.png",
  14647. "2-4.png",
  14648. "2-5.png",
  14649. "2-6.png",
  14650. "2-7.png",
  14651. "2-8.png",
  14652. "2-9.png",
  14653. "2-10.png",
  14654. "2-11.png",
  14655. "2-12.png",
  14656. "2-13.png",
  14657. "2-14.png",
  14658. "2-15.png",
  14659. "2-16.png",
  14660. "2-17.png",
  14661. "2-18.png",
  14662. "2-19.png",
  14663. "2-20.png",
  14664. "2-21.png",
  14665. "2-22.png",
  14666. "2-23.png",
  14667. "2-24.png",
  14668. "2-25.png",
  14669. "2-26.png",
  14670. "2-27.png",
  14671. "2-28.png",
  14672. "2-29.png",
  14673. "2-30.png",
  14674. "2-31.png",
  14675. "2-32.png",
  14676. "2-33.png",
  14677. "2-34.png",
  14678. "2-35.png",
  14679. "3-1.png",
  14680. "3-2.png",
  14681. "3-3.png",
  14682. "3-4.png",
  14683. "3-5.png",
  14684. "3-6.png",
  14685. "3-7.png",
  14686. "3-8.png",
  14687. "3-9.png",
  14688. "3-10.png",
  14689. "3-11.png",
  14690. "3-12.png",
  14691. "3-13.png",
  14692. "3-14.png",
  14693. "3-15.png",
  14694. "3-16.png",
  14695. "3-17.png",
  14696. "3-18.png",
  14697. "3-19.png",
  14698. "3-20.png",
  14699. "3-21.png",
  14700. "3-22.png",
  14701. "3-23.png",
  14702. "3-24.png",
  14703. "3-25.png",
  14704. "3-26.png",
  14705. "3-27.png",
  14706. "3-28.png",
  14707. "3-29.png",
  14708. "3-30.png",
  14709. "3-31.png",
  14710. "3-32.png",
  14711. "3-33.png",
  14712. "3-34.png",
  14713. "3-35.png",
  14714. "4-1.png",
  14715. "4-2.png",
  14716. "4-3.png",
  14717. "4-4.png",
  14718. "4-5.png",
  14719. "4-6.png",
  14720. "4-7.png",
  14721. "4-8.png",
  14722. "4-9.png",
  14723. "4-10.png",
  14724. "4-11.png",
  14725. "4-12.png",
  14726. "4-13.png",
  14727. "4-14.png",
  14728. "4-15.png",
  14729. "4-16.png",
  14730. "4-17.png",
  14731. "4-18.png",
  14732. "4-19.png",
  14733. "4-20.png",
  14734. "4-21.png",
  14735. "4-22.png",
  14736. "4-23.png"
  14737. ];
  14738. threadCommentsObserver.addEvent(() => {
  14739. try {
  14740. forEach(DOMS(`
  14741. .p_author_name:has(.nicknameEmoji),
  14742. .at:has(.nicknameEmoji),
  14743. .lzl_content_main:has(.nicknameEmoji)
  14744. `), (el) => {
  14745. updateEmojis(el);
  14746. });
  14747. } catch (error) {
  14748. forEach(DOMS(".p_author_name, .at, .lzl_content_main"), (el) => {
  14749. if (includes(el.classList, "nicknameEmoji")) {
  14750. updateEmojis(el);
  14751. }
  14752. });
  14753. }
  14754. });
  14755. legacyIndexFeedsObserver.addEvent(() => {
  14756. try {
  14757. forEach(DOMS(`
  14758. .new_list .post_author:has(.nicknameEmoji),
  14759. .userinfo_username:has(.nicknameEmoji)
  14760. `), (el) => {
  14761. updateEmojis(el);
  14762. });
  14763. } catch (error) {
  14764. forEach(DOMS(".newlist .post_author, .userinfo_username"), (el) => {
  14765. if (includes(el.classList, "nicknameEmoji")) {
  14766. updateEmojis(el);
  14767. }
  14768. });
  14769. }
  14770. });
  14771. forumThreadsObserver.addEvent(() => {
  14772. try {
  14773. forEach(DOMS(".threadlist_author a:has(.nicknameEmoji)"), (el) => {
  14774. updateEmojis(el);
  14775. });
  14776. } catch (error) {
  14777. forEach(DOMS(".threadlist_author a"), (el) => {
  14778. if (includes(el.classList, "nicknameEmoji")) {
  14779. updateEmojis(el);
  14780. }
  14781. });
  14782. }
  14783. });
  14784. function updateEmojis(elem) {
  14785. const arrIndex = elem.innerHTML.match(indexRegExp);
  14786. arrIndex == null ? void 0 : arrIndex.forEach((index2) => {
  14787. const emoji = emojis[transformed.indexOf(`${index2}.png`)];
  14788. const arrInner = elem.innerHTML.split(RegExp(
  14789. `<img[^>]*?${index2}.png(?:[^>]*?)*>`,
  14790. "g"
  14791. ));
  14792. elem.innerHTML = arrInner.join(decodeURIComponent(emoji));
  14793. });
  14794. }
  14795. }
  14796. const index$b = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
  14797. __proto__: null,
  14798. default: index$a
  14799. }, Symbol.toStringTag, { value: "Module" }));
  14800. const index$8 = {
  14801. id: "portal",
  14802. name: "传送门",
  14803. author: "锯条",
  14804. version: "1.1.1",
  14805. brief: "为贴子中的b站番号添加跳转链接",
  14806. description: `该模块可以识别贴子中的 av/BV 号并将其转换为超链接`,
  14807. scope: ["thread"],
  14808. runAt: "immediately",
  14809. entry: main$3
  14810. };
  14811. function main$3() {
  14812. const LINKED_CLASS = "linked";
  14813. const avRegExp = new RegExp("(?<!:\\/\\/www.bilibili.com\\/video\\/)av[1-9]\\d*", "gi");
  14814. const BVRegExp = new RegExp("(?<!:\\/\\/www.bilibili.com\\/video\\/)BV[A-Za-z0-9]{10}", "g");
  14815. document.addEventListener("DOMContentLoaded", () => {
  14816. threadCommentsObserver.addEvent(biliPortal);
  14817. });
  14818. function biliPortal() {
  14819. addBiliLinks(".d_post_content");
  14820. addBiliLinks(".lzl_cnt .lzl_content_main");
  14821. function addBiliLinks(selector) {
  14822. forEach(DOMS(selector), (elem) => {
  14823. var _a, _b, _c, _d;
  14824. if (elem.classList.contains(LINKED_CLASS))
  14825. return;
  14826. elem.classList.add(LINKED_CLASS);
  14827. if (((_a = elem.textContent) == null ? void 0 : _a.toLowerCase().indexOf("av")) !== -1) {
  14828. const avs = (_b = elem.textContent) == null ? void 0 : _b.match(avRegExp);
  14829. bindingLinks(avs ?? void 0, true);
  14830. }
  14831. if (((_c = elem.textContent) == null ? void 0 : _c.indexOf("BV")) !== -1) {
  14832. const BVs = (_d = elem.textContent) == null ? void 0 : _d.match(BVRegExp);
  14833. bindingLinks(BVs ?? void 0);
  14834. }
  14835. function bindingLinks(array, lowerCase = false) {
  14836. if (!array)
  14837. return;
  14838. const hadHyperLink = [];
  14839. forEach(array, (videoID) => {
  14840. if (hadHyperLink.indexOf(videoID) === -1) {
  14841. hadHyperLink.push(videoID);
  14842. const htmlArray = elem.innerHTML.split(
  14843. RegExp(`(?<!://www.bilibili.com/video/)${videoID}`, "g")
  14844. );
  14845. if (lowerCase)
  14846. videoID = videoID.toLowerCase();
  14847. const linkedID = `<a href='https://www.bilibili.com/video/${videoID}' target='_blank'>${videoID}</a>`;
  14848. elem.innerHTML = htmlArray.join(linkedID);
  14849. }
  14850. });
  14851. }
  14852. });
  14853. }
  14854. }
  14855. }
  14856. const index$9 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
  14857. __proto__: null,
  14858. default: index$8
  14859. }, Symbol.toStringTag, { value: "Module" }));
  14860. const floatMessageCSS = "@keyframes kf-fade-in {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes kf-fade-out {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n@keyframes kf-dialog-in {\n 0% {\n opacity: 0;\n transform: scale(1.2);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes kf-zoom-in {\n 0% {\n transform: scale(0.72);\n }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes kf-fade-zoom-in {\n 0% {\n opacity: 0;\n transform: scale(0.72);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\nhtml {\n padding: 0;\n margin: 0;\n text-align: justify;\n}\n\nbody {\n overflow-x: hidden;\n overflow-y: scroll;\n overflow: hidden scroll;\n padding: 0;\n margin: 0;\n font-family: var(--code-zh);\n}\nbody[no-scrollbar] {\n overflow: hidden;\n}\n\ndiv,\np {\n margin: 0;\n}\n\nselect {\n padding: 1px 8px;\n border: 1px solid var(--border-color);\n border-radius: 8px;\n cursor: pointer;\n}\n\noption {\n cursor: pointer;\n}\n\noption:checked {\n background-color: var(--tieba-theme-color);\n color: var(--default-background);\n}\n\na {\n color: inherit;\n -webkit-text-decoration: none;\n text-decoration: none;\n word-break: break-all;\n}\n\n.dialogJ {\n position: fixed !important;\n top: 50% !important;\n left: 50% !important;\n}\n\n.dialogJ {\n transform: translate(-50%, -50%);\n}\n\n.float-message {\n position: fixed;\n z-index: 99999;\n display: none;\n overflow: hidden;\n box-sizing: border-box;\n padding: 4px 6px;\n border: 1px solid var(--border-color);\n border-radius: 6px;\n background-color: var(--default-background);\n font-size: 14px;\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.01);\n animation: kf-fade-in 0.2s;\n}\nhtml.dark-theme .float-message {\n box-shadow: 0 0 16px rgba(0, 0, 0, 0.2);\n}\n.float-message .float-content {\n display: flex;\n overflow: auto;\n}";
  14861. const userButtonCSS = "@keyframes kf-fade-in {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes kf-fade-out {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n@keyframes kf-dialog-in {\n 0% {\n opacity: 0;\n transform: scale(1.2);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes kf-zoom-in {\n 0% {\n transform: scale(0.72);\n }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes kf-fade-zoom-in {\n 0% {\n opacity: 0;\n transform: scale(0.72);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}";
  14862. const floatBarCSS = '@keyframes kf-fade-in {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n@keyframes kf-fade-out {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n@keyframes kf-dialog-in {\n 0% {\n opacity: 0;\n transform: scale(1.2);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes kf-zoom-in {\n 0% {\n transform: scale(0.72);\n }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes kf-fade-zoom-in {\n 0% {\n opacity: 0;\n transform: scale(0.72);\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\nhtml {\n padding: 0;\n margin: 0;\n text-align: justify;\n}\n\nbody {\n overflow-x: hidden;\n overflow-y: scroll;\n overflow: hidden scroll;\n padding: 0;\n margin: 0;\n font-family: var(--code-zh);\n}\nbody[no-scrollbar] {\n overflow: hidden;\n}\n\ndiv,\np {\n margin: 0;\n}\n\nselect {\n padding: 1px 8px;\n border: 1px solid var(--border-color);\n border-radius: 8px;\n cursor: pointer;\n}\n\noption {\n cursor: pointer;\n}\n\noption:checked {\n background-color: var(--tieba-theme-color);\n color: var(--default-background);\n}\n\na {\n color: inherit;\n -webkit-text-decoration: none;\n text-decoration: none;\n word-break: break-all;\n}\n\n.dialogJ {\n position: fixed !important;\n top: 50% !important;\n left: 50% !important;\n}\n\n.dialogJ {\n transform: translate(-50%, -50%);\n}\n\n.tbui_aside_float_bar {\n background-color: var(--very-light-background) !important;\n}\n\n.tbui_aside_float_bar {\n bottom: 20px;\n left: calc(50% + var(--content-max) / 2 + 20px);\n display: flex;\n overflow: hidden;\n width: -moz-max-content;\n width: max-content;\n flex-direction: column;\n border-radius: 8px;\n margin-left: 0;\n gap: 4px;\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.01);\n}\nhtml.dark-theme .tbui_aside_float_bar {\n box-shadow: 0 0 16px rgba(0, 0, 0, 0.2);\n}\n.shrink-view .tbui_aside_float_bar {\n bottom: 0;\n left: calc(100% - 40px);\n}\n.tbui_aside_float_bar .tbui_aside_fbar_button {\n margin: 0 !important;\n}\n.tbui_aside_float_bar .tbui_aside_fbar_button {\n border-radius: 0;\n background-color: var(--default-background);\n transition: 0.4s;\n}\n.tbui_aside_float_bar .tbui_aside_fbar_button a {\n border-radius: 0;\n}\n.tbui_aside_float_bar .tbui_aside_fbar_button a:hover {\n color: var(--tieba-theme-color);\n}\n.tbui_aside_float_bar .tbui_aside_fbar_button a:active {\n color: var(--tieba-theme-fore);\n}\n.tbui_aside_float_bar .tbui_aside_fbar_button[style*="visibility: hidden"] {\n margin-top: -4px !important;\n}\n.tbui_aside_float_bar .tbui_aside_fbar_button[style*="visibility: hidden"] {\n height: 0;\n}';
  14863. const _hoisted_1$2 = {
  14864. key: 0,
  14865. class: "menu-separator"
  14866. };
  14867. const _hoisted_2$2 = {
  14868. key: 0,
  14869. class: "icon"
  14870. };
  14871. const _hoisted_3$2 = { class: "menu-title" };
  14872. const _hoisted_4$2 = {
  14873. key: 0,
  14874. class: "menu-inner"
  14875. };
  14876. const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
  14877. __name: "dropdown-menu",
  14878. props: {
  14879. menuItems: {},
  14880. blurEffect: { type: Boolean }
  14881. },
  14882. emits: ["RequestClose"],
  14883. setup(__props, { emit: __emit }) {
  14884. const props = __props;
  14885. const emit = __emit;
  14886. vue.onMounted(() => {
  14887. setTimeout(() => {
  14888. window.addEventListener("click", () => {
  14889. setTimeout(() => {
  14890. emit("RequestClose");
  14891. }, 100);
  14892. });
  14893. window.addEventListener("focusin", (ev) => {
  14894. if (!findParent(ev.target, "dropdown-menu")) {
  14895. emit("RequestClose");
  14896. }
  14897. });
  14898. }, 100);
  14899. });
  14900. return (_ctx, _cache) => {
  14901. return vue.openBlock(), vue.createElementBlock("div", {
  14902. class: vue.normalizeClass(["dropdown-menu", _ctx.blurEffect ? "blur-effect" : ""])
  14903. }, [
  14904. (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(props.menuItems, (menuItem) => {
  14905. return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [
  14906. typeof menuItem === "string" ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$2)) : (vue.openBlock(), vue.createBlock(_sfc_main$m, {
  14907. key: 1,
  14908. class: "menu-item",
  14909. "is-anchor": menuItem.href !== void 0,
  14910. href: menuItem.href ? menuItem.href : "javascript:;",
  14911. onClick: menuItem.click,
  14912. target: menuItem.href ? "_blank" : "",
  14913. "no-border": ""
  14914. }, {
  14915. default: vue.withCtx(() => [
  14916. menuItem.icon ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$2, vue.toDisplayString(menuItem.icon), 1)) : vue.createCommentVNode("", true),
  14917. vue.createElementVNode("div", _hoisted_3$2, [
  14918. vue.createTextVNode(vue.toDisplayString(menuItem.title) + " ", 1),
  14919. menuItem.innerText ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_4$2, vue.toDisplayString(menuItem.innerText), 1)) : vue.createCommentVNode("", true)
  14920. ])
  14921. ]),
  14922. _: 2
  14923. }, 1032, ["is-anchor", "href", "onClick", "target"]))
  14924. ], 64);
  14925. }), 256))
  14926. ], 2);
  14927. };
  14928. }
  14929. });
  14930. const DropdownMenu = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-50de6ad2"]]);
  14931. const _withScopeId$1 = (n) => (vue.pushScopeId("data-v-4cad486c"), n = n(), vue.popScopeId(), n);
  14932. const _hoisted_1$1 = { id: "fold-bar" };
  14933. const _hoisted_2$1 = { id: "nav-container" };
  14934. const _hoisted_3$1 = { class: "left-container" };
  14935. const _hoisted_4$1 = ["src"];
  14936. const _hoisted_5$1 = /* @__PURE__ */ _withScopeId$1(() => /* @__PURE__ */ vue.createElementVNode("p", { class: "nav-title" }, "贴吧", -1));
  14937. const _hoisted_6$1 = { class: "right-container" };
  14938. const _hoisted_7$1 = { class: "middle-container" };
  14939. const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
  14940. __name: "nav-bar",
  14941. props: {
  14942. hideMode: { default: navBarHideMode.get() }
  14943. },
  14944. setup(__props) {
  14945. const props = __props;
  14946. const navBar = vue.ref();
  14947. const teiggerHide = vue.ref(false);
  14948. const navAvatar = vue.ref();
  14949. const userPortrait = vue.ref("");
  14950. const middleMenu = vue.ref({});
  14951. const userMenu = vue.ref([]);
  14952. const extendMenu = vue.ref([]);
  14953. init();
  14954. vue.onMounted(async function() {
  14955. {
  14956. waitUntil(() => userPortrait.value !== "").then(function() {
  14957. if (navAvatar.value)
  14958. navAvatar.value.src = tiebaAPI.URL_profile(userPortrait.value);
  14959. });
  14960. }
  14961. });
  14962. async function init() {
  14963. await waitUntil(() => PageData !== void 0).then(() => {
  14964. userPortrait.value = PageData.user.portrait;
  14965. loadNavMenuContent();
  14966. });
  14967. forEach(DOMS(".menu-trigger", "button", DOMS(true, "#nav-bar")), (el) => {
  14968. el.addEventListener("mousemove", function(e) {
  14969. e.stopPropagation();
  14970. const menu = el.lastElementChild;
  14971. const elRect = el.getBoundingClientRect();
  14972. const menuCoord = getFloatCoord(menu, { x: elRect.left + elRect.width / 2, y: 0 }, "middle");
  14973. menu.style.left = `${menuCoord.x}px`;
  14974. menu.style.top = "48px";
  14975. });
  14976. });
  14977. switch (props.hideMode) {
  14978. case "alwaysFold":
  14979. teiggerHide.value = true;
  14980. break;
  14981. case "fold":
  14982. case "hideWhenScroll": {
  14983. const modeClass = props.hideMode === "fold" ? "fold" : "hide";
  14984. const threshold = 50, timeout = 1e3;
  14985. let lastScrollY = window.scrollY;
  14986. let timer = -1;
  14987. const handle = throttle(function() {
  14988. var _a, _b;
  14989. if (window.scrollY > lastScrollY + threshold) {
  14990. (_a = navBar.value) == null ? void 0 : _a.classList.add(modeClass);
  14991. teiggerHide.value = true;
  14992. clearTimeout(timer);
  14993. } else if (window.scrollY < lastScrollY - threshold) {
  14994. (_b = navBar.value) == null ? void 0 : _b.classList.remove(modeClass);
  14995. teiggerHide.value = false;
  14996. clearTimeout(timer);
  14997. } else {
  14998. clearTimeout(timer);
  14999. timer = setTimeout(handle, timeout);
  15000. }
  15001. lastScrollY = window.scrollY;
  15002. });
  15003. window.addEventListener("scroll", handle);
  15004. break;
  15005. }
  15006. }
  15007. }
  15008. async function login() {
  15009. const loginButton = DOMS(".u_login");
  15010. const directLoginButton = DOMS("#TANGRAM__PSP_24__submit");
  15011. if (directLoginButton.length > 0) {
  15012. const confirmDirect = await messageBox({
  15013. title: "快速登录(不可用)",
  15014. message: "检测到快速登录(不可用)入口,是否尝试直接登录(不可用)?",
  15015. type: "OkCancel"
  15016. });
  15017. if (confirmDirect === "positive") {
  15018. directLoginButton[0].click();
  15019. } else {
  15020. regularLogin();
  15021. }
  15022. } else {
  15023. regularLogin();
  15024. }
  15025. function regularLogin() {
  15026. loginButton.length > 0 ? DOMS("a", loginButton[0])[0].click() : cannotLogin();
  15027. }
  15028. function cannotLogin() {
  15029. toast({ message: "未检测到可用的登录(不可用)入口,请刷新重试", type: "warning" });
  15030. }
  15031. }
  15032. function loadNavMenuContent() {
  15033. middleMenu.value = {
  15034. "消息": [
  15035. {
  15036. title: "查看私信",
  15037. href: "/im/pcmsg"
  15038. },
  15039. {
  15040. title: "查看回复",
  15041. href: `/i/sys/jump?u=${userPortrait.value}&type=replyme`
  15042. },
  15043. {
  15044. title: "查看 @",
  15045. href: `/i/sys/jump?u=${userPortrait.value}&type=atme`
  15046. },
  15047. "separator",
  15048. {
  15049. title: "查看好友申请",
  15050. href: `/i/sys/jump?u=${userPortrait.value}&type=friendapply`
  15051. },
  15052. {
  15053. title: "查看新粉丝",
  15054. href: `/i/sys/jump?u=${userPortrait.value}&type=fans`
  15055. },
  15056. "separator",
  15057. {
  15058. title: "我的收藏",
  15059. href: `/i/sys/jump?u=${userPortrait.value}&type=storethread`
  15060. },
  15061. {
  15062. title: "我的通知",
  15063. href: "/sysmsg/index?type=notity"
  15064. }
  15065. ],
  15066. "更多": [
  15067. {
  15068. title: "账号设置",
  15069. href: "//passport.baidu.com/?center&tpl=tb&aid=6&default_tab=3#3,0"
  15070. },
  15071. {
  15072. title: "贴吧设置",
  15073. href: `/home/profile?un=${PageData.user.name_url}`
  15074. },
  15075. "separator",
  15076. {
  15077. title: "服务中心",
  15078. href: "//tieba.baidu.com/pmc"
  15079. },
  15080. {
  15081. title: "问题反馈",
  15082. href: "//tieba.baidu.com/hermes/feedback"
  15083. }
  15084. ]
  15085. };
  15086. userMenu.value = [
  15087. {
  15088. title: "我的贴吧",
  15089. href: `/home/main?id=${userPortrait.value}&fr=userbar`
  15090. },
  15091. {
  15092. title: "我的收藏",
  15093. href: `/i/sys/jump?un=${PageData.user.user_name}${PageData.user.name_url}&type=storethread&st_mod=userbar&fr=tb0_pb`
  15094. }
  15095. ];
  15096. PageData.user.is_login ? userMenu.value.push("separator", {
  15097. title: "退出登录(不可用)",
  15098. click() {
  15099. DOMS("a", "a", DOMS(".u_logout")[0])[0].click();
  15100. }
  15101. }) : userMenu.value.push("separator", {
  15102. title: "登录(不可用)",
  15103. click() {
  15104. login();
  15105. }
  15106. });
  15107. extendMenu.value = [
  15108. {
  15109. title: "脚本设置",
  15110. click() {
  15111. renderDialog(Settings);
  15112. }
  15113. },
  15114. {
  15115. title: "检查更新",
  15116. click() {
  15117. checkUpdateAndNotify(true);
  15118. }
  15119. },
  15120. "separator",
  15121. {
  15122. title: "源代码仓库",
  15123. innerText: "GitHub",
  15124. href: GithubRepo
  15125. },
  15126. {
  15127. title: "源代码仓库",
  15128. innerText: "Gitee",
  15129. href: GiteeRepo
  15130. },
  15131. {
  15132. title: "切换至 GreasyFork",
  15133. href: "https://gf.qytechs.cn/zh-CN/scripts/460113"
  15134. }
  15135. ];
  15136. }
  15137. return (_ctx, _cache) => {
  15138. return vue.openBlock(), vue.createElementBlock("nav", {
  15139. ref_key: "navBar",
  15140. ref: navBar,
  15141. id: "nav-bar",
  15142. class: vue.normalizeClass(["nav-bar remove-default", { "fold": _ctx.hideMode === "alwaysFold", "blur-effect": !vue.unref(experimental).get().rasterEffect, "raster-effect": vue.unref(experimental).get().rasterEffect, "fixed-on-top": _ctx.hideMode === "fixedOnTop" }])
  15143. }, [
  15144. vue.withDirectives(vue.createElementVNode("div", _hoisted_1$1, null, 512), [
  15145. [vue.vShow, teiggerHide.value]
  15146. ]),
  15147. vue.createElementVNode("div", _hoisted_2$1, [
  15148. vue.createElementVNode("div", _hoisted_3$1, [
  15149. vue.createVNode(_sfc_main$m, {
  15150. class: "nav-button nav-title-container",
  15151. "is-anchor": "",
  15152. href: "/",
  15153. "no-border": "all"
  15154. }, {
  15155. default: vue.withCtx(() => [
  15156. vue.createElementVNode("img", {
  15157. src: vue.unref(getResource)("/assets/images/main/icon64.png"),
  15158. alt: "",
  15159. class: "nav-icon"
  15160. }, null, 8, _hoisted_4$1),
  15161. _hoisted_5$1
  15162. ]),
  15163. _: 1
  15164. })
  15165. ]),
  15166. vue.createElementVNode("div", _hoisted_6$1, [
  15167. vue.createElementVNode("div", _hoisted_7$1, [
  15168. (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(middleMenu.value, (menu, key) => {
  15169. return vue.openBlock(), vue.createBlock(_sfc_main$m, {
  15170. key,
  15171. class: "menu-trigger middle-menu-trigger",
  15172. "no-border": "all"
  15173. }, {
  15174. default: vue.withCtx(() => [
  15175. vue.createTextVNode(vue.toDisplayString(key) + " ", 1),
  15176. vue.createVNode(DropdownMenu, {
  15177. class: "nav-menu",
  15178. "menu-items": menu
  15179. }, null, 8, ["menu-items"])
  15180. ]),
  15181. _: 2
  15182. }, 1024);
  15183. }), 128))
  15184. ]),
  15185. vue.createVNode(_sfc_main$m, {
  15186. class: "nav-button menu-trigger avatar-button",
  15187. "no-border": "all"
  15188. }, {
  15189. default: vue.withCtx(() => [
  15190. vue.createElementVNode("img", {
  15191. ref_key: "navAvatar",
  15192. ref: navAvatar,
  15193. class: "nav-avatar"
  15194. }, null, 512),
  15195. vue.createVNode(DropdownMenu, {
  15196. class: "nav-menu",
  15197. "menu-items": userMenu.value
  15198. }, null, 8, ["menu-items"])
  15199. ]),
  15200. _: 1
  15201. }),
  15202. vue.createVNode(_sfc_main$m, {
  15203. class: "nav-button menu-trigger menu-button icon",
  15204. "shadow-border": "",
  15205. "no-border": "all"
  15206. }, {
  15207. default: vue.withCtx(() => [
  15208. vue.createTextVNode(" menu "),
  15209. vue.createVNode(DropdownMenu, {
  15210. class: "nav-menu",
  15211. "menu-items": extendMenu.value,
  15212. style: { "font-family": "initial" }
  15213. }, null, 8, ["menu-items"])
  15214. ]),
  15215. _: 1
  15216. })
  15217. ])
  15218. ])
  15219. ], 2);
  15220. };
  15221. }
  15222. });
  15223. const navBarVue = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-4cad486c"]]);
  15224. const navBarCSS = "#com_userbar {\n display: none;\n}";
  15225. function _navBar() {
  15226. injectCSSList(navBarCSS);
  15227. waitUntil(() => DOMS("#com_userbar").length > 0).then(function() {
  15228. const elder = DOMS("#com_userbar")[0];
  15229. const navWrapper = vue.createVNode("div", {
  15230. "id": "nav-wrapper",
  15231. "class": "nav-wrapper"
  15232. }, null);
  15233. insertJSX(navWrapper, document.body, elder);
  15234. renderComponent(navBarVue, DOMS("#nav-wrapper")[0]);
  15235. });
  15236. }
  15237. _navBar();
  15238. const index$6 = {
  15239. id: "remixed-theme",
  15240. name: "Tieba Remix 主题",
  15241. author: "锯条",
  15242. version: "0.3",
  15243. brief: "更现代的主题样式",
  15244. description: `包含新的样式、昼夜主题及其自动切换等功能`,
  15245. scope: true,
  15246. runAt: "immediately",
  15247. entry: main$2
  15248. };
  15249. const themeSheets = [];
  15250. function main$2() {
  15251. themeSheets.push(injectCSSList(userButtonCSS));
  15252. themeSheets.push(injectCSSList(floatBarCSS));
  15253. themeSheets.push(injectCSSList(floatMessageCSS));
  15254. fadeInElems.push(".tbui_aside_float_bar .svg-container");
  15255. fadeInElems.push(".d_badge_bright .d_badge_lv, .user_level .badge_index");
  15256. fadeInElems.forEach((selector) => {
  15257. injectCSSRule(selector, {
  15258. opacity: "0"
  15259. });
  15260. });
  15261. setCustomBackground();
  15262. document.addEventListener("DOMContentLoaded", () => {
  15263. DOMS(".post-tail-wrap .icon-jubao").forEach((elem) => {
  15264. elem.removeAttribute("src");
  15265. elem.after("举报");
  15266. });
  15267. threadFloorsObserver.addEvent(() => {
  15268. DOMS(".d_badge_lv").forEach((elem) => {
  15269. if (elem.textContent === "") {
  15270. let parent = elem;
  15271. while (!parent.classList.contains("l_badge")) {
  15272. if (parent.parentElement)
  15273. parent = parent.parentElement;
  15274. }
  15275. parent.style.display = "none";
  15276. }
  15277. });
  15278. });
  15279. });
  15280. window.addEventListener("load", () => {
  15281. fadeInLoad(".tbui_aside_float_bar .svg-container");
  15282. threadFloorsObserver.addEvent(() => {
  15283. const lvlClassHead = "tieba-lvl-";
  15284. const lvlGreen = `${lvlClassHead}green`;
  15285. const lvlBlue = `${lvlClassHead}blue`;
  15286. const lvlYellow = `${lvlClassHead}yellow`;
  15287. const lvlOrange = `${lvlClassHead}orange`;
  15288. DOMS(
  15289. ".d_badge_bawu1 .d_badge_lv, .d_badge_bawu2 .d_badge_lv, .badge_index"
  15290. ).forEach((elem) => {
  15291. if (elem.className.indexOf(lvlClassHead) !== -1)
  15292. return;
  15293. const lvl = parseInt(defaults(elem.textContent, "0"));
  15294. if (lvl >= 1 && lvl <= 3) {
  15295. elem.classList.add(lvlGreen);
  15296. } else if (lvl >= 4 && lvl <= 9) {
  15297. elem.classList.add(lvlBlue);
  15298. } else if (lvl >= 10 && lvl <= 15) {
  15299. elem.classList.add(lvlYellow);
  15300. } else if (lvl >= 16) {
  15301. elem.classList.add(lvlOrange);
  15302. }
  15303. });
  15304. fadeInLoad(".d_badge_bright .d_badge_lv, .user_level .badge_index");
  15305. });
  15306. themeSheets.forEach((sheet) => {
  15307. document.head.appendChild(sheet);
  15308. });
  15309. });
  15310. }
  15311. const index$7 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
  15312. __proto__: null,
  15313. default: index$6
  15314. }, Symbol.toStringTag, { value: "Module" }));
  15315. const shieldList = new UserKey("shieldList", []);
  15316. const _withScopeId = (n) => (vue.pushScopeId("data-v-64c498cf"), n = n(), vue.popScopeId(), n);
  15317. const _hoisted_1 = { class: "shield-container" };
  15318. const _hoisted_2 = {
  15319. key: 0,
  15320. class: "words-container"
  15321. };
  15322. const _hoisted_3 = { class: "icon" };
  15323. const _hoisted_4 = {
  15324. key: 1,
  15325. class: "empty-list-container"
  15326. };
  15327. const _hoisted_5 = { class: "shield-controls" };
  15328. const _hoisted_6 = { class: "submit-controls" };
  15329. const _hoisted_7 = { class: "regex-check" };
  15330. const _hoisted_8 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("label", { for: "use-regex" }, "正则表达式", -1));
  15331. const _hoisted_9 = { class: "user-scope" };
  15332. const _hoisted_10 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("label", { for: "user-scope" }, "屏蔽用户名", -1));
  15333. const _sfc_main = /* @__PURE__ */ vue.defineComponent({
  15334. __name: "module.shield",
  15335. setup(__props) {
  15336. const shieldListRef = vue.ref(shieldList.get());
  15337. const inputRule = vue.ref("");
  15338. const useRegex = vue.ref(false);
  15339. const scope = vue.ref("posts");
  15340. function inputKeyPress(e) {
  15341. if (e.key === "Enter") {
  15342. e.preventDefault();
  15343. updateShieldList();
  15344. }
  15345. }
  15346. function removeAll() {
  15347. shieldListRef.value.length = 0;
  15348. shieldList.remove();
  15349. }
  15350. function removeAllWithConfirm() {
  15351. if (confirm("确定要删除所有屏蔽规则吗?")) {
  15352. removeAll();
  15353. }
  15354. }
  15355. function updateShieldList() {
  15356. if (inputRule.value.length <= 0)
  15357. return;
  15358. const sh = {
  15359. rule: inputRule.value,
  15360. type: useRegex.value ? "regex" : "string",
  15361. scope: scope.value,
  15362. switch: true
  15363. };
  15364. shieldListRef.value.push(sh);
  15365. inputRule.value = "";
  15366. shieldList.set(shieldListRef.value);
  15367. }
  15368. return (_ctx, _cache) => {
  15369. return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
  15370. shieldListRef.value.length > 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2, [
  15371. (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(shieldListRef.value, (sh) => {
  15372. return vue.openBlock(), vue.createBlock(_sfc_main$m, {
  15373. class: vue.normalizeClass(["shield-elem", { "content-scope": sh.scope === "posts", "user-scope": sh.scope === "users" }])
  15374. }, {
  15375. default: vue.withCtx(() => [
  15376. vue.createElementVNode("div", _hoisted_3, vue.toDisplayString(sh.scope === "posts" ? "chat" : "account_circle"), 1),
  15377. vue.createTextVNode(" " + vue.toDisplayString(sh.rule), 1)
  15378. ]),
  15379. _: 2
  15380. }, 1032, ["class"]);
  15381. }), 256)),
  15382. vue.createVNode(_sfc_main$m, {
  15383. class: "remove-all shield-elem icon",
  15384. onClick: removeAllWithConfirm
  15385. }, {
  15386. default: vue.withCtx(() => [
  15387. vue.createTextVNode("delete")
  15388. ]),
  15389. _: 1
  15390. })
  15391. ])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_4, "当前没有记录屏蔽规则")),
  15392. vue.createElementVNode("div", _hoisted_5, [
  15393. vue.createVNode(UserTextbox, {
  15394. modelValue: inputRule.value,
  15395. "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => inputRule.value = $event),
  15396. "muti-lines": true,
  15397. class: "shield-input",
  15398. placeholder: "输入屏蔽规则",
  15399. onKeypress: inputKeyPress
  15400. }, null, 8, ["modelValue"]),
  15401. vue.createElementVNode("div", _hoisted_6, [
  15402. vue.createElementVNode("div", _hoisted_7, [
  15403. vue.withDirectives(vue.createElementVNode("input", {
  15404. "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => useRegex.value = $event),
  15405. id: "use-regex",
  15406. type: "checkbox"
  15407. }, null, 512), [
  15408. [vue.vModelCheckbox, useRegex.value]
  15409. ]),
  15410. _hoisted_8
  15411. ]),
  15412. vue.createElementVNode("div", _hoisted_9, [
  15413. vue.withDirectives(vue.createElementVNode("input", {
  15414. "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => scope.value = $event),
  15415. id: "user-scope",
  15416. type: "checkbox"
  15417. }, null, 512), [
  15418. [vue.vModelCheckbox, scope.value]
  15419. ]),
  15420. _hoisted_10
  15421. ]),
  15422. vue.createVNode(_sfc_main$m, {
  15423. class: "submit-button",
  15424. "shadow-border": true,
  15425. "theme-style": true,
  15426. onClick: updateShieldList
  15427. }, {
  15428. default: vue.withCtx(() => [
  15429. vue.createTextVNode("确定 ")
  15430. ]),
  15431. _: 1
  15432. })
  15433. ])
  15434. ])
  15435. ]);
  15436. };
  15437. }
  15438. });
  15439. const moduleShieldVue = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-64c498cf"]]);
  15440. const index$4 = {
  15441. id: "shield",
  15442. name: "贴吧屏蔽",
  15443. author: "锯条",
  15444. version: "1.2",
  15445. brief: "眼不见为净",
  15446. description: `用户自定义屏蔽规则,符合规则的贴子和楼层将不会显示在首页、看贴页面和进吧页面。支持正则匹配`,
  15447. scope: true,
  15448. runAt: "immediately",
  15449. settings: {
  15450. "shield-controls": {
  15451. title: "管理屏蔽规则",
  15452. description: `这些屏蔽规则将会在首页(旧版)、看贴页面生效,会自动隐藏所有符合匹配规则的贴子和楼层。`,
  15453. widgets: [{
  15454. type: "component",
  15455. component: vue.markRaw(moduleShieldVue)
  15456. }]
  15457. }
  15458. },
  15459. entry: main$1
  15460. };
  15461. function matchShield(obj, str) {
  15462. if (obj.ignoreCase === void 0)
  15463. obj.ignoreCase = true;
  15464. if (obj.type === "string") {
  15465. if (obj.ignoreCase) {
  15466. obj.rule = obj.rule.toLowerCase();
  15467. str = str.toLowerCase();
  15468. }
  15469. if (str.indexOf(obj.rule) !== -1) {
  15470. return true;
  15471. }
  15472. }
  15473. if (obj.type === "regex") {
  15474. let regex;
  15475. if (obj.ignoreCase) {
  15476. regex = new RegExp(obj.rule, "i");
  15477. } else {
  15478. regex = new RegExp(obj.rule);
  15479. }
  15480. if (regex.test(str)) {
  15481. return true;
  15482. }
  15483. }
  15484. return false;
  15485. }
  15486. function shieldElementsBySelector(observer, parentSelector, subSelector) {
  15487. observer.addEvent(() => {
  15488. DOMS(parentSelector).forEach((elem) => {
  15489. let isMatch = false;
  15490. const content = join(map(DOMS(subSelector, elem), (el) => el.textContent ?? ""), "\n");
  15491. for (const sh of shieldList.get()) {
  15492. if (matchShield(sh, content)) {
  15493. isMatch = true;
  15494. break;
  15495. }
  15496. }
  15497. if (isMatch) {
  15498. elem.style.display = "none";
  15499. }
  15500. });
  15501. });
  15502. }
  15503. function main$1() {
  15504. shieldElementsBySelector(threadFloorsObserver, ".l_post_bright", ".d_post_content");
  15505. shieldElementsBySelector(threadFloorsObserver, ".l_post_bright", ".d_name a");
  15506. shieldElementsBySelector(threadCommentsObserver, ".lzl_single_post", ".lzl_cnt .j_user_card");
  15507. shieldElementsBySelector(legacyIndexFeedsObserver, ".j_feed_li", ".title, .n_txt");
  15508. shieldElementsBySelector(legacyIndexFeedsObserver, ".j_feed_li", ".post_author");
  15509. shieldElementsBySelector(forumThreadsObserver, ".j_thread_list", ".threadlist_title a");
  15510. shieldElementsBySelector(forumThreadsObserver, ".j_thread_list", ".frs-author-name-wrap");
  15511. }
  15512. const index$5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
  15513. __proto__: null,
  15514. default: index$4
  15515. }, Symbol.toStringTag, { value: "Module" }));
  15516. const tagCSS = ':root {\r\n --myself-theme-background: rgba(25, 110, 153, 0.2);\r\n --myself-theme-fore: rgb(16, 73, 101);\r\n --cengzhu-theme-background: rgba(255, 89, 107, 0.2);\r\n --cengzhu-theme-fore: rgb(178, 62, 90);\r\n}\r\n\r\n@media (prefers-color-scheme: dark) {\r\n :root {\r\n --myself-theme-background: rgba(34, 135, 204, 0.2);\r\n --myself-theme-fore: rgb(40, 160, 242);\r\n --cengzhu-theme-background: rgba(204, 71, 103, 0.2);\r\n --cengzhu-theme-fore: rgb(255, 89, 118);\r\n }\r\n}\r\n\r\n.tag-elem {\r\n display: inline-block;\r\n}\r\n\r\n.tag-elem::after {\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n margin: 0 4px;\r\n background-color: var(--trans-light-background);\r\n color: var(--light-fore);\r\n font-size: 12px;\r\n font-weight: normal;\r\n}\r\n\r\n.tieba-tags-me::after {\r\n /* background-color: var(--myself-theme-background);\r\n color: var(--myself-theme-fore); */\r\n content: "我";\r\n}\r\n\r\n.tieba-tags-lz::after {\r\n /* background-color: var(--tieba-theme-background);\r\n color: var(--tieba-theme-fore); */\r\n content: "楼主";\r\n}\r\n\r\n.tieba-tags-cz::after {\r\n /* background-color: var(--cengzhu-theme-background);\r\n color: var(--cengzhu-theme-fore); */\r\n content: "层主";\r\n}\r\n';
  15517. const index$2 = {
  15518. id: "tieba-tags",
  15519. name: "楼中楼标签",
  15520. author: "锯条",
  15521. version: "2.0.1",
  15522. brief: "优化楼中楼浏览体验",
  15523. description: `为楼中楼的楼主、层主等用户添加特殊标签`,
  15524. scope: ["thread"],
  15525. runAt: "loaded",
  15526. entry: main
  15527. };
  15528. function main() {
  15529. const TAGGED = "is-tagged";
  15530. const TB_TAG = "tag-elem";
  15531. const MY_TAG = "tieba-tags-me";
  15532. const LZ_TAG = "tieba-tags-lz";
  15533. const CZ_TAG = "tieba-tags-cz";
  15534. const louzhu = PageData.thread.author;
  15535. const myPortrait = PageData.user.portrait;
  15536. const myUserName = PageData.user.user_name;
  15537. let louzhuPortrait = getLouzhuPortrait(document);
  15538. injectCSSList(tagCSS);
  15539. (async () => {
  15540. if (!louzhuPortrait) {
  15541. const response = await fetch(location.href.split("?")[0], {
  15542. mode: "cors",
  15543. credentials: "include"
  15544. });
  15545. if (response.ok) {
  15546. await response.text().then((value) => {
  15547. const fpDOC = new DOMParser().parseFromString(value, "text/html");
  15548. louzhuPortrait = getLouzhuPortrait(fpDOC);
  15549. });
  15550. }
  15551. }
  15552. })().then(() => {
  15553. threadCommentsObserver.addEvent(createTagsAll);
  15554. });
  15555. function getLouzhuPortrait(doc) {
  15556. const j_tags = doc.getElementsByClassName("j_louzhubiaoshi");
  15557. if (j_tags.length > 0) {
  15558. const targetFloor = findParent(j_tags[0], "l_post_bright");
  15559. if (targetFloor) {
  15560. const dataAttr = targetFloor.getAttribute("data-field");
  15561. if (dataAttr) {
  15562. const dataField = JSON.parse(dataAttr);
  15563. return split(dataField.author.portrait, "?")[0];
  15564. }
  15565. }
  15566. }
  15567. return void 0;
  15568. }
  15569. function createTagsAll() {
  15570. forEach(DOMS(".lzl_cnt .at"), (elem) => {
  15571. if (elem.classList.contains(TAGGED))
  15572. return;
  15573. elem.classList.add(TAGGED);
  15574. let isLouzhu = false;
  15575. let isMe = false;
  15576. const username = elem.getAttribute("username");
  15577. if (userClassify(myUserName, myPortrait)) {
  15578. isMe = true;
  15579. addTag(elem, MY_TAG);
  15580. }
  15581. if (!isMe) {
  15582. if (userClassify(louzhu, louzhuPortrait)) {
  15583. isLouzhu = true;
  15584. addTag(elem, LZ_TAG);
  15585. }
  15586. }
  15587. if (!isMe && !isLouzhu) {
  15588. const floor = findParent(elem, "l_post_bright");
  15589. if (floor) {
  15590. const cengzhuCard = floor.getElementsByClassName("p_author_name")[0];
  15591. const cengzhu = cengzhuCard.textContent;
  15592. if (cengzhu) {
  15593. if (elem.textContent === cengzhu) {
  15594. addTag(elem, CZ_TAG);
  15595. }
  15596. }
  15597. }
  15598. }
  15599. function userClassify(un, portrait) {
  15600. if (username === un && un !== "") {
  15601. return true;
  15602. } else if (indexOf(["", " "], username) !== -1) {
  15603. const targetPortrait = elem.getAttribute("portrait");
  15604. if (targetPortrait && portrait) {
  15605. if (targetPortrait === portrait) {
  15606. return true;
  15607. }
  15608. } else {
  15609. return dataClassify();
  15610. }
  15611. } else if (!username) {
  15612. return dataClassify();
  15613. }
  15614. return false;
  15615. function dataClassify() {
  15616. const dataAttr = elem.getAttribute("data-field");
  15617. if (dataAttr) {
  15618. const dataField = JSON.parse(dataAttr.replace(/'/g, '"'));
  15619. if (portrait) {
  15620. if (dataField.id === portrait) {
  15621. return true;
  15622. }
  15623. } else {
  15624. if (dataField.un === un) {
  15625. return true;
  15626. }
  15627. }
  15628. }
  15629. return false;
  15630. }
  15631. }
  15632. });
  15633. function addTag(elem, className) {
  15634. elem.appendChild(
  15635. templateCreate("div", {
  15636. class: `${TB_TAG} ${className}`
  15637. })
  15638. );
  15639. }
  15640. }
  15641. }
  15642. const index$3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
  15643. __proto__: null,
  15644. default: index$2
  15645. }, Symbol.toStringTag, { value: "Module" }));
  15646. const index = {
  15647. id: "toolkit",
  15648. name: "实用工具库",
  15649. author: "锯条",
  15650. version: "1.1",
  15651. brief: "优化原版贴吧体验的一组功能",
  15652. description: "这是一个轻量级的工具库,包含了诸如自动展开长图等实用功能。",
  15653. scope: true,
  15654. runAt: "immediately",
  15655. settings: {
  15656. autoExpand: {
  15657. title: "自动展开长图",
  15658. description: `该功能会自动将帖子中所有的长图片自动展开,无需手动操作`,
  15659. widgets: [{
  15660. type: "toggle",
  15661. init: () => toolkitToggles.get().autoExpand,
  15662. event() {
  15663. toolkitToggles.merge({ autoExpand: !toolkitToggles.get().autoExpand });
  15664. }
  15665. }]
  15666. },
  15667. reloadAvatars: {
  15668. title: "重新加载错误头像",
  15669. description: `原版贴吧的帖子页面时常会出现加载失败的头像,本功能可以将这些无法正常显示的头像资源链接到正常的 URL`,
  15670. widgets: [{
  15671. type: "toggle",
  15672. init: () => toolkitToggles.get().reloadAvatars,
  15673. event() {
  15674. toolkitToggles.merge({ reloadAvatars: !toolkitToggles.get().reloadAvatars });
  15675. }
  15676. }]
  15677. }
  15678. },
  15679. entry: function() {
  15680. for (const key in toolkitFeatures) {
  15681. const k = key;
  15682. if (toolkitToggles.get()[k])
  15683. toolkitFeatures[k]();
  15684. }
  15685. }
  15686. };
  15687. const toolkitFeatures = {
  15688. /** 自动展开长图 */
  15689. autoExpand() {
  15690. threadFloorsObserver.addEvent(() => {
  15691. forEach(DOMS(".replace_tip"), (el) => {
  15692. el.click();
  15693. });
  15694. });
  15695. },
  15696. /** 重新加载错误头像 */
  15697. reloadAvatars() {
  15698. const observer = new IntersectionObserver(function(entries) {
  15699. forEach(entries, (entry) => {
  15700. if (entry.isIntersecting) {
  15701. const avatar = entry.target;
  15702. if (!avatar.complete)
  15703. return;
  15704. if (avatar.naturalWidth > 0) {
  15705. avatar.setAttribute("data-loaded", "");
  15706. } else {
  15707. const userCard = findParent(avatar, "j_user_card");
  15708. if (!userCard)
  15709. return;
  15710. const dataField = userCard.getAttribute("data-field");
  15711. if (!dataField)
  15712. return;
  15713. const portarit = JSON.parse(dataField.replaceAll(/'/g, '"')).id;
  15714. avatar.src = tiebaAPI.URL_profile(portarit);
  15715. avatar.setAttribute("data-loaded", "");
  15716. }
  15717. }
  15718. });
  15719. }, { threshold: 0 });
  15720. threadCommentsObserver.addEvent(function() {
  15721. const avatars = DOMS(".lzl_single_post img:not(.BDE_Smiley, [data-loaded])", "img");
  15722. avatars.forEach((avatar) => observer.observe(avatar));
  15723. });
  15724. }
  15725. };
  15726. const toolkitToggles = new UserKey("toolkitToggles", {
  15727. autoExpand: true,
  15728. reloadAvatars: true
  15729. });
  15730. const index$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
  15731. __proto__: null,
  15732. default: index
  15733. }, Symbol.toStringTag, { value: "Module" }));
  15734. })(Vue, marked, ElementPlus);
  15735.  
  15736. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址