归档 artalk-cf 评论后端 + rss-robot 到 blog-admin(含技术选型/模块分布 README)
Deploy to Production / pre-check (push) Successful in 58s
Deploy to Production / build (push) Successful in 4m3s
Deploy to Production / deploy-edgeone (push) Successful in 3m48s
Deploy to Production / finalize (push) Successful in 26s
Deploy to Production / notify-failure (push) Skipped

This commit is contained in:
zqlit committed 2026-10-04 08:45:40 +08:00
1 parent 855a001046
commit a74b3c7127
98 files changed
+15657

No files matched your search

+550
View File
@@ -0,0 +1,550 @@
/* ==========================================================================
评论后台样式 —— 对齐 post.usj.cc(写作后台)的视觉语言
色板与度量照抄 write-server/src/app/globals.css
原则:可读性优先
· 暖白底 + 深蓝墨字(不是纯黑,降低长时间阅读的刺眼感)
· 1px 细边框代替投影,只有弹层才用阴影
· 字号偏小但层级明确:11 / 12 / 13 / 15 / 22
· 圆角克制:6px(控件)/ 8px(卡片)/ 16px(登录卡)
· 无装饰性动效,只保留 hover 的颜色过渡
========================================================================== */
/* ---------------------------------------------------------- 色板 */
/* 参考 EWD 后台:白色侧栏 + 中性浅灰内容底 + 蓝色点缀 */
:root{
color-scheme: light;
--bg:#f5f8f6; /* 内容区底 · 带一点绿意的浅灰 */
--surface:#edf2ee; /* 次级面 · hover / 代码底 */
--card:#ffffff; /* 卡片 / 侧栏 · 纯白 */
--text:#253830; /* 正文 · 深灰绿 */
--muted:#8b9a91; /* 次要文字 */
--line:#e3eae5; /* 分隔线 */
--accent:#2f9e63; /* 主色 · 清新绿 */
--accent-hover:#288a56;
--danger:#d75a4a;
--danger-hover:#c45151;
--success:#39b86f;
--warning:#c09a46;
--on-accent:#fff;
--accent-soft:rgba(47,158,99,.09);
--accent-line:rgba(47,158,99,.20);
--danger-soft:rgba(215,90,74,.10);
--danger-line:rgba(215,90,74,.24);
--ok-soft:rgba(57,184,111,.12);
--pend-fg:#92400e; --pend-bg:#fef3c7; --pend-line:#fde68a;
--err-fg:#991b1b; --err-bg:#fee2e2; --err-line:#fecaca;
--shadow-card:0 1px 2px rgba(24,48,36,.04);
--shadow-pop:0 12px 32px rgba(24,48,36,.16);
--side-w:216px;
--font:"PingFang SC","Hiragino Sans GB","Microsoft YaHei",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;
}
/* 夜间模式:护眼向 —— 暖墨绿黑底、降对比、柔绿点缀,不用纯黑纯白 */
:root[data-theme="dark"]{
color-scheme: dark;
--bg:#141916; /* 暖墨绿黑,比纯黑柔和 */
--surface:#1d2420; /* hover / 代码底 */
--card:#191f1b; /* 卡片 / 侧栏 */
--text:#d6ded7; /* 正文 · 柔白(不用纯白,降低刺眼感) */
--muted:#8fa093; /* 次要文字 · 灰绿 */
--line:#2a332c; /* 分隔线 · 低对比 */
--accent:#7cc9a0; /* 主色 · 柔和绿 */
--accent-hover:#98d8b4;
--danger:#e39a8f;
--danger-hover:#f0b6ad;
--success:#8fd4a8;
--warning:#e3c98f;
/* 柔绿底上用深墨绿字,保证可读 */
--on-accent:#12241a;
--accent-soft:rgba(124,201,160,.12);
--accent-line:rgba(124,201,160,.28);
--danger-soft:rgba(227,154,143,.13);
--danger-line:rgba(227,154,143,.28);
--ok-soft:rgba(143,212,168,.14);
--pend-fg:#e3c98f; --pend-bg:rgba(227,201,143,.10); --pend-line:rgba(227,201,143,.26);
--err-fg:#e39a8f; --err-bg:rgba(227,154,143,.10); --err-line:rgba(227,154,143,.26);
--shadow-card:0 1px 2px rgba(0,0,0,.20);
--shadow-pop:0 12px 32px rgba(0,0,0,.45);
}
/* ---------------------------------------------------------- 基础 */
*{box-sizing:border-box}
/* 必须放最前面:.gate / .app / .modal 的 display 会盖掉 [hidden] 的 UA 样式 */
[hidden]{display:none!important}
html,body{margin:0;padding:0;height:100%}
body{
background:var(--bg);
color:var(--text);
font-family:var(--font);
font-size:13px;
line-height:1.65;
-webkit-font-smoothing:antialiased;
}
h1,h2,h3,h4{margin:0;font-weight:700;line-height:1.4}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline}
::selection{background:var(--accent-soft)}
::-webkit-scrollbar{width:6px;height:6px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:var(--line);border-radius:3px}
::-webkit-scrollbar-thumb:hover{background:var(--muted)}
*:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.px{font-size:11px;letter-spacing:.04em;color:var(--muted);text-transform:uppercase}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace}
/* ---------------------------------------------------------- 按钮 */
.btn{
display:inline-flex;align-items:center;justify-content:center;gap:6px;
padding:7px 12px;
font-family:inherit;font-size:12px;font-weight:500;line-height:1.4;
color:var(--text);
background:var(--card);
border:1px solid var(--line);
border-radius:6px;
cursor:pointer;white-space:nowrap;
transition:background-color .15s,color .15s,border-color .15s;
}
.btn:hover:not(:disabled){background:var(--surface);color:var(--accent);border-color:var(--accent-line)}
.btn:disabled{opacity:.45;cursor:not-allowed}
.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--on-accent);font-weight:600}
.btn.primary:hover:not(:disabled){background:var(--accent-hover);border-color:var(--accent-hover);color:var(--on-accent)}
.btn.danger:hover:not(:disabled){color:var(--danger);border-color:var(--danger-line);background:var(--danger-soft)}
.btn.tiny{padding:5px 9px;font-size:11px}
.btn.block{display:flex;width:100%;padding:9px 12px}
.btn[data-busy]{opacity:.5;pointer-events:none}
.icon-btn{
display:inline-flex;align-items:center;justify-content:center;
width:28px;height:28px;padding:0;
color:var(--muted);background:transparent;
border:1px solid transparent;border-radius:6px;
font-size:14px;line-height:1;cursor:pointer;
transition:background-color .15s,color .15s;
}
.icon-btn:hover{background:var(--bg);color:var(--text)}
/* ---------------------------------------------------------- 表单 */
input,select,textarea{
width:100%;padding:9px 11px;
font-family:inherit;font-size:13px;color:var(--text);
background:var(--bg);
border:1px solid var(--line);border-radius:6px;
outline:none;
transition:border-color .15s;
}
input:focus,select:focus,textarea:focus{border-color:var(--accent);outline:none;box-shadow:0 0 0 3px var(--accent-soft)}
input::placeholder,textarea::placeholder{color:var(--muted);opacity:.7}
textarea{resize:vertical;min-height:88px;line-height:1.7}
select{appearance:none;cursor:pointer;padding-right:28px;
background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),linear-gradient(135deg,var(--muted) 50%,transparent 50%);
background-position:calc(100% - 15px) 50%,calc(100% - 10px) 50%;
background-size:5px 5px,5px 5px;background-repeat:no-repeat;
}
.lbl{display:block;margin-bottom:6px;font-size:12px;font-weight:500;color:var(--text)}
.field{display:block;margin-bottom:14px}
.field-k{display:block;margin-bottom:6px;font-size:12px;font-weight:500;color:var(--text)}
.alert{
padding:10px 13px;margin-bottom:16px;
font-size:12px;line-height:1.6;
color:var(--err-fg);background:var(--err-bg);
border:1px solid var(--err-line);border-radius:6px;
}
.form-err{
margin:14px 0 0;padding:10px 13px;
font-size:12px;color:var(--err-fg);background:var(--err-bg);
border:1px solid var(--err-line);border-radius:6px;
}
/* ---------------------------------------------------------- 登录 */
.gate{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px;background:var(--bg)}
.login-card{
width:100%;max-width:340px;padding:32px;
background:var(--card);
border:1px solid var(--line);border-radius:16px;
box-shadow:var(--shadow-pop);
}
.login-card h1{font-size:19px;color:var(--accent)}
.login-card .sub{margin:3px 0 26px;font-size:12px;color:var(--muted)}
.login-card form{margin-top:0}
.login-card .btn{margin-top:6px}
.login-card .hint{margin:18px 0 0;font-size:11px;line-height:1.7;color:var(--muted);text-align:center}
/* ---------------------------------------------------------- 主框架 */
.app{display:flex;min-height:100vh;background:var(--bg)}
.sidebar{
width:var(--side-w);flex:none;
display:flex;flex-direction:column;
background:var(--card);
border-right:1px solid var(--line);
position:fixed;inset:0 auto 0 0;z-index:50;
}
.side-head{
display:flex;align-items:center;gap:10px;
padding:16px 16px 14px;
border-bottom:1px solid var(--line);
}
.logo{
flex:none;width:30px;height:30px;
display:flex;align-items:center;justify-content:center;
background:var(--accent);color:var(--on-accent);
font-size:14px;font-weight:700;border-radius:8px;
}
.side-tt h1{font-size:14px;color:var(--text);letter-spacing:.02em}
.side-tt p{margin:0;font-size:11px;color:var(--muted)}
.side-nav{flex:1;padding:10px;display:flex;flex-direction:column;gap:2px;overflow-y:auto}
.tab{
display:flex;align-items:center;gap:10px;width:100%;
padding:8px 11px;
font-family:inherit;font-size:13px;font-weight:400;text-align:left;
color:var(--text);background:transparent;
border:0;border-radius:7px;cursor:pointer;
transition:background-color .15s,color .15s;
}
.tab svg{flex:none;opacity:.75}
.tab:hover{background:var(--surface);color:var(--accent)}
.tab.on{background:var(--accent-soft);color:var(--accent);font-weight:500}
.tab.on:hover{background:var(--accent-soft);color:var(--accent)}
.tab.on svg{opacity:1}
.tab .n{
margin-left:auto;padding:1px 6px;
font-size:10px;line-height:1.5;
background:var(--danger);color:#fff;border-radius:999px;
}
.tab.on .n{background:var(--danger);color:#fff}
.nav-group{
padding:12px 11px 4px;
font-size:10.5px;font-weight:600;letter-spacing:.6px;
color:var(--muted);
}
.nav-sep{height:1px;margin:6px 8px;background:var(--line)}
.side-foot{padding:10px 12px 12px;border-top:1px solid var(--line);display:flex;flex-direction:column;gap:2px}
.sfoot-btn{
display:flex;align-items:center;gap:9px;width:100%;
padding:7px 10px;
font-family:inherit;font-size:12px;color:var(--muted);
background:transparent;border:0;border-radius:7px;cursor:pointer;
transition:background-color .15s,color .15s;
}
.sfoot-btn:hover{background:var(--surface);color:var(--accent)}
.main{
flex:1;min-width:0;margin-left:var(--side-w);
display:flex;flex-direction:column;
padding:0 28px;
}
/* 顶栏:面包屑 + 登录身份 */
.topbar{
position:sticky;top:0;z-index:30;
margin:0 -28px;padding:13px 28px;
display:flex;align-items:center;gap:10px;
background:var(--card);
border-bottom:1px solid var(--line);
}
.crumb{display:flex;align-items:center;gap:7px;font-size:13px}
.crumb .cg{color:var(--muted)}
.crumb .sp{color:var(--line)}
.crumb .pg{color:var(--text);font-weight:500}
.top-right{margin-left:auto}
.side-name{font-size:12px;color:var(--muted)}
#view{padding-top:22px}
.mobile-bar{display:none}
.scrim{display:none}
.foot{
margin-top:auto;padding:20px 0 24px;
display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;
font-size:11px;color:var(--muted);
}
/* ---------------------------------------------------------- 页头 */
.page-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin:0 0 18px}
.page-head h2{font-size:18px}
.page-head .sub{font-size:12px;color:var(--muted)}
.page-head .right{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
/* ---------------------------------------------------------- 卡片 */
.card{
background:var(--card);
border:1px solid var(--line);border-radius:8px;
box-shadow:var(--shadow-card);
overflow:hidden;
}
.card-head{
display:flex;align-items:center;gap:8px;
padding:12px 16px;border-bottom:1px solid var(--line);
}
.card-head h3{font-size:13px;font-weight:700}
.card-body{padding:16px}
/* ---------------------------------------------------------- 统计卡 */
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}
.stat{
padding:16px;text-align:center;
background:var(--card);
border:1px solid var(--line);border-radius:8px;
}
.stat .k{font-size:11px;color:var(--muted);margin-bottom:4px}
.stat .v{font-size:22px;font-weight:700;line-height:1.3;color:var(--accent)}
.stat .x{margin-top:2px;font-size:11px;color:var(--muted)}
.grid2{display:grid;grid-template-columns:1.3fr 1fr;gap:14px;margin-top:14px;align-items:start}
/* ---------------------------------------------------------- 小列表 */
.mini{display:flex;flex-direction:column}
.mini-i{
display:flex;align-items:baseline;gap:10px;
padding:8px 0;border-bottom:1px solid var(--line);
font-size:13px;
}
.mini-i:last-child{border-bottom:0}
.mini-i .n{flex:none;width:62px;font-size:11px;color:var(--muted);white-space:nowrap}
.mini-i .b{flex:1;min-width:0}
.mini-i .b .nm{font-weight:500}
.mini-i .b .tx{margin-left:6px;font-size:12px;color:var(--muted)}
.mini-i .c{flex:none;font-weight:500;color:var(--accent)}
/* ---------------------------------------------------------- 标签 */
.tag{
display:inline-block;padding:1px 6px;
font-size:10px;line-height:1.6;border-radius:4px;
white-space:nowrap;
}
.tag.acc{color:var(--accent);background:var(--accent-soft)}
.tag.pink{color:var(--accent);background:var(--accent-soft)}
.tag.blue{color:var(--accent);background:var(--accent-soft)}
.tag.warn{color:var(--pend-fg);background:var(--pend-bg)}
.tag.dang{color:var(--danger);background:var(--danger-soft)}
.tag.line{color:var(--muted);border:1px solid var(--line)}
/* ---------------------------------------------------------- 评论列表 */
.ctool{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-bottom:14px}
.ctool .grow{flex:1;min-width:180px}
.ctool input,.ctool select{height:36px;padding-top:0;padding-bottom:0}
.clist{display:flex;flex-direction:column;gap:8px}
.citem{
padding:14px 16px;
background:var(--card);
border:1px solid var(--line);border-radius:10px;
transition:border-color .15s;
}
.citem:hover{border-color:var(--accent-line)}
.citem.pend{border-left:3px solid var(--warning)}
.citem.pin{border-left:3px solid var(--accent)}
.citem.hid{opacity:.55}
/* 头像 + 内容 横排;回复嵌套画树状线,不用 margin hack */
.crow{display:flex;gap:12px;align-items:flex-start}
.cavatar{
flex:none;width:38px;height:38px;
border-radius:50%;object-fit:cover;
background:var(--surface);
border:1px solid var(--line);
}
.cmain{flex:1;min-width:0}
.chead{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:5px}
.chead .nick{font-size:13px;font-weight:600}
.chead .t{margin-left:auto;font-size:11px;color:var(--muted);white-space:nowrap}
.cbody{
font-size:14px;line-height:1.75;color:var(--text);
word-break:break-word;white-space:pre-wrap;
}
.cbody .ph{color:var(--muted)}
.creplies{
margin-top:11px;padding-left:14px;
border-left:2px solid var(--line);
display:flex;flex-direction:column;gap:8px;
}
.creplies .citem{background:var(--bg);border-radius:8px}
.creplies .citem.pend{border-left-color:var(--warning)}
.creplies .citem.pin{border-left-color:var(--accent)}
.cfoot{
display:flex;align-items:center;gap:10px;flex-wrap:wrap;
margin-top:9px;padding-top:9px;
border-top:1px solid var(--line);
font-size:11px;color:var(--muted);
}
.cfoot a{color:var(--muted)}
.cfoot a:hover{color:var(--accent)}
.cfoot .acts{margin-left:auto;display:flex;gap:6px;flex-wrap:wrap}
/* ---------------------------------------------------------- 表格 */
.tblwrap{
background:var(--card);
border:1px solid var(--line);border-radius:8px;
overflow-x:auto;
}
table{width:100%;border-collapse:collapse;font-size:13px;min-width:620px}
thead th{
padding:10px 14px;text-align:left;
font-size:11px;font-weight:500;color:var(--muted);
border-bottom:1px solid var(--line);white-space:nowrap;
}
tbody td{padding:11px 14px;border-bottom:1px solid var(--line);vertical-align:middle}
tbody tr:last-child td{border-bottom:0}
tbody tr:hover{background:var(--surface)}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
td .lk{font-size:12px;color:var(--muted)}
.ell{display:block;max-width:340px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* ---------------------------------------------------------- 分页 */
.pager{display:flex;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap;margin:20px 0 4px}
.pager .info{font-size:12px;color:var(--muted)}
.pager .info b{color:var(--text);font-weight:600}
/* ---------------------------------------------------------- 空态 / 加载 */
.empty{
padding:48px 20px;text-align:center;
font-size:13px;color:var(--muted);
background:var(--card);
border:1px dashed var(--line);border-radius:8px;
}
.empty b{display:block;margin-bottom:6px;font-size:12px;color:var(--text)}
.loading{padding:40px;text-align:center;font-size:13px;color:var(--muted)}
/* ---------------------------------------------------------- 键值表 */
.kv{display:grid;grid-template-columns:auto 1fr;gap:9px 18px;margin:0;font-size:13px}
.kv dt{font-size:12px;color:var(--muted)}
.kv dd{margin:0;word-break:break-all}
.kv dd.ok{color:var(--success);font-weight:500}
.kv dd.bad{color:var(--danger)}
pre.code{
margin:0;padding:14px;
background:var(--surface);color:var(--text);
border:1px solid var(--line);border-radius:6px;
font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
font-size:12px;line-height:1.7;
overflow:auto;max-height:320px;white-space:pre;
}
textarea.code{
display:block;margin:0;padding:14px;
background:var(--surface);color:var(--text);
border:1px solid var(--line);border-radius:6px;
font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
font-size:12px;line-height:1.7;
white-space:pre;tab-size:2;
}
textarea.code:focus{outline:none;border-color:var(--accent)}
/* ---------------------------------------------------------- 提示 / 模态 */
.toast{
position:fixed;left:50%;bottom:24px;transform:translateX(-50%);
z-index:600;max-width:86vw;
padding:10px 16px;
font-size:13px;
color:var(--text);background:var(--card);
border:1px solid var(--line);border-radius:8px;
box-shadow:var(--shadow-pop);
}
.toast.bad{color:var(--danger);border-color:var(--danger-line)}
.modal{
position:fixed;inset:0;z-index:500;
display:flex;align-items:center;justify-content:center;padding:20px;
background:rgba(24,48,36,.30);
backdrop-filter:blur(2px);
}
:root[data-theme="dark"] .modal{background:rgba(0,0,0,.55)}
.modal-card{
width:100%;max-width:520px;max-height:86vh;
display:flex;flex-direction:column;
background:var(--card);
border:1px solid var(--line);border-radius:12px;
box-shadow:var(--shadow-pop);
}
.modal-head{
display:flex;align-items:center;gap:10px;
padding:14px 18px;border-bottom:1px solid var(--line);
}
.modal-head h3{flex:1;font-size:14px;font-weight:700}
.modal-body{padding:18px;overflow-y:auto}
/* ---------------------------------------------------------- 响应式 */
@media (max-width:1000px){
.stats{grid-template-columns:repeat(2,1fr)}
.grid2{grid-template-columns:1fr}
.main{padding:0 20px}
.topbar{margin:0 -20px;padding:13px 20px}
}
@media (max-width:760px){
.mobile-bar{
display:flex;align-items:center;gap:8px;
position:sticky;top:0;z-index:40;
height:48px;padding:0 12px;
background:var(--card);border-bottom:1px solid var(--line);
}
.mobile-title{font-size:13px;font-weight:700;color:var(--accent)}
.scrim{display:block;position:fixed;inset:0;z-index:45;background:rgba(18,30,23,.32)}
:root[data-theme="dark"] .scrim{background:rgba(0,0,0,.5)}
.sidebar{
width:78%;max-width:280px;
transform:translateX(-100%);
transition:transform .2s ease-out;
box-shadow:var(--shadow-pop);
}
.sidebar.open{transform:translateX(0)}
.main{margin-left:0;padding:0 16px}
.topbar{margin:0 -16px;padding:12px 16px;top:48px}
#view{padding-top:16px}
.stats{grid-template-columns:1fr 1fr;gap:10px}
.stat{padding:13px 10px}
.stat .v{font-size:19px}
.cavatar{width:32px;height:32px}
.ell{max-width:170px}
.page-head h2{font-size:16px}
.login-card{padding:26px 22px}
}
@media (prefers-reduced-motion:reduce){
*{transition:none!important}
}
File diff suppressed because it is too large. Load diff
+98
View File
@@ -0,0 +1,98 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
<title>管理面板 · 优世界</title>
<meta name="robots" content="noindex,nofollow">
<script>
/* 主题要在样式生效前定好,否则会闪一下浅色 */
try { if (localStorage.getItem('atk-theme') === 'dark') document.documentElement.dataset.theme = 'dark'; } catch (e) {}
</script>
<link rel="stylesheet" href="./admin.css">
</head>
<body>
<!-- ===================== 登录 ===================== -->
<div id="gate" class="gate" hidden>
<div class="login-card">
<h1>管理面板</h1>
<p class="sub">优世界 · 评论 + 订阅统一管理</p>
<div id="lgErr" class="alert" hidden></div>
<form id="loginForm">
<label class="lbl" for="lgUser">账号</label>
<input id="lgUser" type="text" placeholder="admin" required autocomplete="username" spellcheck="false">
<label class="lbl" for="lgPass">密码</label>
<input id="lgPass" type="password" required autocomplete="current-password">
<label class="lbl" for="lgRss">订阅口令(管理订阅/友链用,留空则跳过)</label>
<input id="lgRss" type="password" autocomplete="off">
<button class="btn primary block" type="submit" id="lgBtn">登 录</button>
</form>
<p class="hint" title="Cloudflare Workers 没有 TCP,发不了 SMTP">邮箱验证码登录未启用</p>
</div>
</div>
<!-- ===================== 主界面 ===================== -->
<div id="app" class="app" hidden>
<header class="mobile-bar">
<button class="icon-btn" data-act="menu" aria-label="打开菜单">&#9776;</button>
<span class="mobile-title">管理面板</span>
</header>
<div class="scrim" id="scrim" data-act="menu" hidden></div>
<aside class="sidebar" id="sidebar">
<div class="side-head">
<span class="logo">优</span>
<div class="side-tt">
<h1>优世界</h1>
<p>管理面板</p>
</div>
</div>
<nav class="side-nav" id="tabs"></nav>
<div class="side-foot">
<button class="sfoot-btn" data-act="theme" id="themeBtn"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20.5 14.5A8.5 8.5 0 1 1 9.5 3.5a7 7 0 0 0 11 11z"/></svg><span>深色模式</span></button>
<button class="sfoot-btn" data-act="logout"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 4H5.5A1.5 1.5 0 0 0 4 5.5v13A1.5 1.5 0 0 0 5.5 20H9"/><path d="M15 16l4-4-4-4M19 12H9"/></svg><span>退出登录</span></button>
</div>
</aside>
<main class="main">
<header class="topbar">
<div class="crumb" id="crumb"></div>
<div class="top-right">
<span class="side-name" id="who"></span>
</div>
</header>
<div id="view"></div>
<div class="foot">
<span id="footL"></span>
<span id="footR"></span>
</div>
</main>
</div>
<div id="toast" class="toast" hidden></div>
<div id="modal" class="modal" hidden>
<div class="modal-card" role="dialog" aria-modal="true">
<div class="modal-head">
<h3 id="modalTitle"></h3>
<button class="icon-btn" data-act="modal-close" aria-label="关闭">&#10005;</button>
</div>
<div class="modal-body" id="modalBody"></div>
</div>
</div>
<script src="./admin.js"></script>
</body>
</html>
+1
View File
@@ -0,0 +1 @@
@charset "UTF-8";.artalk,.atk-layer-wrap{--at-color-font: #2a2e2e;--at-color-deep: #2a2e2e;--at-color-sub: #757575;--at-color-grey: #747474;--at-color-meta: #697182;--at-color-border: #eceff2;--at-color-light: #4285f4;--at-color-bg: #fff;--at-color-bg-transl: rgba(255, 255, 255, .94);--at-color-bg-grey: #f3f4f5;--at-color-bg-grey-transl: rgba(244, 244, 244, .75);--at-color-bg-light: rgba(29, 161, 242, .1);--at-color-main: #0083ff;--at-color-red: #ff5652;--at-color-pink: #fa5a57;--at-color-yellow: #ff7c37;--at-color-green: #4caf50;--at-color-gradient: linear-gradient(180deg, transparent, rgba(255, 255, 255))}.artalk.atk-dark-mode,.atk-layer-wrap.atk-dark-mode{--at-color-font: #fff;--at-color-deep: #e7e7e7;--at-color-sub: #e7e7e7;--at-color-grey: #fff;--at-color-meta: #fff;--at-color-border: #2d3235;--at-color-light: #687a86;--at-color-bg: #1e2224;--at-color-bg-transl: rgba(30, 34, 36, .95);--at-color-bg-grey: #46494e;--at-color-bg-grey-transl: rgba(8, 8, 8, .95);--at-color-bg-light: rgba(29, 161, 242, .1);--at-color-main: #0083ff;--at-color-red: #ff5652;--at-color-pink: #fa5a57;--at-color-yellow: #ff7c37;--at-color-green: #4caf50;--at-color-gradient: linear-gradient(180deg, transparent, rgba(30, 34, 36, 1))}.atk-comment-wrap{overflow:hidden;position:relative;border-bottom:1px solid transparent}.atk-comment-wrap.atk-flash-once{animation:atkFlashOnce 1s ease-in-out 0s}@keyframes atkFlashOnce{0%{background:#0083ff33}to{background:transparent}}.atk-comment-wrap.atk-unread:before{content:" ";position:absolute;left:0;top:10%;width:3px;height:80%;background:var(--at-color-main)}.atk-comment-wrap.atk-openable{cursor:pointer}.atk-comment-wrap.atk-openable:hover{background:var(--at-color-bg-grey)}.atk-comment-wrap.atk-openable .atk-height-limit:after{background:transparent!important}.atk-comment-wrap:last-child{border-bottom:none}.atk-comment{display:block;padding:10px}.atk-comment>.atk-avatar{display:block;padding:2px 0;float:left}.atk-comment>.atk-avatar img{width:50px;height:50px;border-radius:3px}.atk-comment>.atk-main{display:block;margin-left:63px}.atk-comment>.atk-main>.atk-header{line-height:1.5;font-size:13px;margin-bottom:.5em;overflow:hidden;position:relative;display:flex;flex-wrap:wrap;align-items:center}.atk-comment>.atk-main>.atk-header .atk-item{display:flex;align-items:center;margin-top:2px;margin-bottom:2px;color:var(--at-color-meta)}.atk-comment>.atk-main>.atk-header .atk-item:not(:last-child){margin-right:6px}.atk-comment>.atk-main>.atk-header .atk-item.atk-nick,.atk-comment>.atk-main>.atk-header .atk-item.atk-nick a{font-size:14px;color:var(--at-color-main);text-decoration:none}.atk-comment>.atk-main>.atk-header .atk-item.atk-reply-at{margin-left:2px}.atk-comment>.atk-main>.atk-header .atk-item.atk-reply-at>.atk-arrow:before{content:"";vertical-align:middle;transform:rotate(90deg);border-bottom:4px solid var(--at-color-grey);border-left:3px solid transparent;border-right:3px solid transparent;display:inline-block;margin-top:-1px}.atk-comment>.atk-main>.atk-header .atk-item.atk-reply-at>.atk-nick{color:var(--at-color-main);cursor:pointer;margin-left:6px}.atk-comment>.atk-main>.atk-header .badge,.atk-comment>.atk-main>.atk-header .atk-ua,.atk-comment>.atk-main>.atk-header .atk-pinned-badge,.atk-comment>.atk-main>.atk-header .atk-region-badge,.atk-comment>.atk-main>.atk-header .atk-badge{display:inline-block;color:var(--at-color-meta);background:var(--at-color-bg-grey);padding:0 6px;line-height:17px;border-radius:3px}.atk-comment>.atk-main>.atk-header .badge:not(:last-child),.atk-comment>.atk-main>.atk-header .atk-ua:not(:last-child),.atk-comment>.atk-main>.atk-header .atk-pinned-badge:not(:last-child),.atk-comment>.atk-main>.atk-header .atk-region-badge:not(:last-child),.atk-comment>.atk-main>.atk-header .atk-badge:not(:last-child){margin-right:6px}.atk-comment>.atk-main>.atk-header .atk-badge-wrap>*:last-child{margin-right:6px}.atk-comment>.atk-main>.atk-header .atk-badge{color:#fff}.atk-comment>.atk-main>.atk-header .atk-pinned-badge{color:#fff;background:#f44336}.atk-comment>.atk-main>.atk-header .atk-verified-icon{height:1.4em;width:1.4em;background-repeat:no-repeat;background-position:center;background-size:contain;display:block;background-image:url('data:image/svg+xml,<svg viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg" fill="%231d9bf0"><g><path d="M20.396 11c-.018-.646-.215-1.275-.57-1.816-.354-.54-.852-.972-1.438-1.246.223-.607.27-1.264.14-1.897-.131-.634-.437-1.218-.882-1.687-.47-.445-1.053-.75-1.687-.882-.633-.13-1.29-.083-1.897.14-.273-.587-.704-1.086-1.245-1.44S11.647 1.62 11 1.604c-.646.017-1.273.213-1.813.568s-.969.854-1.24 1.44c-.608-.223-1.267-.272-1.902-.14-.635.13-1.22.436-1.69.882-.445.47-.749 1.055-.878 1.688-.13.633-.08 1.29.144 1.896-.587.274-1.087.705-1.443 1.245-.356.54-.555 1.17-.574 1.817.02.647.218 1.276.574 1.817.356.54.856.972 1.443 1.245-.224.606-.274 1.263-.144 1.896.13.634.433 1.218.877 1.688.47.443 1.054.747 1.687.878.633.132 1.29.084 1.897-.136.274.586.705 1.Line truncated
+11
View File
@@ -0,0 +1,11 @@
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Artalk={})}(this,(function(e){"use strict";var t,n,s,i,r=Object.defineProperty,o=Object.defineProperties,a=Object.getOwnPropertyDescriptors,l=Object.getOwnPropertySymbols,c=Object.prototype.hasOwnProperty,d=Object.prototype.propertyIsEnumerable,h=(e,t,n)=>t in e?r(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,u=(e,t)=>{for(var n in t||(t={}))c.call(t,n)&&h(e,n,t[n]);if(l)for(var n of l(t))d.call(t,n)&&h(e,n,t[n]);return e},p=(e,t)=>o(e,a(t)),g=(e,t,n)=>(h(e,"symbol"!=typeof t?t+"":t,n),n),m=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)},f=(e,t,n)=>(((e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)})(e,t,"access private method"),n),k=(e,t,n)=>new Promise(((s,i)=>{var r=e=>{try{a(n.next(e))}catch(t){i(t)}},o=e=>{try{a(n.throw(e))}catch(t){i(t)}},a=e=>e.done?s(e.value):Promise.resolve(e.value).then(r,o);a((n=n.apply(e,t)).next())}));class y{constructor(e={}){g(this,"baseUrl","/api/v2"),g(this,"securityData",null),g(this,"securityWorker"),g(this,"abortControllers",new Map),g(this,"customFetch",((...e)=>fetch(...e))),g(this,"baseApiParams",{credentials:"same-origin",headers:{},redirect:"follow",referrerPolicy:"no-referrer"}),g(this,"setSecurityData",(e=>{this.securityData=e})),g(this,"contentFormatters",{"application/json":e=>null===e||"object"!=typeof e&&"string"!=typeof e?e:JSON.stringify(e),"text/plain":e=>null!==e&&"string"!=typeof e?JSON.stringify(e):e,"multipart/form-data":e=>Object.keys(e||{}).reduce(((t,n)=>{const s=e[n];return t.append(n,s instanceof Blob?s:"object"==typeof s&&null!==s?JSON.stringify(s):`${s}`),t}),new FormData),"application/x-www-form-urlencoded":e=>this.toQueryString(e)}),g(this,"createAbortSignal",(e=>{if(this.abortControllers.has(e)){const t=this.abortControllers.get(e);return t?t.signal:void 0}const t=new AbortController;return this.abortControllers.set(e,t),t.signal})),g(this,"abortRequest",(e=>{const t=this.abortControllers.get(e);t&&(t.abort(),this.abortControllers.delete(e))})),g(this,"request",(e=>k(this,null,(function*(){var t=e,{body:n,secure:s,path:i,type:r,query:o,format:a,baseUrl:h,cancelToken:g}=t,m=((e,t)=>{var n={};for(var s in e)c.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&l)for(var s of l(e))t.indexOf(s)<0&&d.call(e,s)&&(n[s]=e[s]);return n})(t,["body","secure","path","type","query","format","baseUrl","cancelToken"]);const f=("boolean"==typeof s?s:this.baseApiParams.secure)&&this.securityWorker&&(yield this.securityWorker(this.securityData))||{},y=this.mergeRequestParams(m,f),v=o&&this.toQueryString(o),$=this.contentFormatters[r||"application/json"],b=a||y.format;return this.customFetch(`${h||this.baseUrl||""}${i}${v?`?${v}`:""}`,p(u({},y),{headers:u(u({},y.headers||{}),r&&"multipart/form-data"!==r?{"Content-Type":r}:{}),signal:(g?this.createAbortSignal(g):y.signal)||null,body:null==n?null:$(n)})).then((e=>k(this,null,(function*(){const t=e;t.data=null,t.error=null;const n=b?yield e[b]().then((e=>(t.ok?t.data=e:t.error=e,t))).catch((e=>(t.error=e,t))):t;if(g&&this.abortControllers.delete(g),!e.ok)throw n;return n}))))})))),Object.assign(this,e)}encodeQueryParam(e,t){return`${encodeURIComponent(e)}=${encodeURIComponent("number"==typeof t?t:`${t}`)}`}addQueryParam(e,t){return this.encodeQueryParam(t,e[t])}addArrayQueryParam(e,t){return e[t].map((e=>this.encodeQueryParam(t,e))).join("&")}toQueryString(e){const t=e||{};return Object.keys(t).filter((e=>void 0!==t[e])).map((e=>Array.isArray(t[e])?this.addArrayQueryParam(t,e):this.addQueryParam(t,e))).join("&")}addQueryParams(e){const t=this.toQueryString(e);return t?`?${t}`:""}mergeRequestParams(e,t){return p(u(u(u({},this.baseApiParams),e),t||{}),{headers:u(u(u({},this.baseApiParams.headers||{}),e.headers||{}),t&&t.headers||{})})}}
/**
* @title Artalk API
* @version 2.0
* @license MIT (https://github.com/ArtalkJS/Artalk/blob/master/LICENSE)
* @baseUrl /api/v2
* @contact API Support <artalkjs@gmail.com> (https://artalk.js.org)
*
* Artalk is a modern comment system based on Golang.
*/let v=class extends y{constructor(){super(...arguments),g(this,"auth",{loginByEmail:(e,t={})=>this.request(u({path:"/auth/email/login",method:"POST",body:e,type:"application/json",format:"json"},t)),registerByEmail:(e,t={})=>this.request(u({path:"/auth/email/register",method:"POST",body:e,type:"application/json",format:"json"},t)),sendVerifyEmail:(e,t={})=>this.request(u({path:"/auth/email/send",method:"POST",body:e,type:"application/json",format:"json"},t)),checkDataMerge:(e={})=>this.request(u({path:"/auth/merge",method:"GET",secure:!0,format:"json"},e)),applyDataMerge:(e,t={})=>this.request(u({path:"/auth/merge",method:"POST",body:e,secure:!0,type:"application/json",format:"json"},t))}),g(this,"cache",{flushCache:(e={})=>this.request(u({path:"/cache/flush",method:"POST",secure:!0,format:"json"},e)),warmUpCache:(e={})=>this.request(u({path:"/cache/warm_up",method:"POST",secure:!0,format:"json"},e))}),g(this,"captcha",{getCaptcha:(e={})=>this.request(u({path:"/captcha",method:"GET",format:"json"},e)),getCaptchaStatus:(e={})=>this.request(u({path:"/captcha/status",method:"GET",format:"json"},e)),verifyCaptcha:(e,t={})=>this.request(u({path:"/captcha/verify",method:"POST",body:e,type:"application/json",format:"json"},t))}),g(this,"comments",{getComments:(e,t={})=>this.request(u({path:"/comments",method:"GET",query:e,secure:!0,type:"application/json",format:"json"},t)),createComment:(e,t={})=>this.request(u({path:"/comments",method:"POST",body:e,secure:!0,type:"application/json",format:"json"},t)),getComment:(e,t={})=>this.request(u({path:`/comments/${e}`,method:"GET",type:"application/json",format:"json"},t)),updateComment:(e,t,n={})=>this.request(u({path:`/comments/${e}`,method:"PUT",body:t,secure:!0,type:"application/json",format:"json"},n)),deleteComment:(e,t={})=>this.request(u({path:`/comments/${e}`,method:"DELETE",secure:!0,format:"json"},t))}),g(this,"conf",{conf:(e={})=>this.request(u({path:"/conf",method:"GET",format:"json"},e)),getSocialLoginProviders:(e={})=>this.request(u({path:"/conf/auth/providers",method:"GET",format:"json"},e)),getDomain:(e,t={})=>this.request(u({path:"/conf/domain",method:"GET",query:e,format:"json"},t))}),g(this,"notifies",{getNotifies:(e,t={})=>this.request(u({path:"/notifies",method:"GET",query:e,type:"application/json",format:"json"},t)),markAllNotifyRead:(e,t={})=>this.request(u({path:"/notifies/read",method:"POST",body:e,type:"application/json",format:"json"},t)),markNotifyRead:(e,t,n={})=>this.request(u({path:`/notifies/${e}/${t}`,method:"POST",format:"json"},n))}),g(this,"pages",{getPages:(e,t={})=>this.request(u({path:"/pages",method:"GET",query:e,secure:!0,type:"application/json",format:"json"},t)),fetchAllPages:(e,t={})=>this.request(u({path:"/pages/fetch",method:"POST",body:e,secure:!0,type:"application/json",format:"json"},t)),getPageFetchStatus:(e={})=>this.request(u({path:"/pages/fetch/status",method:"GET",secure:!0,format:"json"},e)),logPv:(e,t={})=>this.request(u({path:"/pages/pv",method:"POST",body:e,type:"application/json",format:"json"},t)),updatePage:(e,t,n={})=>this.request(u({path:`/pages/${e}`,method:"PUT",body:t,secure:!0,type:"application/json",format:"json"},n)),deletePage:(e,t={})=>this.request(u({path:`/pages/${e}`,method:"DELETE",secure:!0,format:"json"},t)),fetchPage:(e,t={})=>this.request(u({path:`/pages/${e}/fetch`,method:"POST",secure:!0,type:"application/json",format:"json"},t))}),g(this,"sendEmail",{sendEmail:(e,t={})=>this.request(u({path:"/send_email",method:"POST",body:e,secure:!0,type:"application/json",format:"json"},t))}),g(this,"settings",{getSettings:(e={})=>this.request(u({path:"/settings",method:"GET",secure:!0,format:"json"},e)),applySettings:(e,t={})=>this.request(u({path:"/settings",method:"PUT",body:e,secure:!0,type:"application/json",format:"json"},t)),getSettingsTemplate:(e,t={})=>this.request(u({path:`/settings/template/${e}`,method:"GET",secure:!0,format:"json"},t))}),g(this,"sites",{getSites:(e={})=>this.request(u({path:"/sites",method:"GET",secure:!0,format:"json"},e)),createSite:(e,t={})=>this.request(u({path:"/sites",method:"POST",body:e,secure:!0,type:"application/json",format:"json"},t)),updateSite:(e,t,n={})=>this.request(u({path:`/sites/${e}`,method:"PUT",body:t,secure:!0,type:"application/json",format:"json"},n)),deleteSite:(e,t={})=>this.request(u({path:`/sites/${e}`,method:"DELETE",secure:!0,format:"json"},t))}),g(this,"stats",{getStats:(e,t,n={})=>this.request(u({path:`/stats/${e}`,method:"GET",query:t,type:"application/json",format:"json"},n))}),g(this,"transfer",{exportArtrans:(e={})=>this.request(u({path:"/transfer/export",method:"GET",secure:!0,format:"json"},e)),importArtrans:(e,t={})=>this.request(u({path:"/transfer/import",method:"POST",body:e,secure:!0,type:"application/json"},t)),uploadArtrans:(e,t={})=>this.request(u({path:"/transfer/upload",method:"POST",body:e,secure:!0,type:"multipart/form-data",format:"json"},t))}),g(this,"upload",{upload:(e,t={})=>this.request(u({path:"/upload",method:"POSLine truncated
//# sourceMappingURL=Artalk.js.map
+1
View File
@@ -0,0 +1 @@
@charset "UTF-8";.artalk,.atk-layer-wrap{--at-color-font: #2a2e2e;--at-color-deep: #2a2e2e;--at-color-sub: #757575;--at-color-grey: #747474;--at-color-meta: #697182;--at-color-border: #eceff2;--at-color-light: #4285f4;--at-color-bg: #fff;--at-color-bg-transl: rgba(255, 255, 255, .94);--at-color-bg-grey: #f3f4f5;--at-color-bg-grey-transl: rgba(244, 244, 244, .75);--at-color-bg-light: rgba(29, 161, 242, .1);--at-color-main: #0083ff;--at-color-red: #ff5652;--at-color-pink: #fa5a57;--at-color-yellow: #ff7c37;--at-color-green: #4caf50;--at-color-gradient: linear-gradient(180deg, transparent, rgba(255, 255, 255))}.artalk.atk-dark-mode,.atk-layer-wrap.atk-dark-mode{--at-color-font: #fff;--at-color-deep: #e7e7e7;--at-color-sub: #e7e7e7;--at-color-grey: #fff;--at-color-meta: #fff;--at-color-border: #2d3235;--at-color-light: #687a86;--at-color-bg: #1e2224;--at-color-bg-transl: rgba(30, 34, 36, .95);--at-color-bg-grey: #46494e;--at-color-bg-grey-transl: rgba(8, 8, 8, .95);--at-color-bg-light: rgba(29, 161, 242, .1);--at-color-main: #0083ff;--at-color-red: #ff5652;--at-color-pink: #fa5a57;--at-color-yellow: #ff7c37;--at-color-green: #4caf50;--at-color-gradient: linear-gradient(180deg, transparent, rgba(30, 34, 36, 1))}.atk-comment-wrap{overflow:hidden;position:relative;border-bottom:1px solid transparent}.atk-comment-wrap.atk-flash-once{animation:atkFlashOnce 1s ease-in-out 0s}@keyframes atkFlashOnce{0%{background:#0083ff33}to{background:transparent}}.atk-comment-wrap.atk-unread:before{content:" ";position:absolute;left:0;top:10%;width:3px;height:80%;background:var(--at-color-main)}.atk-comment-wrap.atk-openable{cursor:pointer}.atk-comment-wrap.atk-openable:hover{background:var(--at-color-bg-grey)}.atk-comment-wrap.atk-openable .atk-height-limit:after{background:transparent!important}.atk-comment-wrap:last-child{border-bottom:none}.atk-comment{display:block;padding:10px}.atk-comment>.atk-avatar{display:block;padding:2px 0;float:left}.atk-comment>.atk-avatar img{width:50px;height:50px;border-radius:3px}.atk-comment>.atk-main{display:block;margin-left:63px}.atk-comment>.atk-main>.atk-header{line-height:1.5;font-size:13px;margin-bottom:.5em;overflow:hidden;position:relative;display:flex;flex-wrap:wrap;align-items:center}.atk-comment>.atk-main>.atk-header .atk-item{display:flex;align-items:center;margin-top:2px;margin-bottom:2px;color:var(--at-color-meta)}.atk-comment>.atk-main>.atk-header .atk-item:not(:last-child){margin-right:6px}.atk-comment>.atk-main>.atk-header .atk-item.atk-nick,.atk-comment>.atk-main>.atk-header .atk-item.atk-nick a{font-size:14px;color:var(--at-color-main);text-decoration:none}.atk-comment>.atk-main>.atk-header .atk-item.atk-reply-at{margin-left:2px}.atk-comment>.atk-main>.atk-header .atk-item.atk-reply-at>.atk-arrow:before{content:"";vertical-align:middle;transform:rotate(90deg);border-bottom:4px solid var(--at-color-grey);border-left:3px solid transparent;border-right:3px solid transparent;display:inline-block;margin-top:-1px}.atk-comment>.atk-main>.atk-header .atk-item.atk-reply-at>.atk-nick{color:var(--at-color-main);cursor:pointer;margin-left:6px}.atk-comment>.atk-main>.atk-header .badge,.atk-comment>.atk-main>.atk-header .atk-ua,.atk-comment>.atk-main>.atk-header .atk-pinned-badge,.atk-comment>.atk-main>.atk-header .atk-region-badge,.atk-comment>.atk-main>.atk-header .atk-badge{display:inline-block;color:var(--at-color-meta);background:var(--at-color-bg-grey);padding:0 6px;line-height:17px;border-radius:3px}.atk-comment>.atk-main>.atk-header .badge:not(:last-child),.atk-comment>.atk-main>.atk-header .atk-ua:not(:last-child),.atk-comment>.atk-main>.atk-header .atk-pinned-badge:not(:last-child),.atk-comment>.atk-main>.atk-header .atk-region-badge:not(:last-child),.atk-comment>.atk-main>.atk-header .atk-badge:not(:last-child){margin-right:6px}.atk-comment>.atk-main>.atk-header .atk-badge-wrap>*:last-child{margin-right:6px}.atk-comment>.atk-main>.atk-header .atk-badge{color:#fff}.atk-comment>.atk-main>.atk-header .atk-pinned-badge{color:#fff;background:#f44336}.atk-comment>.atk-main>.atk-header .atk-verified-icon{height:1.4em;width:1.4em;background-repeat:no-repeat;background-position:center;background-size:contain;display:block;background-image:url('data:image/svg+xml,<svg viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg" fill="%231d9bf0"><g><path d="M20.396 11c-.018-.646-.215-1.275-.57-1.816-.354-.54-.852-.972-1.438-1.246.223-.607.27-1.264.14-1.897-.131-.634-.437-1.218-.882-1.687-.47-.445-1.053-.75-1.687-.882-.633-.13-1.29-.083-1.897.14-.273-.587-.704-1.086-1.245-1.44S11.647 1.62 11 1.604c-.646.017-1.273.213-1.813.568s-.969.854-1.24 1.44c-.608-.223-1.267-.272-1.902-.14-.635.13-1.22.436-1.69.882-.445.47-.749 1.055-.878 1.688-.13.633-.08 1.29.144 1.896-.587.274-1.087.705-1.443 1.245-.356.54-.555 1.17-.574 1.817.02.647.218 1.276.574 1.817.356.54.856.972 1.443 1.245-.224.606-.274 1.263-.144 1.896.13.634.433 1.218.877 1.688.47.443 1.054.747 1.687.878.633.132 1.29.084 1.897-.136.274.586.705 1.Line truncated
+11
View File
@@ -0,0 +1,11 @@
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("marked")):"function"==typeof define&&define.amd?define(["exports","marked"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).Artalk={},t.marked)}(this,(function(t,e){"use strict";var n=Object.defineProperty,i=Object.defineProperties,s=Object.getOwnPropertyDescriptors,o=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable,l=(t,e,i)=>e in t?n(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,c=(t,e)=>{for(var n in e||(e={}))r.call(e,n)&&l(t,n,e[n]);if(o)for(var n of o(e))a.call(e,n)&&l(t,n,e[n]);return t},d=(t,e)=>i(t,s(e)),h=(t,e,n)=>(l(t,"symbol"!=typeof e?e+"":e,n),n),u=(t,e,n)=>new Promise(((i,s)=>{var o=t=>{try{a(n.next(t))}catch(e){s(e)}},r=t=>{try{a(n.throw(t))}catch(e){s(e)}},a=t=>t.done?i(t.value):Promise.resolve(t.value).then(o,r);a((n=n.apply(t,e)).next())}));class p{constructor(t={}){h(this,"baseUrl","/api/v2"),h(this,"securityData",null),h(this,"securityWorker"),h(this,"abortControllers",new Map),h(this,"customFetch",((...t)=>fetch(...t))),h(this,"baseApiParams",{credentials:"same-origin",headers:{},redirect:"follow",referrerPolicy:"no-referrer"}),h(this,"setSecurityData",(t=>{this.securityData=t})),h(this,"contentFormatters",{"application/json":t=>null===t||"object"!=typeof t&&"string"!=typeof t?t:JSON.stringify(t),"text/plain":t=>null!==t&&"string"!=typeof t?JSON.stringify(t):t,"multipart/form-data":t=>Object.keys(t||{}).reduce(((e,n)=>{const i=t[n];return e.append(n,i instanceof Blob?i:"object"==typeof i&&null!==i?JSON.stringify(i):`${i}`),e}),new FormData),"application/x-www-form-urlencoded":t=>this.toQueryString(t)}),h(this,"createAbortSignal",(t=>{if(this.abortControllers.has(t)){const e=this.abortControllers.get(t);return e?e.signal:void 0}const e=new AbortController;return this.abortControllers.set(t,e),e.signal})),h(this,"abortRequest",(t=>{const e=this.abortControllers.get(t);e&&(e.abort(),this.abortControllers.delete(t))})),h(this,"request",(t=>u(this,null,(function*(){var e=t,{body:n,secure:i,path:s,type:l,query:h,format:p,baseUrl:m,cancelToken:g}=e,f=((t,e)=>{var n={};for(var i in t)r.call(t,i)&&e.indexOf(i)<0&&(n[i]=t[i]);if(null!=t&&o)for(var i of o(t))e.indexOf(i)<0&&a.call(t,i)&&(n[i]=t[i]);return n})(e,["body","secure","path","type","query","format","baseUrl","cancelToken"]);const y=("boolean"==typeof i?i:this.baseApiParams.secure)&&this.securityWorker&&(yield this.securityWorker(this.securityData))||{},v=this.mergeRequestParams(f,y),k=h&&this.toQueryString(h),$=this.contentFormatters[l||"application/json"],w=p||v.format;return this.customFetch(`${m||this.baseUrl||""}${s}${k?`?${k}`:""}`,d(c({},v),{headers:c(c({},v.headers||{}),l&&"multipart/form-data"!==l?{"Content-Type":l}:{}),signal:(g?this.createAbortSignal(g):v.signal)||null,body:null==n?null:$(n)})).then((t=>u(this,null,(function*(){const e=t;e.data=null,e.error=null;const n=w?yield t[w]().then((t=>(e.ok?e.data=t:e.error=t,e))).catch((t=>(e.error=t,e))):e;if(g&&this.abortControllers.delete(g),!t.ok)throw n;return n}))))})))),Object.assign(this,t)}encodeQueryParam(t,e){return`${encodeURIComponent(t)}=${encodeURIComponent("number"==typeof e?e:`${e}`)}`}addQueryParam(t,e){return this.encodeQueryParam(e,t[e])}addArrayQueryParam(t,e){return t[e].map((t=>this.encodeQueryParam(e,t))).join("&")}toQueryString(t){const e=t||{};return Object.keys(e).filter((t=>void 0!==e[t])).map((t=>Array.isArray(e[t])?this.addArrayQueryParam(e,t):this.addQueryParam(e,t))).join("&")}addQueryParams(t){const e=this.toQueryString(t);return e?`?${e}`:""}mergeRequestParams(t,e){return d(c(c(c({},this.baseApiParams),t),e||{}),{headers:c(c(c({},this.baseApiParams.headers||{}),t.headers||{}),e&&e.headers||{})})}}
/**
* @title Artalk API
* @version 2.0
* @license MIT (https://github.com/ArtalkJS/Artalk/blob/master/LICENSE)
* @baseUrl /api/v2
* @contact API Support <artalkjs@gmail.com> (https://artalk.js.org)
*
* Artalk is a modern comment system based on Golang.
*/let m=class extends p{constructor(){super(...arguments),h(this,"auth",{loginByEmail:(t,e={})=>this.request(c({path:"/auth/email/login",method:"POST",body:t,type:"application/json",format:"json"},e)),registerByEmail:(t,e={})=>this.request(c({path:"/auth/email/register",method:"POST",body:t,type:"application/json",format:"json"},e)),sendVerifyEmail:(t,e={})=>this.request(c({path:"/auth/email/send",method:"POST",body:t,type:"application/json",format:"json"},e)),checkDataMerge:(t={})=>this.request(c({path:"/auth/merge",method:"GET",secure:!0,format:"json"},t)),applyDataMerge:(t,e={})=>this.request(c({path:"/auth/merge",method:"POST",body:t,secure:!0,type:"application/json",format:"json"},e))}),h(this,"cache",{flushCache:(t={})=>this.request(c({path:"/cache/flush",method:"POST",secure:!0,format:"json"},t)),warmUpCache:(t={})=>this.request(c({path:"/cache/warm_up",method:"POST",secure:!0,format:"json"},t))}),h(this,"captcha",{getCaptcha:(t={})=>this.request(c({path:"/captcha",method:"GET",format:"json"},t)),getCaptchaStatus:(t={})=>this.request(c({path:"/captcha/status",method:"GET",format:"json"},t)),verifyCaptcha:(t,e={})=>this.request(c({path:"/captcha/verify",method:"POST",body:t,type:"application/json",format:"json"},e))}),h(this,"comments",{getComments:(t,e={})=>this.request(c({path:"/comments",method:"GET",query:t,secure:!0,type:"application/json",format:"json"},e)),createComment:(t,e={})=>this.request(c({path:"/comments",method:"POST",body:t,secure:!0,type:"application/json",format:"json"},e)),getComment:(t,e={})=>this.request(c({path:`/comments/${t}`,method:"GET",type:"application/json",format:"json"},e)),updateComment:(t,e,n={})=>this.request(c({path:`/comments/${t}`,method:"PUT",body:e,secure:!0,type:"application/json",format:"json"},n)),deleteComment:(t,e={})=>this.request(c({path:`/comments/${t}`,method:"DELETE",secure:!0,format:"json"},e))}),h(this,"conf",{conf:(t={})=>this.request(c({path:"/conf",method:"GET",format:"json"},t)),getSocialLoginProviders:(t={})=>this.request(c({path:"/conf/auth/providers",method:"GET",format:"json"},t)),getDomain:(t,e={})=>this.request(c({path:"/conf/domain",method:"GET",query:t,format:"json"},e))}),h(this,"notifies",{getNotifies:(t,e={})=>this.request(c({path:"/notifies",method:"GET",query:t,type:"application/json",format:"json"},e)),markAllNotifyRead:(t,e={})=>this.request(c({path:"/notifies/read",method:"POST",body:t,type:"application/json",format:"json"},e)),markNotifyRead:(t,e,n={})=>this.request(c({path:`/notifies/${t}/${e}`,method:"POST",format:"json"},n))}),h(this,"pages",{getPages:(t,e={})=>this.request(c({path:"/pages",method:"GET",query:t,secure:!0,type:"application/json",format:"json"},e)),fetchAllPages:(t,e={})=>this.request(c({path:"/pages/fetch",method:"POST",body:t,secure:!0,type:"application/json",format:"json"},e)),getPageFetchStatus:(t={})=>this.request(c({path:"/pages/fetch/status",method:"GET",secure:!0,format:"json"},t)),logPv:(t,e={})=>this.request(c({path:"/pages/pv",method:"POST",body:t,type:"application/json",format:"json"},e)),updatePage:(t,e,n={})=>this.request(c({path:`/pages/${t}`,method:"PUT",body:e,secure:!0,type:"application/json",format:"json"},n)),deletePage:(t,e={})=>this.request(c({path:`/pages/${t}`,method:"DELETE",secure:!0,format:"json"},e)),fetchPage:(t,e={})=>this.request(c({path:`/pages/${t}/fetch`,method:"POST",secure:!0,type:"application/json",format:"json"},e))}),h(this,"sendEmail",{sendEmail:(t,e={})=>this.request(c({path:"/send_email",method:"POST",body:t,secure:!0,type:"application/json",format:"json"},e))}),h(this,"settings",{getSettings:(t={})=>this.request(c({path:"/settings",method:"GET",secure:!0,format:"json"},t)),applySettings:(t,e={})=>this.request(c({path:"/settings",method:"PUT",body:t,secure:!0,type:"application/json",format:"json"},e)),getSettingsTemplate:(t,e={})=>this.request(c({path:`/settings/template/${t}`,method:"GET",secure:!0,format:"json"},e))}),h(this,"sites",{getSites:(t={})=>this.request(c({path:"/sites",method:"GET",secure:!0,format:"json"},t)),createSite:(t,e={})=>this.request(c({path:"/sites",method:"POST",body:t,secure:!0,type:"application/json",format:"json"},e)),updateSite:(t,e,n={})=>this.request(c({path:`/sites/${t}`,method:"PUT",body:e,secure:!0,type:"application/json",format:"json"},n)),deleteSite:(t,e={})=>this.request(c({path:`/sites/${t}`,method:"DELETE",secure:!0,format:"json"},e))}),h(this,"stats",{getStats:(t,e,n={})=>this.request(c({path:`/stats/${t}`,method:"GET",query:e,type:"application/json",format:"json"},n))}),h(this,"transfer",{exportArtrans:(t={})=>this.request(c({path:"/transfer/export",method:"GET",secure:!0,format:"json"},t)),importArtrans:(t,e={})=>this.request(c({path:"/transfer/import",method:"POST",body:t,secure:!0,type:"application/json"},e)),uploadArtrans:(t,e={})=>this.request(c({path:"/transfer/upload",method:"POST",body:t,secure:!0,type:"multipart/form-data",format:"json"},e))}),h(this,"upload",{upload:(t,e={})=>this.request(c({path:"/upload",method:"POSLine truncated
//# sourceMappingURL=ArtalkLite.js.map
+1
View File
@@ -0,0 +1 @@
!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o():"function"==typeof define&&define.amd?define(o):(e="undefined"!=typeof globalThis?globalThis:e||self).jp=o()}(this,(function(){"use strict";const e="ArtalkI18n";var o,n,t;return o="jp",n={placeholder:"内容を入力してください...",noComment:"コメントなし",send:"コメントを送信",signIn:"サインイン",signUp:"サインアップ",save:"コメントを保存",nick:"ニックネーム",email:"Eメール",link:"ウェブサイト",emoticon:"絵文字",preview:"プレビュー",uploadImage:"画像をアップロード",uploadFail:"アップロードに失敗しました",commentFail:"コメントに失敗しました",restoredMsg:"内容が自動的に復元されました",onlyAdminCanReply:"管理者のみがコメントできます",uploadLoginMsg:"名前とメールアドレスを入力してからアップロードしてください",counter:"{count}件のコメント",sortLatest:"最新",sortOldest:"最古",sortBest:"人気",sortAuthor:"著者",openComment:"コメントを表示",closeComment:"コメントを非表示",listLoadFailMsg:"コメントリストのデータを取得できません",listRetry:"再試行するにはクリック",loadMore:"もっと読み込む",admin:"管理者",reply:"返信",voteUp:"賛成",voteDown:"反対",voteFail:"投票に失敗しました",readMore:"続きを読む",actionConfirm:"操作を確認",collapse:"折り畳む",collapsed:"折りたたまれた",collapsedMsg:"このコメントはシステムまたは管理者によって折りたたまれました",expand:"展開",approved:"承認済み",pending:"保留中",pendingMsg:"審査中、自分自身のみが表示できます。",edit:"編集",editCancel:"編集をキャンセル",delete:"削除",deleteConfirm:"削除を確認",pin:"ピン留め",unpin:"ピン留めを解除",seconds:"秒前",minutes:"分前",hours:"時間前",days:"日前",now:"たった今",adminCheck:"管理者として認証するにはパスワードを入力してください:",captchaCheck:"続行するにはキャプチャを入力してください:",confirm:"確認",cancel:"キャンセル",msgCenter:"通知センター",ctrlCenter:"コントロールセンター",noAccountPrompt:"アカウントがありませんか?",haveAccountPrompt:"アカウントをお持ちですか?",forgetPassword:"パスワードを忘れた",resetPassword:"パスワードをリセット",verificationCode:"検証コード",verifySend:"検証",verifyResend:"再送信",waitSeconds:"{seconds}秒待つ",emailVerified:"メールアドレスが確認されました",password:"パスワード",username:"ユーザー名",nextStep:"次のステップ",skipNotVerify:"スキップ、検証しない",logoutConfirm:"ログアウトしてもよろしいですか?",accountMergeNotice:"あなたのメールには異なるIDを持つ複数のアカウントがあります。",accountMergeSelectOne:"すべてのデータを統合するアカウントを選択してください。",accountMergeConfirm:"すべてのデータは1つのアカウントに統合されます。そのIDは{id}です。",dismiss:"閉じる",merge:"統合する",frontend:"フロントエンド",backend:"バックエンド",loading:"読み込み中",loadFail:"読み込みに失敗しました",editing:"編集中",editFail:"編集に失敗しました",deleting:"削除中",deleteFail:"削除に失敗しました",reqGot:"リクエストが受信されました",reqAborted:"リクエストがタイムアウトまたは予期せず中止されました",updateMsg:"Artalk {name} を更新して、より良い体験をしてください!",currentVersion:"現在のバージョン",ignore:"無視",open:"開く",openName:"{name}を開く"},t=["jp-JP"],window[e]||(window[e]={}),window[e][o]=n,t&&t.forEach((o=>{window[e][o]=n})),n}));
+1
View File
@@ -0,0 +1 @@
!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o():"function"==typeof define&&define.amd?define(o):(e="undefined"!=typeof globalThis?globalThis:e||self)["zh-TW"]=o()}(this,(function(){"use strict";const e="ArtalkI18n";var o,n;return o="zh-TW",n={placeholder:"輸入內容...",noComment:"「此時無聲勝有聲」",send:"發送",signIn:"登入",signUp:"註冊",save:"保存",nick:"暱稱",email:"電子郵件",link:"網址",emoticon:"表情",preview:"預覽",uploadImage:"上傳圖片",uploadFail:"上傳失敗",commentFail:"評論失敗",restoredMsg:"內容已自動恢復",onlyAdminCanReply:"僅管理員可評論",uploadLoginMsg:"填入你的名字郵箱才能上傳哦",counter:"{count} 條評論",sortLatest:"最新",sortOldest:"最舊",sortBest:"最熱",sortAuthor:"作者",openComment:"打開評論",closeComment:"關閉評論",listLoadFailMsg:"無法獲取評論列表數據",listRetry:"點擊重新獲取",loadMore:"加載更多",admin:"管理員",reply:"回覆",voteUp:"贊同",voteDown:"反對",voteFail:"投票失敗",readMore:"閱讀更多",actionConfirm:"確認操作",collapse:"折疊",collapsed:"已折疊",collapsedMsg:"該評論已被系統或管理員折疊",expand:"展開",approved:"已審",pending:"待審",pendingMsg:"審核中,僅本人可見。",edit:"編輯",editCancel:"取消編輯",delete:"刪除",deleteConfirm:"確認刪除",pin:"置頂",unpin:"取消置頂",seconds:"秒前",minutes:"分鐘前",hours:"小時前",days:"天前",now:"剛剛",adminCheck:"輸入密碼來驗證管理員身份:",captchaCheck:"輸入驗證碼繼續:",confirm:"確認",cancel:"取消",msgCenter:"通知中心",ctrlCenter:"控制中心",noAccountPrompt:"沒有帳號?",haveAccountPrompt:"已有帳號?",forgetPassword:"忘記密碼",resetPassword:"重置密碼",verificationCode:"驗證碼",verifySend:"發送驗證碼",verifyResend:"重新發送",waitSeconds:"等待 {seconds}秒",emailVerified:"郵箱已驗證",password:"密碼",username:"用戶名",nextStep:"下一步",skipNotVerify:"跳過,不驗證",logoutConfirm:"確定要登出嗎?",accountMergeNotice:"您的電子郵件下有多個不同 ID 的帳戶。",accountMergeSelectOne:"請選擇要將所有數據合併到其中的一個。",accountMergeConfirm:"所有數據將合併到 ID 為 {id} 的帳戶中。",dismiss:"忽略",merge:"合併",frontend:"前端",backend:"後端",loading:"加載中",loadFail:"加載失敗",editing:"修改中",editFail:"修改失敗",deleting:"刪除中",deleteFail:"刪除失敗",reqGot:"請求已接收",reqAborted:"請求超時或意外終止",updateMsg:"請更新 Artalk {name} 以獲得更好的體驗!",currentVersion:"當前版本",ignore:"忽略",open:"打開",openName:"打開{name}"},window[e]||(window[e]={}),window[e][o]=n,n}));
+2
View File
@@ -0,0 +1,2 @@
!function(){"use strict";try{if("undefined"!=typeof document){var t=document.createElement("style");t.appendChild(document.createTextNode('.atk-auth-plugin-dialog-wrap{display:flex;align-items:center;justify-content:center;flex-direction:column;height:100%}.atk-auth-plugin-dialog-wrap .atk-skip-btn{cursor:pointer;margin:10px auto 0;display:flex;justify-content:center;place-items:center;height:40px;padding:0 20px;font-size:16px;border-radius:50px;color:var(--at-color-font)}.atk-auth-plugin-dialog-wrap .atk-skip-btn:hover{opacity:.9}.atk-auth-plugin-dialog{overflow:hidden;transform:translateY(0) scale(1);animation:atkLoginDialogShowAnim .3s ease-in-out;will-change:transform,opacity,width,height;transition-property:transform,opacity,width,height;transition-duration:.2s;transition-timing-function:cubic-bezier(.25,.1,.25,1);display:flex;flex-direction:column;width:360px;max-height:500px;background:var(--at-color-bg);border-radius:18px}@keyframes atkLoginDialogShowAnim{0%{opacity:0;transform:translateY(15px) scale(1.02)}to{opacity:1;transform:translateY(0) scale(1)}}.atk-auth-plugin-dialog .atk-auth-dialog-title{display:flex;justify-content:space-between;place-items:center;padding:25px 25px 0;font-size:20px;font-weight:500;color:var(--at-color-font)}.atk-auth-plugin-dialog .atk-auth-dialog-title .atk-text{margin:0 10px}.atk-auth-plugin-dialog .atk-auth-dialog-title .atk-icon{display:flex;justify-content:center;place-items:center;height:40px;width:40px;border-radius:50%}.atk-auth-plugin-dialog .atk-auth-dialog-title .atk-icon:hover{background:var(--at-color-bg-grey)}.atk-auth-plugin-dialog .atk-view-wrap{max-height:calc(100% - 65px);overflow-y:auto}.atk-auth-plugin-dialog .atk-methods-page .atk-methods{padding:12px 20px 20px}.atk-auth-plugin-dialog .atk-methods-page .atk-methods .atk-method-item{display:flex;align-items:center;padding:15px 25px;cursor:pointer;border-radius:10px}.atk-auth-plugin-dialog .atk-methods-page .atk-methods .atk-method-item:hover{background:var(--at-color-bg-grey)}.atk-auth-plugin-dialog .atk-methods-page .atk-methods .atk-method-item .atk-method-icon{width:40px;height:40px;margin-right:20px;background-repeat:no-repeat;background-size:contain;background-position:center}.atk-auth-plugin-dialog .atk-methods-page .atk-methods .atk-method-item .atk-method-text{font-size:16px;font-weight:500;color:var(--at-color-font)}.atk-auth-plugin-dialog .atk-form{padding:20px 30px}.atk-auth-plugin-dialog .atk-form .atk-form-bottom{padding:5px 0;text-align:center;font-size:14px}.atk-auth-plugin-dialog .atk-form .atk-form-bottom .atk-link{cursor:pointer;text-align:center;color:var(--at-color-main)}.atk-auth-plugin-dialog .atk-form .atk-form-bottom .atk-link:hover{text-decoration:underline}.atk-auth-plugin-dialog .atk-form input{width:100%;padding:10px 20px;margin:5px 0;font-size:16px;border-radius:10px;border:1px solid var(--at-color-bg-grey);background:var(--at-color-bg-grey);color:var(--at-color-font);transition:border-color .2s;outline:none}.atk-auth-plugin-dialog .atk-form input:focus{border-color:var(--at-color-primary)}.atk-auth-plugin-dialog .atk-form button[type=submit]{width:100%;padding:10px 20px;margin:10px 0;font-size:16px;border-radius:10px;background:var(--at-color-main);color:var(--at-color-bg);cursor:pointer;transition:background .2s;border:0}.atk-auth-plugin-dialog .atk-form button[type=submit]:hover{opacity:.9}.atk-auth-plugin-dialog .atk-form .atk-input-grp{position:relative}.atk-auth-plugin-dialog .atk-form .atk-input-grp>input{padding-right:115px}.atk-auth-plugin-dialog .atk-form .atk-input-grp-btn{position:absolute;right:0;top:50%;transform:translateY(-50%);padding:10px 15px;font-size:14px;color:var(--at-color-main);cursor:pointer}.atk-auth-plugin-dialog[data-dialog-name=merge]{background-size:100% auto;background-position:center top;background-repeat:no-repeat;background-image:url(\'data:image/svg+xml,<svg fill="none" height="159" viewBox="0 0 390 159" width="390" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="195" x2="195" y1="0" y2="159"><stop offset="0" stop-color="%23f6f0fe"/><stop offset=".835" stop-color="%23f6f0fe" stop-opacity="0"/></linearGradient><clipPath id="b"><path d="m0 0h390v159h-390z"/></clipPath><g clip-path="url(%23b)"><path d="m0 0h390v159h-390z" fill="url(%23a)"/><g clip-rule="evenodd" fill="%23743fc8" fill-rule="evenodd"><path d="m76.0859 23.5c-1.5187 0-2.75 1.2312-2.75 2.75s1.2313 2.75 2.75 2.75c1.5188 0 2.75-1.2312 2.75-2.75s-1.2312-2.75-2.75-2.75zm-5.5 2.75c0-3.0376 2.4625-5.5 5.5-5.5 3.0376 0 5.5 2.4624 5.5 5.5s-2.4624 5.5-5.5 5.5c-3.0375 0-5.5-2.4624-5.5-5.5z"/><path d="m76.0859 51c-1.5187 0-2.75 1.2312-2.75 2.75s1.2313 2.75 2.75 2.75c1.5188 0 2.75-1.2312 2.75-2.75s-1.2312-2.75-2.75-2.75zm-5.5 2.75c0-3.0376 2.4625-5.5 5.5-5.5 3.0376 0 5.5 2.4624 5.5 5.5s-2.4624 5.5-5.5 5.5c-3.0375 0-5.5-2.4624-5.5-5.5z"/><path d="m76.0859 29c.7594 0 1.375.6156 1.375 1.375v19.25c0 .7594-.Line truncated
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["artalk-plugin-auth"]=e["artalk-plugin-auth"]||{})}(this,(function(e){"use strict";var t,n=Object.defineProperty,r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,l=Object.prototype.propertyIsEnumerable,i=(e,t,r)=>t in e?n(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,s=(e,t)=>{var n={};for(var i in e)o.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(null!=e&&r)for(var i of r(e))t.indexOf(i)<0&&l.call(e,i)&&(n[i]=e[i]);return n},a=(e,t,n)=>new Promise(((r,o)=>{var l=e=>{try{s(n.next(e))}catch(t){o(t)}},i=e=>{try{s(n.throw(e))}catch(t){o(t)}},s=e=>e.done?r(e.value):Promise.resolve(e.value).then(l,i);s((n=n.apply(e,t)).next())}));const c=Symbol("solid-proxy"),u=Symbol("solid-track"),d={equals:(e,t)=>e===t};let f=N;const g=1,p=2,h={owned:null,cleanups:null,context:null,owner:null},v={};var m=null;let y=null,b=null,k=null,w=null,$=0;function A(e,t){const n=b,r=m,o=0===e.length,l=void 0===t?r:t,i=o?h:{owned:null,cleanups:null,context:l?l.context:null,owner:l},s=o?e:()=>e((()=>B((()=>K(i)))));m=i,b=null;try{return M(s,!0)}finally{b=n,m=r}}function x(e,t){const n={value:e,observers:null,observerSlots:null,comparator:(t=t?Object.assign({},d,t):d).equals||void 0};return[_.bind(n),e=>("function"==typeof e&&(e=e(n.value)),L(n,e))]}function C(e,t,n){D(I(e,t,!0,g))}function S(e,t,n){D(I(e,t,!1,g))}function O(e,t,n){f=H;const r=I(e,t,!1,g);r.user=!0,w?w.push(r):D(r)}function P(e,t,n){n=n?Object.assign({},d,n):d;const r=I(e,t,!0,0);return r.observers=null,r.observerSlots=null,r.comparator=n.equals||void 0,D(r),_.bind(r)}function j(e,t,n){let r,o,l;2===arguments.length&&"object"==typeof t||1===arguments.length?(r=!0,o=e,l={}):(r=e,o=t,l={});let i=null,s=v,a=!1,c="initialValue"in l,u="function"==typeof r&&P(r);const d=new Set,[f,g]=(l.storage||x)(l.initialValue),[p,h]=x(void 0),[m,y]=x(void 0,{equals:!1}),[k,w]=x(c?"ready":"unresolved");function $(e,t,n,r){return i===e&&(i=null,void 0!==r&&(c=!0),e!==s&&t!==s||!l.onHydrated||queueMicrotask((()=>l.onHydrated(r,{value:t}))),s=v,function(e,t){M((()=>{void 0===t&&g((()=>e)),w(void 0!==t?"errored":c?"ready":"unresolved"),h(t);for(const e of d.keys())e.decrement();d.clear()}),!1)}(t,n)),t}function A(){const e=undefined,t=f(),n=p();if(void 0!==n&&!i)throw n;return b&&!b.user&&e&&C((()=>{m(),i&&(e.resolved||d.has(e)||(e.increment(),d.add(e)))})),t}function S(e=!0){if(!1!==e&&a)return;a=!1;const t=u?u():r;if(null==t||!1===t)return void $(i,B(f));const n=s!==v?s:B((()=>o(t,{value:f(),refetching:e})));return(l=n)&&"object"==typeof l&&"then"in l?(i=n,"value"in n?("success"===n.status?$(i,n.value,void 0,t):$(i,void 0,void 0,t),n):(a=!0,queueMicrotask((()=>a=!1)),M((()=>{w(c?"refreshing":"pending"),y()}),!1),n.then((e=>$(n,e,void 0,t)),(e=>$(n,void 0,R(e),t))))):($(i,n,void 0,t),n);var l}return Object.defineProperties(A,{state:{get:()=>k()},error:{get:()=>p()},loading:{get(){const e=k();return"pending"===e||"refreshing"===e}},latest:{get(){if(!c)return A();const e=p();if(e&&!i)throw e;return f()}}}),u?C((()=>S(!1))):S(!1),[A,{refetch:S,mutate:g}]}function B(e){if(null===b)return e();const t=b;b=null;try{return e()}finally{b=t}}function T(e){return null===m||(null===m.cleanups?m.cleanups=[e]:m.cleanups.push(e)),e}function E(){return b}function _(){if(this.sources&&this.state)if(this.state===g)D(this);else{const e=k;k=null,M((()=>V(this)),!1),k=e}if(b){const e=this.observers?this.observers.length:0;b.sources?(b.sources.push(this),b.sourceSlots.push(e)):(b.sources=[this],b.sourceSlots=[e]),this.observers?(this.observers.push(b),this.observerSlots.push(b.sources.length-1)):(this.observers=[b],this.observerSlots=[b.sources.length-1])}return this.value}function L(e,t,n){let r=e.value;return e.comparator&&e.comparator(r,t)||(e.value=t,e.observers&&e.observers.length&&M((()=>{for(let t=0;t<e.observers.length;t+=1){const n=e.observers[t],r=y&&y.running;r&&y.disposed.has(n),(r?n.tState:n.state)||(n.pure?k.push(n):w.push(n),n.observers&&U(n)),r||(n.state=g)}if(k.length>1e6)throw k=[],new Error}),!1)),t}function D(e){if(!e.fn)return;K(e);const t=$;!function(e,t,n){let r;const o=m,l=b;b=m=e;try{r=e.fn(t)}catch(i){return e.pure&&(e.state=g,e.owned&&e.owned.forEach(K),e.owned=null),e.updatedAt=n+1,z(i)}finally{b=l,m=o}(!e.updatedAt||e.updatedAt<=n)&&(null!=e.updatedAt&&"observers"in e?L(e,r):e.value=r,e.updatedAt=n)}(e,e.value,t)}function I(e,t,n,r=g,o){const l={fn:e,state:r,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:t,owner:m,context:m?m.context:null,pure:n};return null===m||m!==h&&(m.owned?m.owned.push(l):m.owned=[l]),l}function q(e){if(0===e.state)return;if(e.state===p)return V(e);if(e.suspense&&B(e.suspense.inFallback))return e.suspense.effects.push(e);const t=[e];for(;(e=e.owner)&&(!e.updatedAt||e.updatedAt<$);)e.state&&t.push(e);for(let n=t.lengLine truncated
+487
View File
@@ -0,0 +1,487 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>UAPI管理系统</title>
<style>
:root { --bg: #0d1117; --card: #161b22; --border: #30363d; --text: #c9d1d9; --muted: #8b949e; --accent: #58a6ff; --green: #3fb950; --red: #f85149; --yellow: #d2991d; }
* { margin: 0; padding: 0; box-sizing: border-box; }
body { background: var(--bg); color: var(--text); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; min-height: 100vh; padding: 40px 20px; }
.container { max-width: 960px; margin: 0 auto; }
header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 32px; flex-wrap: wrap; gap: 16px; }
header h1 { font-size: 24px; color: #fff; }
header .actions { display: flex; gap: 10px; flex-wrap: wrap; }
.btn { padding: 8px 16px; border-radius: 8px; font-size: 13px; font-weight: 600; cursor: pointer; border: none; display: inline-flex; align-items: center; gap: 6px; }
.btn-primary { background: #238636; color: #fff; }
.btn-primary:hover { background: #2ea043; }
.btn-secondary { background: var(--card); color: var(--text); border: 1px solid var(--border); }
.btn-secondary:hover { background: #1c2333; }
.btn-danger { background: var(--card); color: var(--red); border: 1px solid var(--red); }
.btn-danger:hover { background: #49020233; }
.stats { display: flex; gap: 12px; margin-bottom: 24px; flex-wrap: wrap; }
.stat { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 10px 20px; }
.stat .num { font-size: 20px; font-weight: 700; color: #fff; }
.stat .label { font-size: 11px; color: var(--muted); }
.stat.alive .num { color: var(--green); }
.stat.dead .num { color: var(--red); }
table { width: 100%; border-collapse: collapse; background: var(--card); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }
th, td { padding: 12px 16px; text-align: left; font-size: 13px; }
th { background: #1c2333; color: var(--muted); font-weight: 600; font-size: 12px; text-transform: uppercase; }
td { border-top: 1px solid var(--border); }
td.url { font-family: 'SF Mono', 'Fira Code', monospace; font-size: 12px; color: var(--accent); word-break: break-all; }
td.title { color: #fff; font-weight: 500; display: flex; align-items: center; }
td.actions { white-space: nowrap; }
td.actions button { padding: 4px 10px; font-size: 12px; margin-right: 6px; }
.status-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 8px; flex-shrink: 0; }
.status-dot.alive { background: var(--green); box-shadow: 0 0 6px var(--green); }
.status-dot.dead { background: var(--red); }
.status-dot.checking { background: var(--yellow); animation: pulse 0.8s ease-in-out infinite; }
@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } }
.latency { font-size: 11px; color: var(--muted); margin-left: 6px; }
.modal-overlay { display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.6); z-index: 100; align-items: center; justify-content: center; }
.modal-overlay.active { display: flex; }
.modal { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 32px; width: 100%; max-width: 480px; }
.modal h2 { font-size: 18px; color: #fff; margin-bottom: 20px; }
.modal label { display: block; font-size: 13px; color: var(--muted); margin-bottom: 4px; margin-top: 12px; }
.modal input, .modal select { width: 100%; padding: 9px 12px; background: #0d1117; border: 1px solid var(--border); border-radius: 6px; color: #fff; font-size: 14px; outline: none; }
.modal input:focus { border-color: var(--accent); }
.modal .modal-actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 24px; }
.toast { position: fixed; bottom: 24px; right: 24px; background: #238636; color: #fff; padding: 10px 20px; border-radius: 8px; font-size: 13px; z-index: 200; display: none; animation: fadeIn 0.2s ease; }
.toast.error { background: #da3633; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
.empty { text-align: center; padding: 60px 20px; color: var(--muted); }
.empty h3 { font-size: 16px; color: #fff; margin-bottom: 8px; }
.tab { display: inline-flex; gap: 2px; background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 4px; margin-bottom: 24px; }
.tab button { padding: 6px 16px; border: none; background: none; color: var(--muted); border-radius: 6px; cursor: pointer; font-size: 13px; }
.tab button.active { background: #1f6feb; color: #fff; }
.feed-url-bar { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 10px 16px; margin-bottom: 20px; display: flex; align-items: center; gap: 10px; font-size: 13px; }
.feed-url-bar code { font-family: 'SF Mono', 'Fira Code', monospace; color: var(--accent); font-size: 12px; }
.link-avatar { width: 32px; height: 32px; border-radius: 50%; object-fit: cover; background: var(--border); }
.link-name { color: #fff; font-weight: 500; display: flex; align-items: center; gap: 10px; }
</style>
</head>
<body>
<div class="container">
<header>
<h1>UAPI管理系统</h1>
<div class="actions">
<a href="/" class="btn btn-secondary" target="_blank">API 文档</a>
<button class="btn btn-secondary" onclick="checkHealth()" id="healthBtn">检测存活</button>
<button class="btn btn-primary" onclick="openAddModal()">+ 添加订阅源</button>
</div>
</header>
<div class="feed-url-bar">
<span style="color:var(--muted)">订阅地址</span>
<code id="feedUrlText">https://api.200181.xyz/api/feeds</code>
<button class="btn btn-secondary" style="padding:4px 10px;font-size:11px" onclick="copyFeedUrl()">复制</button>
</div>
<div class="stats">
<div class="stat"><div class="num" id="feedCount">0</div><div class="label">订阅源</div></div>
<div class="stat"><div class="num" id="linkCount">0</div><div class="label">友链</div></div>
<div class="stat alive" id="aliveStat" style="display:none"><div class="num" id="aliveCount">0</div><div class="label">存活</div></div>
<div class="stat dead" id="deadStat" style="display:none"><div class="num" id="deadCount">0</div><div class="label">异常</div></div>
</div>
<div class="tab">
<button class="active" onclick="showTab('feeds')">订阅源</button>
<button onclick="showTab('links')">友链</button>
<button onclick="showTab('password')">访问口令</button>
</div>
<div id="tab-feeds">
<table><thead><tr><th style="width:220px">博客名称</th><th>URL</th><th style="width:100px">操作</th></tr></thead><tbody id="feedTableBody"></tbody></table>
<div class="empty" id="emptyMsg" style="display:none"><h3>暂无订阅源</h3><p>点击上方按钮添加第一个</p></div>
</div>
<div id="tab-links" style="display:none">
<div style="margin-bottom:16px">
<button class="btn btn-primary" onclick="openLinkModal()">+ 添加友链</button>
</div>
<table><thead><tr><th style="width:50px"></th><th style="width:180px">站点名称</th><th>URL</th><th style="width:200px">描述</th><th style="width:100px">操作</th></tr></thead><tbody id="linkTableBody"></tbody></table>
<div class="empty" id="linkEmpty" style="display:none"><h3>暂无友链</h3><p>点击上方按钮添加</p></div>
</div>
<div id="tab-password" style="display:none">
<div class="modal" style="max-width:400px; margin:0 auto; position:static; border-radius:8px;">
<h2>修改访问口令</h2>
<label>当前口令</label>
<input type="password" id="oldPwd" placeholder="当前口令">
<label>新口令(留空则清除保护)</label>
<input type="password" id="newPwd" placeholder="新口令">
<div class="modal-actions">
<button class="btn btn-secondary" onclick="document.getElementById('oldPwd').value='';document.getElementById('newPwd').value='';">取消</button>
<button class="btn btn-primary" onclick="changePassword()">保存</button>
</div>
</div>
</div>
</div>
<!-- 添加/编辑弹窗 -->
<div class="modal-overlay" id="feedModal">
<div class="modal">
<h2 id="modalTitle">添加订阅源</h2>
<label>博客 URL</label>
<input type="text" id="feedUrl" placeholder="https://example.com">
<label>博客名称</label>
<input type="text" id="feedTitle" placeholder="示例博客">
<label>抓取格式</label>
<select id="feedFormat">
<option value="">自动检测 (auto)</option>
<option value="xml">RSS/XML</option>
<option value="json">JSON Feed</option>
</select>
<label>JSON 数据路径(format=json 时填写)</label>
<input type="text" id="feedPath" placeholder="例如 data.list">
<label>强制使用代理</label>
<select id="feedProxy">
<option value="">否</option>
<option value="true">是</option>
</select>
<div class="modal-actions">
<button class="btn btn-secondary" onclick="closeModal()">取消</button>
<button class="btn btn-primary" id="saveBtn" onclick="saveFeed()">保存</button>
<button class="btn btn-danger" id="deleteBtn" style="display:none" onclick="deleteFeed()">删除</button>
</div>
</div>
</div>
<!-- 友链弹窗 -->
<div class="modal-overlay" id="linkModal">
<div class="modal">
<h2 id="linkModalTitle">添加友链</h2>
<label>站点名称</label>
<input type="text" id="linkName" placeholder="示例博客">
<label>站点 URL</label>
<input type="text" id="linkUrl" placeholder="https://example.com">
<label>头像图片 URL(留空自动获取 favicon)</label>
<input type="text" id="linkImage" placeholder="自动获取">
<label>描述</label>
<input type="text" id="linkDesc" placeholder="一个很棒的博客">
<label>RSS 订阅地址(选填)</label>
<input type="text" id="linkRss" placeholder="https://example.com/feed">
<label style="display:flex;align-items:center;gap:8px;cursor:pointer;margin-top:12px">
<input type="checkbox" id="linkHidden" style="width:auto;accent-color:var(--red)"> 隐藏(不在公开接口展示)
</label>
<div class="modal-actions">
<button class="btn btn-secondary" onclick="closeLinkModal()">取消</button>
<button class="btn btn-primary" id="linkSaveBtn" onclick="saveLink()">保存</button>
<button class="btn btn-danger" id="linkDeleteBtn" style="display:none" onclick="deleteLink()">删除</button>
</div>
</div>
</div>
<div class="toast" id="toast"></div>
<script>
let token = '';
const cMatch = document.cookie.match(/site_token=([^;]+)/);
if (cMatch) token = cMatch[1];
if (!token) { location.href = '/feed'; }
let feeds = [];
let editingUrl = null;
function showToast(msg, isError) {
const t = document.getElementById('toast');
t.textContent = msg;
t.className = 'toast' + (isError ? ' error' : '');
t.style.display = 'block';
setTimeout(() => t.style.display = 'none', 2500);
}
function copyFeedUrl() {
navigator.clipboard.writeText('https://api.200181.xyz/api/feeds').then(() => showToast('已复制订阅地址'));
}
function showTab(name) {
document.querySelectorAll('.tab button').forEach((b, i) => b.classList.toggle('active', (i === 0 && name === 'feeds') || (i === 1 && name === 'links') || (i === 2 && name === 'password')));
document.getElementById('tab-feeds').style.display = name === 'feeds' ? '' : 'none';
document.getElementById('tab-links').style.display = name === 'links' ? '' : 'none';
document.getElementById('tab-password').style.display = name === 'password' ? '' : 'none';
}
function renderTable(healthMap) {
const tbody = document.getElementById('feedTableBody');
if (feeds.length === 0) {
tbody.innerHTML = '';
document.getElementById('emptyMsg').style.display = '';
return;
}
document.getElementById('emptyMsg').style.display = 'none';
tbody.innerHTML = feeds.map((f, i) => {
const h = healthMap ? healthMap[f.url] : null;
let dot = '';
let latency = '';
if (h) {
if (h.ok) {
dot = '<span class="status-dot alive" title="HTTP ' + h.status + '"></span>';
latency = '<span class="latency">' + h.latency + 'ms</span>';
} else {
dot = '<span class="status-dot dead" title="' + (h.error || 'HTTP ' + h.status) + '"></span>';
}
}
return '<tr>' +
'<td class="title">' + dot + (f.feedTitle || '-') + latency + '</td>' +
'<td class="url">' + f.url + '</td>' +
'<td class="actions"><button class="btn btn-secondary" onclick="openEditModal(' + i + ')">编辑</button></td>' +
'</tr>';
}).join('');
}
async function loadFeeds() {
try {
const res = await fetch('/api/feeds?token=' + encodeURIComponent(token));
if (res.status === 401) { location.href = '/feed'; return; }
const data = await res.json();
feeds = data.feeds || [];
document.getElementById('feedCount').textContent = feeds.length;
renderTable(null);
} catch (err) {
showToast('加载失败: ' + err.message, true);
}
}
async function checkHealth() {
const btn = document.getElementById('healthBtn');
if (feeds.length === 0) { showToast('暂无订阅源', true); return; }
btn.textContent = '检测中 0/' + feeds.length;
btn.disabled = true;
const healthMap = {};
let done = 0;
// 每批 5 个并发,逐批更新 UI
for (let i = 0; i < feeds.length; i += 5) {
const batch = feeds.slice(i, i + 5);
await Promise.all(batch.map(async (f) => {
try {
const res = await fetch('/api/health?url=' + encodeURIComponent(f.url));
healthMap[f.url] = await res.json();
} catch {
healthMap[f.url] = { ok: false, error: 'network error' };
}
done++;
btn.textContent = '检测中 ' + done + '/' + feeds.length;
}));
renderTable(healthMap);
}
const alive = Object.values(healthMap).filter(r => r.ok).length;
const dead = Object.values(healthMap).filter(r => !r.ok).length;
document.getElementById('aliveStat').style.display = '';
document.getElementById('deadStat').style.display = '';
document.getElementById('aliveCount').textContent = alive;
document.getElementById('deadCount').textContent = dead;
btn.textContent = '检测存活';
btn.disabled = false;
showToast('存活 ' + alive + ' / 异常 ' + dead);
}
function openAddModal() {
editingUrl = null;
document.getElementById('modalTitle').textContent = '添加订阅源';
document.getElementById('feedUrl').value = '';
document.getElementById('feedTitle').value = '';
document.getElementById('feedFormat').value = '';
document.getElementById('feedPath').value = '';
document.getElementById('feedProxy').value = '';
document.getElementById('deleteBtn').style.display = 'none';
document.getElementById('feedModal').classList.add('active');
}
function openEditModal(idx) {
const f = feeds[idx];
editingUrl = f.url;
document.getElementById('modalTitle').textContent = '编辑订阅源';
document.getElementById('feedUrl').value = f.url || '';
document.getElementById('feedTitle').value = f.feedTitle || '';
document.getElementById('feedFormat').value = f.format || '';
document.getElementById('feedPath').value = f.path || '';
document.getElementById('feedProxy').value = f.proxy ? 'true' : '';
document.getElementById('deleteBtn').style.display = '';
document.getElementById('feedModal').classList.add('active');
}
function closeModal() {
document.getElementById('feedModal').classList.remove('active');
}
async function saveFeed() {
const url = document.getElementById('feedUrl').value.trim();
const feedTitle = document.getElementById('feedTitle').value.trim();
if (!url) { showToast('URL 不能为空', true); return; }
const body = { url };
if (feedTitle) body.feedTitle = feedTitle;
const format = document.getElementById('feedFormat').value;
if (format) body.format = format;
const path = document.getElementById('feedPath').value.trim();
if (path) body.path = path;
const proxy = document.getElementById('feedProxy').value;
if (proxy) body.proxy = true;
if (editingUrl) body.oldUrl = editingUrl;
try {
const res = await fetch('/api/feeds?token=' + encodeURIComponent(token), {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body)
});
if (!res.ok) throw new Error('HTTP ' + res.status);
closeModal();
showToast(editingUrl ? '已更新' : '已添加');
loadFeeds();
} catch (err) {
showToast('保存失败: ' + err.message, true);
}
}
async function deleteFeed() {
if (!editingUrl || !confirm('确定删除 ' + editingUrl + ' ?')) return;
try {
const res = await fetch('/api/feeds?token=' + encodeURIComponent(token) + '&url=' + encodeURIComponent(editingUrl), { method: 'DELETE' });
if (!res.ok) throw new Error('HTTP ' + res.status);
closeModal();
showToast('已删除');
loadFeeds();
} catch (err) {
showToast('删除失败: ' + err.message, true);
}
}
// ─── 友链管理 ───
let links = [];
let editingLinkUrl = null;
function renderLinkTable() {
const tbody = document.getElementById('linkTableBody');
if (links.length === 0) {
tbody.innerHTML = '';
document.getElementById('linkEmpty').style.display = '';
return;
}
document.getElementById('linkEmpty').style.display = 'none';
tbody.innerHTML = links.map((l, i) => {
var img = l.image || l.avatar || ('https://api.200181.xyz/api/favicon?url=' + encodeURIComponent(l.url));
var hiddenBadge = l.hidden ? ' <span style="font-size:10px;color:var(--red);border:1px solid var(--red);border-radius:4px;padding:1px 5px;margin-left:6px">隐藏</span>' : '';
return '<tr>' +
'<td><img src="' + img + '" class="link-avatar" onerror="this.style.opacity=0"></td>' +
'<td class="link-name">' + (l.name || '-') + hiddenBadge + '</td>' +
'<td class="url">' + l.url + '</td>' +
'<td style="font-size:12px;color:var(--muted)">' + (l.description || '') + '</td>' +
'<td class="actions"><button class="btn btn-secondary" onclick="openEditLink(' + i + ')">编辑</button></td>' +
'</tr>';
}).join('');
}
async function loadLinks() {
try {
const res = await fetch('/api/links?all=1');
const data = await res.json();
links = data.links || [];
document.getElementById('linkCount').textContent = links.length;
renderLinkTable();
} catch (err) {
showToast('加载友链失败: ' + err.message, true);
}
}
function openLinkModal() {
editingLinkUrl = null;
document.getElementById('linkModalTitle').textContent = '添加友链';
document.getElementById('linkName').value = '';
document.getElementById('linkUrl').value = '';
document.getElementById('linkImage').value = '';
document.getElementById('linkDesc').value = '';
document.getElementById('linkRss').value = '';
document.getElementById('linkHidden').checked = false;
document.getElementById('linkDeleteBtn').style.display = 'none';
document.getElementById('linkModal').classList.add('active');
}
function openEditLink(idx) {
const l = links[idx];
editingLinkUrl = l.url;
document.getElementById('linkModalTitle').textContent = '编辑友链';
document.getElementById('linkName').value = l.name || '';
document.getElementById('linkUrl').value = l.url || '';
document.getElementById('linkImage').value = l.image || '';
document.getElementById('linkDesc').value = l.description || '';
document.getElementById('linkRss').value = l.rss || '';
document.getElementById('linkHidden').checked = !!l.hidden;
document.getElementById('linkDeleteBtn').style.display = '';
document.getElementById('linkModal').classList.add('active');
}
function closeLinkModal() {
document.getElementById('linkModal').classList.remove('active');
}
async function saveLink() {
const name = document.getElementById('linkName').value.trim();
const url = document.getElementById('linkUrl').value.trim();
if (!name && !url) { showToast('名称和 URL 至少填一个', true); return; }
if (!url) { showToast('URL 不能为空', true); return; }
const body = { name: name || url, url: url };
const image = document.getElementById('linkImage').value.trim();
if (image) body.image = image;
const desc = document.getElementById('linkDesc').value.trim();
if (desc) body.description = desc;
const rss = document.getElementById('linkRss').value.trim();
if (rss) body.rss = rss;
body.hidden = document.getElementById('linkHidden').checked;
if (editingLinkUrl) body.oldUrl = editingLinkUrl;
try {
const res = await fetch('/api/links?token=' + encodeURIComponent(token), {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body)
});
if (!res.ok) throw new Error('HTTP ' + res.status);
closeLinkModal();
showToast(editingLinkUrl ? '已更新' : '已添加');
loadLinks();
} catch (err) {
showToast('保存失败: ' + err.message, true);
}
}
async function deleteLink() {
if (!editingLinkUrl || !confirm('确定删除 ' + editingLinkUrl + ' ?')) return;
try {
const res = await fetch('/api/links?token=' + encodeURIComponent(token) + '&url=' + encodeURIComponent(editingLinkUrl), { method: 'DELETE' });
if (!res.ok) throw new Error('HTTP ' + res.status);
closeLinkModal();
showToast('已删除');
loadLinks();
} catch (err) {
showToast('删除失败: ' + err.message, true);
}
}
async function changePassword() {
const oldPwd = document.getElementById('oldPwd').value;
const newPwd = document.getElementById('newPwd').value;
try {
const res = await fetch('/api/auth?token=' + encodeURIComponent(token), {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ oldPassword: oldPwd, newPassword: newPwd })
});
const data = await res.json();
if (!res.ok) throw new Error(data.error || 'HTTP ' + res.status);
if (newPwd) {
token = newPwd;
document.cookie = 'site_token=' + newPwd + ';path=/;max-age=2592000;SameSite=Lax';
}
document.getElementById('oldPwd').value = '';
document.getElementById('newPwd').value = '';
showToast(newPwd ? '口令已更新' : '口令保护已清除');
} catch (err) {
showToast('修改失败: ' + err.message, true);
}
}
loadFeeds();
loadLinks();
</script>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

+34
View File
@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>UAPI</title>
<style>
:root { --bg: #0a0f0f; --card: #0f1a1a; --border: #1a3a2a; --text: #c9d1d9; --muted: #5a7a5a; --accent: #3fb950; }
* { margin:0; padding:0; box-sizing:border-box; }
body { background:var(--bg); color:var(--text); font-family:'JetBrains Mono','Fira Code','SF Mono',Consolas,monospace; min-height:100vh; display:flex; align-items:center; justify-content:center; }
.box { background:var(--card); border:1px solid var(--border); border-radius:4px; padding:36px; width:100%; max-width:360px; text-align:center; }
.box h1 { font-size:18px; color:var(--accent); font-weight:400; margin-bottom:6px; }
.box p { color:var(--muted); font-size:12px; margin-bottom:20px; }
.box input { width:100%; padding:10px 12px; background:#050a0a; border:1px solid var(--border); border-radius:4px; color:#fff; font-size:14px; font-family:inherit; outline:none; }
.box input:focus { border-color:var(--accent); }
.box button { width:100%; margin-top:12px; padding:10px; background:var(--accent); color:#000; border:none; border-radius:4px; font-size:14px; font-family:inherit; cursor:pointer; font-weight:600; }
.box button:hover { background:#2ea043; color:#fff; }
.err { color:var(--red); font-size:12px; margin-top:10px; display:none; }
</style>
</head>
<body>
<div class="box">
<h1>[UAPI] 身份验证</h1>
<p>请输入访问口令</p>
<input type="password" id="pwd" placeholder="口令" autofocus>
<button onclick="login()">进入系统</button>
<div class="err" id="err">口令错误</div>
</div>
<script>
async function login(){const t=document.getElementById('pwd').value;if(!t)return;try{const r=await fetch('/api/auth?token='+encodeURIComponent(t));if(r.ok){document.cookie='site_token='+t+';path=/;max-age=2592000;SameSite=Lax';location.href='/?token='+encodeURIComponent(t)}else{document.getElementById('err').style.display='block'}}catch{document.getElementById('err').style.display='block'}}
document.getElementById('pwd').addEventListener('keydown',e=>{if(e.key==='Enter')login()});
</script>
</body>
</html>
+45
View File
@@ -0,0 +1,45 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
<title>评论后端 · 优世界</title>
<meta name="robots" content="noindex,nofollow">
<script>
try { if (localStorage.getItem('atk-theme') === 'dark') document.documentElement.dataset.theme = 'dark'; } catch (e) {}
</script>
<link rel="stylesheet" href="./admin/admin.css">
</head>
<body>
<div class="gate">
<div class="login-card">
<h1>评论后端</h1>
<p class="sub">优世界 · Cloudflare Workers + D1</p>
<dl class="kv" style="margin:0 0 22px">
<dt>接口</dt><dd class="mono">/api/v2/*</dd>
<dt>状态</dt><dd class="ok" id="st">检查中…</dd>
</dl>
<a class="btn primary block" href="./admin/" style="text-decoration:none">进入管理面板</a>
<a class="btn block" href="./sidebar/" style="text-decoration:none;margin-top:8px">官方后台(Artalk Sidebar)</a>
<p class="hint">博客端的 <code>server</code> 指向本域名即可</p>
</div>
</div>
<script>
(function () {
var el = document.getElementById('st');
fetch('./api/v2/healthz')
.then(function (r) { return r.json(); })
.then(function (d) {
el.textContent = '正常 · ' + Number(d.comments || 0).toLocaleString('zh-CN') +
' 条评论 · ' + d.latency_ms + 'ms';
})
.catch(function () { el.className = 'bad'; el.textContent = '不可达'; });
})();
</script>
</body>
</html>
+48
View File
@@ -0,0 +1,48 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录 · UAPI管理系统</title>
<style>
:root { --bg: #0d1117; --card: #161b22; --border: #30363d; --text: #c9d1d9; --muted: #8b949e; --accent: #58a6ff; }
* { margin: 0; padding: 0; box-sizing: border-box; }
body { background: var(--bg); color: var(--text); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 20px; }
.login-box { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 40px; width: 100%; max-width: 380px; text-align: center; }
.login-box h1 { font-size: 22px; margin-bottom: 8px; color: #fff; }
.login-box p { color: var(--muted); font-size: 14px; margin-bottom: 24px; }
.login-box input { width: 100%; padding: 10px 14px; background: #0d1117; border: 1px solid var(--border); border-radius: 8px; color: #fff; font-size: 15px; outline: none; }
.login-box input:focus { border-color: var(--accent); }
.login-box button { width: 100%; margin-top: 14px; padding: 10px; background: #238636; color: #fff; border: none; border-radius: 8px; font-size: 15px; cursor: pointer; font-weight: 600; }
.login-box button:hover { background: #2ea043; }
.error { color: #f85149; font-size: 13px; margin-top: 10px; display: none; }
</style>
</head>
<body>
<div class="login-box">
<h1>UAPI管理系统</h1>
<p>请输入访问口令</p>
<input type="password" id="pwd" placeholder="口令" autofocus>
<button onclick="login()">进入</button>
<div class="error" id="err">口令错误</div>
</div>
<script>
async function login() {
const pwd = document.getElementById('pwd').value;
if (!pwd) return;
try {
const res = await fetch('/api/auth?token=' + encodeURIComponent(pwd));
if (res.ok) {
document.cookie = 'site_token=' + pwd + ';path=/;max-age=2592000;SameSite=Lax';
location.href = '/feed?token=' + encodeURIComponent(pwd);
} else {
document.getElementById('err').style.display = 'block';
}
} catch {
document.getElementById('err').style.display = 'block';
}
}
document.getElementById('pwd').addEventListener('keydown', (e) => { if (e.key === 'Enter') login(); });
</script>
</body>
</html>
@@ -0,0 +1,61 @@
var e=Object.defineProperty,t=Object.defineProperties,n=Object.getOwnPropertyDescriptors,s=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable,o=(e,t)=>(t=Symbol[e])?t:Symbol.for("Symbol."+e),a=(t,n,s)=>n in t?e(t,n,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[n]=s,l=(e,t)=>{for(var n in t||(t={}))r.call(t,n)&&a(e,n,t[n]);if(s)for(var n of s(t))i.call(t,n)&&a(e,n,t[n]);return e},c=(e,s)=>t(e,n(s)),u=(e,t,n)=>(a(e,"symbol"!=typeof t?t+"":t,n),n),d=(e,t,n)=>new Promise(((s,r)=>{var i=e=>{try{a(n.next(e))}catch(t){r(t)}},o=e=>{try{a(n.throw(e))}catch(t){r(t)}},a=e=>e.done?s(e.value):Promise.resolve(e.value).then(i,o);a((n=n.apply(e,t)).next())})),p=function(e,t){this[0]=e,this[1]=t},h=e=>{var t,n=e[o("asyncIterator")],s=!1,r={};return null==n?(n=e[o("iterator")](),t=e=>r[e]=t=>n[e](t)):(n=n.call(e),t=e=>r[e]=t=>{if(s){if(s=!1,"throw"===e)throw t;return t}return s=!0,{done:!1,value:new p(new Promise((s=>{var r=n[e](t);if(!(r instanceof Object))throw TypeError("Object expected");s(r)})),1)}}),r[o("iterator")]=()=>r,t("next"),"throw"in n?t("throw"):r.throw=e=>{throw e},"return"in n&&t("return"),r};
/**
* @vue/shared v3.4.26
* (c) 2018-present Yuxi (Evan) You and Vue contributors
* @license MIT
**/
/*! #__NO_SIDE_EFFECTS__ */
function f(e,t){const n=new Set(e.split(","));return e=>n.has(e)}!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))t(e);new MutationObserver((e=>{for(const n of e)if("childList"===n.type)for(const e of n.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&t(e)})).observe(document,{childList:!0,subtree:!0})}function t(e){if(e.ep)return;e.ep=!0;const t=function(e){const t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?t.credentials="include":"anonymous"===e.crossOrigin?t.credentials="omit":t.credentials="same-origin",t}(e);fetch(e.href,t)}}();const m={},g=[],v=()=>{},y=()=>!1,k=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),b=e=>e.startsWith("onUpdate:"),w=Object.assign,_=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},E=Object.prototype.hasOwnProperty,x=(e,t)=>E.call(e,t),S=Array.isArray,C=e=>"[object Map]"===R(e),A=e=>"[object Set]"===R(e),$=e=>"[object Date]"===R(e),T=e=>"function"==typeof e,L=e=>"string"==typeof e,O=e=>"symbol"==typeof e,N=e=>null!==e&&"object"==typeof e,I=e=>(N(e)||T(e))&&T(e.then)&&T(e.catch),P=Object.prototype.toString,R=e=>P.call(e),M=e=>R(e).slice(8,-1),D=e=>"[object Object]"===R(e),U=e=>L(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,F=f(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),j=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},B=/-(\w)/g,q=j((e=>e.replace(B,((e,t)=>t?t.toUpperCase():"")))),W=/\B([A-Z])/g,H=j((e=>e.replace(W,"-$1").toLowerCase())),V=j((e=>e.charAt(0).toUpperCase()+e.slice(1))),K=j((e=>e?`on${V(e)}`:"")),z=(e,t)=>!Object.is(e,t),G=(e,t)=>{for(let n=0;n<e.length;n++)e[n](t)},Y=(e,t,n,s=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Q=e=>{const t=parseFloat(e);return isNaN(t)?e:t},X=e=>{const t=L(e)?Number(e):NaN;return isNaN(t)?e:t};let J;const Z=()=>J||(J="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{});function ee(e){if(S(e)){const t={};for(let n=0;n<e.length;n++){const s=e[n],r=L(s)?re(s):ee(s);if(r)for(const e in r)t[e]=r[e]}return t}if(L(e)||N(e))return e}const te=/;(?![^(]*\))/g,ne=/:([^]+)/,se=/\/\*[^]*?\*\//g;function re(e){const t={};return e.replace(se,"").split(te).forEach((e=>{if(e){const n=e.split(ne);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function ie(e){let t="";if(L(e))t=e;else if(S(e))for(let n=0;n<e.length;n++){const s=ie(e[n]);s&&(t+=s+" ")}else if(N(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}const oe=f("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly");function ae(e){return!!e||""===e}function le(e,t){if(e===t)return!0;let n=$(e),s=$(t);if(n||s)return!(!n||!s)&&e.getTime()===t.getTime();if(n=O(e),s=O(t),n||s)return e===t;if(n=S(e),s=S(t),n||s)return!(!n||!s)&&function(e,t){if(e.length!==t.length)return!1;let n=!0;for(let s=0;n&&s<e.length;s++)n=le(e[s],t[s]);return n}(e,t);if(n=N(e),s=N(t),n||s){if(!n||!s)return!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e){const s=e.hasOwnProperty(n),r=t.hasOwnProperty(n);if(s&&!r||!s&&r||!le(e[n],t[n]))return!1}}return String(e)===String(t)}function ce(e,t){return e.findIndex((e=>le(e,t)))}const ue=e=>L(e)?e:null==e?"":S(e)||N(e)&&(e.toString===P||!T(e.toString))?JSON.stringify(e,de,2):String(e),de=(e,t)=>t&&t.__v_isRef?de(e,t.value):C(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n],s)=>(e[pe(t,s)+" =>"]=n,e)),{})}:A(t)?{[`Set(${t.size})`]:[...t.values()].map((e=>pe(e)))}:O(t)?pe(t):!N(t)||S(t)||D(t)?t:String(t),pe=(e,t="")=>{var n;return O(e)?`Symbol(${null!=(n=e.description)?n:t})`:e};
/**
* @vue/reactivity v3.4.26
* (c) 2018-present Yuxi (Evan) You and Vue contributors
* @license MIT
**/
let he,fe;class me{constructor(e=!1){this.detached=e,this._active=!0,this.effects=[],this.cleanups=[],this.parent=he,!e&&he&&(this.index=(he.scopes||(he.scopes=[])).push(this)-1)}get active(){return this._active}run(e){if(this._active){const t=he;try{return he=this,e()}finally{he=t}}}on(){he=this}off(){he=this.parent}stop(e){if(this._active){let t,n;for(t=0,n=this.effects.length;t<n;t++)this.effects[t].stop();for(t=0,n=this.cleanups.length;t<n;t++)this.cleanups[t]();if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].stop(!0);if(!this.detached&&this.parent&&!e){const e=this.parent.scopes.pop();e&&e!==this&&(this.parent.scopes[this.index]=e,e.index=this.index)}this.parent=void 0,this._active=!1}}}function ge(e){return new me(e)}function ve(){return he}class ye{constructor(e,t,n,s){this.fn=e,this.trigger=t,this.scheduler=n,this.active=!0,this.deps=[],this._dirtyLevel=4,this._trackId=0,this._runnings=0,this._shouldSchedule=!1,this._depsLength=0,function(e,t=he){t&&t.active&&t.effects.push(e)}(this,s)}get dirty(){if(2===this._dirtyLevel||3===this._dirtyLevel){this._dirtyLevel=1,Se();for(let e=0;e<this._depsLength;e++){const t=this.deps[e];if(t.computed&&(t.computed.value,this._dirtyLevel>=4))break}1===this._dirtyLevel&&(this._dirtyLevel=0),Ce()}return this._dirtyLevel>=4}set dirty(e){this._dirtyLevel=e?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let e=_e,t=fe;try{return _e=!0,fe=this,this._runnings++,ke(this),this.fn()}finally{be(this),this._runnings--,fe=t,_e=e}}stop(){this.active&&(ke(this),be(this),this.onStop&&this.onStop(),this.active=!1)}}function ke(e){e._trackId++,e._depsLength=0}function be(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t<e.deps.length;t++)we(e.deps[t],e);e.deps.length=e._depsLength}}function we(e,t){const n=e.get(t);void 0!==n&&t._trackId!==n&&(e.delete(t),0===e.size&&e.cleanup())}let _e=!0,Ee=0;const xe=[];function Se(){xe.push(_e),_e=!1}function Ce(){const e=xe.pop();_e=void 0===e||e}function Ae(){Ee++}function $e(){for(Ee--;!Ee&&Le.length;)Le.shift()()}function Te(e,t,n){if(t.get(e)!==e._trackId){t.set(e,e._trackId);const n=e.deps[e._depsLength];n!==t?(n&&we(n,e),e.deps[e._depsLength++]=t):e._depsLength++}}const Le=[];function Oe(e,t,n){Ae();for(const s of e.keys()){let n;s._dirtyLevel<t&&(null!=n?n:n=e.get(s)===s._trackId)&&(s._shouldSchedule||(s._shouldSchedule=0===s._dirtyLevel),s._dirtyLevel=t),s._shouldSchedule&&(null!=n?n:n=e.get(s)===s._trackId)&&(s.trigger(),s._runnings&&!s.allowRecurse||2===s._dirtyLevel||(s._shouldSchedule=!1,s.scheduler&&Le.push(s.scheduler)))}$e()}const Ne=(e,t)=>{const n=new Map;return n.cleanup=e,n.computed=t,n},Ie=new WeakMap,Pe=Symbol(""),Re=Symbol("");function Me(e,t,n){if(_e&&fe){let t=Ie.get(e);t||Ie.set(e,t=new Map);let s=t.get(n);s||t.set(n,s=Ne((()=>t.delete(n)))),Te(fe,s)}}function De(e,t,n,s,r,i){const o=Ie.get(e);if(!o)return;let a=[];if("clear"===t)a=[...o.values()];else if("length"===n&&S(e)){const e=Number(s);o.forEach(((t,n)=>{("length"===n||!O(n)&&n>=e)&&a.push(t)}))}else switch(void 0!==n&&a.push(o.get(n)),t){case"add":S(e)?U(n)&&a.push(o.get("length")):(a.push(o.get(Pe)),C(e)&&a.push(o.get(Re)));break;case"delete":S(e)||(a.push(o.get(Pe)),C(e)&&a.push(o.get(Re)));break;case"set":C(e)&&a.push(o.get(Pe))}Ae();for(const l of a)l&&Oe(l,4);$e()}const Ue=f("__proto__,__v_isRef,__isVue"),Fe=new Set(Object.getOwnPropertyNames(Symbol).filter((e=>"arguments"!==e&&"caller"!==e)).map((e=>Symbol[e])).filter(O)),je=Be();function Be(){const e={};return["includes","indexOf","lastIndexOf"].forEach((t=>{e[t]=function(...e){const n=$t(this);for(let t=0,r=this.length;t<r;t++)Me(n,0,t+"");const s=n[t](...e);return-1===s||!1===s?n[t](...e.map($t)):s}})),["push","pop","shift","unshift","splice"].forEach((t=>{e[t]=function(...e){Se(),Ae();const n=$t(this)[t].apply(this,e);return $e(),Ce(),n}})),e}function qe(e){O(e)||(e=String(e));const t=$t(this);return Me(t,0,e),t.hasOwnProperty(e)}class We{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){const s=this._isReadonly,r=this._isShallow;if("__v_isReactive"===t)return!s;if("__v_isReadonly"===t)return s;if("__v_isShallow"===t)return r;if("__v_raw"===t)return n===(s?r?kt:yt:r?vt:gt).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;const i=S(e);if(!s){if(i&&x(je,t))return Reflect.get(je,t,n);if("hasOwnProperty"===t)return qe}const o=Reflect.get(e,t,n);return(O(t)?Fe.has(t):Ue(t))?o:(s||Me(e,0,t),r?o:Rt(o)?i&&U(t)?o:o.value:N(o)?s?_t(o):bt(o):o)}}class He extends We{constructor(e=!1){super(!1,e)}set(e,t,n,s){let r=e[t];if(!this._isShallow){const t=St(r);if(Ct(n)||St(n)||(r=$t(r),n=$t(n)),!S(e)&&Rt(r)&&!Rt(n))return!t&&(r.value=n,!0)}const i=S(e)&&U(t)?Number(t)<e.length:x(e,t),o=Reflect.set(e,t,n,s);return e===$t(s)&&(i?z(n,r)&&De(e,"set",t,n):De(e,"add",t,n)),o}deleteProperty(e,t){const n=x(e,t);e[t];const s=Reflect.deleteProperty(e,t);return s&&n&&De(e,"delete",t,void 0),s}has(e,t){const n=Reflect.has(e,t);return O(t)&&Fe.has(tLine truncated
/**
* @vue/runtime-core v3.4.26
* (c) 2018-present Yuxi (Evan) You and Vue contributors
* @license MIT
**/function Gt(e,t,n,s){try{return s?e(...s):e()}catch(r){Qt(r,t,n)}}function Yt(e,t,n,s){if(T(e)){const r=Gt(e,t,n,s);return r&&I(r)&&r.catch((e=>{Qt(e,t,n)})),r}if(S(e)){const r=[];for(let i=0;i<e.length;i++)r.push(Yt(e[i],t,n,s));return r}}function Qt(e,t,n,s=!0){t&&t.vnode;if(t){let s=t.parent;const r=t.proxy,i=`https://vuejs.org/error-reference/#runtime-${n}`;for(;s;){const t=s.ec;if(t)for(let n=0;n<t.length;n++)if(!1===t[n](e,r,i))return;s=s.parent}const o=t.appContext.config.errorHandler;if(o)return Se(),Gt(o,null,10,[e,r,i]),void Ce()}!function(e,t,n,s=!0){console.error(e)}(e,0,0,s)}let Xt=!1,Jt=!1;const Zt=[];let en=0;const tn=[];let nn=null,sn=0;const rn=Promise.resolve();let on=null;function an(e){const t=on||rn;return e?t.then(this?e.bind(this):e):t}function ln(e){Zt.length&&Zt.includes(e,Xt&&e.allowRecurse?en+1:en)||(null==e.id?Zt.push(e):Zt.splice(function(e){let t=en+1,n=Zt.length;for(;t<n;){const s=t+n>>>1,r=Zt[s],i=pn(r);i<e||i===e&&r.pre?t=s+1:n=s}return t}(e.id),0,e),cn())}function cn(){Xt||Jt||(Jt=!0,on=rn.then(fn))}function un(e,t,n=(Xt?en+1:0)){for(;n<Zt.length;n++){const t=Zt[n];if(t&&t.pre){if(e&&t.id!==e.uid)continue;Zt.splice(n,1),n--,t()}}}function dn(e){if(tn.length){const e=[...new Set(tn)].sort(((e,t)=>pn(e)-pn(t)));if(tn.length=0,nn)return void nn.push(...e);for(nn=e,sn=0;sn<nn.length;sn++)nn[sn]();nn=null,sn=0}}const pn=e=>null==e.id?1/0:e.id,hn=(e,t)=>{const n=pn(e)-pn(t);if(0===n){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function fn(e){Jt=!1,Xt=!0,Zt.sort(hn);try{for(en=0;en<Zt.length;en++){const e=Zt[en];e&&!1!==e.active&&Gt(e,null,14)}}finally{en=0,Zt.length=0,dn(),Xt=!1,on=null,(Zt.length||tn.length)&&fn()}}function mn(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||m;let r=n;const i=t.startsWith("update:"),o=i&&t.slice(7);if(o&&o in s){const e=`${"modelValue"===o?"model":o}Modifiers`,{number:t,trim:i}=s[e]||m;i&&(r=n.map((e=>L(e)?e.trim():e))),t&&(r=n.map(Q))}let a,l=s[a=K(t)]||s[a=K(q(t))];!l&&i&&(l=s[a=K(H(t))]),l&&Yt(l,e,6,r);const c=s[a+"Once"];if(c){if(e.emitted){if(e.emitted[a])return}else e.emitted={};e.emitted[a]=!0,Yt(c,e,6,r)}}function gn(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(void 0!==r)return r;const i=e.emits;let o={},a=!1;if(!T(e)){const s=e=>{const n=gn(e,t,!0);n&&(a=!0,w(o,n))};!n&&t.mixins.length&&t.mixins.forEach(s),e.extends&&s(e.extends),e.mixins&&e.mixins.forEach(s)}return i||a?(S(i)?i.forEach((e=>o[e]=null)):w(o,i),N(e)&&s.set(e,o),o):(N(e)&&s.set(e,null),null)}function vn(e,t){return!(!e||!k(t))&&(t=t.slice(2).replace(/Once$/,""),x(e,t[0].toLowerCase()+t.slice(1))||x(e,H(t))||x(e,t))}let yn=null,kn=null;function bn(e){const t=yn;return yn=e,kn=e&&e.type.__scopeId||null,t}function wn(e){kn=e}function _n(){kn=null}function En(e,t=yn,n){if(!t)return e;if(e._n)return e;const s=(...n)=>{s._d&&wr(-1);const r=bn(t);let i;try{i=e(...n)}finally{bn(r),s._d&&wr(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function xn(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:a,emit:l,render:c,renderCache:u,props:d,data:p,setupState:h,ctx:f,inheritAttrs:m}=e,g=bn(e);let v,y;try{if(4&n.shapeFlag){const e=r||s,t=e;v=Pr(c.call(t,e,u,d,h,p,f)),y=a}else{const e=t;0,v=Pr(e.length>1?e(d,{attrs:a,slots:o,emit:l}):e(d,null)),y=t.props?a:Sn(a)}}catch(w){vr.length=0,Qt(w,e,1),v=Lr(mr)}let k=v;if(y&&!1!==m){const e=Object.keys(y),{shapeFlag:t}=k;e.length&&7&t&&(i&&e.some(b)&&(y=Cn(y,i)),k=Or(k,y,!1,!0))}return n.dirs&&(k=Or(k,null,!1,!0),k.dirs=k.dirs?k.dirs.concat(n.dirs):n.dirs),n.transition&&(k.transition=n.transition),v=k,bn(g),v}const Sn=e=>{let t;for(const n in e)("class"===n||"style"===n||k(n))&&((t||(t={}))[n]=e[n]);return t},Cn=(e,t)=>{const n={};for(const s in e)b(s)&&s.slice(9)in t||(n[s]=e[s]);return n};function An(e,t,n){const s=Object.keys(t);if(s.length!==Object.keys(e).length)return!0;for(let r=0;r<s.length;r++){const i=s[r];if(t[i]!==e[i]&&!vn(n,i))return!0}return!1}function $n(e,t){return function(e,t,n=!0,s=!1){const r=yn||jr;if(r){const n=r.type;{const e=Zr(n,!1);if(e&&(e===t||e===q(t)||e===V(q(t))))return n}const i=Ln(r[e]||n[e],t)||Ln(r.appContext[e],t);return!i&&s?n:i}}("components",e,!0,t)||e}const Tn=Symbol.for("v-ndc");function Ln(e,t){return e&&(e[t]||e[q(t)]||e[V(q(t))])}const On=Symbol.for("v-scx"),Nn=()=>qs(On),In={};function Pn(e,t,n){return Rn(e,t,n)}function Rn(e,t,{immediate:n,deep:s,flush:r,once:i,onTrack:o,onTrigger:a}=m){if(t&&i){const e=t;t=(...t)=>{e(...t),x()}}const l=jr,c=e=>!0===s?e:Un(e,!1===s?1:void 0);let u,d,p=!1,h=!1;if(Rt(e)?(u=()=>e.value,p=Ct(e)):xt(e)?(u=()=>c(e),p=!0):S(e)?(h=!0,p=e.some((e=>xt(e)||Ct(e))),u=()=>e.map((e=>Rt(e)?e.value:xt(e)?c(e):T(e)?Gt(e,l,2):void 0))):u=T(e)?t?()=>Gt(e,l,2):()=>(d&&d(),Yt(e,l,3,[g])):v,t&&s){const e=u;u=()=>Un(e())}let f,g=e=>{d=w.onStop=()=>{Gt(e,l,4),d=w.onStop=void 0}};if(Gr){if(g=v,t?n&&Yt(t,l,3,[u(),h?[]:void 0,g]):u(),"sync"!==r)return v;{const e=Nn();f=e.__watcherHandles||(e.__watcherHandles=[])}}let y=h?new Array(e.length) Line truncated
/*! #__NO_SIDE_EFFECTS__ */function Jn(e,t){return T(e)?(()=>w({name:e.name},t,{setup:e}))():e}const Zn=e=>!!e.type.__asyncLoader,es=e=>e.type.__isKeepAlive;function ts(e,t){ss(e,"a",t)}function ns(e,t){ss(e,"da",t)}function ss(e,t,n=jr){const s=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(is(t,s,n),n){let e=n.parent;for(;e&&e.parent;)es(e.parent.vnode)&&rs(s,t,n,e),e=e.parent}}function rs(e,t,n,s){const r=is(t,e,s,!0);ps((()=>{_(s[t],r)}),n)}function is(e,t,n=jr,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...s)=>{if(n.isUnmounted)return;Se();const r=Hr(n),i=Yt(t,n,e,s);return r(),Ce(),i});return s?r.unshift(i):r.push(i),i}}const os=e=>(t,n=jr)=>(!Gr||"sp"===e)&&is(e,((...e)=>t(...e)),n),as=os("bm"),ls=os("m"),cs=os("bu"),us=os("u"),ds=os("bum"),ps=os("um"),hs=os("sp"),fs=os("rtg"),ms=os("rtc");function gs(e,t=jr){is("ec",e,t)}function vs(e,t,n,s){let r;const i=n;if(S(e)||L(e)){r=new Array(e.length);for(let n=0,s=e.length;n<s;n++)r[n]=t(e[n],n,void 0,i)}else if("number"==typeof e){r=new Array(e);for(let n=0;n<e;n++)r[n]=t(n+1,n,void 0,i)}else if(N(e))if(e[Symbol.iterator])r=Array.from(e,((e,n)=>t(e,n,void 0,i)));else{const n=Object.keys(e);r=new Array(n.length);for(let s=0,o=n.length;s<o;s++){const o=n[s];r[s]=t(e[o],o,s,i)}}else r=[];return r}function ys(e,t,n={},s,r){if(yn.isCE||yn.parent&&Zn(yn.parent)&&yn.parent.isCE)return"default"!==t&&(n.name=t),Lr("slot",n,s);let i=e[t];i&&i._c&&(i._d=!1),kr();const o=i&&ks(i(n)),a=xr(hr,{key:n.key||o&&o.key||`_${t}`},o||[],o&&1===e._?64:-2);return a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),i&&i._c&&(i._d=!0),a}function ks(e){return e.some((e=>!Sr(e)||e.type!==mr&&!(e.type===hr&&!ks(e.children))))?e:null}const bs=e=>e?Kr(e)?Jr(e)||e.proxy:bs(e.parent):null,ws=w(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>bs(e.parent),$root:e=>bs(e.root),$emit:e=>e.emit,$options:e=>Ts(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,ln(e.update)}),$nextTick:e=>e.n||(e.n=an.bind(e.proxy)),$watch:e=>Mn.bind(e)}),_s=(e,t)=>e!==m&&!e.__isScriptSetup&&x(e,t),Es={get({_:e},t){if("__v_skip"===t)return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:a,appContext:l}=e;let c;if("$"!==t[0]){const a=o[t];if(void 0!==a)switch(a){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(_s(s,t))return o[t]=1,s[t];if(r!==m&&x(r,t))return o[t]=2,r[t];if((c=e.propsOptions[0])&&x(c,t))return o[t]=3,i[t];if(n!==m&&x(n,t))return o[t]=4,n[t];Ss&&(o[t]=0)}}const u=ws[t];let d,p;return u?("$attrs"===t&&Me(e.attrs,0,""),u(e)):(d=a.__cssModules)&&(d=d[t])?d:n!==m&&x(n,t)?(o[t]=4,n[t]):(p=l.config.globalProperties,x(p,t)?p[t]:void 0)},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return _s(r,t)?(r[t]=n,!0):s!==m&&x(s,t)?(s[t]=n,!0):!x(e.props,t)&&(("$"!==t[0]||!(t.slice(1)in e))&&(i[t]=n,!0))},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let a;return!!n[o]||e!==m&&x(e,o)||_s(t,o)||(a=i[0])&&x(a,o)||x(s,o)||x(ws,o)||x(r.config.globalProperties,o)},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:x(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function xs(e){return S(e)?e.reduce(((e,t)=>(e[t]=null,e)),{}):e}let Ss=!0;function Cs(e){const t=Ts(e),n=e.proxy,s=e.ctx;Ss=!1,t.beforeCreate&&As(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:a,provide:l,inject:c,created:u,beforeMount:d,mounted:p,beforeUpdate:h,updated:f,activated:m,deactivated:g,beforeDestroy:y,beforeUnmount:k,destroyed:b,unmounted:w,render:_,renderTracked:E,renderTriggered:x,errorCaptured:C,serverPrefetch:A,expose:$,inheritAttrs:L,components:O,directives:I,filters:P}=t;if(c&&function(e,t,n=v){S(e)&&(e=Is(e));for(const s in e){const n=e[s];let r;r=N(n)?"default"in n?qs(n.from||s,n.default,!0):qs(n.from||s):qs(n),Rt(r)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>r.value,set:e=>r.value=e}):t[s]=r}}(c,s,null),o)for(const v in o){const e=o[v];T(e)&&(s[v]=e.bind(n))}if(r){const t=r.call(n,n);N(t)&&(e.data=bt(t))}if(Ss=!0,i)for(const S in i){const e=i[S],t=T(e)?e.bind(n,n):T(e.get)?e.get.bind(n,n):v,r=!T(e)&&T(e.set)?e.set.bind(n):v,o=ei({get:t,set:r});Object.defineProperty(s,S,{enumerable:!0,configurable:!0,get:()=>o.value,set:e=>o.value=e})}if(a)for(const v in a)$s(a[v],s,n,v);if(l){const e=T(l)?l.call(n):l;Reflect.ownKeys(e).forEach((t=>{Bs(t,e[t])}))}function R(e,t){S(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(u&&As(u,e,"c"),R(as,d),R(ls,p),R(cs,h),R(us,f),R(ts,m),R(ns,g),R(gs,C),R(ms,E),R(fs,x),R(ds,k),R(ps,w),R(hs,A),S($))if($.length){const t=e.exposed||(e.exposed={});$.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});_&&e.render===v&&(e.render=_),null!=L&&(e.inheritAttrs=L),O&&(e.components=O),I&&(e.directives=I)}function As(e,t,n){Yt(S(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.Line truncated
/**
* @vue/runtime-dom v3.4.26
* (c) 2018-present Yuxi (Evan) You and Vue contributors
* @license MIT
**/ci.displayName="Transition";const ui={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ci.props=w({},Hn,ui);const di=(e,t=[])=>{S(e)?e.forEach((e=>e(...t))):e&&e(...t)},pi=e=>!!e&&(S(e)?e.some((e=>e.length>1)):e.length>1);function hi(e){return X(e)}function fi(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e[li]||(e[li]=new Set)).add(t)}function mi(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const n=e[li];n&&(n.delete(t),n.size||(e[li]=void 0))}function gi(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let vi=0;function yi(e,t,n,s){const r=e._endId=++vi,i=()=>{r===e._endId&&s()};if(n)return setTimeout(i,n);const{type:o,timeout:a,propCount:l}=function(e,t){const n=window.getComputedStyle(e),s=e=>(n[e]||"").split(", "),r=s(`${oi}Delay`),i=s(`${oi}Duration`),o=ki(r,i),a=s(`${ai}Delay`),l=s(`${ai}Duration`),c=ki(a,l);let u=null,d=0,p=0;t===oi?o>0&&(u=oi,d=o,p=i.length):t===ai?c>0&&(u=ai,d=c,p=l.length):(d=Math.max(o,c),u=d>0?o>c?oi:ai:null,p=u?u===oi?i.length:l.length:0);const h=u===oi&&/\b(transform|all)(,|$)/.test(s(`${oi}Property`).toString());return{type:u,timeout:d,propCount:p,hasTransform:h}}(e,t);if(!o)return s();const c=o+"end";let u=0;const d=()=>{e.removeEventListener(c,p),i()},p=t=>{t.target===e&&++u>=l&&d()};setTimeout((()=>{u<l&&d()}),a+1),e.addEventListener(c,p)}function ki(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map(((t,n)=>bi(t)+bi(e[n]))))}function bi(e){return"auto"===e?0:1e3*Number(e.slice(0,-1).replace(",","."))}const wi=Symbol("_vod"),_i=Symbol("_vsh"),Ei={beforeMount(e,{value:t},{transition:n}){e[wi]="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):xi(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),xi(e,!0),s.enter(e)):s.leave(e,(()=>{xi(e,!1)})):xi(e,t))},beforeUnmount(e,{value:t}){xi(e,t)}};function xi(e,t){e.style.display=t?e[wi]:"none",e[_i]=!t}const Si=Symbol(""),Ci=/(^|;)\s*display\s*:/;const Ai=/\s*!important$/;function $i(e,t,n){if(S(n))n.forEach((n=>$i(e,t,n)));else if(null==n&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=function(e,t){const n=Li[t];if(n)return n;let s=q(t);if("filter"!==s&&s in e)return Li[t]=s;s=V(s);for(let r=0;r<Ti.length;r++){const n=Ti[r]+s;if(n in e)return Li[t]=n}return t}(e,t);Ai.test(n)?e.setProperty(H(s),n.replace(Ai,""),"important"):e[s]=n}}const Ti=["Webkit","Moz","ms"],Li={};const Oi="http://www.w3.org/1999/xlink";function Ni(e,t,n,s){e.addEventListener(t,n,s)}const Ii=Symbol("_vei");function Pi(e,t,n,s,r=null){const i=e[Ii]||(e[Ii]={}),o=i[t];if(s&&o)o.value=s;else{const[n,a]=function(e){let t;if(Ri.test(e)){let n;for(t={};n=e.match(Ri);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}const n=":"===e[2]?e.slice(3):H(e.slice(2));return[n,t]}(t);if(s){const o=i[t]=function(e,t){const n=e=>{if(e._vts){if(e._vts<=n.attached)return}else e._vts=Date.now();Yt(function(e,t){if(S(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=Ui(),n}(s,r);Ni(e,n,o,a)}else o&&(!function(e,t,n,s){e.removeEventListener(t,n,s)}(e,n,o,a),i[t]=void 0)}}const Ri=/(?:Once|Passive|Capture)$/;let Mi=0;const Di=Promise.resolve(),Ui=()=>Mi||(Di.then((()=>Mi=0)),Mi=Date.now());const Fi=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123;const ji=e=>{const t=e.props["onUpdate:modelValue"]||!1;return S(t)?e=>G(t,e):t};function Bi(e){e.target.composing=!0}function qi(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Wi=Symbol("_assign"),Hi={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[Wi]=ji(r);const i=s||r.props&&"number"===r.props.type;Ni(e,t?"change":"input",(t=>{if(t.target.composing)return;let s=e.value;n&&(s=s.trim()),i&&(s=Q(s)),e[Wi](s)})),n&&Ni(e,"change",(()=>{e.value=e.value.trim()})),t||(Ni(e,"compositionstart",Bi),Ni(e,"compositionend",qi),Ni(e,"change",qi))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:s,number:r}},i){if(e[Wi]=ji(i),e.composing)return;const o=null==t?"":t;if((!r&&"number"!==e.type||/^0\d/.test(e.value)?e.value:Q(e.value))!==o){if(document.activeElement===e&&"range"!==e.type){if(n)return;if(s&&e.value.trim()===o)return}e.value=o}}},Vi={deep:!0,created(e,t,n){e[Wi]=ji(n),Ni(e,"change",(()=>{const t=e._modelValue,n=Yi(e),s=e.checked,r=e[Wi];if(S(t)){const e=ce(t,n),i=-1!==e;if(s&&!i)r(t.concat(n));else if(!s&&i){const n=[...t];n.splice(e,1),r(n)}}else if(A(t)){const e=new Set(t);s?e.add(n):e.delete(n),r(e)}else r(Qi(e,s))}))},mounted:Ki,beforeUpdate(e,t,n){e[WLine truncated
/*!
* pinia v2.1.7
* (c) 2023 Eduardo San Martin Morote
* @license MIT
*/
let no;const so=e=>no=e,ro=Symbol();function io(e){return e&&"object"==typeof e&&"[object Object]"===Object.prototype.toString.call(e)&&"function"!=typeof e.toJSON}var oo,ao;(ao=oo||(oo={})).direct="direct",ao.patchObject="patch object",ao.patchFunction="patch function";const lo=()=>{};function co(e,t,n,s=lo){e.push(t);const r=()=>{const n=e.indexOf(t);n>-1&&(e.splice(n,1),s())};var i;return!n&&ve()&&(i=r,he&&he.cleanups.push(i)),r}function uo(e,...t){e.slice().forEach((e=>{e(...t)}))}const po=e=>e();function ho(e,t){e instanceof Map&&t instanceof Map&&t.forEach(((t,n)=>e.set(n,t))),e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const s=t[n],r=e[n];io(r)&&io(s)&&e.hasOwnProperty(n)&&!Rt(s)&&!xt(s)?e[n]=ho(r,s):e[n]=s}return e}const fo=Symbol();const{assign:mo}=Object;function go(e,t,n={},s,r,i){let o;const a=mo({actions:{}},n),l={deep:!0};let c,u,d,p=[],h=[];const f=s.state.value[e];let m;function g(t){let n;c=u=!1,"function"==typeof t?(t(s.state.value[e]),n={type:oo.patchFunction,storeId:e,events:d}):(ho(s.state.value[e],t),n={type:oo.patchObject,payload:t,storeId:e,events:d});const r=m=Symbol();an().then((()=>{m===r&&(c=!0)})),u=!0,uo(p,n,s.state.value[e])}i||f||(s.state.value[e]={}),Mt({});const v=i?function(){const{state:e}=n,t=e?e():{};this.$patch((e=>{mo(e,t)}))}:lo;function y(t,n){return function(){so(s);const r=Array.from(arguments),i=[],o=[];let a;uo(h,{args:r,name:t,store:k,after:function(e){i.push(e)},onError:function(e){o.push(e)}});try{a=n.apply(this&&this.$id===e?this:k,r)}catch(l){throw uo(o,l),l}return a instanceof Promise?a.then((e=>(uo(i,e),e))).catch((e=>(uo(o,e),Promise.reject(e)))):(uo(i,a),a)}}const k=bt({_p:s,$id:e,$onAction:co.bind(null,h),$patch:g,$reset:v,$subscribe(t,n={}){const r=co(p,t,n.detached,(()=>i())),i=o.run((()=>Pn((()=>s.state.value[e]),(s=>{("sync"===n.flush?u:c)&&t({storeId:e,type:oo.direct,events:d},s)}),mo({},l,n))));return r},$dispose:function(){o.stop(),p=[],h=[],s._s.delete(e)}});s._s.set(e,k);const b=(s._a&&s._a.runWithContext||po)((()=>s._e.run((()=>(o=ge()).run(t)))));for(const E in b){const t=b[E];if(Rt(t)&&(!Rt(_=t)||!_.effect)||xt(t))i||(!f||io(w=t)&&w.hasOwnProperty(fo)||(Rt(t)?t.value=f[E]:ho(t,f[E])),s.state.value[e][E]=t);else if("function"==typeof t){const e=y(E,t);b[E]=e,a.actions[E]=t}}var w,_;return mo(k,b),mo($t(k),b),Object.defineProperty(k,"$state",{get:()=>s.state.value[e],set:e=>{g((t=>{mo(t,e)}))}}),s._p.forEach((e=>{mo(k,o.run((()=>e({store:k,app:s._a,pinia:s,options:a}))))})),f&&i&&n.hydrate&&n.hydrate(k.$state,f),c=!0,u=!0,k}function vo(e,t,n){let s,r;const i="function"==typeof t;function o(e,n){(e=e||(!!(jr||yn||js)?qs(ro,null):null))&&so(e),(e=no)._s.has(s)||(i?go(s,t,r,e):function(e,t,n,s){const{state:r,actions:i,getters:o}=t,a=n.state.value[e];let l;l=go(e,(function(){a||(n.state.value[e]=r?r():{});const t=Wt(n.state.value[e]);return mo(t,i,Object.keys(o||{}).reduce(((t,s)=>(t[s]=Tt(ei((()=>{so(n);const t=n._s.get(e);return o[s].call(t,t)}))),t)),{}))}),t,n,0,!0)}(s,r,e));return e._s.get(s)}return"string"==typeof e?(s=e,r=i?n:t):(r=e,s=e.id),o.$id=s,o}function yo(e){{e=$t(e);const t={};for(const n in e){const s=e[n];(Rt(s)||xt(s))&&(t[n]=Kt(e,n))}return t}}
/*!
* shared v9.13.1
* (c) 2024 kazuya kawaguchi
* Released under the MIT License.
*/const ko="undefined"!=typeof window,bo=(e,t=!1)=>t?Symbol.for(e):Symbol(e),wo=(e,t,n)=>_o({l:e,k:t,s:n}),_o=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),Eo=e=>"number"==typeof e&&isFinite(e),xo=e=>"[object Date]"===jo(e),So=e=>"[object RegExp]"===jo(e),Co=e=>Bo(e)&&0===Object.keys(e).length,Ao=Object.assign;let $o;const To=()=>$o||($o="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{});function Lo(e){return e.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}const Oo=Object.prototype.hasOwnProperty;function No(e,t){return Oo.call(e,t)}const Io=Array.isArray,Po=e=>"function"==typeof e,Ro=e=>"string"==typeof e,Mo=e=>"boolean"==typeof e,Do=e=>null!==e&&"object"==typeof e,Uo=e=>Do(e)&&Po(e.then)&&Po(e.catch),Fo=Object.prototype.toString,jo=e=>Fo.call(e),Bo=e=>{if(!Do(e))return!1;const t=Object.getPrototypeOf(e);return null===t||t.constructor===Object};function qo(e){let t=e;return()=>++t}function Wo(e,t){"undefined"!=typeof console&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const Ho=e=>!Do(e)||Io(e);function Vo(e,t){if(Ho(e)||Ho(t))throw new Error("Invalid value");const n=[{src:e,des:t}];for(;n.length;){const{src:e,des:t}=n.pop();Object.keys(e).forEach((s=>{Ho(e[s])||Ho(t[s])?t[s]=e[s]:n.push({src:e[s],des:t[s]})}))}}
/*!
* message-compiler v9.13.1
* (c) 2024 kazuya kawaguchi
* Released under the MIT License.
*/function Ko(e,t,n){return{start:e,end:t}}const zo=/\{([0-9a-zA-Z]+)\}/g;function Go(e,...t){return 1===t.length&&Xo(t[0])&&(t=t[0]),t&&t.hasOwnProperty||(t={}),e.replace(zo,((e,n)=>t.hasOwnProperty(n)?t[n]:""))}const Yo=Object.assign,Qo=e=>"string"==typeof e,Xo=e=>null!==e&&"object"==typeof e;function Jo(e,t=""){return e.reduce(((e,n,s)=>0===s?e+n:e+t+n),"")}const Zo={USE_MODULO_SYNTAX:1,__EXTEND_POINT__:2},ea={[Zo.USE_MODULO_SYNTAX]:"Use modulo before '{{0}}'."};const ta={EXPECTED_TOKEN:1,INVALID_TOKEN_IN_PLACEHOLDER:2,UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER:3,UNKNOWN_ESCAPE_SEQUENCE:4,INVALID_UNICODE_ESCAPE_SEQUENCE:5,UNBALANCED_CLOSING_BRACE:6,UNTERMINATED_CLOSING_BRACE:7,EMPTY_PLACEHOLDER:8,NOT_ALLOW_NEST_PLACEHOLDER:9,INVALID_LINKED_FORMAT:10,MUST_HAVE_MESSAGES_IN_PLURAL:11,UNEXPECTED_EMPTY_LINKED_MODIFIER:12,UNEXPECTED_EMPTY_LINKED_KEY:13,UNEXPECTED_LEXICAL_ANALYSIS:14,UNHANDLED_CODEGEN_NODE_TYPE:15,UNHANDLED_MINIFIER_NODE_TYPE:16,__EXTEND_POINT__:17},na={[ta.EXPECTED_TOKEN]:"Expected token: '{0}'",[ta.INVALID_TOKEN_IN_PLACEHOLDER]:"Invalid token in placeholder: '{0}'",[ta.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER]:"Unterminated single quote in placeholder",[ta.UNKNOWN_ESCAPE_SEQUENCE]:"Unknown escape sequence: \\{0}",[ta.INVALID_UNICODE_ESCAPE_SEQUENCE]:"Invalid unicode escape sequence: {0}",[ta.UNBALANCED_CLOSING_BRACE]:"Unbalanced closing brace",[ta.UNTERMINATED_CLOSING_BRACE]:"Unterminated closing brace",[ta.EMPTY_PLACEHOLDER]:"Empty placeholder",[ta.NOT_ALLOW_NEST_PLACEHOLDER]:"Not allowed nest placeholder",[ta.INVALID_LINKED_FORMAT]:"Invalid linked format",[ta.MUST_HAVE_MESSAGES_IN_PLURAL]:"Plural must have messages",[ta.UNEXPECTED_EMPTY_LINKED_MODIFIER]:"Unexpected empty linked modifier",[ta.UNEXPECTED_EMPTY_LINKED_KEY]:"Unexpected empty linked key",[ta.UNEXPECTED_LEXICAL_ANALYSIS]:"Unexpected lexical analysis in token: '{0}'",[ta.UNHANDLED_CODEGEN_NODE_TYPE]:"unhandled codegen node type: '{0}'",[ta.UNHANDLED_MINIFIER_NODE_TYPE]:"unhandled mimifier node type: '{0}'"};function sa(e,t,n={}){const{domain:s,messages:r,args:i}=n,o=Go((r||na)[e]||"",...i||[]),a=new SyntaxError(String(o));return a.code=e,t&&(a.location=t),a.domain=s,a}function ra(e){throw e}const ia=" ",oa="\r",aa="\n",la=String.fromCharCode(8232),ca=String.fromCharCode(8233);function ua(e){const t=e;let n=0,s=1,r=1,i=0;const o=e=>t[e]===oa&&t[e+1]===aa,a=e=>t[e]===ca,l=e=>t[e]===la,c=e=>o(e)||(e=>t[e]===aa)(e)||a(e)||l(e),u=e=>o(e)||a(e)||l(e)?aa:t[e];function d(){return i=0,c(n)&&(s++,r=0),o(n)&&n++,n++,r++,t[n]}return{index:()=>n,line:()=>s,column:()=>r,peekOffset:()=>i,charAt:u,currentChar:()=>u(n),currentPeek:()=>u(n+i),next:d,peek:function(){return o(n+i)&&i++,i++,t[n+i]},reset:function(){n=0,s=1,r=1,i=0},resetPeek:function(e=0){i=e},skipToPeek:function(){const e=n+i;for(;e!==n;)d();i=0}}}const da=void 0,pa="'",ha="tokenizer";function fa(e,t={}){const n=!1!==t.location,s=ua(e),r=()=>s.index(),i=()=>{return e=s.line(),t=s.column(),n=s.index(),{line:e,column:t,offset:n};var e,t,n},o=i(),a=r(),l={currentType:14,offset:a,startLoc:o,endLoc:o,lastType:14,lastOffset:a,lastStartLoc:o,lastEndLoc:o,braceNest:0,inLinked:!1,text:""},c=()=>l,{onError:u}=t;function d(e,t,s,...r){const i=c();if(t.column+=s,t.offset+=s,u){const s=sa(e,n?Ko(i.startLoc,t):null,{domain:ha,args:r});u(s)}}function p(e,t,s){e.endLoc=i(),e.currentType=t;const r={type:t};return n&&(r.loc=Ko(e.startLoc,e.endLoc)),null!=s&&(r.value=s),r}const h=e=>p(e,14);function f(e,t){return e.currentChar()===t?(e.next(),t):(d(ta.EXPECTED_TOKEN,i(),0,t),"")}function m(e){let t="";for(;e.currentPeek()===ia||e.currentPeek()===aa;)t+=e.currentPeek(),e.peek();return t}function g(e){const t=m(e);return e.skipToPeek(),t}function v(e){if(e===da)return!1;const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||95===t}function y(e,t){const{currentType:n}=t;if(2!==n)return!1;m(e);const s=function(e){if(e===da)return!1;const t=e.charCodeAt(0);return t>=48&&t<=57}("-"===e.currentPeek()?e.peek():e.currentPeek());return e.resetPeek(),s}function k(e){m(e);const t="|"===e.currentPeek();return e.resetPeek(),t}function b(e,t=!0){const n=(t=!1,s="",r=!1)=>{const i=e.currentPeek();return"{"===i?"%"!==s&&t:"@"!==i&&i?"%"===i?(e.peek(),n(t,"%",!0)):"|"===i?!("%"!==s&&!r)||!(s===ia||s===aa):i===ia?(e.peek(),n(!0,ia,r)):i!==aa||(e.peek(),n(!0,aa,r)):"%"===s||t},s=n();return t&&e.resetPeek(),s}function w(e,t){const n=e.currentChar();return n===da?da:t(n)?(e.next(),n):null}function _(e){const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||95===t||36===t}function E(e){return w(e,_)}function x(e){const t=e.charCodeAt(0);return t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||95===t||36===t||45===t}function S(e){return w(e,x)}function C(e){const t=e.charCodeAt(0);return t>=48&&t<=57}function A(e){return w(e,C)}function $(e){const t=e.charCodeAt(0);return t>=48&&t<=57||t>=65&&t<=70||t>=97&&t<=102}function T(e){return w(e,$)}function L(e){let t="",n="";for(;t=A(e);)n+=t;return n}function O(e)Line truncated
/*!
* core-base v9.13.1
* (c) 2024 kazuya kawaguchi
* Released under the MIT License.
*/const La=[];La[0]={w:[0],i:[3,0],"[":[4],o:[7]},La[1]={w:[1],".":[2],"[":[4],o:[7]},La[2]={w:[2],i:[3,0],0:[3,0]},La[3]={i:[3,0],0:[3,0],w:[1,1],".":[2,1],"[":[4,1],o:[7,1]},La[4]={"'":[5,0],'"':[6,0],"[":[4,2],"]":[1,3],o:8,l:[4,0]},La[5]={"'":[4,0],o:8,l:[5,0]},La[6]={'"':[4,0],o:8,l:[6,0]};const Oa=/^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;function Na(e){if(null==e)return"o";switch(e.charCodeAt(0)){case 91:case 93:case 46:case 34:case 39:return e;case 95:case 36:case 45:return"i";case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"w"}return"i"}function Ia(e){const t=e.trim();return("0"!==e.charAt(0)||!isNaN(parseInt(e)))&&(n=t,Oa.test(n)?function(e){const t=e.charCodeAt(0);return t!==e.charCodeAt(e.length-1)||34!==t&&39!==t?e:e.slice(1,-1)}(t):"*"+t);var n}const Pa=new Map;function Ra(e,t){return Do(e)?e[t]:null}const Ma=e=>e,Da=e=>"",Ua="text",Fa=e=>0===e.length?"":function(e,t=""){return e.reduce(((e,n,s)=>0===s?e+n:e+t+n),"")}(e),ja=e=>null==e?"":Io(e)||Bo(e)&&e.toString===Fo?JSON.stringify(e,null,2):String(e);function Ba(e,t){return e=Math.abs(e),2===t?e?e>1?1:0:1:e?Math.min(e,2):0}function qa(e={}){const t=e.locale,n=function(e){const t=Eo(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(Eo(e.named.count)||Eo(e.named.n))?Eo(e.named.count)?e.named.count:Eo(e.named.n)?e.named.n:t:t}(e),s=Do(e.pluralRules)&&Ro(t)&&Po(e.pluralRules[t])?e.pluralRules[t]:Ba,r=Do(e.pluralRules)&&Ro(t)&&Po(e.pluralRules[t])?Ba:void 0,i=e.list||[],o=e.named||{};Eo(e.pluralIndex)&&function(e,t){t.count||(t.count=e),t.n||(t.n=e)}(n,o);function a(t){const n=Po(e.messages)?e.messages(t):!!Do(e.messages)&&e.messages[t];return n||(e.parent?e.parent.message(t):Da)}const l=Bo(e.processor)&&Po(e.processor.normalize)?e.processor.normalize:Fa,c=Bo(e.processor)&&Po(e.processor.interpolate)?e.processor.interpolate:ja,u={list:e=>i[e],named:e=>o[e],plural:e=>e[s(n,e.length,r)],linked:(t,...n)=>{const[s,r]=n;let i="text",o="";1===n.length?Do(s)?(o=s.modifier||o,i=s.type||i):Ro(s)&&(o=s||o):2===n.length&&(Ro(s)&&(o=s||o),Ro(r)&&(i=r||i));const l=a(t)(u),c="vnode"===i&&Io(l)&&o?l[0]:l;return o?(d=o,e.modifiers?e.modifiers[d]:Ma)(c,i):c;var d},message:a,type:Bo(e.processor)&&Ro(e.processor.type)?e.processor.type:Ua,interpolate:c,normalize:l,values:Ao({},i,o)};return u}let Wa=null;const Ha=Va("function:translate");function Va(e){return t=>Wa&&Wa.emit(e,t)}const Ka=Zo.__EXTEND_POINT__,za=qo(Ka),Ga={NOT_FOUND_KEY:Ka,FALLBACK_TO_TRANSLATE:za(),CANNOT_FORMAT_NUMBER:za(),FALLBACK_TO_NUMBER_FORMAT:za(),CANNOT_FORMAT_DATE:za(),FALLBACK_TO_DATE_FORMAT:za(),EXPERIMENTAL_CUSTOM_MESSAGE_COMPILER:za(),__EXTEND_POINT__:za()},Ya=ta.__EXTEND_POINT__,Qa=qo(Ya),Xa={INVALID_ARGUMENT:Ya,INVALID_DATE_ARGUMENT:Qa(),INVALID_ISO_DATE_ARGUMENT:Qa(),NOT_SUPPORT_NON_STRING_MESSAGE:Qa(),NOT_SUPPORT_LOCALE_PROMISE_VALUE:Qa(),NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:Qa(),NOT_SUPPORT_LOCALE_TYPE:Qa(),__EXTEND_POINT__:Qa()};function Ja(e){return sa(e,null,void 0)}function Za(e,t){return null!=t.locale?tl(t.locale):tl(e.locale)}let el;function tl(e){if(Ro(e))return e;if(Po(e)){if(e.resolvedOnce&&null!=el)return el;if("Function"===e.constructor.name){const t=e();if(Uo(t))throw Ja(Xa.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return el=t}throw Ja(Xa.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}throw Ja(Xa.NOT_SUPPORT_LOCALE_TYPE)}function nl(e,t,n){return[...new Set([n,...Io(t)?t:Do(t)?Object.keys(t):Ro(t)?[t]:[n]])]}function sl(e,t,n){const s=Ro(n)?n:cl,r=e;r.__localeChainCache||(r.__localeChainCache=new Map);let i=r.__localeChainCache.get(s);if(!i){i=[];let e=[n];for(;Io(e);)e=rl(i,e,t);const o=Io(t)||!Bo(t)?t:t.default?t.default:null;e=Ro(o)?[o]:o,Io(e)&&rl(i,e,!1),r.__localeChainCache.set(s,i)}return i}function rl(e,t,n){let s=!0;for(let r=0;r<t.length&&Mo(s);r++){const i=t[r];Ro(i)&&(s=il(e,t[r],n))}return s}function il(e,t,n){let s;const r=t.split("-");do{s=ol(e,r.join("-"),n),r.splice(-1,1)}while(r.length&&!0===s);return s}function ol(e,t,n){let s=!1;if(!e.includes(t)&&(s=!0,t)){s="!"!==t[t.length-1];const r=t.replace(/!/g,"");e.push(r),(Io(n)||Bo(n))&&n[r]&&(s=n[r])}return s}const al="9.13.1",ll=-1,cl="en-US",ul="",dl=e=>`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;let pl,hl,fl;function ml(e){pl=e}let gl=null;const vl=()=>gl;let yl=null;const kl=e=>{yl=e},bl=()=>yl;let wl=0;function _l(e={}){const t=Po(e.onWarn)?e.onWarn:Wo,n=Ro(e.version)?e.version:al,s=Ro(e.locale)||Po(e.locale)?e.locale:cl,r=Po(s)?cl:s,i=Io(e.fallbackLocale)||Bo(e.fallbackLocale)||Ro(e.fallbackLocale)||!1===e.fallbackLocale?e.fallbackLocale:r,o=Bo(e.messages)?e.messages:{[r]:{}},a=Bo(e.datetimeFormats)?e.datetimeFormats:{[r]:{}},l=Bo(e.numberFormats)?e.numberFormats:{[r]:{}},c=Ao({},e.modifiers||{},{upper:(e,t)=>"text"===t&&Ro(e)?e.toUpperCase():"vnode"===t&&Do(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>"text"===t&&Ro(e)?e.toLowerCase():"vnode"===t&&Do(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>"text"===t&&Ro(e)?dl(e):"vnode"===t&&Do(e)&&"__v_isVNLine truncated
/*!
* vue-i18n v9.13.1
* (c) 2024 kazuya kawaguchi
* Released under the MIT License.
*/
const Gl="9.13.1";const Yl=Ga.__EXTEND_POINT__,Ql=qo(Yl);Ql(),Ql(),Ql(),Ql(),Ql(),Ql(),Ql(),Ql(),Ql();const Xl=Xa.__EXTEND_POINT__,Jl=qo(Xl),Zl={UNEXPECTED_RETURN_TYPE:Xl,INVALID_ARGUMENT:Jl(),MUST_BE_CALL_SETUP_TOP:Jl(),NOT_INSTALLED:Jl(),NOT_AVAILABLE_IN_LEGACY_MODE:Jl(),REQUIRED_VALUE:Jl(),INVALID_VALUE:Jl(),CANNOT_SETUP_VUE_DEVTOOLS_PLUGIN:Jl(),NOT_INSTALLED_WITH_PROVIDE:Jl(),UNEXPECTED_ERROR:Jl(),NOT_COMPATIBLE_LEGACY_VUE_I18N:Jl(),BRIDGE_SUPPORT_VUE_2_ONLY:Jl(),MUST_DEFINE_I18N_OPTION_IN_ALLOW_COMPOSITION:Jl(),NOT_AVAILABLE_COMPOSITION_IN_LEGACY:Jl(),__EXTEND_POINT__:Jl()};function ec(e,...t){return sa(e,null,void 0)}const tc=bo("__translateVNode"),nc=bo("__datetimeParts"),sc=bo("__numberParts"),rc=bo("__setPluralRules"),ic=bo("__injectWithOption"),oc=bo("__dispose");function ac(e){if(!Do(e))return e;for(const t in e)if(No(e,t))if(t.includes(".")){const n=t.split("."),s=n.length-1;let r=e,i=!1;for(let e=0;e<s;e++){if(n[e]in r||(r[n[e]]={}),!Do(r[n[e]])){i=!0;break}r=r[n[e]]}i||(r[n[s]]=e[t],delete e[t]),Do(r[n[s]])&&ac(r[n[s]])}else Do(e[t])&&ac(e[t]);return e}function lc(e,t){const{messages:n,__i18n:s,messageResolver:r,flatJson:i}=t,o=Bo(n)?n:Io(s)?{}:{[e]:{}};if(Io(s)&&s.forEach((e=>{if("locale"in e&&"resource"in e){const{locale:t,resource:n}=e;t?(o[t]=o[t]||{},Vo(n,o[t])):Vo(n,o)}else Ro(e)&&Vo(JSON.parse(e),o)})),null==r&&i)for(const a in o)No(o,a)&&ac(o[a]);return o}function cc(e){return e.type}function uc(e,t,n){let s=Do(t.messages)?t.messages:{};"__i18nGlobal"in n&&(s=lc(e.locale.value,{messages:s,__i18n:n.__i18nGlobal}));const r=Object.keys(s);if(r.length&&r.forEach((t=>{e.mergeLocaleMessage(t,s[t])})),Do(t.datetimeFormats)){const n=Object.keys(t.datetimeFormats);n.length&&n.forEach((n=>{e.mergeDateTimeFormat(n,t.datetimeFormats[n])}))}if(Do(t.numberFormats)){const n=Object.keys(t.numberFormats);n.length&&n.forEach((n=>{e.mergeNumberFormat(n,t.numberFormats[n])}))}}function dc(e){return Lr(fr,null,e,0)}const pc=()=>[],hc=()=>!1;let fc=0;function mc(e){return(t,n,s,r)=>e(n,s,Br()||void 0,r)}function gc(e={},t){const{__root:n,__injectWithOption:s}=e,r=void 0===n,i=e.flatJson,o=ko?Mt:Dt,a=!!e.translateExistCompatible;let l=!Mo(e.inheritLocale)||e.inheritLocale;const c=o(n&&l?n.locale.value:Ro(e.locale)?e.locale:cl),u=o(n&&l?n.fallbackLocale.value:Ro(e.fallbackLocale)||Io(e.fallbackLocale)||Bo(e.fallbackLocale)||!1===e.fallbackLocale?e.fallbackLocale:c.value),d=o(lc(c.value,e)),p=o(Bo(e.datetimeFormats)?e.datetimeFormats:{[c.value]:{}}),h=o(Bo(e.numberFormats)?e.numberFormats:{[c.value]:{}});let f=n?n.missingWarn:!Mo(e.missingWarn)&&!So(e.missingWarn)||e.missingWarn,m=n?n.fallbackWarn:!Mo(e.fallbackWarn)&&!So(e.fallbackWarn)||e.fallbackWarn,g=n?n.fallbackRoot:!Mo(e.fallbackRoot)||e.fallbackRoot,v=!!e.fallbackFormat,y=Po(e.missing)?e.missing:null,k=Po(e.missing)?mc(e.missing):null,b=Po(e.postTranslation)?e.postTranslation:null,w=n?n.warnHtmlMessage:!Mo(e.warnHtmlMessage)||e.warnHtmlMessage,_=!!e.escapeParameter;const E=n?n.modifiers:Bo(e.modifiers)?e.modifiers:{};let x,S=e.pluralRules||n&&n.pluralRules;x=(()=>{r&&kl(null);const t={version:Gl,locale:c.value,fallbackLocale:u.value,messages:d.value,modifiers:E,pluralRules:S,missing:null===k?void 0:k,missingWarn:f,fallbackWarn:m,fallbackFormat:v,unresolving:!0,postTranslation:null===b?void 0:b,warnHtmlMessage:w,escapeParameter:_,messageResolver:e.messageResolver,messageCompiler:e.messageCompiler,__meta:{framework:"vue"}};t.datetimeFormats=p.value,t.numberFormats=h.value,t.__datetimeFormatters=Bo(x)?x.__datetimeFormatters:void 0,t.__numberFormatters=Bo(x)?x.__numberFormatters:void 0;const n=_l(t);return r&&kl(n),n})(),xl(x,c.value,u.value);const C=ei({get:()=>c.value,set:e=>{c.value=e,x.locale=c.value}}),A=ei({get:()=>u.value,set:e=>{u.value=e,x.fallbackLocale=u.value,xl(x,c.value,e)}}),$=ei((()=>d.value)),T=ei((()=>p.value)),L=ei((()=>h.value));const O=(e,t,s,i,o,a)=>{let l;c.value,u.value,d.value,p.value,h.value;try{__INTLIFY_PROD_DEVTOOLS__,r||(x.fallbackContext=n?bl():void 0),l=e(x)}finally{__INTLIFY_PROD_DEVTOOLS__,r||(x.fallbackContext=void 0)}if("translate exists"!==s&&Eo(l)&&l===ll||"translate exists"===s&&!l){const[e,s]=t();return n&&g?i(n):o(e)}if(a(l))return l;throw ec(Zl.UNEXPECTED_RETURN_TYPE)};function N(...e){return O((t=>Reflect.apply(Ml,null,[t,...e])),(()=>Fl(...e)),"translate",(t=>Reflect.apply(t.t,t,[...e])),(e=>e),(e=>Ro(e)))}const I={normalize:function(e){return e.map((e=>Ro(e)||Eo(e)||Mo(e)?dc(String(e)):e))},interpolate:e=>e,type:"vnode"};function P(e){return d.value[e]||{}}fc++,n&&ko&&(Pn(n.locale,(e=>{l&&(c.value=e,x.locale=e,xl(x,c.value,u.value))})),Pn(n.fallbackLocale,(e=>{l&&(u.value=e,x.fallbackLocale=e,xl(x,c.value,u.value))})));const R={id:fc,locale:C,fallbackLocale:A,get inheritLocale(){return l},set inheritLocale(e){l=e,e&&n&&(c.value=n.locale.value,u.value=n.fallbackLocale.value,xl(x,c.value,u.value))},get availableLocales(){return Object.keys(d.value).sort()},messages:$,get modifiers(){return E},get pluralRules(){reLine truncated
/**
* @title Artalk API
* @version 2.0
* @license MIT (https://github.com/ArtalkJS/Artalk/blob/master/LICENSE)
* @baseUrl /api/v2
* @contact API Support <artalkjs@gmail.com> (https://artalk.js.org)
*
* Artalk is a modern comment system based on Golang.
*/let Xc=class extends Qc{constructor(){super(...arguments),Kc(this,"auth",{loginByEmail:(e,t={})=>this.request(Hc({path:"/auth/email/login",method:"POST",body:e,type:"application/json",format:"json"},t)),registerByEmail:(e,t={})=>this.request(Hc({path:"/auth/email/register",method:"POST",body:e,type:"application/json",format:"json"},t)),sendVerifyEmail:(e,t={})=>this.request(Hc({path:"/auth/email/send",method:"POST",body:e,type:"application/json",format:"json"},t)),checkDataMerge:(e={})=>this.request(Hc({path:"/auth/merge",method:"GET",secure:!0,format:"json"},e)),applyDataMerge:(e,t={})=>this.request(Hc({path:"/auth/merge",method:"POST",body:e,secure:!0,type:"application/json",format:"json"},t))}),Kc(this,"cache",{flushCache:(e={})=>this.request(Hc({path:"/cache/flush",method:"POST",secure:!0,format:"json"},e)),warmUpCache:(e={})=>this.request(Hc({path:"/cache/warm_up",method:"POST",secure:!0,format:"json"},e))}),Kc(this,"captcha",{getCaptcha:(e={})=>this.request(Hc({path:"/captcha",method:"GET",format:"json"},e)),getCaptchaStatus:(e={})=>this.request(Hc({path:"/captcha/status",method:"GET",format:"json"},e)),verifyCaptcha:(e,t={})=>this.request(Hc({path:"/captcha/verify",method:"POST",body:e,type:"application/json",format:"json"},t))}),Kc(this,"comments",{getComments:(e,t={})=>this.request(Hc({path:"/comments",method:"GET",query:e,secure:!0,type:"application/json",format:"json"},t)),createComment:(e,t={})=>this.request(Hc({path:"/comments",method:"POST",body:e,secure:!0,type:"application/json",format:"json"},t)),getComment:(e,t={})=>this.request(Hc({path:`/comments/${e}`,method:"GET",type:"application/json",format:"json"},t)),updateComment:(e,t,n={})=>this.request(Hc({path:`/comments/${e}`,method:"PUT",body:t,secure:!0,type:"application/json",format:"json"},n)),deleteComment:(e,t={})=>this.request(Hc({path:`/comments/${e}`,method:"DELETE",secure:!0,format:"json"},t))}),Kc(this,"conf",{conf:(e={})=>this.request(Hc({path:"/conf",method:"GET",format:"json"},e)),getSocialLoginProviders:(e={})=>this.request(Hc({path:"/conf/auth/providers",method:"GET",format:"json"},e)),getDomain:(e,t={})=>this.request(Hc({path:"/conf/domain",method:"GET",query:e,format:"json"},t))}),Kc(this,"notifies",{getNotifies:(e,t={})=>this.request(Hc({path:"/notifies",method:"GET",query:e,type:"application/json",format:"json"},t)),markAllNotifyRead:(e,t={})=>this.request(Hc({path:"/notifies/read",method:"POST",body:e,type:"application/json",format:"json"},t)),markNotifyRead:(e,t,n={})=>this.request(Hc({path:`/notifies/${e}/${t}`,method:"POST",format:"json"},n))}),Kc(this,"pages",{getPages:(e,t={})=>this.request(Hc({path:"/pages",method:"GET",query:e,secure:!0,type:"application/json",format:"json"},t)),fetchAllPages:(e,t={})=>this.request(Hc({path:"/pages/fetch",method:"POST",body:e,secure:!0,type:"application/json",format:"json"},t)),getPageFetchStatus:(e={})=>this.request(Hc({path:"/pages/fetch/status",method:"GET",secure:!0,format:"json"},e)),logPv:(e,t={})=>this.request(Hc({path:"/pages/pv",method:"POST",body:e,type:"application/json",format:"json"},t)),updatePage:(e,t,n={})=>this.request(Hc({path:`/pages/${e}`,method:"PUT",body:t,secure:!0,type:"application/json",format:"json"},n)),deletePage:(e,t={})=>this.request(Hc({path:`/pages/${e}`,method:"DELETE",secure:!0,format:"json"},t)),fetchPage:(e,t={})=>this.request(Hc({path:`/pages/${e}/fetch`,method:"POST",secure:!0,type:"application/json",format:"json"},t))}),Kc(this,"sendEmail",{sendEmail:(e,t={})=>this.request(Hc({path:"/send_email",method:"POST",body:e,secure:!0,type:"application/json",format:"json"},t))}),Kc(this,"settings",{getSettings:(e={})=>this.request(Hc({path:"/settings",method:"GET",secure:!0,format:"json"},e)),applySettings:(e,t={})=>this.request(Hc({path:"/settings",method:"PUT",body:e,secure:!0,type:"application/json",format:"json"},t)),getSettingsTemplate:(e,t={})=>this.request(Hc({path:`/settings/template/${e}`,method:"GET",secure:!0,format:"json"},t))}),Kc(this,"sites",{getSites:(e={})=>this.request(Hc({path:"/sites",method:"GET",secure:!0,format:"json"},e)),createSite:(e,t={})=>this.request(Hc({path:"/sites",method:"POST",body:e,secure:!0,type:"application/json",format:"json"},t)),updateSite:(e,t,n={})=>this.request(Hc({path:`/sites/${e}`,method:"PUT",body:t,secure:!0,type:"application/json",format:"json"},n)),deleteSite:(e,t={})=>this.request(Hc({path:`/sites/${e}`,method:"DELETE",secure:!0,format:"json"},t))}),Kc(this,"stats",{getStats:(e,t,n={})=>this.request(Hc({path:`/stats/${e}`,method:"GET",query:t,type:"application/json",format:"json"},n))}),Kc(this,"transfer",{exportArtrans:(e={})=>this.request(Hc({path:"/transfer/export",method:"GET",secure:!0,format:"json"},e)),importArtrans:(e,t={})=>this.request(Hc({path:"/transfer/import",method:"POST",body:e,secure:!0,type:"application/json"},t)),uploadArtrans:(e,t={})=>this.request(Hc({path:"/transfer/upload",method:"POST",body:e,secure:!0,type:"multipart/form-data",format:"json"},t))}),Kc(this,"upload",{uploadLine truncated
@@ -0,0 +1 @@
@charset "UTF-8";.atk-slim-scrollbar[data-v-ae18da71]::-webkit-scrollbar{width:4px;height:4px;background:transparent}.atk-slim-scrollbar[data-v-ae18da71]::-webkit-scrollbar-thumb,.atk-slim-scrollbar[data-v-ae18da71]::-webkit-scrollbar-thumb:window-inactive{background:#5656564d}.atk-slim-scrollbar[data-v-ae18da71]::-webkit-scrollbar-thumb:vertical:hover{background:#414a52c4}.atk-slim-scrollbar[data-v-ae18da71]::-webkit-scrollbar-thumb:vertical:active{background:#292f35c4}.atk-list-text-actions[data-v-ae18da71]{display:flex;flex-direction:column;flex:auto;padding:10px 35px 0;flex-wrap:wrap;align-content:flex-start}.atk-list-text-actions .atk-item[data-v-ae18da71]{position:relative;font-size:17px;display:inline-flex;margin-right:15px;margin-bottom:6px;cursor:pointer;user-select:none}.atk-list-text-actions .atk-item.atk-green[data-v-ae18da71]:after{position:absolute;content:" ";height:5px;width:100%;left:0;bottom:5px;background:#32c78663}.atk-list-text-actions .atk-item.atk-yellow[data-v-ae18da71]:after{position:absolute;content:" ";height:5px;width:100%;left:0;bottom:5px;background:#ffcb0063}.atk-list-btn-actions[data-v-ae18da71]{display:flex;flex-direction:row;align-items:center;padding:0 20px}.atk-list-btn-actions .atk-item[data-v-ae18da71]{cursor:pointer;user-select:none;display:flex;width:35px;height:35px;border-radius:2px;align-items:center;justify-content:center}.atk-list-btn-actions .atk-item[data-v-ae18da71]:hover{background:var(--at-color-bg-grey)}.atk-list-btn-actions .atk-item[data-v-ae18da71]:not(:last-child){margin-right:15px}.atk-list-btn-actions .atk-item.atk-item-close[data-v-ae18da71]{margin-left:10px}.atk-list-btn-actions .atk-icon[data-v-ae18da71]:after{background-color:var(--at-color-meta)}.atk-list-btn-actions .atk-icon-yes[data-v-ae18da71]:after{background-color:var(--at-color-main)}.comments-wrap[data-v-ae18da71]{overflow-y:auto;height:100%}.comments-wrap[data-v-ae18da71] .atk-comment-wrap{border-bottom:1px solid var(--at-color-border)}.atk-slim-scrollbar[data-v-bcddeb94]::-webkit-scrollbar{width:4px;height:4px;background:transparent}.atk-slim-scrollbar[data-v-bcddeb94]::-webkit-scrollbar-thumb,.atk-slim-scrollbar[data-v-bcddeb94]::-webkit-scrollbar-thumb:window-inactive{background:#5656564d}.atk-slim-scrollbar[data-v-bcddeb94]::-webkit-scrollbar-thumb:vertical:hover{background:#414a52c4}.atk-slim-scrollbar[data-v-bcddeb94]::-webkit-scrollbar-thumb:vertical:active{background:#292f35c4}.atk-list-text-actions[data-v-bcddeb94]{display:flex;flex-direction:column;flex:auto;padding:10px 35px 0;flex-wrap:wrap;align-content:flex-start}.atk-list-text-actions .atk-item[data-v-bcddeb94]{position:relative;font-size:17px;display:inline-flex;margin-right:15px;margin-bottom:6px;cursor:pointer;user-select:none}.atk-list-text-actions .atk-item.atk-green[data-v-bcddeb94]:after{position:absolute;content:" ";height:5px;width:100%;left:0;bottom:5px;background:#32c78663}.atk-list-text-actions .atk-item.atk-yellow[data-v-bcddeb94]:after{position:absolute;content:" ";height:5px;width:100%;left:0;bottom:5px;background:#ffcb0063}.atk-list-btn-actions[data-v-bcddeb94]{display:flex;flex-direction:row;align-items:center;padding:0 20px}.atk-list-btn-actions .atk-item[data-v-bcddeb94]{cursor:pointer;user-select:none;display:flex;width:35px;height:35px;border-radius:2px;align-items:center;justify-content:center}.atk-list-btn-actions .atk-item[data-v-bcddeb94]:hover{background:var(--at-color-bg-grey)}.atk-list-btn-actions .atk-item[data-v-bcddeb94]:not(:last-child){margin-right:15px}.atk-list-btn-actions .atk-item.atk-item-close[data-v-bcddeb94]{margin-left:10px}.atk-list-btn-actions .atk-icon[data-v-bcddeb94]:after{background-color:var(--at-color-meta)}.atk-list-btn-actions .atk-icon-yes[data-v-bcddeb94]:after{background-color:var(--at-color-main)}.login-dialog[data-v-bcddeb94]{position:fixed;display:flex;flex-direction:column;place-items:center;justify-content:center;top:0;left:0;background:var(--at-color-bg);width:100%;height:100%}.login-dialog .logo[data-v-bcddeb94]{user-select:none;display:inline-block;width:50px;height:50px;margin-bottom:50px;margin-top:-50px;border-radius:2px}.login-dialog .copyright[data-v-bcddeb94]{font-size:13px;color:var(--at-color-meta);position:fixed;height:30px;bottom:0;width:100%;text-align:center}.login-form[data-v-bcddeb94]{display:flex;flex-direction:column;width:280px}.login-form input[data-v-bcddeb94]{display:block;border:0;background:transparent;border-bottom:1px solid var(--at-color-border);padding:0 20px;line-height:40px;margin-bottom:10px}.login-form input[data-v-bcddeb94]:focus{outline:none}.login-form button[data-v-bcddeb94]{color:#fff;background:#6e8392;border-radius:2px;cursor:pointer;border:0;line-height:35px;padding:0 20px;margin-top:20px;display:block}.login-form button[data-v-bcddeb94]:hover{opacity:.95}.login-form .err-msg[data-v-bcddeb94]{display:flex;flex-direction:row;align-items:center;margin:5px 10px 0;padding:0 10px;color:var(--at-color-red)}.login-form .err-msg[dLine truncated
+14
View File
@@ -0,0 +1,14 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="referrer" content="strict-origin" />
<title>Artalk Sidebar</title>
<script type="module" crossorigin src="./assets/index-DWDx-G2X.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-DZ-EIihu.css">
</head>
<body>
<div id="app"></div>
</body>
</html>
+2
View File
@@ -0,0 +1,2 @@
User-agent: *
Disallow: /