-
+
#{info.pid}
@@ -283,22 +292,23 @@ class FlowItem extends PureComponent {
{info.author_title && (
{`"${info.author_title}"`}
)}
- {info.is_reported && (
- R
- )}
+ {info.is_reported && R }
{!!do_delete && !!info.can_del && (
{
do_delete('pid', info.pid);
}}
- > 🗑️
+ >
+ {' '}
+ 🗑️{' '}
+
)}
{!!do_block && (
- 🚫
+
+ {' '}
+ 🚫{' '}
+
)}
{info.dangerous_user && (
{info.dangerous_user}
@@ -306,30 +316,24 @@ class FlowItem extends PureComponent {
{info.blocked_count && (
{info.blocked_count}
)}
- {info.cw !== null &&
- (!do_edit_cw || !info.can_del) && (
- {info.cw}
+ {info.cw !== null && (!do_edit_cw || !info.can_del) && (
+ {info.cw}
)}
- {
- !!do_edit_cw && !!info.can_del && (
- - 最新回复{' '} - + 最新回复
)}{this.state.reply_error}
)} - {this.state.replies.slice(0, PREVIEW_REPLY_COUNT).map((reply) => !reply.blocked && ( -#{this.props.info.pid}
+
+ {this.props.info.author_title && (
+ {`"${this.props.info.author_title}"`}
+ )}
+ {this.props.info.cw !== null && (
+ {this.props.info.cw}
+ )}
+
+
+ {this.needFold ? '已折叠' : '已屏蔽'}
- )}
- #{this.props.info.pid}
-
- {this.props.info.author_title && (
- {`"${this.props.info.author_title}"`}
- )}
- {this.props.info.cw !== null && (
- {this.props.info.cw}
- )}
-
-
- {this.needFold ? '已折叠' : '已屏蔽'}
-
-
+
+ 加载中……
; @@ -84,20 +80,29 @@ export class MessageViewer extends PureComponent { else if (this.state.loading_status === 'done') return ( <> -最近一次重置
随机盐 {this.state.salt}
-15分钟临时token:
+15分钟临时token:
{msg.detail}
强烈建议开始使用前先看一遍所有设置选项
++ 强烈建议开始使用前先看一遍所有设置选项 +
@@ -87,15 +86,18 @@ export function InfoSidebar(props) {
意见反馈请加tag #意见反馈 或到github后端的issue区。
-新T树洞强烈期待有其他更多树洞的出现,一起分布式互联,构建清华树洞族。详情见 关于 中的描述。
-联系我们:{EMAIL} 。
++ 新T树洞强烈期待有其他更多树洞的出现,一起分布式互联,构建清华树洞族。详情见 + 关于 中的描述。 +
++ 联系我们:{EMAIL} 。 +
新T树洞 网页版 by @hole_thu,基于
-
+
AGPLv3
协议在{' '}
@@ -121,7 +123,8 @@ export function InfoSidebar(props) {
>
T大树洞网页版 by @thuhole
- 、
+ 、{' '}
+
React
、
@@ -139,8 +142,8 @@ export class LoginForm extends Component {
constructor(props) {
super(props);
this.state = {
- 'custom_title': window.TITLE || ''
- }
+ custom_title: window.TITLE || '',
+ };
}
update_title(title, token) {
@@ -151,10 +154,11 @@ export class LoginForm extends Component {
API.set_title(title, token)
.then((json) => {
if (json.code === 0) {
- window.TITLE = title
+ window.TITLE = title;
alert('专属头衔设置成功');
}
- }).catch(err => alert("设置头衔出错了:\n"+ err));
+ })
+ .catch((err) => alert('设置头衔出错了:\n' + err));
}
copy_token(token) {
@@ -203,22 +207,27 @@ export class LoginForm extends Component {
复制 User Token
- User Token仅用于开发bot,切勿告知他人。若怀疑被盗号请刷新Token(刷新功能即将上线)。
+ User
+ Token仅用于开发bot,切勿告知他人。若怀疑被盗号请刷新Token(刷新功能即将上线)。
- 专属头衔:
+ 专属头衔:
{
- this.setState({ custom_title: e.target.value})
+ this.setState({ custom_title: e.target.value });
}}
maxLength={10}
/>
设置专属头衔后,可在发言时选择使用。重置后需重新设置。临时用户如需保持头衔请使用相同后缀。
请遵守 @@ -839,7 +852,8 @@ export class PostForm extends Component {
- 插入图片请使用图片外链,Markdown格式 , 支持动图,支持多图。推荐的图床:
+ 插入图片请使用图片外链,Markdown格式 ,
+ 支持动图,支持多图。推荐的图床:
路过图床
@@ -848,7 +862,10 @@ export class PostForm extends Component {
sm.ms
、
-
+
未名BBS
、
diff --git a/src/flows_api.js b/src/flows_api.js
index 5e7271d..c7b0781 100644
--- a/src/flows_api.js
+++ b/src/flows_api.js
@@ -1,4 +1,4 @@
-import { get_json, gen_name} from './infrastructure/functions';
+import { get_json, gen_name } from './infrastructure/functions';
import { API_BASE } from './Common';
import { cache } from './cache';
@@ -35,14 +35,11 @@ export const parse_replies = (replies, color_picker) =>
export const API = {
load_replies: async (pid, token, color_picker, cache_version) => {
pid = parseInt(pid);
- let response = await fetch(
- API_BASE + '/getcomment?pid=' + pid ,
- {
- headers: {
- 'User-Token': token,
- }
- }
- );
+ let response = await fetch(API_BASE + '/getcomment?pid=' + pid, {
+ headers: {
+ 'User-Token': token,
+ },
+ });
let json = await handle_response(response);
// Why delete then put ??
//console.log('Put cache', json, pid, cache_version);
@@ -70,17 +67,14 @@ export const API = {
let data = new URLSearchParams();
data.append('pid', pid);
data.append('switch', attention ? '1' : '0');
- let response = await fetch(
- API_BASE + '/attention',
- {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded',
- 'User-Token': token,
- },
- body: data,
+ let response = await fetch(API_BASE + '/attention', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'User-Token': token,
},
- );
+ body: data,
+ });
// Delete cache to update `attention` on next reload
cache().delete(pid);
return handle_response(response, false);
@@ -90,55 +84,46 @@ export const API = {
let data = new URLSearchParams();
data.append('pid', pid);
data.append('reason', reason);
- let response = await fetch(
- API_BASE + '/report',
- {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded',
- 'User-Token': token,
- },
- body: data,
+ let response = await fetch(API_BASE + '/report', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'User-Token': token,
},
- );
+ body: data,
+ });
return handle_response(response, false);
},
block: async (type, id, token) => {
let data = new URLSearchParams([
- ['type', type], ['id', id]
+ ['type', type],
+ ['id', id],
]);
- let response = await fetch(
- API_BASE + '/block',
- {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded',
- 'User-Token': token,
- },
- body: data,
+ let response = await fetch(API_BASE + '/block', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'User-Token': token,
},
- );
+ body: data,
+ });
return handle_response(response, false);
},
-
del: async (type, id, note, token) => {
let data = new URLSearchParams();
data.append('type', type);
data.append('id', id);
data.append('note', note);
- let response = await fetch(
- API_BASE + '/delete',
- {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded',
- 'User-Token': token,
- },
- body: data,
+ let response = await fetch(API_BASE + '/delete', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'User-Token': token,
},
- );
+ body: data,
+ });
return handle_response(response, false);
},
@@ -146,17 +131,14 @@ export const API = {
let data = new URLSearchParams();
data.append('cw', cw);
data.append('pid', id);
- let response = await fetch(
- API_BASE + '/editcw',
- {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded',
- 'User-Token': token,
- },
- body: data,
+ let response = await fetch(API_BASE + '/editcw', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'User-Token': token,
},
- );
+ body: data,
+ });
return handle_response(response, false);
},
@@ -166,7 +148,7 @@ export const API = {
window.config.no_c_post ? '&no_cw' : ''
}&order_mode=${submode}`,
{
- headers: {'User-Token': token},
+ headers: { 'User-Token': token },
},
);
return handle_response(response);
@@ -174,58 +156,49 @@ export const API = {
get_search: async (page, keyword, token, submode) => {
let response = await fetch(
- `${API_BASE}/search?search_mode=${submode}&page=${page}&keywords=${
- encodeURIComponent(keyword)
- }&pagesize=${SEARCH_PAGESIZE}`,
+ `${API_BASE}/search?search_mode=${submode}&page=${page}&keywords=${encodeURIComponent(
+ keyword,
+ )}&pagesize=${SEARCH_PAGESIZE}`,
{
- headers: {'User-Token': token},
- }
+ headers: { 'User-Token': token },
+ },
);
return handle_response(response);
},
get_single: async (pid, token) => {
- let response = await fetch(
- API_BASE + '/getone?pid=' + pid,
- {
- headers: {'User-Token': token},
- }
- );
+ let response = await fetch(API_BASE + '/getone?pid=' + pid, {
+ headers: { 'User-Token': token },
+ });
return handle_response(response);
},
get_attention: async (token) => {
- let response = await fetch(
- API_BASE + '/getattention',
- {
- headers: {'User-Token': token},
- }
- );
+ let response = await fetch(API_BASE + '/getattention', {
+ headers: { 'User-Token': token },
+ });
return handle_response(response);
},
add_vote: async (vote, pid, token) => {
let data = new URLSearchParams([
['vote', vote],
- ['pid', pid]
+ ['pid', pid],
]);
- let response = await fetch(
- API_BASE + '/vote',
- {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded',
- 'User-Token': token,
- },
- body: data,
+ let response = await fetch(API_BASE + '/vote', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'User-Token': token,
},
- );
+ body: data,
+ });
return handle_response(response, true);
},
get_multi: async (pids, token) => {
let response = await fetch(
- API_BASE + '/getmulti?' + pids.map(pid => `pids=${pid}`).join('&'),
+ API_BASE + '/getmulti?' + pids.map((pid) => `pids=${pid}`).join('&'),
{
headers: {
'User-Token': token,
@@ -238,18 +211,14 @@ export const API = {
set_title: async (title, token) => {
console.log('title: ', title);
let data = new URLSearchParams([['title', title]]);
- let response = await fetch(
- API_BASE + '/title',
- {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded',
- 'User-Token': token,
- },
- body: data,
+ let response = await fetch(API_BASE + '/title', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'User-Token': token,
},
- );
+ body: data,
+ });
return handle_response(response, true);
},
-
};
diff --git a/src/fonts_7/icomoon.css b/src/fonts_7/icomoon.css
index 49071f0..70d7e3e 100644
--- a/src/fonts_7/icomoon.css
+++ b/src/fonts_7/icomoon.css
@@ -1,7 +1,6 @@
@font-face {
font-family: 'icomoon';
- src:
- url('icomoon.ttf?8qh3rt') format('truetype'),
+ src: url('icomoon.ttf?8qh3rt') format('truetype'),
url('icomoon.woff?8qh3rt') format('woff'),
url('icomoon.svg?8qh3rt#icomoon') format('svg');
font-weight: normal;
@@ -19,7 +18,7 @@
font-variant: normal;
text-transform: none;
line-height: 1;
- vertical-align: -.0625em;
+ vertical-align: -0.0625em;
/* Better Font Rendering =========== */
-webkit-font-smoothing: antialiased;
@@ -27,84 +26,84 @@
}
.icon-send:before {
- content: "\e900";
+ content: '\e900';
}
.icon-textfile:before {
- content: "\e926";
+ content: '\e926';
}
.icon-history:before {
- content: "\e94d";
+ content: '\e94d';
}
.icon-reply:before {
- content: "\e96b";
+ content: '\e96b';
}
.icon-quote:before {
- content: "\e977";
+ content: '\e977';
}
.icon-loading:before {
- content: "\e979";
+ content: '\e979';
}
.icon-login:before {
- content: "\e98d";
+ content: '\e98d';
}
.icon-settings:before {
- content: "\e994";
+ content: '\e994';
}
.icon-stats:before {
- content: "\e99b";
+ content: '\e99b';
}
.icon-locate:before {
- content: "\e9b3";
+ content: '\e9b3';
}
.icon-upload:before {
- content: "\e9c3";
+ content: '\e9c3';
}
.icon-flag:before {
- content: "\e9cc";
+ content: '\e9cc';
}
.icon-attention:before {
- content: "\e9d3";
+ content: '\e9d3';
}
.icon-star:before {
- content: "\e9d7";
+ content: '\e9d7';
}
.icon-star-ok:before {
- content: "\e9d9";
+ content: '\e9d9';
}
.icon-plus:before {
- content: "\ea0a";
+ content: '\ea0a';
}
.icon-about:before {
- content: "\ea0c";
+ content: '\ea0c';
}
.icon-close:before {
- content: "\ea0d";
+ content: '\ea0d';
}
.icon-logout:before {
- content: "\ea14";
+ content: '\ea14';
}
.icon-refresh:before {
- content: "\ea2e";
+ content: '\ea2e';
}
.icon-forward:before {
- content: "\ea42";
+ content: '\ea42';
}
.icon-back:before {
- content: "\ea44";
+ content: '\ea44';
}
.icon-order-rev:before {
- content: "\ea46";
+ content: '\ea46';
font-size: 1.2em;
}
.icon-github:before {
- content: "\eab0";
+ content: '\eab0';
}
.icon-new-tab:before {
- content: "\ea7e";
+ content: '\ea7e';
}
.icon-eye:before {
- content: "\e9ce";
+ content: '\e9ce';
}
.icon-eye-blocked:before {
- content: "\e9d1";
+ content: '\e9d1';
}
diff --git a/src/index.css b/src/index.css
index c0da48c..737977e 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,87 +1,98 @@
body {
- background-size: cover;
- user-select: none;
- background-color: #333;
+ background-size: cover;
+ user-select: none;
+ background-color: #333;
}
body.root-dark-mode {
- background-color: black;
+ background-color: black;
}
html::-webkit-scrollbar {
- display: none;
+ display: none;
}
html {
- scrollbar-width: none;
- -ms-overflow-style: none;
+ scrollbar-width: none;
+ -ms-overflow-style: none;
}
:root {
- --var-link-color: #00c;
+ --var-link-color: #00c;
}
-.root-dark-mode .left-container, .root-dark-mode .sidebar, .root-dark-mode .sidebar-title, .root-dark-mode .balance-popover {
- --var-link-color: #9bf;
+.root-dark-mode .left-container,
+.root-dark-mode .sidebar,
+.root-dark-mode .sidebar-title,
+.root-dark-mode .balance-popover {
+ --var-link-color: #9bf;
}
a {
- color: var(--var-link-color);
+ color: var(--var-link-color);
}
a:not(.no-underline):hover {
- border-bottom: 1px solid var(--var-link-color);
- margin-bottom: -1px;
+ border-bottom: 1px solid var(--var-link-color);
+ margin-bottom: -1px;
}
-input, textarea {
- border-radius: 5px;
- border: 1px solid black;
- outline: none;
- margin: 0;
+input,
+textarea {
+ border-radius: 5px;
+ border: 1px solid black;
+ outline: none;
+ margin: 0;
}
input {
- padding: 0 1em;
- line-height: 2em;
+ padding: 0 1em;
+ line-height: 2em;
}
audio {
- vertical-align: middle;
+ vertical-align: middle;
}
-button, .button {
- color: black;
- background-color: rgba(235,235,235,.5);
- border-radius: 5px;
- text-align: center;
- border: 1px solid black;
- line-height: 2em;
- margin: 0 .5rem;
+button,
+.button {
+ color: black;
+ background-color: rgba(235, 235, 235, 0.5);
+ border-radius: 5px;
+ text-align: center;
+ border: 1px solid black;
+ line-height: 2em;
+ margin: 0 0.5rem;
}
-.root-dark-mode button, .root-dark-mode .button {
- background-color: hsl(0,0%,30%);
- color: var(--foreground-dark);
+.root-dark-mode button,
+.root-dark-mode .button {
+ background-color: hsl(0, 0%, 30%);
+ color: var(--foreground-dark);
}
-button:hover, .button:hover {
- background-color: rgba(255,255,255,.7);
+button:hover,
+.button:hover {
+ background-color: rgba(255, 255, 255, 0.7);
}
-.root-dark-mode button:hover, .root-dark-mode .button:hover {
- background-color: hsl(0,0%,40%);
+.root-dark-mode button:hover,
+.root-dark-mode .button:hover {
+ background-color: hsl(0, 0%, 40%);
}
-button:disabled, .button:disabled {
- background-color: rgba(128,128,128,.5);
+button:disabled,
+.button:disabled {
+ background-color: rgba(128, 128, 128, 0.5);
}
-.root-dark-mode button:disabled, .root-dark-mode .button:disabled {
- background-color: hsl(0,0%,20%);
- color: hsl(0,0%,60%);
+.root-dark-mode button:disabled,
+.root-dark-mode .button:disabled {
+ background-color: hsl(0, 0%, 20%);
+ color: hsl(0, 0%, 60%);
}
-.root-dark-mode input:not([type=file]), .root-dark-mode textarea {
- background-color: hsl(0,0%,30%);
- color: var(--foreground-dark);
+.root-dark-mode input:not([type='file']),
+.root-dark-mode textarea {
+ background-color: hsl(0, 0%, 30%);
+ color: var(--foreground-dark);
+}
+.root-dark-mode input:not([type='file'])::placeholder {
+ color: var(--foreground-dark);
}
-.root-dark-mode input:not([type=file])::placeholder {
- color: var(--foreground-dark);
-}
\ No newline at end of file
diff --git a/src/index.js b/src/index.js
index f44e849..7f2172c 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,7 +1,7 @@
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
-import './fonts_7/icomoon.css'
+import './fonts_7/icomoon.css';
import App from './App';
//import {elevate} from './infrastructure/elevator';
import registerServiceWorker from './registerServiceWorker';
diff --git a/src/infrastructure/functions.js b/src/infrastructure/functions.js
index 2bfca57..688489a 100644
--- a/src/infrastructure/functions.js
+++ b/src/infrastructure/functions.js
@@ -1,75 +1,72 @@
export function get_json(res) {
- if(!res.ok) {
- return (
- res.text().then((t) => {
- console.log('error:', res);
- t = t.length < 100 ? t : '';
- throw Error(`${res.status} ${res.statusText} ${t}`);
- })
- );
+ if (!res.ok) {
+ return res.text().then((t) => {
+ console.log('error:', res);
+ t = t.length < 100 ? t : '';
+ throw Error(`${res.status} ${res.statusText} ${t}`);
+ });
+ }
+ return res.text().then((t) => {
+ try {
+ return JSON.parse(t);
+ } catch (e) {
+ console.error('json parse error');
+ console.trace(e);
+ console.log(t);
+ throw new SyntaxError('JSON Parse Error ' + t.substr(0, 50));
}
- return (
- res
- .text()
- .then((t)=>{
- try {
- return JSON.parse(t);
- } catch(e) {
- console.error('json parse error');
- console.trace(e);
- console.log(t);
- throw new SyntaxError('JSON Parse Error '+t.substr(0,50));
- }
- })
- );
+ });
}
-export function listen_darkmode(override) { // override: true/false/undefined
- function update_color_scheme() {
- if(override===undefined ? window.matchMedia('(prefers-color-scheme: dark)').matches : override)
- document.body.classList.add('root-dark-mode');
- else
- document.body.classList.remove('root-dark-mode');
- }
+export function listen_darkmode(override) {
+ // override: true/false/undefined
+ function update_color_scheme() {
+ if (
+ override === undefined
+ ? window.matchMedia('(prefers-color-scheme: dark)').matches
+ : override
+ )
+ document.body.classList.add('root-dark-mode');
+ else document.body.classList.remove('root-dark-mode');
+ }
+ update_color_scheme();
+ window.matchMedia('(prefers-color-scheme: dark)').addListener(() => {
update_color_scheme();
- window.matchMedia('(prefers-color-scheme: dark)').addListener(()=>{
- update_color_scheme();
- });
+ });
}
const NAMES = [
-'Alice',
-'Bob',
-'Carol',
-'Dave',
-'Eve',
-'Francis',
-'Grace',
-'Hans',
-'Isabella',
-'Jason',
-'Kate',
-'Louis',
-'Margaret',
-'Nathan',
-'Olivia',
-'Paul',
-'Queen',
-'Richard',
-'Susan',
-'Thomas',
-'Uma',
-'Vivian',
-'Winnie',
-'Xander',
-'Yasmine',
-'Zach'
-]
+ 'Alice',
+ 'Bob',
+ 'Carol',
+ 'Dave',
+ 'Eve',
+ 'Francis',
+ 'Grace',
+ 'Hans',
+ 'Isabella',
+ 'Jason',
+ 'Kate',
+ 'Louis',
+ 'Margaret',
+ 'Nathan',
+ 'Olivia',
+ 'Paul',
+ 'Queen',
+ 'Richard',
+ 'Susan',
+ 'Thomas',
+ 'Uma',
+ 'Vivian',
+ 'Winnie',
+ 'Xander',
+ 'Yasmine',
+ 'Zach',
+];
export function gen_name(name_id) {
- if (name_id == 0)
- return '洞主';
+ if (name_id == 0) return '洞主';
let r = name_id;
let name = '';
@@ -81,4 +78,3 @@ export function gen_name(name_id) {
return name.substr(1);
}
-
diff --git a/src/infrastructure/global.css b/src/infrastructure/global.css
index 6be140f..153d8e6 100644
--- a/src/infrastructure/global.css
+++ b/src/infrastructure/global.css
@@ -1,37 +1,40 @@
:root {
- --foreground-dark: hsl(0,0%,93%);
+ --foreground-dark: hsl(0, 0%, 93%);
}
body {
- margin: 0;
- padding: 0;
- overflow-x: hidden;
- text-size-adjust: 100%;
+ margin: 0;
+ padding: 0;
+ overflow-x: hidden;
+ text-size-adjust: 100%;
}
-body, textarea, pre {
- font-family: 'Segoe UI', '微软雅黑', 'Microsoft YaHei', sans-serif;
+body,
+textarea,
+pre {
+ font-family: 'Segoe UI', '微软雅黑', 'Microsoft YaHei', sans-serif;
}
* {
- box-sizing: border-box;
- word-wrap: break-word;
- -webkit-overflow-scrolling: touch;
+ box-sizing: border-box;
+ word-wrap: break-word;
+ -webkit-overflow-scrolling: touch;
}
-p, pre {
- margin: 0;
+p,
+pre {
+ margin: 0;
}
a {
- text-decoration: none;
- cursor: pointer;
+ text-decoration: none;
+ cursor: pointer;
}
pre {
- white-space: pre-line;
+ white-space: pre-line;
}
code {
- font-family: Consolas, Courier, monospace;
-}
\ No newline at end of file
+ font-family: Consolas, Courier, monospace;
+}
diff --git a/src/infrastructure/widgets.css b/src/infrastructure/widgets.css
index 4edfcc2..3d66b1c 100644
--- a/src/infrastructure/widgets.css
+++ b/src/infrastructure/widgets.css
@@ -1,312 +1,322 @@
.centered-line {
- overflow: hidden;
- text-align: center;
+ overflow: hidden;
+ text-align: center;
}
.centered-line::before,
.centered-line::after {
- background-color: #000;
- content: "";
- display: inline-block;
- height: 1px;
- position: relative;
- vertical-align: middle;
- width: 50%;
+ background-color: #000;
+ content: '';
+ display: inline-block;
+ height: 1px;
+ position: relative;
+ vertical-align: middle;
+ width: 50%;
}
.root-dark-mode .centered-line {
- color: var(--foreground-dark);
+ color: var(--foreground-dark);
}
-.root-dark-mode .centered-line::before, .root-dark-mode .centered-line::after {
- background-color: var(--foreground-dark);
+.root-dark-mode .centered-line::before,
+.root-dark-mode .centered-line::after {
+ background-color: var(--foreground-dark);
}
.centered-line::before {
- right: 1em;
- margin-left: -50%;
+ right: 1em;
+ margin-left: -50%;
}
.centered-line::after {
- left: 1em;
- margin-right: -50%;
+ left: 1em;
+ margin-right: -50%;
}
.title-line {
- color: #fff;
- margin-top: 1em;
+ color: #fff;
+ margin-top: 1em;
}
.title-line::before,
.title-line::after {
- background-color: #fff;
- box-shadow: 0 1px 1px #000;
+ background-color: #fff;
+ box-shadow: 0 1px 1px #000;
}
.root-dark-mode .title-line {
- color: var(--foreground-dark);
+ color: var(--foreground-dark);
}
-.root-dark-mode .title-line::before, .root-dark-mode .title-line::after {
- background-color: var(--foreground-dark);
+.root-dark-mode .title-line::before,
+.root-dark-mode .title-line::after {
+ background-color: var(--foreground-dark);
}
.app-switcher {
- display: flex;
- height: 2em;
- text-align: center;
- margin: 0 .1em;
- user-select: none;
+ display: flex;
+ height: 2em;
+ text-align: center;
+ margin: 0 0.1em;
+ user-select: none;
}
.app-switcher-desc {
- margin: 0 .5em;
- flex: 1 1 0;
- opacity: .5;
- height: 2em;
- line-height: 2rem;
- font-size: .8em;
+ margin: 0 0.5em;
+ flex: 1 1 0;
+ opacity: 0.5;
+ height: 2em;
+ line-height: 2rem;
+ font-size: 0.8em;
}
.root-dark-mode .app-switcher-desc {
- color: var(--foreground-dark);
+ color: var(--foreground-dark);
}
@media screen and (max-width: 570px) {
- .app-switcher-desc {
- flex: 1 1 0;
- display: none;
- }
- .app-switcher-item {
- flex: 1 1 0 !important;
- padding: 0 !important;
- }
- .app-switcher-dropdown-title {
- padding-left: 0 !important;
- padding-right: 0 !important;
- text-align: center !important;
- }
- .app-switcher-dropdown-item {
- margin-left: -2em !important;
- margin-right: 0 !important;
- }
+ .app-switcher-desc {
+ flex: 1 1 0;
+ display: none;
+ }
+ .app-switcher-item {
+ flex: 1 1 0 !important;
+ padding: 0 !important;
+ }
+ .app-switcher-dropdown-title {
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+ text-align: center !important;
+ }
+ .app-switcher-dropdown-item {
+ margin-left: -2em !important;
+ margin-right: 0 !important;
+ }
}
-.app-switcher a:hover { /* reset underline from /hole style */
- border-bottom: unset;
- margin-bottom: unset;
+.app-switcher a:hover {
+ /* reset underline from /hole style */
+ border-bottom: unset;
+ margin-bottom: unset;
}
.app-switcher-desc a {
- color: unset;
+ color: unset;
}
.app-switcher-left {
- text-align: right;
+ text-align: right;
}
.app-switcher-right {
- text-align: left;
+ text-align: left;
}
.app-switcher-item {
- flex: 0 0 auto;
- border-radius: 3px;
- height: 1.6em;
- line-height: 1.6em;
- margin: .2em .1em;
- padding: 0 .45em;
-}
-a.app-switcher-item, .app-switcher-item a {
- transition: unset; /* override ant design */
- color: black;
+ flex: 0 0 auto;
+ border-radius: 3px;
+ height: 1.6em;
+ line-height: 1.6em;
+ margin: 0.2em 0.1em;
+ padding: 0 0.45em;
+}
+a.app-switcher-item,
+.app-switcher-item a {
+ transition: unset; /* override ant design */
+ color: black;
}
.app-switcher-item img {
- width: 1.2rem;
- height: 1.2rem;
- position: relative;
- top: .2rem;
- vertical-align: unset; /* override ant design */
+ width: 1.2rem;
+ height: 1.2rem;
+ position: relative;
+ top: 0.2rem;
+ vertical-align: unset; /* override ant design */
}
.app-switcher-item span:not(:empty) {
- margin-left: .2rem;
+ margin-left: 0.2rem;
}
.app-switcher-logo-hover {
- margin-left: -1.2rem;
+ margin-left: -1.2rem;
}
.app-switcher-item:hover {
- background-color: black;
- color: white !important;
+ background-color: black;
+ color: white !important;
}
.app-switcher-item:hover a {
- color: white !important;
+ color: white !important;
}
.app-switcher-item-current {
- background-color: rgba(0,0,0,.4);
- text-shadow: 0 0 5px rgba(0,0,0,.5);
- color: white !important;
+ background-color: rgba(0, 0, 0, 0.4);
+ text-shadow: 0 0 5px rgba(0, 0, 0, 0.5);
+ color: white !important;
}
.app-switcher-item-current a {
- color: white !important;
+ color: white !important;
}
-.root-dark-mode .app-switcher-item, .root-dark-mode .app-switcher-dropdown-title a {
- color: var(--foreground-dark);
+.root-dark-mode .app-switcher-item,
+.root-dark-mode .app-switcher-dropdown-title a {
+ color: var(--foreground-dark);
}
-.root-dark-mode .app-switcher-item:hover, .root-dark-mode .app-switcher-item-current, .root-dark-mode .app-switcher-dropdown-title:hover a {
- background-color: #555;
- color: var(--foreground-dark);
+.root-dark-mode .app-switcher-item:hover,
+.root-dark-mode .app-switcher-item-current,
+.root-dark-mode .app-switcher-dropdown-title:hover a {
+ background-color: #555;
+ color: var(--foreground-dark);
}
-.app-switcher-item:hover .app-switcher-logo-normal, .app-switcher-item-current .app-switcher-logo-normal {
- opacity: 0;
+.app-switcher-item:hover .app-switcher-logo-normal,
+.app-switcher-item-current .app-switcher-logo-normal {
+ opacity: 0;
}
-.app-switcher-item:not(.app-switcher-item-current):not(:hover) .app-switcher-logo-hover {
- opacity: 0;
+.app-switcher-item:not(.app-switcher-item-current):not(:hover)
+ .app-switcher-logo-hover {
+ opacity: 0;
}
.root-dark-mode .app-switcher-logo-normal {
- opacity: 0 !important;
+ opacity: 0 !important;
}
.root-dark-mode .app-switcher-logo-hover {
- opacity: 1 !important;
+ opacity: 1 !important;
}
.app-switcher-dropdown {
- padding: 0;
- text-align: left;
+ padding: 0;
+ text-align: left;
}
.app-switcher-dropdown:not(:hover) {
- max-height: 1.6rem;
- overflow: hidden;
+ max-height: 1.6rem;
+ overflow: hidden;
}
.app-switcher-dropdown-item {
- background-color: hsla(0,0%,35%,.9);
- padding: .125em .25em;
- margin-left: -.75em;
- margin-right: -.75em;
- position: relative;
- z-index: 10;
- cursor: pointer;
+ background-color: hsla(0, 0%, 35%, 0.9);
+ padding: 0.125em 0.25em;
+ margin-left: -0.75em;
+ margin-right: -0.75em;
+ position: relative;
+ z-index: 10;
+ cursor: pointer;
}
.app-switcher-dropdown-item:hover {
- background-color: rgba(0,0,0,.9);
+ background-color: rgba(0, 0, 0, 0.9);
}
.app-switcher-dropdown-item:nth-child(2) {
- border-top-left-radius: 3px;
- border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
}
.app-switcher-dropdown-item:last-child {
- border-bottom-left-radius: 3px;
- border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px;
}
.app-switcher-dropdown-title {
- padding-bottom: .2em;
- padding-left: .5em;
- padding-right: .25em;
+ padding-bottom: 0.2em;
+ padding-left: 0.5em;
+ padding-right: 0.25em;
}
.app-switcher-dropdown-title a {
- cursor: unset;
+ cursor: unset;
}
.thuhole-login-popup {
- font-size: 1rem;
- background-color: #f7f7f7;
- color: black;
- position: fixed;
- left: 50%;
- top: 50%;
- width: 320px;
- z-index: 114515;
- transform: translateX(-50%) translateY(-50%);
- border-radius: 5px;
+ font-size: 1rem;
+ background-color: #f7f7f7;
+ color: black;
+ position: fixed;
+ left: 50%;
+ top: 50%;
+ width: 320px;
+ z-index: 114515;
+ transform: translateX(-50%) translateY(-50%);
+ border-radius: 5px;
}
.thuhole-login-popup a {
- color: #00c;
+ color: #00c;
}
.thuhole-login-popup p {
- margin: 1.25em 0;
- text-align: center;
+ margin: 1.25em 0;
+ text-align: center;
}
.thuhole-login-popup-info p {
- margin: .25em 1em;
- text-align: left;
+ margin: 0.25em 1em;
+ text-align: left;
}
.thuhole-login-popup-info ul {
- margin: .75em 1em;
- text-align: left;
- font-size: 75%;
+ margin: 0.75em 1em;
+ text-align: left;
+ font-size: 75%;
}
/* override ant design */
-.thuhole-login-popup input, .thuhole-login-popup button {
- font-size: .85em;
- vertical-align: middle;
-}
-.thuhole-login-popup input:not([type="checkbox"]) {
- width: 8rem;
- border-radius: 5px;
- border: 1px solid black;
- outline: none;
- margin: 0;
- padding: 0 .5em;
- line-height: 2em;
+.thuhole-login-popup input,
+.thuhole-login-popup button {
+ font-size: 0.85em;
+ vertical-align: middle;
+}
+.thuhole-login-popup input:not([type='checkbox']) {
+ width: 8rem;
+ border-radius: 5px;
+ border: 1px solid black;
+ outline: none;
+ margin: 0;
+ padding: 0 0.5em;
+ line-height: 2em;
}
.thuhole-login-popup button {
- min-width: 6rem;
- color: black;
- background-color: rgba(235,235,235,.5);
- border-radius: 5px;
- text-align: center;
- border: 1px solid black;
- line-height: 2em;
- margin: 0 .5rem;
+ min-width: 6rem;
+ color: black;
+ background-color: rgba(235, 235, 235, 0.5);
+ border-radius: 5px;
+ text-align: center;
+ border: 1px solid black;
+ line-height: 2em;
+ margin: 0 0.5rem;
}
.thuhole-login-popup button:hover {
- background-color: rgba(255,255,255,.7);
+ background-color: rgba(255, 255, 255, 0.7);
}
.thuhole-login-popup button:disabled {
- background-color: rgba(128,128,128,.5);
+ background-color: rgba(128, 128, 128, 0.5);
}
.thuhole-login-type {
- display: inline-block;
- width: 6rem;
- margin: 0 .5rem;
+ display: inline-block;
+ width: 6rem;
+ margin: 0 0.5rem;
}
.thuhole-login-popup-shadow {
- opacity: .5;
- background-color: black;
- position: fixed;
- left: 0;
- top: 0;
- height: 100%;
- width: 100%;
- z-index: 114514;
+ opacity: 0.5;
+ background-color: black;
+ position: fixed;
+ left: 0;
+ top: 0;
+ height: 100%;
+ width: 100%;
+ z-index: 114514;
}
.thuhole-login-popup label.perm-item {
- font-size: .8em;
- vertical-align: .1rem;
- margin-left: .5rem;
+ font-size: 0.8em;
+ vertical-align: 0.1rem;
+ margin-left: 0.5rem;
}
.aux-margin {
- width: calc(100% - 2 * 50px);
- margin: 0 50px;
+ width: calc(100% - 2 * 50px);
+ margin: 0 50px;
}
@media screen and (max-width: 1300px) {
- .aux-margin {
- width: calc(100% - 2 * 10px);
- margin: 0 10px;
- }
+ .aux-margin {
+ width: calc(100% - 2 * 10px);
+ margin: 0 10px;
+ }
}
.title {
- font-size: 1.5em;
- height: 4rem;
- padding-top: 1rem;
- text-align: center;
+ font-size: 1.5em;
+ height: 4rem;
+ padding-top: 1rem;
+ text-align: center;
}
.time-str {
- color: #999999;
+ color: #999999;
}
a.button {
diff --git a/src/infrastructure/widgets.js b/src/infrastructure/widgets.js
index aaba2ce..0507b20 100644
--- a/src/infrastructure/widgets.js
+++ b/src/infrastructure/widgets.js
@@ -1,4 +1,4 @@
-import React, {Component, PureComponent} from 'react';
+import React, { Component, PureComponent } from 'react';
import ReactDOM from 'react-dom';
import TimeAgo from 'react-timeago';
@@ -8,57 +8,63 @@ import buildFormatter from 'react-timeago/lib/formatters/buildFormatter';
import './global.css';
import './widgets.css';
-import {get_json, API_VERSION_PARAM} from './functions';
+import { get_json, API_VERSION_PARAM } from './functions';
function pad2(x) {
- return x<10 ? '0'+x : ''+x;
+ return x < 10 ? '0' + x : '' + x;
}
export function format_time(time) {
- return `${time.getMonth()+1}-${pad2(time.getDate())} ${time.getHours()}:${pad2(time.getMinutes())}:${pad2(time.getSeconds())}`;
+ return `${time.getMonth() + 1}-${pad2(
+ time.getDate(),
+ )} ${time.getHours()}:${pad2(time.getMinutes())}:${pad2(time.getSeconds())}`;
}
-const chinese_format=buildFormatter(chineseStrings);
+const chinese_format = buildFormatter(chineseStrings);
export function Time(props) {
- const time=new Date(props.stamp*1000);
- return (
-
-
- {props.text} -
- ) + return ( ++ {props.text} +
+ ); } export function GlobalTitle(props) { - return ( -{props.text}
-{props.text}
+- 通过第三方验证登陆新T树洞 -
-- - - 闭社 - -
-
-
-
- {this.setThuhole(e, e.target, this.input_token_ref)}}
- >
-
- T大树洞
-
-
- 前往Telegram群查询15分钟临时token
-
-
-
- 清华大水群
-
-
-
-
-
提醒: -
-+ 通过第三方验证登陆新T树洞 +
++ + + 闭社 + +
+
+
+
+ {
+ this.setThuhole(e, e.target, this.input_token_ref);
+ }}
+ >
+
+ T大树洞
+
+
+ 前往Telegram群查询15分钟临时token
+
+
+
+ 清华大水群
+
+
+
+
+
提醒:
+