diff --git a/embed_static/static/spa/assets/AdminCommentsPage-8EpDyC2e.js b/embed_static/static/spa/assets/AdminCommentsPage-CGuslsQh.js similarity index 93% rename from embed_static/static/spa/assets/AdminCommentsPage-8EpDyC2e.js rename to embed_static/static/spa/assets/AdminCommentsPage-CGuslsQh.js index 659df6c..425e17c 100644 --- a/embed_static/static/spa/assets/AdminCommentsPage-8EpDyC2e.js +++ b/embed_static/static/spa/assets/AdminCommentsPage-CGuslsQh.js @@ -1 +1 @@ -import{e as A,r as i,j as e}from"./react-vendor-1fwFMt02.js";import{i as D,S as C,B as d,a as m,n as c}from"./index-kfMSnNdB.js";import{B as N}from"./badge-C0Go598m.js";import{A as y,a as b,b as k,c as S,d as _,e as z,f as B,g as E,h as P}from"./alert-dialog-_wPjKojj.js";import"./ui-vendor-Gb6mai95.js";function G(){const j=A(),{ready:r}=D(),[o,g]=i.useState([]),[p,h]=i.useState(!0),[a,u]=i.useState(1),[l,f]=i.useState(1),n=(s=a)=>{h(!0),m.adminComments(s).then(t=>{g(t.comments??[]),u(t.page),f(t.total_pages)}).catch(t=>c.error(t.message)).finally(()=>h(!1))};i.useEffect(()=>{r&&n(1)},[r]);const v=async s=>{try{await m.adminDeleteComment(s),c.success("评论已删除"),n()}catch(t){c.error(t instanceof Error?t.message:"删除失败")}};return r?e.jsxs("div",{className:"admin-page",children:[e.jsxs("div",{className:"admin-page-head",children:[e.jsx("h1",{children:"评论管理"}),e.jsx("p",{children:"查看与删除楼层评论"})]}),e.jsx("div",{className:"admin-card",children:p?e.jsx("div",{className:"flex justify-center py-12",children:e.jsx(C,{size:"lg"})}):e.jsxs(e.Fragment,{children:[e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"ID"}),e.jsx("th",{children:"楼层"}),e.jsx("th",{children:"帖子"}),e.jsx("th",{children:"作者"}),e.jsx("th",{children:"内容"}),e.jsx("th",{children:"私密"}),e.jsx("th",{children:"时间"}),e.jsx("th",{children:"操作"})]})}),e.jsx("tbody",{children:o.map(s=>{var t,x;return e.jsxs("tr",{children:[e.jsx("td",{children:s.id}),e.jsxs("td",{children:["#",s.floor]}),e.jsx("td",{children:e.jsx("button",{type:"button",className:"admin-text-link",onClick:()=>j(`/post/${s.post_id}`),children:((t=s.post)==null?void 0:t.title)??`#${s.post_id}`})}),e.jsx("td",{children:((x=s.user)==null?void 0:x.nickname)||s.guest_nick||"游客"}),e.jsx("td",{className:"max-w-[200px] truncate",children:s.content}),e.jsx("td",{children:s.is_private?e.jsx(N,{variant:"secondary",children:"是"}):"—"}),e.jsx("td",{children:new Date(s.created_at).toLocaleString("zh-CN")}),e.jsx("td",{children:e.jsxs(y,{children:[e.jsx(b,{asChild:!0,children:e.jsx(d,{size:"sm",variant:"ghost",className:"text-destructive",children:"删除"})}),e.jsxs(k,{children:[e.jsxs(S,{children:[e.jsx(_,{children:"确定删除该评论?"}),e.jsx(z,{children:"此操作不可恢复。"})]}),e.jsxs(B,{children:[e.jsx(E,{children:"取消"}),e.jsx(P,{onClick:()=>v(s.id),children:"删除"})]})]})]})})]},s.id)})})]}),o.length===0&&e.jsx("div",{className:"admin-empty",children:"暂无评论"}),l>1&&e.jsxs("div",{className:"admin-pagination",children:[e.jsx(d,{size:"sm",variant:"outline",disabled:a<=1,onClick:()=>n(a-1),children:"上一页"}),e.jsxs("span",{children:["第 ",a," / ",l," 页"]}),e.jsx(d,{size:"sm",variant:"outline",disabled:a>=l,onClick:()=>n(a+1),children:"下一页"})]})]})})]}):null}export{G as default}; +import{e as A,r as i,j as e}from"./react-vendor-1fwFMt02.js";import{i as D,S as C,B as d,a as m,n as c}from"./index-BCHo3nLu.js";import{B as N}from"./badge-C7JnHIoR.js";import{A as y,a as b,b as k,c as S,d as _,e as z,f as B,g as E,h as P}from"./alert-dialog-C_2cPHgh.js";import"./ui-vendor-Gb6mai95.js";function G(){const j=A(),{ready:r}=D(),[o,g]=i.useState([]),[p,h]=i.useState(!0),[a,u]=i.useState(1),[l,f]=i.useState(1),n=(s=a)=>{h(!0),m.adminComments(s).then(t=>{g(t.comments??[]),u(t.page),f(t.total_pages)}).catch(t=>c.error(t.message)).finally(()=>h(!1))};i.useEffect(()=>{r&&n(1)},[r]);const v=async s=>{try{await m.adminDeleteComment(s),c.success("评论已删除"),n()}catch(t){c.error(t instanceof Error?t.message:"删除失败")}};return r?e.jsxs("div",{className:"admin-page",children:[e.jsxs("div",{className:"admin-page-head",children:[e.jsx("h1",{children:"评论管理"}),e.jsx("p",{children:"查看与删除楼层评论"})]}),e.jsx("div",{className:"admin-card",children:p?e.jsx("div",{className:"flex justify-center py-12",children:e.jsx(C,{size:"lg"})}):e.jsxs(e.Fragment,{children:[e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"ID"}),e.jsx("th",{children:"楼层"}),e.jsx("th",{children:"帖子"}),e.jsx("th",{children:"作者"}),e.jsx("th",{children:"内容"}),e.jsx("th",{children:"私密"}),e.jsx("th",{children:"时间"}),e.jsx("th",{children:"操作"})]})}),e.jsx("tbody",{children:o.map(s=>{var t,x;return e.jsxs("tr",{children:[e.jsx("td",{children:s.id}),e.jsxs("td",{children:["#",s.floor]}),e.jsx("td",{children:e.jsx("button",{type:"button",className:"admin-text-link",onClick:()=>j(`/post/${s.post_id}`),children:((t=s.post)==null?void 0:t.title)??`#${s.post_id}`})}),e.jsx("td",{children:((x=s.user)==null?void 0:x.nickname)||s.guest_nick||"游客"}),e.jsx("td",{className:"max-w-[200px] truncate",children:s.content}),e.jsx("td",{children:s.is_private?e.jsx(N,{variant:"secondary",children:"是"}):"—"}),e.jsx("td",{children:new Date(s.created_at).toLocaleString("zh-CN")}),e.jsx("td",{children:e.jsxs(y,{children:[e.jsx(b,{asChild:!0,children:e.jsx(d,{size:"sm",variant:"ghost",className:"text-destructive",children:"删除"})}),e.jsxs(k,{children:[e.jsxs(S,{children:[e.jsx(_,{children:"确定删除该评论?"}),e.jsx(z,{children:"此操作不可恢复。"})]}),e.jsxs(B,{children:[e.jsx(E,{children:"取消"}),e.jsx(P,{onClick:()=>v(s.id),children:"删除"})]})]})]})})]},s.id)})})]}),o.length===0&&e.jsx("div",{className:"admin-empty",children:"暂无评论"}),l>1&&e.jsxs("div",{className:"admin-pagination",children:[e.jsx(d,{size:"sm",variant:"outline",disabled:a<=1,onClick:()=>n(a-1),children:"上一页"}),e.jsxs("span",{children:["第 ",a," / ",l," 页"]}),e.jsx(d,{size:"sm",variant:"outline",disabled:a>=l,onClick:()=>n(a+1),children:"下一页"})]})]})})]}):null}export{G as default}; diff --git a/embed_static/static/spa/assets/AdminDashboardPage-biZSiZPA.js b/embed_static/static/spa/assets/AdminDashboardPage-BJzAuroX.js similarity index 94% rename from embed_static/static/spa/assets/AdminDashboardPage-biZSiZPA.js rename to embed_static/static/spa/assets/AdminDashboardPage-BJzAuroX.js index b941194..f123dbc 100644 --- a/embed_static/static/spa/assets/AdminDashboardPage-biZSiZPA.js +++ b/embed_static/static/spa/assets/AdminDashboardPage-BJzAuroX.js @@ -1 +1 @@ -import{e as h,r as n,j as s}from"./react-vendor-1fwFMt02.js";import{i as o,a as x,S as j}from"./index-kfMSnNdB.js";import{B as u}from"./badge-C0Go598m.js";import"./ui-vendor-Gb6mai95.js";function f(){const i=h(),{ready:t}=o(),[e,d]=n.useState(null),[r,c]=n.useState(!0);if(n.useEffect(()=>{t&&x.adminDashboard().then(d).finally(()=>c(!1))},[t]),!t||r)return s.jsx("div",{className:"flex justify-center py-16",children:s.jsx(j,{size:"lg"})});if(!e)return null;const m=[{label:"注册用户",value:e.users,cls:"admin-stat-users"},{label:"帖子总数",value:e.posts,cls:"admin-stat-posts"},{label:"板块数量",value:e.boards,cls:"admin-stat-boards"},{label:"评论总数",value:e.comments,cls:"admin-stat-comments"},{label:"当前在线",value:e.online,cls:"admin-stat-online"}];return s.jsxs("div",{className:"admin-page",children:[s.jsxs("div",{className:"admin-page-head",children:[s.jsx("h1",{children:"仪表盘"}),s.jsx("p",{children:"论坛运行概览与最新帖子"})]}),s.jsx("div",{className:"admin-stat-grid",children:m.map(a=>s.jsxs("div",{className:`admin-stat-card ${a.cls}`,children:[s.jsx("div",{className:"admin-stat-value",children:a.value}),s.jsx("div",{className:"admin-stat-label",children:a.label})]},a.label))}),s.jsxs("div",{className:"admin-card",children:[s.jsxs("div",{className:"admin-card-head",children:[s.jsx("span",{children:"最新帖子"}),s.jsx("button",{type:"button",className:"admin-text-link",onClick:()=>i("/admin/posts"),children:"查看全部 →"})]}),s.jsxs("table",{className:"admin-table",children:[s.jsx("thead",{children:s.jsxs("tr",{children:[s.jsx("th",{children:"ID"}),s.jsx("th",{children:"标题"}),s.jsx("th",{children:"作者"}),s.jsx("th",{children:"置顶"}),s.jsx("th",{children:"时间"})]})}),s.jsx("tbody",{children:e.recent_posts.map(a=>{var l;return s.jsxs("tr",{children:[s.jsx("td",{children:a.id}),s.jsx("td",{children:s.jsx("button",{type:"button",className:"admin-text-link",onClick:()=>i(`/post/${a.id}`),children:a.title})}),s.jsx("td",{children:((l=a.user)==null?void 0:l.nickname)??"—"}),s.jsx("td",{children:a.pinned?s.jsx(u,{variant:"orange",children:"是"}):"—"}),s.jsx("td",{children:new Date(a.created_at).toLocaleString("zh-CN")})]},a.id)})})]}),e.recent_posts.length===0&&s.jsx("div",{className:"admin-empty",children:"暂无帖子"})]})]})}export{f as default}; +import{e as h,r as n,j as s}from"./react-vendor-1fwFMt02.js";import{i as o,a as x,S as j}from"./index-BCHo3nLu.js";import{B as u}from"./badge-C7JnHIoR.js";import"./ui-vendor-Gb6mai95.js";function f(){const i=h(),{ready:t}=o(),[e,d]=n.useState(null),[r,c]=n.useState(!0);if(n.useEffect(()=>{t&&x.adminDashboard().then(d).finally(()=>c(!1))},[t]),!t||r)return s.jsx("div",{className:"flex justify-center py-16",children:s.jsx(j,{size:"lg"})});if(!e)return null;const m=[{label:"注册用户",value:e.users,cls:"admin-stat-users"},{label:"帖子总数",value:e.posts,cls:"admin-stat-posts"},{label:"板块数量",value:e.boards,cls:"admin-stat-boards"},{label:"评论总数",value:e.comments,cls:"admin-stat-comments"},{label:"当前在线",value:e.online,cls:"admin-stat-online"}];return s.jsxs("div",{className:"admin-page",children:[s.jsxs("div",{className:"admin-page-head",children:[s.jsx("h1",{children:"仪表盘"}),s.jsx("p",{children:"论坛运行概览与最新帖子"})]}),s.jsx("div",{className:"admin-stat-grid",children:m.map(a=>s.jsxs("div",{className:`admin-stat-card ${a.cls}`,children:[s.jsx("div",{className:"admin-stat-value",children:a.value}),s.jsx("div",{className:"admin-stat-label",children:a.label})]},a.label))}),s.jsxs("div",{className:"admin-card",children:[s.jsxs("div",{className:"admin-card-head",children:[s.jsx("span",{children:"最新帖子"}),s.jsx("button",{type:"button",className:"admin-text-link",onClick:()=>i("/admin/posts"),children:"查看全部 →"})]}),s.jsxs("table",{className:"admin-table",children:[s.jsx("thead",{children:s.jsxs("tr",{children:[s.jsx("th",{children:"ID"}),s.jsx("th",{children:"标题"}),s.jsx("th",{children:"作者"}),s.jsx("th",{children:"置顶"}),s.jsx("th",{children:"时间"})]})}),s.jsx("tbody",{children:e.recent_posts.map(a=>{var l;return s.jsxs("tr",{children:[s.jsx("td",{children:a.id}),s.jsx("td",{children:s.jsx("button",{type:"button",className:"admin-text-link",onClick:()=>i(`/post/${a.id}`),children:a.title})}),s.jsx("td",{children:((l=a.user)==null?void 0:l.nickname)??"—"}),s.jsx("td",{children:a.pinned?s.jsx(u,{variant:"orange",children:"是"}):"—"}),s.jsx("td",{children:new Date(a.created_at).toLocaleString("zh-CN")})]},a.id)})})]}),e.recent_posts.length===0&&s.jsx("div",{className:"admin-empty",children:"暂无帖子"})]})]})}export{f as default}; diff --git a/embed_static/static/spa/assets/AdminPostsPage-CPPJRgyw.js b/embed_static/static/spa/assets/AdminPostsPage-Y2jb5HlP.js similarity index 94% rename from embed_static/static/spa/assets/AdminPostsPage-CPPJRgyw.js rename to embed_static/static/spa/assets/AdminPostsPage-Y2jb5HlP.js index 7540cfe..55a1915 100644 --- a/embed_static/static/spa/assets/AdminPostsPage-CPPJRgyw.js +++ b/embed_static/static/spa/assets/AdminPostsPage-Y2jb5HlP.js @@ -1 +1 @@ -import{e as _,r as i,j as e}from"./react-vendor-1fwFMt02.js";import{i as P,B as n,S as z,a as x,n as r,c as E}from"./index-kfMSnNdB.js";import{I as L}from"./input-BjHCK3cg.js";import{B as j}from"./badge-C0Go598m.js";import{A as T,a as F,b as B,c as I,d as G,e as H,f as K,g as O,h as R}from"./alert-dialog-_wPjKojj.js";import{i as $}from"./content-BrFHUpp8.js";import{l as q,ai as J,E as M}from"./ui-vendor-Gb6mai95.js";function N(o){const c=new Date(o);return Number.isNaN(c.getTime())?o:c.toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}function ee(){const o=_(),{ready:c}=P(),[u,k]=i.useState([]),[b,g]=i.useState(!0),[d,w]=i.useState(1),[m,A]=i.useState(1),[f,p]=i.useState(""),[h,v]=i.useState(""),l=(s=d,t=h)=>{g(!0),x.adminPosts({page:s,keyword:t}).then(a=>{k(a.posts??[]),w(a.page),A(a.total_pages)}).catch(a=>r.error(a.message)).finally(()=>g(!1))};i.useEffect(()=>{c&&l(1,h)},[c,h]);const D=async s=>{try{const t=await x.adminPinPost(s.id,!s.pinned);E(),window.dispatchEvent(new Event("posts-refresh")),r.success(t.message),l()}catch(t){r.error(t instanceof Error?t.message:"操作失败")}},C=async s=>{try{const t=await x.adminLockPost(s.id,!s.edit_locked);r.success(t.message),l()}catch(t){r.error(t instanceof Error?t.message:"操作失败")}},S=async s=>{try{await x.adminDeletePost(s),r.success("帖子已删除"),l()}catch(t){r.error(t instanceof Error?t.message:"删除失败")}};return c?e.jsxs("div",{className:"admin-page",children:[e.jsxs("div",{className:"admin-page-head",children:[e.jsx("h1",{children:"帖子管理"}),e.jsx("p",{children:"置顶、锁定编辑、删除帖子;支持按标题、标签或正文关键词搜索"})]}),e.jsxs("form",{className:"admin-search-bar",onSubmit:s=>{s.preventDefault(),v(f.trim())},children:[e.jsx(L,{value:f,onChange:s=>p(s.target.value),placeholder:"搜索标题、标签或正文…"}),e.jsxs(n,{type:"submit",children:[e.jsx(q,{size:16}),"搜索"]}),h&&e.jsx(n,{type:"button",variant:"outline",onClick:()=>{p(""),v("")},children:"清除"})]}),e.jsx("div",{className:"admin-card",children:b?e.jsx("div",{className:"flex justify-center py-12",children:e.jsx(z,{size:"lg"})}):e.jsxs(e.Fragment,{children:[e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"ID"}),e.jsx("th",{children:"标题"}),e.jsx("th",{children:"板块"}),e.jsx("th",{children:"作者"}),e.jsx("th",{children:"标签"}),e.jsx("th",{children:"评论"}),e.jsx("th",{children:"置顶"}),e.jsx("th",{children:"锁定"}),e.jsx("th",{children:"点赞"}),e.jsx("th",{children:"浏览"}),e.jsx("th",{children:"时间"}),e.jsx("th",{children:"操作"})]})}),e.jsx("tbody",{children:u.map(s=>{var a,y;const t=s.updated_at&&$(s.created_at,s.updated_at);return e.jsxs("tr",{children:[e.jsx("td",{children:s.id}),e.jsxs("td",{className:"max-w-[200px] truncate",children:[e.jsx("button",{type:"button",className:"admin-text-link",onClick:()=>o(`/post/${s.id}`),children:s.title}),t&&e.jsx(j,{variant:"secondary",className:"ml-1",children:"已编辑"})]}),e.jsx("td",{children:((a=s.board)==null?void 0:a.name)??"—"}),e.jsx("td",{children:((y=s.user)==null?void 0:y.nickname)??"—"}),e.jsx("td",{className:"max-w-[120px] truncate text-muted-foreground",children:s.tags||"—"}),e.jsx("td",{children:s.comment_count??0}),e.jsx("td",{children:s.pinned?e.jsx(j,{variant:"orange",children:"是"}):"—"}),e.jsx("td",{children:s.edit_locked?e.jsx(j,{variant:"destructive",children:"是"}):"—"}),e.jsx("td",{children:s.like_count}),e.jsx("td",{children:s.view_count}),e.jsxs("td",{className:"text-sm whitespace-nowrap",children:[e.jsx("span",{children:N(s.created_at)}),t&&s.updated_at&&e.jsxs("span",{className:"block text-muted-foreground text-xs",children:["改于 ",N(s.updated_at)]})]}),e.jsx("td",{children:e.jsxs("div",{className:"flex gap-1",children:[e.jsx(n,{size:"sm",variant:"outline",onClick:()=>D(s),children:s.pinned?"取消置顶":"置顶"}),e.jsx(n,{size:"sm",variant:"outline",onClick:()=>C(s),children:s.edit_locked?e.jsxs(e.Fragment,{children:[e.jsx(J,{size:14})," 解锁"]}):e.jsxs(e.Fragment,{children:[e.jsx(M,{size:14})," 锁定"]})}),e.jsxs(T,{children:[e.jsx(F,{asChild:!0,children:e.jsx(n,{size:"sm",variant:"ghost",className:"text-destructive",children:"删除"})}),e.jsxs(B,{children:[e.jsxs(I,{children:[e.jsx(G,{children:"确定删除该帖子?"}),e.jsx(H,{children:"相关评论也将一并删除,不可恢复。"})]}),e.jsxs(K,{children:[e.jsx(O,{children:"取消"}),e.jsx(R,{onClick:()=>S(s.id),children:"删除"})]})]})]})]})})]},s.id)})})]}),u.length===0&&e.jsx("div",{className:"admin-empty",children:"没有找到帖子"}),m>1&&e.jsxs("div",{className:"admin-pagination",children:[e.jsx(n,{size:"sm",variant:"outline",disabled:d<=1,onClick:()=>l(d-1),children:"上一页"}),e.jsxs("span",{children:["第 ",d," / ",m," 页"]}),e.jsx(n,{size:"sm",variant:"outline",disabled:d>=m,onClick:()=>l(d+1),children:"下一页"})]})]})})]}):null}export{ee as default}; +import{e as _,r as i,j as e}from"./react-vendor-1fwFMt02.js";import{i as P,B as n,S as z,a as x,n as r,c as E}from"./index-BCHo3nLu.js";import{I as L}from"./input-Dsk6No-h.js";import{B as j}from"./badge-C7JnHIoR.js";import{A as T,a as F,b as B,c as I,d as G,e as H,f as K,g as O,h as R}from"./alert-dialog-C_2cPHgh.js";import{i as $}from"./content-BrFHUpp8.js";import{l as q,ai as J,E as M}from"./ui-vendor-Gb6mai95.js";function N(o){const c=new Date(o);return Number.isNaN(c.getTime())?o:c.toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}function ee(){const o=_(),{ready:c}=P(),[u,k]=i.useState([]),[b,g]=i.useState(!0),[d,w]=i.useState(1),[m,A]=i.useState(1),[f,p]=i.useState(""),[h,v]=i.useState(""),l=(s=d,t=h)=>{g(!0),x.adminPosts({page:s,keyword:t}).then(a=>{k(a.posts??[]),w(a.page),A(a.total_pages)}).catch(a=>r.error(a.message)).finally(()=>g(!1))};i.useEffect(()=>{c&&l(1,h)},[c,h]);const D=async s=>{try{const t=await x.adminPinPost(s.id,!s.pinned);E(),window.dispatchEvent(new Event("posts-refresh")),r.success(t.message),l()}catch(t){r.error(t instanceof Error?t.message:"操作失败")}},C=async s=>{try{const t=await x.adminLockPost(s.id,!s.edit_locked);r.success(t.message),l()}catch(t){r.error(t instanceof Error?t.message:"操作失败")}},S=async s=>{try{await x.adminDeletePost(s),r.success("帖子已删除"),l()}catch(t){r.error(t instanceof Error?t.message:"删除失败")}};return c?e.jsxs("div",{className:"admin-page",children:[e.jsxs("div",{className:"admin-page-head",children:[e.jsx("h1",{children:"帖子管理"}),e.jsx("p",{children:"置顶、锁定编辑、删除帖子;支持按标题、标签或正文关键词搜索"})]}),e.jsxs("form",{className:"admin-search-bar",onSubmit:s=>{s.preventDefault(),v(f.trim())},children:[e.jsx(L,{value:f,onChange:s=>p(s.target.value),placeholder:"搜索标题、标签或正文…"}),e.jsxs(n,{type:"submit",children:[e.jsx(q,{size:16}),"搜索"]}),h&&e.jsx(n,{type:"button",variant:"outline",onClick:()=>{p(""),v("")},children:"清除"})]}),e.jsx("div",{className:"admin-card",children:b?e.jsx("div",{className:"flex justify-center py-12",children:e.jsx(z,{size:"lg"})}):e.jsxs(e.Fragment,{children:[e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"ID"}),e.jsx("th",{children:"标题"}),e.jsx("th",{children:"板块"}),e.jsx("th",{children:"作者"}),e.jsx("th",{children:"标签"}),e.jsx("th",{children:"评论"}),e.jsx("th",{children:"置顶"}),e.jsx("th",{children:"锁定"}),e.jsx("th",{children:"点赞"}),e.jsx("th",{children:"浏览"}),e.jsx("th",{children:"时间"}),e.jsx("th",{children:"操作"})]})}),e.jsx("tbody",{children:u.map(s=>{var a,y;const t=s.updated_at&&$(s.created_at,s.updated_at);return e.jsxs("tr",{children:[e.jsx("td",{children:s.id}),e.jsxs("td",{className:"max-w-[200px] truncate",children:[e.jsx("button",{type:"button",className:"admin-text-link",onClick:()=>o(`/post/${s.id}`),children:s.title}),t&&e.jsx(j,{variant:"secondary",className:"ml-1",children:"已编辑"})]}),e.jsx("td",{children:((a=s.board)==null?void 0:a.name)??"—"}),e.jsx("td",{children:((y=s.user)==null?void 0:y.nickname)??"—"}),e.jsx("td",{className:"max-w-[120px] truncate text-muted-foreground",children:s.tags||"—"}),e.jsx("td",{children:s.comment_count??0}),e.jsx("td",{children:s.pinned?e.jsx(j,{variant:"orange",children:"是"}):"—"}),e.jsx("td",{children:s.edit_locked?e.jsx(j,{variant:"destructive",children:"是"}):"—"}),e.jsx("td",{children:s.like_count}),e.jsx("td",{children:s.view_count}),e.jsxs("td",{className:"text-sm whitespace-nowrap",children:[e.jsx("span",{children:N(s.created_at)}),t&&s.updated_at&&e.jsxs("span",{className:"block text-muted-foreground text-xs",children:["改于 ",N(s.updated_at)]})]}),e.jsx("td",{children:e.jsxs("div",{className:"flex gap-1",children:[e.jsx(n,{size:"sm",variant:"outline",onClick:()=>D(s),children:s.pinned?"取消置顶":"置顶"}),e.jsx(n,{size:"sm",variant:"outline",onClick:()=>C(s),children:s.edit_locked?e.jsxs(e.Fragment,{children:[e.jsx(J,{size:14})," 解锁"]}):e.jsxs(e.Fragment,{children:[e.jsx(M,{size:14})," 锁定"]})}),e.jsxs(T,{children:[e.jsx(F,{asChild:!0,children:e.jsx(n,{size:"sm",variant:"ghost",className:"text-destructive",children:"删除"})}),e.jsxs(B,{children:[e.jsxs(I,{children:[e.jsx(G,{children:"确定删除该帖子?"}),e.jsx(H,{children:"相关评论也将一并删除,不可恢复。"})]}),e.jsxs(K,{children:[e.jsx(O,{children:"取消"}),e.jsx(R,{onClick:()=>S(s.id),children:"删除"})]})]})]})]})})]},s.id)})})]}),u.length===0&&e.jsx("div",{className:"admin-empty",children:"没有找到帖子"}),m>1&&e.jsxs("div",{className:"admin-pagination",children:[e.jsx(n,{size:"sm",variant:"outline",disabled:d<=1,onClick:()=>l(d-1),children:"上一页"}),e.jsxs("span",{children:["第 ",d," / ",m," 页"]}),e.jsx(n,{size:"sm",variant:"outline",disabled:d>=m,onClick:()=>l(d+1),children:"下一页"})]})]})})]}):null}export{ee as default}; diff --git a/embed_static/static/spa/assets/AdminSettingsPage-BPulW3i2.js b/embed_static/static/spa/assets/AdminSettingsPage-BPulW3i2.js deleted file mode 100644 index 2aaf16d..0000000 --- a/embed_static/static/spa/assets/AdminSettingsPage-BPulW3i2.js +++ /dev/null @@ -1,3 +0,0 @@ -import{r as t,j as s}from"./react-vendor-1fwFMt02.js";import{i as B,a as u,S as z,B as g,n as d,l as I}from"./index-kfMSnNdB.js";import{I as L}from"./input-BjHCK3cg.js";import{T as M}from"./textarea-5HbBKxKc.js";import{as as A,at as W,au as Y,av as $}from"./ui-vendor-Gb6mai95.js";const f=[{id:"rule",title:"编辑规则",summary:"控制普通用户修改自己帖子的时限",rows:[{key:"post_edit_window_hours",label:"可编辑时限",unit:"小时",hint:"0 = 不限",min:0}]},{id:"rate",title:"操作限流",summary:"同一用户或 IP 在窗口期内的最大请求次数",rows:[{key:"rate_limit_window_sec",label:"限流窗口",unit:"秒",min:10},{key:"rate_limit_post",label:"发帖",unit:"次",min:1},{key:"rate_limit_comment",label:"评论",unit:"次",min:1},{key:"rate_limit_register",label:"注册",unit:"次",min:1},{key:"rate_limit_login",label:"登录",unit:"次",min:1}]},{id:"content",title:"内容长度",summary:"发帖与评论的字数上限,服务端强制校验",rows:[{key:"post_title_max",label:"帖子标题",unit:"字",min:1},{key:"post_tags_max",label:"帖子标签",unit:"字",hint:"0 = 不限",min:0},{key:"post_content_max",label:"帖子正文",unit:"字",hint:"0 = 不限",min:0},{key:"comment_max",label:"评论内容",unit:"字",min:1}]},{id:"search",title:"搜索与列表",summary:"关键词长度与帖子列表分页",rows:[{key:"search_keyword_min",label:"关键词最短",unit:"字",min:0},{key:"search_keyword_max",label:"关键词最长",unit:"字",min:1},{key:"page_size_default",label:"默认每页",unit:"条",min:1},{key:"page_size_max",label:"最大每页",unit:"条",min:1}]},{id:"user",title:"用户账号",summary:"注册、改密与头像上传限制",rows:[{key:"password_min_len",label:"密码最短",unit:"位",min:4},{key:"avatar_max_mb",label:"头像上限",unit:"MB",min:1}]}],D=[{id:"limits",label:"论坛限制",icon:A},{id:"filter",label:"敏感词",icon:W},{id:"system",label:"系统维护",icon:Y}];function H({sections:r,limits:l,onChange:c}){return s.jsx("div",{className:"admin-settings-sections",children:r.map(a=>s.jsxs("section",{className:"admin-settings-section",id:`settings-${a.id}`,children:[s.jsxs("div",{className:"admin-settings-section-head",children:[s.jsx("h3",{children:a.title}),s.jsx("p",{children:a.summary})]}),s.jsx("div",{className:"admin-settings-table",role:"group","aria-label":a.title,children:a.rows.map(i=>s.jsxs("div",{className:"admin-settings-row",children:[s.jsx("label",{htmlFor:`limit-${i.key}`,className:"admin-settings-row-label",children:i.label}),s.jsxs("div",{className:"admin-settings-row-input",children:[s.jsx(L,{id:`limit-${i.key}`,type:"number",min:i.min??0,value:l[i.key],onChange:m=>c(i.key,m.target.value),className:"admin-settings-input"}),i.unit&&s.jsx("span",{className:"admin-settings-unit",children:i.unit})]}),s.jsx("span",{className:"admin-settings-row-hint",children:i.hint??""})]},i.key))})]},a.id))})}function R(){const{ready:r}=B(),[l,c]=t.useState(null),[a,i]=t.useState(null),[m,j]=t.useState(""),[o,_]=t.useState("limits"),[N,v]=t.useState(!0),[k,p]=t.useState(!1),[S,y]=t.useState(!1),[w,b]=t.useState(!1);t.useEffect(()=>{r&&u.adminSettings().then(e=>{c(e),i(e.limits),j(e.filter_words)}).finally(()=>v(!1))},[r]);const C=(e,n)=>{const h=parseInt(n,10);Number.isNaN(h)||i(x=>x&&{...x,[e]:h})},F=async()=>{if(a){y(!0);try{const e=await u.adminUpdateForumSettings(a);d.success(e.message),I(),i(e.limits),c(n=>n&&{...n,limits:e.limits})}catch(e){d.error(e instanceof Error?e.message:"保存失败")}finally{y(!1)}}},T=async()=>{b(!0);try{const e=await u.adminUpdateFilterWords(m);d.success(e.message),c(n=>n&&{...n,filter_words:m,filter_word_count:e.word_count})}catch(e){d.error(e instanceof Error?e.message:"保存失败")}finally{b(!1)}},E=async()=>{p(!0);try{const e=await u.adminBackup();d.success(e.message),window.location.href=e.download}catch(e){d.error(e instanceof Error?e.message:"备份失败")}finally{p(!1)}};return!r||N?s.jsx("div",{className:"flex justify-center py-16",children:s.jsx(z,{size:"lg"})}):!l||!a?null:s.jsxs("div",{className:"admin-settings-page",children:[s.jsxs("header",{className:"admin-page-head",children:[s.jsx("h1",{children:"系统设置"}),s.jsx("p",{children:"管理论坛运行规则、敏感词过滤与数据维护"})]}),s.jsx("nav",{className:"admin-settings-tabs","aria-label":"设置分类",children:D.map(({id:e,label:n,icon:h})=>s.jsxs("button",{type:"button",className:`admin-settings-tab${o===e?" active":""}`,onClick:()=>_(e),"aria-selected":o===e,children:[s.jsx(h,{size:15}),n]},e))}),o==="limits"&&s.jsxs("div",{className:"admin-settings-panel",children:[s.jsxs("div",{className:"admin-card admin-settings-card",children:[s.jsxs("div",{className:"admin-card-head",children:[s.jsx("span",{children:"论坛限制"}),s.jsxs("span",{className:"admin-settings-card-badge",children:["共 ",f.length," 组"]})]}),s.jsx("div",{className:"admin-card-body",children:s.jsx(H,{sections:f,limits:a,onChange:C})})]}),s.jsxs("div",{className:"admin-settings-bar",children:[s.jsx("p",{children:"修改后请点击保存,新规则立即对全部用户生效"}),s.jsx(g,{onClick:F,loading:S,children:"保存论坛限制"})]})]}),o==="filter"&&s.jsxs("div",{className:"admin-settings-panel",children:[s.jsxs("div",{className:"admin-card admin-settings-card",children:[s.jsxs("div",{className:"admin-card-head",children:[s.jsx("span",{children:"敏感词过滤"}),s.jsxs("span",{className:"admin-settings-card-badge",children:[l.filter_word_count," 个词条"]})]}),s.jsxs("div",{className:"admin-card-body admin-settings-filter-body",children:[s.jsxs("p",{className:"admin-settings-filter-tip",children:["每行一个词,",s.jsx("code",{children:"#"})," 开头为注释。保存后写入 ",s.jsx("code",{children:"filter_words.txt"})," 并立即生效。"]}),s.jsx(M,{rows:16,value:m,onChange:e=>j(e.target.value),className:"admin-settings-filter-textarea",spellCheck:!1,placeholder:`# 示例 -违禁词 -广告刷单`})]})]}),s.jsxs("div",{className:"admin-settings-bar",children:[s.jsx("p",{children:"敏感词会在发帖、评论、昵称等文本中自动替换为 *"}),s.jsx(g,{onClick:T,loading:w,children:"保存敏感词"})]})]}),o==="system"&&s.jsxs("div",{className:"admin-settings-panel",children:[s.jsxs("div",{className:"admin-card admin-settings-card",children:[s.jsx("div",{className:"admin-card-head",children:"运行信息"}),s.jsx("div",{className:"admin-card-body",children:s.jsxs("dl",{className:"admin-settings-info",children:[s.jsxs("div",{className:"admin-settings-info-row",children:[s.jsx("dt",{children:"数据目录"}),s.jsx("dd",{children:s.jsx("code",{children:l.data_dir})})]}),s.jsxs("div",{className:"admin-settings-info-row",children:[s.jsx("dt",{children:"数据库"}),s.jsx("dd",{children:s.jsx("code",{children:l.db_path})})]}),s.jsxs("div",{className:"admin-settings-info-row",children:[s.jsx("dt",{children:"敏感词文件"}),s.jsx("dd",{children:s.jsx("code",{children:l.filter_path})})]}),s.jsxs("div",{className:"admin-settings-info-row",children:[s.jsx("dt",{children:"监听端口"}),s.jsx("dd",{children:l.port})]})]})})]}),s.jsxs("div",{className:"admin-card admin-settings-card",children:[s.jsx("div",{className:"admin-card-head",children:"数据备份"}),s.jsxs("div",{className:"admin-card-body admin-settings-backup-body",children:[s.jsx("p",{children:"导出当前 SQLite 数据库副本,便于迁移或灾难恢复。"}),s.jsxs("p",{className:"admin-settings-backup-name",children:["文件名:",s.jsx("code",{children:"jiang13_backup_YYYYMMDD_HHMMSS.db"})]}),s.jsxs(g,{onClick:E,loading:k,children:[s.jsx($,{size:16}),"立即备份并下载"]})]})]})]})]})}export{R as default}; diff --git a/embed_static/static/spa/assets/AdminSettingsPage-D_QJX2YW.js b/embed_static/static/spa/assets/AdminSettingsPage-D_QJX2YW.js new file mode 100644 index 0000000..0dc2f2f --- /dev/null +++ b/embed_static/static/spa/assets/AdminSettingsPage-D_QJX2YW.js @@ -0,0 +1,3 @@ +import{r as t,j as s}from"./react-vendor-1fwFMt02.js";import{i as B,a as u,S as z,B as g,n as d,l as I}from"./index-BCHo3nLu.js";import{I as L}from"./input-Dsk6No-h.js";import{T as M}from"./textarea-BPVvpwYr.js";import{as as A,at as W,au as Y,av as $}from"./ui-vendor-Gb6mai95.js";const f=[{id:"rule",title:"编辑规则",summary:"控制普通用户修改自己帖子的时限",rows:[{key:"post_edit_window_hours",label:"可编辑时限",unit:"小时",hint:"0 = 不限",min:0}]},{id:"rate",title:"操作限流",summary:"同一用户或 IP 在窗口期内的最大请求次数",rows:[{key:"rate_limit_window_sec",label:"限流窗口",unit:"秒",min:10},{key:"rate_limit_post",label:"发帖",unit:"次",min:1},{key:"rate_limit_comment",label:"评论",unit:"次",min:1},{key:"rate_limit_register",label:"注册",unit:"次",min:1},{key:"rate_limit_login",label:"登录",unit:"次",min:1}]},{id:"content",title:"内容长度",summary:"发帖与评论的字数上限,服务端强制校验",rows:[{key:"post_title_max",label:"帖子标题",unit:"字",min:1},{key:"post_tags_max",label:"帖子标签",unit:"字",hint:"0 = 不限",min:0},{key:"post_content_max",label:"帖子正文",unit:"字",hint:"0 = 不限",min:0},{key:"comment_max",label:"评论内容",unit:"字",min:1}]},{id:"search",title:"搜索与列表",summary:"关键词长度与帖子列表分页",rows:[{key:"search_keyword_min",label:"关键词最短",unit:"字",min:0},{key:"search_keyword_max",label:"关键词最长",unit:"字",min:1},{key:"page_size_default",label:"默认每页",unit:"条",min:1},{key:"page_size_max",label:"最大每页",unit:"条",min:1},{key:"feed_max_pages",label:"首页自动加载页数",unit:"页",hint:"超出后需手动加载",min:1},{key:"feed_max_items",label:"首页自动加载条数",unit:"条",hint:"与页数取先到上限",min:1}]},{id:"user",title:"用户账号",summary:"注册、改密与头像上传限制",rows:[{key:"password_min_len",label:"密码最短",unit:"位",min:4},{key:"avatar_max_mb",label:"头像上限",unit:"MB",min:1}]}],D=[{id:"limits",label:"论坛限制",icon:A},{id:"filter",label:"敏感词",icon:W},{id:"system",label:"系统维护",icon:Y}];function H({sections:r,limits:l,onChange:c}){return s.jsx("div",{className:"admin-settings-sections",children:r.map(a=>s.jsxs("section",{className:"admin-settings-section",id:`settings-${a.id}`,children:[s.jsxs("div",{className:"admin-settings-section-head",children:[s.jsx("h3",{children:a.title}),s.jsx("p",{children:a.summary})]}),s.jsx("div",{className:"admin-settings-table",role:"group","aria-label":a.title,children:a.rows.map(i=>s.jsxs("div",{className:"admin-settings-row",children:[s.jsx("label",{htmlFor:`limit-${i.key}`,className:"admin-settings-row-label",children:i.label}),s.jsxs("div",{className:"admin-settings-row-input",children:[s.jsx(L,{id:`limit-${i.key}`,type:"number",min:i.min??0,value:l[i.key],onChange:m=>c(i.key,m.target.value),className:"admin-settings-input"}),i.unit&&s.jsx("span",{className:"admin-settings-unit",children:i.unit})]}),s.jsx("span",{className:"admin-settings-row-hint",children:i.hint??""})]},i.key))})]},a.id))})}function R(){const{ready:r}=B(),[l,c]=t.useState(null),[a,i]=t.useState(null),[m,j]=t.useState(""),[o,_]=t.useState("limits"),[N,v]=t.useState(!0),[k,p]=t.useState(!1),[S,y]=t.useState(!1),[w,b]=t.useState(!1);t.useEffect(()=>{r&&u.adminSettings().then(e=>{c(e),i(e.limits),j(e.filter_words)}).finally(()=>v(!1))},[r]);const C=(e,n)=>{const h=parseInt(n,10);Number.isNaN(h)||i(x=>x&&{...x,[e]:h})},F=async()=>{if(a){y(!0);try{const e=await u.adminUpdateForumSettings(a);d.success(e.message),I(),i(e.limits),c(n=>n&&{...n,limits:e.limits})}catch(e){d.error(e instanceof Error?e.message:"保存失败")}finally{y(!1)}}},T=async()=>{b(!0);try{const e=await u.adminUpdateFilterWords(m);d.success(e.message),c(n=>n&&{...n,filter_words:m,filter_word_count:e.word_count})}catch(e){d.error(e instanceof Error?e.message:"保存失败")}finally{b(!1)}},E=async()=>{p(!0);try{const e=await u.adminBackup();d.success(e.message),window.location.href=e.download}catch(e){d.error(e instanceof Error?e.message:"备份失败")}finally{p(!1)}};return!r||N?s.jsx("div",{className:"flex justify-center py-16",children:s.jsx(z,{size:"lg"})}):!l||!a?null:s.jsxs("div",{className:"admin-settings-page",children:[s.jsxs("header",{className:"admin-page-head",children:[s.jsx("h1",{children:"系统设置"}),s.jsx("p",{children:"管理论坛运行规则、敏感词过滤与数据维护"})]}),s.jsx("nav",{className:"admin-settings-tabs","aria-label":"设置分类",children:D.map(({id:e,label:n,icon:h})=>s.jsxs("button",{type:"button",className:`admin-settings-tab${o===e?" active":""}`,onClick:()=>_(e),"aria-selected":o===e,children:[s.jsx(h,{size:15}),n]},e))}),o==="limits"&&s.jsxs("div",{className:"admin-settings-panel",children:[s.jsxs("div",{className:"admin-card admin-settings-card",children:[s.jsxs("div",{className:"admin-card-head",children:[s.jsx("span",{children:"论坛限制"}),s.jsxs("span",{className:"admin-settings-card-badge",children:["共 ",f.length," 组"]})]}),s.jsx("div",{className:"admin-card-body",children:s.jsx(H,{sections:f,limits:a,onChange:C})})]}),s.jsxs("div",{className:"admin-settings-bar",children:[s.jsx("p",{children:"修改后请点击保存,新规则立即对全部用户生效"}),s.jsx(g,{onClick:F,loading:S,children:"保存论坛限制"})]})]}),o==="filter"&&s.jsxs("div",{className:"admin-settings-panel",children:[s.jsxs("div",{className:"admin-card admin-settings-card",children:[s.jsxs("div",{className:"admin-card-head",children:[s.jsx("span",{children:"敏感词过滤"}),s.jsxs("span",{className:"admin-settings-card-badge",children:[l.filter_word_count," 个词条"]})]}),s.jsxs("div",{className:"admin-card-body admin-settings-filter-body",children:[s.jsxs("p",{className:"admin-settings-filter-tip",children:["每行一个词,",s.jsx("code",{children:"#"})," 开头为注释。保存后写入 ",s.jsx("code",{children:"filter_words.txt"})," 并立即生效。"]}),s.jsx(M,{rows:16,value:m,onChange:e=>j(e.target.value),className:"admin-settings-filter-textarea",spellCheck:!1,placeholder:`# 示例 +违禁词 +广告刷单`})]})]}),s.jsxs("div",{className:"admin-settings-bar",children:[s.jsx("p",{children:"敏感词会在发帖、评论、昵称等文本中自动替换为 *"}),s.jsx(g,{onClick:T,loading:w,children:"保存敏感词"})]})]}),o==="system"&&s.jsxs("div",{className:"admin-settings-panel",children:[s.jsxs("div",{className:"admin-card admin-settings-card",children:[s.jsx("div",{className:"admin-card-head",children:"运行信息"}),s.jsx("div",{className:"admin-card-body",children:s.jsxs("dl",{className:"admin-settings-info",children:[s.jsxs("div",{className:"admin-settings-info-row",children:[s.jsx("dt",{children:"数据目录"}),s.jsx("dd",{children:s.jsx("code",{children:l.data_dir})})]}),s.jsxs("div",{className:"admin-settings-info-row",children:[s.jsx("dt",{children:"数据库"}),s.jsx("dd",{children:s.jsx("code",{children:l.db_path})})]}),s.jsxs("div",{className:"admin-settings-info-row",children:[s.jsx("dt",{children:"敏感词文件"}),s.jsx("dd",{children:s.jsx("code",{children:l.filter_path})})]}),s.jsxs("div",{className:"admin-settings-info-row",children:[s.jsx("dt",{children:"监听端口"}),s.jsx("dd",{children:l.port})]})]})})]}),s.jsxs("div",{className:"admin-card admin-settings-card",children:[s.jsx("div",{className:"admin-card-head",children:"数据备份"}),s.jsxs("div",{className:"admin-card-body admin-settings-backup-body",children:[s.jsx("p",{children:"导出当前 SQLite 数据库副本,便于迁移或灾难恢复。"}),s.jsxs("p",{className:"admin-settings-backup-name",children:["文件名:",s.jsx("code",{children:"jiang13_backup_YYYYMMDD_HHMMSS.db"})]}),s.jsxs(g,{onClick:E,loading:k,children:[s.jsx($,{size:16}),"立即备份并下载"]})]})]})]})]})}export{R as default}; diff --git a/embed_static/static/spa/assets/AdminUsersPage-qrFcGy2M.js b/embed_static/static/spa/assets/AdminUsersPage-Br2jBqxw.js similarity index 94% rename from embed_static/static/spa/assets/AdminUsersPage-qrFcGy2M.js rename to embed_static/static/spa/assets/AdminUsersPage-Br2jBqxw.js index 5be9df3..6040ef7 100644 --- a/embed_static/static/spa/assets/AdminUsersPage-qrFcGy2M.js +++ b/embed_static/static/spa/assets/AdminUsersPage-Br2jBqxw.js @@ -1 +1 @@ -import{r as i,j as e}from"./react-vendor-1fwFMt02.js";import{i as v,S as y,B as l,a as j,n as r}from"./index-kfMSnNdB.js";import{B as h}from"./badge-C0Go598m.js";import"./ui-vendor-Gb6mai95.js";function z(){const{ready:d}=v(),[o,m]=i.useState([]),[g,x]=i.useState(!0),[n,p]=i.useState(1),[c,f]=i.useState(1),t=(s=n)=>{x(!0),j.adminUsers(s).then(a=>{m(a.users??[]),p(a.page),f(a.total_pages)}).catch(a=>r.error(a.message)).finally(()=>x(!1))};i.useEffect(()=>{d&&t(1)},[d]);const u=async s=>{if(s.role==="admin"){r.warning("不能禁言管理员");return}try{const a=await j.adminBanUser(s.id,!s.banned);r.success(a.message),t()}catch(a){r.error(a instanceof Error?a.message:"操作失败")}};return d?e.jsxs("div",{className:"admin-page",children:[e.jsxs("div",{className:"admin-page-head",children:[e.jsx("h1",{children:"用户管理"}),e.jsx("p",{children:"查看注册用户,禁言或解除禁言"})]}),e.jsx("div",{className:"admin-card",children:g?e.jsx("div",{className:"flex justify-center py-12",children:e.jsx(y,{size:"lg"})}):e.jsxs(e.Fragment,{children:[e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"ID"}),e.jsx("th",{children:"用户名"}),e.jsx("th",{children:"昵称"}),e.jsx("th",{children:"角色"}),e.jsx("th",{children:"状态"}),e.jsx("th",{children:"注册时间"}),e.jsx("th",{children:"操作"})]})}),e.jsx("tbody",{children:o.map(s=>e.jsxs("tr",{children:[e.jsx("td",{children:s.id}),e.jsx("td",{children:s.username}),e.jsx("td",{children:s.nickname}),e.jsx("td",{children:s.role==="admin"?e.jsx(h,{variant:"orange",children:"管理员"}):e.jsx(h,{variant:"secondary",children:"用户"})}),e.jsx("td",{children:s.banned?e.jsx(h,{variant:"destructive",children:"已禁言"}):"正常"}),e.jsx("td",{children:s.created_at?new Date(s.created_at).toLocaleString("zh-CN"):"—"}),e.jsx("td",{children:s.role!=="admin"&&e.jsx(l,{size:"sm",variant:"outline",onClick:()=>u(s),children:s.banned?"解除禁言":"禁言"})})]},s.id))})]}),o.length===0&&e.jsx("div",{className:"admin-empty",children:"暂无用户"}),c>1&&e.jsxs("div",{className:"admin-pagination",children:[e.jsx(l,{size:"sm",variant:"outline",disabled:n<=1,onClick:()=>t(n-1),children:"上一页"}),e.jsxs("span",{children:["第 ",n," / ",c," 页"]}),e.jsx(l,{size:"sm",variant:"outline",disabled:n>=c,onClick:()=>t(n+1),children:"下一页"})]})]})})]}):null}export{z as default}; +import{r as i,j as e}from"./react-vendor-1fwFMt02.js";import{i as v,S as y,B as l,a as j,n as r}from"./index-BCHo3nLu.js";import{B as h}from"./badge-C7JnHIoR.js";import"./ui-vendor-Gb6mai95.js";function z(){const{ready:d}=v(),[o,m]=i.useState([]),[g,x]=i.useState(!0),[n,p]=i.useState(1),[c,f]=i.useState(1),t=(s=n)=>{x(!0),j.adminUsers(s).then(a=>{m(a.users??[]),p(a.page),f(a.total_pages)}).catch(a=>r.error(a.message)).finally(()=>x(!1))};i.useEffect(()=>{d&&t(1)},[d]);const u=async s=>{if(s.role==="admin"){r.warning("不能禁言管理员");return}try{const a=await j.adminBanUser(s.id,!s.banned);r.success(a.message),t()}catch(a){r.error(a instanceof Error?a.message:"操作失败")}};return d?e.jsxs("div",{className:"admin-page",children:[e.jsxs("div",{className:"admin-page-head",children:[e.jsx("h1",{children:"用户管理"}),e.jsx("p",{children:"查看注册用户,禁言或解除禁言"})]}),e.jsx("div",{className:"admin-card",children:g?e.jsx("div",{className:"flex justify-center py-12",children:e.jsx(y,{size:"lg"})}):e.jsxs(e.Fragment,{children:[e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"ID"}),e.jsx("th",{children:"用户名"}),e.jsx("th",{children:"昵称"}),e.jsx("th",{children:"角色"}),e.jsx("th",{children:"状态"}),e.jsx("th",{children:"注册时间"}),e.jsx("th",{children:"操作"})]})}),e.jsx("tbody",{children:o.map(s=>e.jsxs("tr",{children:[e.jsx("td",{children:s.id}),e.jsx("td",{children:s.username}),e.jsx("td",{children:s.nickname}),e.jsx("td",{children:s.role==="admin"?e.jsx(h,{variant:"orange",children:"管理员"}):e.jsx(h,{variant:"secondary",children:"用户"})}),e.jsx("td",{children:s.banned?e.jsx(h,{variant:"destructive",children:"已禁言"}):"正常"}),e.jsx("td",{children:s.created_at?new Date(s.created_at).toLocaleString("zh-CN"):"—"}),e.jsx("td",{children:s.role!=="admin"&&e.jsx(l,{size:"sm",variant:"outline",onClick:()=>u(s),children:s.banned?"解除禁言":"禁言"})})]},s.id))})]}),o.length===0&&e.jsx("div",{className:"admin-empty",children:"暂无用户"}),c>1&&e.jsxs("div",{className:"admin-pagination",children:[e.jsx(l,{size:"sm",variant:"outline",disabled:n<=1,onClick:()=>t(n-1),children:"上一页"}),e.jsxs("span",{children:["第 ",n," / ",c," 页"]}),e.jsx(l,{size:"sm",variant:"outline",disabled:n>=c,onClick:()=>t(n+1),children:"下一页"})]})]})})]}):null}export{z as default}; diff --git a/embed_static/static/spa/assets/BoardsManagePage-CBisP7fL.js b/embed_static/static/spa/assets/BoardsManagePage-CkQP_LEp.js similarity index 93% rename from embed_static/static/spa/assets/BoardsManagePage-CBisP7fL.js rename to embed_static/static/spa/assets/BoardsManagePage-CkQP_LEp.js index db4126b..e15f061 100644 --- a/embed_static/static/spa/assets/BoardsManagePage-CBisP7fL.js +++ b/embed_static/static/spa/assets/BoardsManagePage-CkQP_LEp.js @@ -1 +1 @@ -import{r as n,j as e,e as M}from"./react-vendor-1fwFMt02.js";import{_ as O,Z as P,u as Z,a as G,F as V,b as u,c as g,d as b,e as y,f as N,o as q,s as C}from"./form-PYX6hP9B.js";import{f as d,i as J,S as A,B as h,a as p,n as c}from"./index-kfMSnNdB.js";import{I as F}from"./input-BjHCK3cg.js";import{T as K}from"./textarea-5HbBKxKc.js";import{B as Q}from"./badge-C0Go598m.js";import{D as U,a as W,b as X,c as Y,e as $}from"./dialog-DJohwkVv.js";import{A as ee,a as se,b as ae,c as re,d as te,e as ne,f as le,g as ie,h as oe}from"./alert-dialog-_wPjKojj.js";import{m as ce}from"./ui-vendor-Gb6mai95.js";function de(a){return O(P,a)}const S=n.forwardRef(({className:a,...r},t)=>e.jsx("div",{className:"relative w-full overflow-auto",children:e.jsx("table",{ref:t,className:d("w-full caption-bottom text-sm",a),...r})}));S.displayName="Table";const _=n.forwardRef(({className:a,...r},t)=>e.jsx("thead",{ref:t,className:d("[&_tr]:border-b",a),...r}));_.displayName="TableHeader";const B=n.forwardRef(({className:a,...r},t)=>e.jsx("tbody",{ref:t,className:d("[&_tr:last-child]:border-0",a),...r}));B.displayName="TableBody";const w=n.forwardRef(({className:a,...r},t)=>e.jsx("tr",{ref:t,className:d("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",a),...r}));w.displayName="TableRow";const i=n.forwardRef(({className:a,...r},t)=>e.jsx("th",{ref:t,className:d("h-10 px-3 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",a),...r}));i.displayName="TableHead";const o=n.forwardRef(({className:a,...r},t)=>e.jsx("td",{ref:t,className:d("p-3 align-middle [&:has([role=checkbox])]:pr-0",a),...r}));o.displayName="TableCell";const me=q({name:C().min(1,"请输入名称").max(64),description:C().max(500).optional(),sort_order:de().min(0)});function Ne(){M();const{ready:a}=J(),[r,t]=n.useState([]),[E,v]=n.useState(!0),[R,m]=n.useState(!1),[j,D]=n.useState(null),[k,T]=n.useState(!1),l=Z({resolver:G(me),defaultValues:{name:"",description:"",sort_order:1}}),f=()=>{v(!0),p.boards().then(s=>t(s.boards??[])).catch(s=>c.error(s.message)).finally(()=>v(!1))};n.useEffect(()=>{a&&f()},[a]);const H=()=>{D(null),l.reset({name:"",description:"",sort_order:r.length+1}),m(!0)},I=s=>{D(s),l.reset({name:s.name,description:s.description??"",sort_order:s.sort_order}),m(!0)},z=async s=>{T(!0);try{j?(await p.updateBoard(j.id,s),c.success("板块已更新")):(await p.createBoard(s),c.success("板块已创建")),m(!1),f(),window.dispatchEvent(new Event("boards-refresh"))}catch(x){c.error(x instanceof Error?x.message:"操作失败")}finally{T(!1)}},L=async s=>{try{await p.deleteBoard(s),c.success("板块已删除"),f(),window.dispatchEvent(new Event("boards-refresh"))}catch(x){c.error(x instanceof Error?x.message:"删除失败")}};return a?e.jsxs("div",{className:"admin-page",children:[e.jsx("div",{className:"admin-page-head",children:e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start"},children:[e.jsxs("div",{children:[e.jsx("h1",{children:"板块管理"}),e.jsx("p",{children:"创建、编辑或删除论坛板块,用户发帖前需先有板块"})]}),e.jsxs(h,{onClick:H,children:[e.jsx(ce,{}),"新建板块"]})]})}),e.jsx("div",{className:"admin-card",children:E?e.jsx("div",{className:"flex justify-center py-12",children:e.jsx(A,{size:"lg"})}):e.jsxs(e.Fragment,{children:[e.jsxs(S,{children:[e.jsx(_,{children:e.jsxs(w,{children:[e.jsx(i,{className:"w-[60px]",children:"ID"}),e.jsx(i,{children:"名称"}),e.jsx(i,{children:"简介"}),e.jsx(i,{className:"w-[70px]",children:"排序"}),e.jsx(i,{className:"w-[80px]",children:"帖子数"}),e.jsx(i,{className:"w-[160px]",children:"操作"})]})}),e.jsx(B,{children:r.map(s=>e.jsxs(w,{children:[e.jsx(o,{children:s.id}),e.jsx(o,{children:e.jsx("strong",{children:s.name})}),e.jsx(o,{className:"max-w-[200px] truncate",children:s.description}),e.jsx(o,{children:s.sort_order}),e.jsx(o,{children:e.jsx(Q,{variant:"secondary",children:s.post_count??0})}),e.jsx(o,{children:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(h,{variant:"ghost",size:"sm",onClick:()=>I(s),children:"编辑"}),e.jsxs(ee,{children:[e.jsx(se,{asChild:!0,children:e.jsx(h,{variant:"ghost",size:"sm",className:"text-destructive hover:text-destructive",children:"删除"})}),e.jsxs(ae,{children:[e.jsxs(re,{children:[e.jsx(te,{children:"确定删除该板块?"}),e.jsx(ne,{children:"删除后该板块下的帖子将无法通过板块筛选,此操作不可撤销。"})]}),e.jsxs(le,{children:[e.jsx(ie,{children:"取消"}),e.jsx(oe,{onClick:()=>L(s.id),children:"删除"})]})]})]})]})})]},s.id))})]}),r.length===0&&e.jsx("div",{className:"empty-state",children:e.jsx("p",{children:"还没有板块,点击右上角创建第一个"})})]})}),e.jsx(U,{open:R,onOpenChange:m,children:e.jsxs(W,{children:[e.jsx(X,{children:e.jsx(Y,{children:j?"编辑板块":"新建板块"})}),e.jsx(V,{...l,children:e.jsxs("form",{onSubmit:l.handleSubmit(z),className:"space-y-4",children:[e.jsx(u,{control:l.control,name:"name",render:({field:s})=>e.jsxs(g,{children:[e.jsx(b,{children:"板块名称"}),e.jsx(y,{children:e.jsx(F,{maxLength:64,placeholder:"如:技术交流",...s})}),e.jsx(N,{})]})}),e.jsx(u,{control:l.control,name:"description",render:({field:s})=>e.jsxs(g,{children:[e.jsx(b,{children:"简介"}),e.jsx(y,{children:e.jsx(K,{rows:3,maxLength:500,placeholder:"板块说明(可选)",...s})}),e.jsx(N,{})]})}),e.jsx(u,{control:l.control,name:"sort_order",render:({field:s})=>e.jsxs(g,{children:[e.jsx(b,{children:"排序"}),e.jsx(y,{children:e.jsx(F,{type:"number",min:0,...s})}),e.jsx(N,{})]})}),e.jsxs($,{children:[e.jsx(h,{type:"button",variant:"outline",onClick:()=>m(!1),children:"取消"}),e.jsx(h,{type:"submit",loading:k,children:j?"保存":"创建"})]})]})})]})})]}):e.jsx("div",{className:"flex justify-center py-16",children:e.jsx(A,{size:"lg"})})}export{Ne as default}; +import{r as n,j as e,e as M}from"./react-vendor-1fwFMt02.js";import{_ as O,Z as P,u as Z,a as G,F as V,b as u,c as g,d as b,e as y,f as N,o as q,s as C}from"./form-CB9KBlPG.js";import{f as d,i as J,S as A,B as h,a as p,n as c}from"./index-BCHo3nLu.js";import{I as F}from"./input-Dsk6No-h.js";import{T as K}from"./textarea-BPVvpwYr.js";import{B as Q}from"./badge-C7JnHIoR.js";import{D as U,a as W,b as X,c as Y,e as $}from"./dialog-CXDeMxB9.js";import{A as ee,a as se,b as ae,c as re,d as te,e as ne,f as le,g as ie,h as oe}from"./alert-dialog-C_2cPHgh.js";import{m as ce}from"./ui-vendor-Gb6mai95.js";function de(a){return O(P,a)}const S=n.forwardRef(({className:a,...r},t)=>e.jsx("div",{className:"relative w-full overflow-auto",children:e.jsx("table",{ref:t,className:d("w-full caption-bottom text-sm",a),...r})}));S.displayName="Table";const _=n.forwardRef(({className:a,...r},t)=>e.jsx("thead",{ref:t,className:d("[&_tr]:border-b",a),...r}));_.displayName="TableHeader";const B=n.forwardRef(({className:a,...r},t)=>e.jsx("tbody",{ref:t,className:d("[&_tr:last-child]:border-0",a),...r}));B.displayName="TableBody";const w=n.forwardRef(({className:a,...r},t)=>e.jsx("tr",{ref:t,className:d("border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",a),...r}));w.displayName="TableRow";const i=n.forwardRef(({className:a,...r},t)=>e.jsx("th",{ref:t,className:d("h-10 px-3 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",a),...r}));i.displayName="TableHead";const o=n.forwardRef(({className:a,...r},t)=>e.jsx("td",{ref:t,className:d("p-3 align-middle [&:has([role=checkbox])]:pr-0",a),...r}));o.displayName="TableCell";const me=q({name:C().min(1,"请输入名称").max(64),description:C().max(500).optional(),sort_order:de().min(0)});function Ne(){M();const{ready:a}=J(),[r,t]=n.useState([]),[E,v]=n.useState(!0),[R,m]=n.useState(!1),[j,D]=n.useState(null),[k,T]=n.useState(!1),l=Z({resolver:G(me),defaultValues:{name:"",description:"",sort_order:1}}),f=()=>{v(!0),p.boards().then(s=>t(s.boards??[])).catch(s=>c.error(s.message)).finally(()=>v(!1))};n.useEffect(()=>{a&&f()},[a]);const H=()=>{D(null),l.reset({name:"",description:"",sort_order:r.length+1}),m(!0)},I=s=>{D(s),l.reset({name:s.name,description:s.description??"",sort_order:s.sort_order}),m(!0)},z=async s=>{T(!0);try{j?(await p.updateBoard(j.id,s),c.success("板块已更新")):(await p.createBoard(s),c.success("板块已创建")),m(!1),f(),window.dispatchEvent(new Event("boards-refresh"))}catch(x){c.error(x instanceof Error?x.message:"操作失败")}finally{T(!1)}},L=async s=>{try{await p.deleteBoard(s),c.success("板块已删除"),f(),window.dispatchEvent(new Event("boards-refresh"))}catch(x){c.error(x instanceof Error?x.message:"删除失败")}};return a?e.jsxs("div",{className:"admin-page",children:[e.jsx("div",{className:"admin-page-head",children:e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start"},children:[e.jsxs("div",{children:[e.jsx("h1",{children:"板块管理"}),e.jsx("p",{children:"创建、编辑或删除论坛板块,用户发帖前需先有板块"})]}),e.jsxs(h,{onClick:H,children:[e.jsx(ce,{}),"新建板块"]})]})}),e.jsx("div",{className:"admin-card",children:E?e.jsx("div",{className:"flex justify-center py-12",children:e.jsx(A,{size:"lg"})}):e.jsxs(e.Fragment,{children:[e.jsxs(S,{children:[e.jsx(_,{children:e.jsxs(w,{children:[e.jsx(i,{className:"w-[60px]",children:"ID"}),e.jsx(i,{children:"名称"}),e.jsx(i,{children:"简介"}),e.jsx(i,{className:"w-[70px]",children:"排序"}),e.jsx(i,{className:"w-[80px]",children:"帖子数"}),e.jsx(i,{className:"w-[160px]",children:"操作"})]})}),e.jsx(B,{children:r.map(s=>e.jsxs(w,{children:[e.jsx(o,{children:s.id}),e.jsx(o,{children:e.jsx("strong",{children:s.name})}),e.jsx(o,{className:"max-w-[200px] truncate",children:s.description}),e.jsx(o,{children:s.sort_order}),e.jsx(o,{children:e.jsx(Q,{variant:"secondary",children:s.post_count??0})}),e.jsx(o,{children:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(h,{variant:"ghost",size:"sm",onClick:()=>I(s),children:"编辑"}),e.jsxs(ee,{children:[e.jsx(se,{asChild:!0,children:e.jsx(h,{variant:"ghost",size:"sm",className:"text-destructive hover:text-destructive",children:"删除"})}),e.jsxs(ae,{children:[e.jsxs(re,{children:[e.jsx(te,{children:"确定删除该板块?"}),e.jsx(ne,{children:"删除后该板块下的帖子将无法通过板块筛选,此操作不可撤销。"})]}),e.jsxs(le,{children:[e.jsx(ie,{children:"取消"}),e.jsx(oe,{onClick:()=>L(s.id),children:"删除"})]})]})]})]})})]},s.id))})]}),r.length===0&&e.jsx("div",{className:"empty-state",children:e.jsx("p",{children:"还没有板块,点击右上角创建第一个"})})]})}),e.jsx(U,{open:R,onOpenChange:m,children:e.jsxs(W,{children:[e.jsx(X,{children:e.jsx(Y,{children:j?"编辑板块":"新建板块"})}),e.jsx(V,{...l,children:e.jsxs("form",{onSubmit:l.handleSubmit(z),className:"space-y-4",children:[e.jsx(u,{control:l.control,name:"name",render:({field:s})=>e.jsxs(g,{children:[e.jsx(b,{children:"板块名称"}),e.jsx(y,{children:e.jsx(F,{maxLength:64,placeholder:"如:技术交流",...s})}),e.jsx(N,{})]})}),e.jsx(u,{control:l.control,name:"description",render:({field:s})=>e.jsxs(g,{children:[e.jsx(b,{children:"简介"}),e.jsx(y,{children:e.jsx(K,{rows:3,maxLength:500,placeholder:"板块说明(可选)",...s})}),e.jsx(N,{})]})}),e.jsx(u,{control:l.control,name:"sort_order",render:({field:s})=>e.jsxs(g,{children:[e.jsx(b,{children:"排序"}),e.jsx(y,{children:e.jsx(F,{type:"number",min:0,...s})}),e.jsx(N,{})]})}),e.jsxs($,{children:[e.jsx(h,{type:"button",variant:"outline",onClick:()=>m(!1),children:"取消"}),e.jsx(h,{type:"submit",loading:k,children:j?"保存":"创建"})]})]})})]})})]}):e.jsx("div",{className:"flex justify-center py-16",children:e.jsx(A,{size:"lg"})})}export{Ne as default}; diff --git a/embed_static/static/spa/assets/ComposePage-DOjc4_kJ.js b/embed_static/static/spa/assets/ComposePage-CW_vWd31.js similarity index 99% rename from embed_static/static/spa/assets/ComposePage-DOjc4_kJ.js rename to embed_static/static/spa/assets/ComposePage-CW_vWd31.js index 5cc303b..f8c30df 100644 --- a/embed_static/static/spa/assets/ComposePage-DOjc4_kJ.js +++ b/embed_static/static/spa/assets/ComposePage-CW_vWd31.js @@ -1,4 +1,4 @@ -var ap=Object.defineProperty;var cp=(n,e,t)=>e in n?ap(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var V=(n,e,t)=>cp(n,typeof e!="symbol"?e+"":e,t);import{r as N,k as Ft,j as b,a as up,m as dp,e as hp,w as fp,i as pp}from"./react-vendor-1fwFMt02.js";import{B as gi,f as Yl,a as en,n as He,u as mp,h as gp,S as Xl}from"./index-kfMSnNdB.js";import{P as lu,r as yp,i as kp}from"./postContent-ClrHK1rL.js";import{p as au}from"./purify-vendor-Cx4rtWv4.js";import{O as to,Q as bp,V as Ql,W as Zl,Y as ea,Z as ta,_ as na,$ as ra,a0 as sa,a1 as ia,a2 as oa,a3 as la,a4 as aa,a5 as xp,a6 as Sp,B as wp,D as vp,A as Ep,x as Cp,a7 as Tp}from"./ui-vendor-Gb6mai95.js";import{D as Mp,a as Ap,b as Np,c as Op,d as Rp,e as Ip}from"./dialog-DJohwkVv.js";import{I as Dp}from"./input-BjHCK3cg.js";var cu={exports:{}},uu={};/** +var ap=Object.defineProperty;var cp=(n,e,t)=>e in n?ap(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var V=(n,e,t)=>cp(n,typeof e!="symbol"?e+"":e,t);import{r as N,k as Ft,j as b,a as up,m as dp,e as hp,w as fp,i as pp}from"./react-vendor-1fwFMt02.js";import{B as gi,f as Yl,a as en,n as He,h as mp,u as gp,S as Xl}from"./index-BCHo3nLu.js";import{P as lu,r as yp,i as kp}from"./postContent-ClrHK1rL.js";import{p as au}from"./purify-vendor-Cx4rtWv4.js";import{O as to,Q as bp,V as Ql,W as Zl,Y as ea,Z as ta,_ as na,$ as ra,a0 as sa,a1 as ia,a2 as oa,a3 as la,a4 as aa,a5 as xp,a6 as Sp,B as wp,D as vp,A as Ep,x as Cp,a7 as Tp}from"./ui-vendor-Gb6mai95.js";import{D as Mp,a as Ap,b as Np,c as Op,d as Rp,e as Ip}from"./dialog-CXDeMxB9.js";import{I as Dp}from"./input-Dsk6No-h.js";var cu={exports:{}},uu={};/** * @license React * use-sync-external-store-shim.production.js * diff --git a/embed_static/static/spa/assets/FavoritesPage-C0oxHajd.js b/embed_static/static/spa/assets/FavoritesPage-CZ210yAP.js similarity index 89% rename from embed_static/static/spa/assets/FavoritesPage-C0oxHajd.js rename to embed_static/static/spa/assets/FavoritesPage-CZ210yAP.js index 8632751..c8cb055 100644 --- a/embed_static/static/spa/assets/FavoritesPage-C0oxHajd.js +++ b/embed_static/static/spa/assets/FavoritesPage-CZ210yAP.js @@ -1 +1 @@ -import{e as j,r as n,j as s}from"./react-vendor-1fwFMt02.js";import{u as f,a as g,n as N,S as v,B as m}from"./index-kfMSnNdB.js";import{f as y}from"./content-BrFHUpp8.js";import{A as k}from"./ui-vendor-Gb6mai95.js";function S(){const a=j(),{user:t,loading:i}=f(),[r,h]=n.useState([]),[u,x]=n.useState(!0);return n.useEffect(()=>{if(!i){if(!t){a("/login");return}g.favorites().then(e=>h(Array.isArray(e.favorites)?e.favorites:[])).catch(e=>N.error(e.message)).finally(()=>x(!1))}},[t,i,a]),i||u?s.jsx("div",{className:"flex justify-center py-16",children:s.jsx(v,{size:"lg"})}):t?s.jsx("div",{className:"page-wrap",children:s.jsxs("div",{className:"page-inner-wide",children:[s.jsxs(m,{variant:"ghost",className:"mb-3",onClick:()=>a("/"),children:[s.jsx(k,{}),"返回"]}),s.jsx("h1",{className:"page-title",children:"我的收藏"}),s.jsxs("p",{className:"page-desc",children:["共 ",r.length," 篇收藏帖子"]}),r.length===0?s.jsxs("div",{className:"empty-state",children:[s.jsx("p",{children:"还没有收藏任何帖子"}),s.jsx(m,{onClick:()=>a("/"),children:"去逛逛"})]}):s.jsx("div",{className:"content-surface",children:r.map(e=>{var o,l,c,d,p;return s.jsx("div",{className:"post-row",onClick:()=>a(`/post/${e.post_id}`),children:s.jsxs("div",{className:"post-body",children:[s.jsx("div",{className:"post-title",children:((o=e.post)==null?void 0:o.title)||"帖子已删除"}),s.jsxs("div",{className:"post-meta",children:[((c=(l=e.post)==null?void 0:l.board)==null?void 0:c.name)&&s.jsx("span",{children:e.post.board.name}),((p=(d=e.post)==null?void 0:d.user)==null?void 0:p.nickname)&&s.jsx("span",{children:e.post.user.nickname}),s.jsxs("span",{children:["收藏于 ",y(e.created_at)]})]})]})},e.id)})})]})}):null}export{S as default}; +import{e as j,r as n,j as s}from"./react-vendor-1fwFMt02.js";import{h as f,a as g,n as N,S as v,B as m}from"./index-BCHo3nLu.js";import{f as y}from"./content-BrFHUpp8.js";import{A as k}from"./ui-vendor-Gb6mai95.js";function S(){const a=j(),{user:t,loading:i}=f(),[r,h]=n.useState([]),[x,u]=n.useState(!0);return n.useEffect(()=>{if(!i){if(!t){a("/login");return}g.favorites().then(e=>h(Array.isArray(e.favorites)?e.favorites:[])).catch(e=>N.error(e.message)).finally(()=>u(!1))}},[t,i,a]),i||x?s.jsx("div",{className:"flex justify-center py-16",children:s.jsx(v,{size:"lg"})}):t?s.jsx("div",{className:"page-wrap",children:s.jsxs("div",{className:"page-inner-wide",children:[s.jsxs(m,{variant:"ghost",className:"mb-3",onClick:()=>a("/"),children:[s.jsx(k,{}),"返回"]}),s.jsx("h1",{className:"page-title",children:"我的收藏"}),s.jsxs("p",{className:"page-desc",children:["共 ",r.length," 篇收藏帖子"]}),r.length===0?s.jsxs("div",{className:"empty-state",children:[s.jsx("p",{children:"还没有收藏任何帖子"}),s.jsx(m,{onClick:()=>a("/"),children:"去逛逛"})]}):s.jsx("div",{className:"content-surface",children:r.map(e=>{var o,l,c,d,p;return s.jsx("div",{className:"post-row",onClick:()=>a(`/post/${e.post_id}`),children:s.jsxs("div",{className:"post-body",children:[s.jsx("div",{className:"post-title",children:((o=e.post)==null?void 0:o.title)||"帖子已删除"}),s.jsxs("div",{className:"post-meta",children:[((c=(l=e.post)==null?void 0:l.board)==null?void 0:c.name)&&s.jsx("span",{children:e.post.board.name}),((p=(d=e.post)==null?void 0:d.user)==null?void 0:p.nickname)&&s.jsx("span",{children:e.post.user.nickname}),s.jsxs("span",{children:["收藏于 ",y(e.created_at)]})]})]})},e.id)})})]})}):null}export{S as default}; diff --git a/embed_static/static/spa/assets/HomePage-Bk9P_MHc.js b/embed_static/static/spa/assets/HomePage-Bk9P_MHc.js deleted file mode 100644 index e04de73..0000000 --- a/embed_static/static/spa/assets/HomePage-Bk9P_MHc.js +++ /dev/null @@ -1 +0,0 @@ -import{j as e,r as a,e as B,g as W,i as Y,v as q}from"./react-vendor-1fwFMt02.js";import{S as G,p as J,g as S,c as Q,a as A,n as X,s as Z,F as V,b as C,d as ee,e as se}from"./index-kfMSnNdB.js";import{u as te}from"./virtual-vendor-DDSEW9eW.js";import{B as re}from"./badge-C0Go598m.js";import{P as ae}from"./PinnedIcon-wXBQDLix.js";import{f as $}from"./content-BrFHUpp8.js";import"./ui-vendor-Gb6mai95.js";function ne({post:r,sort:f="latest",onClick:h}){var i,s,t,o;const c=((s=(i=r.user)==null?void 0:i.nickname)==null?void 0:s[0])||"?",l=f==="reply"?r.last_reply_at?`${$(r.last_reply_at)} 回复`:"暂无回复":$(r.created_at);return e.jsxs("div",{className:"post-row",onClick:h,children:[e.jsx("div",{className:"post-avatar",children:(t=r.user)!=null&&t.avatar?e.jsx("img",{src:r.user.avatar,alt:""}):c}),e.jsxs("div",{className:"post-body",children:[e.jsxs("div",{className:"post-title",children:[r.pinned&&e.jsx(ae,{className:"mr-1.5"}),r.title]}),e.jsxs("div",{className:"post-meta",children:[r.board&&e.jsx(re,{variant:"green",children:r.board.name}),e.jsx("span",{children:((o=r.user)==null?void 0:o.nickname)||"匿名"}),e.jsx("span",{children:l})]})]}),e.jsxs("div",{className:"post-stats",children:[e.jsxs("span",{children:["💬 ",r.comment_count??0]}),e.jsxs("span",{children:["👍 ",r.like_count??0]})]})]})}function ce({posts:r,sort:f="latest",loading:h,hasMore:c,onLoadMore:l,onSelect:i,restoreScrollTop:s,resetScrollKey:t=0,onScrollTopChange:o,onScrollRestored:p}){const x=a.useRef(null),g=a.useRef(!1),j=te({count:r.length,getScrollElement:()=>x.current,estimateSize:()=>72,overscan:8});return a.useLayoutEffect(()=>{if(t<=0)return;const d=x.current;d&&(d.scrollTop=0,j.scrollToOffset(0)),g.current=!0,o==null||o(0)},[t,j,o]),a.useLayoutEffect(()=>{s==null||g.current||r.length===0||(j.scrollToOffset(s),g.current=!0,p==null||p())},[s,r.length,j,p]),a.useEffect(()=>{g.current=!1},[s]),a.useEffect(()=>{const d=x.current;if(!d)return;const v=()=>{o==null||o(d.scrollTop),d.scrollTop+d.clientHeight>=d.scrollHeight-120&&c&&!h&&l()};return d.addEventListener("scroll",v),()=>d.removeEventListener("scroll",v)},[c,h,l,o]),e.jsxs("div",{className:"post-list-scroll",ref:x,children:[e.jsx("div",{className:"content-surface",style:{height:j.getTotalSize(),position:"relative"},children:j.getVirtualItems().map(d=>{const v=r[d.index];return e.jsx("div",{style:{position:"absolute",top:0,left:0,width:"100%",transform:`translateY(${d.start}px)`},children:e.jsx(ne,{post:v,sort:f,onClick:()=>i(v.id)})},v.id)})}),h&&e.jsx("div",{className:"flex justify-center py-4",children:e.jsx(G,{})}),!h&&!c&&r.length>0&&e.jsx("div",{style:{textAlign:"center",padding:6,fontSize:12,color:"var(--color-text-3)"},children:"— 已加载全部 —"})]})}function oe({boardId:r,keyword:f,boards:h,stats:c,postTotal:l}){const i=B(),s=h.find(p=>p.id===r),t=f?`搜索:${f}`:r&&s?s.name:"全部帖子",o=r&&s&&s.description||"";return e.jsxs("div",{className:`feed-head${f?" feed-head--solo":""}`,children:[e.jsxs("div",{className:"feed-head__title",children:[e.jsx("h2",{title:o||void 0,children:t}),!f&&c&&e.jsxs("span",{className:"feed-head__meta",children:["会员 ",e.jsx("strong",{children:c.users}),e.jsx("span",{className:"feed-head__dot","aria-hidden":!0,children:"·"}),"帖子 ",e.jsx("strong",{children:c.posts}),e.jsx("span",{className:"feed-head__dot","aria-hidden":!0,children:"·"}),"板块 ",e.jsx("strong",{children:c.boards})]})]}),f&&e.jsx("button",{type:"button",className:"feed-head__clear",onClick:()=>i("/"),children:"清除搜索"}),f&&e.jsxs("span",{className:"feed-toolbar__count",children:["共 ",l," 条"]})]})}function pe(){const r=B(),f=W(),[h]=Y(),c=q(),l=Number(h.get("board"))||(c==null?void 0:c.boardId)||0,i=h.get("keyword")||"",s=J(h.get("sort")),t=S(l,i,s),[o,p]=a.useState(()=>(t==null?void 0:t.posts)??[]),[x,g]=a.useState(()=>(t==null?void 0:t.postTotal)??0),[j,d]=a.useState(()=>(t==null?void 0:t.page)??1),[v,w]=a.useState(()=>(t==null?void 0:t.hasMore)??!0),[L,k]=a.useState(()=>!t),[I,F]=a.useState(()=>(t==null?void 0:t.scrollTop)??null),[M,O]=a.useState(0),E=a.useRef((t==null?void 0:t.scrollTop)??0),P=a.useRef(null),T=a.useRef(!1),z=a.useCallback(()=>{var n;F(null),E.current=0,O(u=>u+1),(n=P.current)==null||n.scrollTo(0)},[]),b=a.useCallback(()=>{T.current=!0,Q(),z()},[z]),_=a.useCallback(async(n,u=!1)=>{k(!0);try{const m=await A.posts({page:n,size:30,board_id:l||"",keyword:i,sort:s==="latest"?"":s}),y=Array.isArray(m.posts)?m.posts:[];p(N=>u?y:[...N,...y]),g(m.total??0),w(!!m.has_more),d(n)}catch(m){X.error(m instanceof Error?m.message:"加载失败"),u&&p([])}finally{k(!1)}},[l,i,s]),H=a.useCallback(async n=>{try{const u=[];let m=0,y=!0;for(let N=1;N<=n;N++){const R=await A.posts({page:N,size:30,board_id:l||"",keyword:i,sort:s==="latest"?"":s}),U=Array.isArray(R.posts)?R.posts:[];if(u.push(...U),m=R.total??0,y=!!R.has_more,!R.has_more)break}p(u),g(m),w(y),d(n)}catch{}},[l,i,s]);a.useEffect(()=>{var m;if((m=f.state)==null?void 0:m.refreshFeed){b(),_(1,!0);return}const u=S(l,i,s);if(u){p(u.posts),g(u.postTotal),d(u.page),w(u.hasMore),F(u.scrollTop),E.current=u.scrollTop,k(!1),H(u.page);return}F(null),E.current=0,_(1,!0)},[l,i,s,f.key,f.state,_,H,b]),a.useEffect(()=>()=>{T.current||o.length===0||Z(l,i,s,{posts:o,postTotal:x,page:j,hasMore:v,scrollTop:E.current})},[l,i,s,o,x,j,v]),a.useEffect(()=>{!L&&o.length>0&&(T.current=!1)},[L,o.length]),a.useEffect(()=>{const n=()=>{b()};return window.addEventListener(V,n),()=>window.removeEventListener(V,n)},[b]),a.useEffect(()=>{const n=()=>{b(),_(1,!0)};return window.addEventListener("posts-refresh",n),()=>window.removeEventListener("posts-refresh",n)},[b,_]);const K=n=>{if(n===s){b(),_(1,!0);return}ee(r,se(l,n))},D=!i;return e.jsxs("div",{className:"page-wrap",ref:P,children:[e.jsxs("div",{className:"feed-top",children:[e.jsx(oe,{boardId:l,keyword:i,boards:(c==null?void 0:c.boards)??[],stats:(c==null?void 0:c.stats)??null,postTotal:x}),D&&e.jsx(C,{value:s,onChange:K,postTotal:x})]}),e.jsx(ce,{posts:o,sort:s,loading:L,hasMore:v,onLoadMore:()=>!L&&v&&_(j+1),onSelect:n=>r(`/post/${n}`),restoreScrollTop:I,resetScrollKey:M,onScrollTopChange:n=>{E.current=n},onScrollRestored:()=>F(null)})]})}export{pe as default}; diff --git a/embed_static/static/spa/assets/HomePage-DTZV5yFZ.js b/embed_static/static/spa/assets/HomePage-DTZV5yFZ.js new file mode 100644 index 0000000..4fb0559 --- /dev/null +++ b/embed_static/static/spa/assets/HomePage-DTZV5yFZ.js @@ -0,0 +1 @@ +import{j as e,r as t,e as O,g as J,i as Q,v as X}from"./react-vendor-1fwFMt02.js";import{S as Z,B as C,u as ee,p as se,g as V,c as te,a as $,n as re,s as ae,F as A,b as ne,d as oe,e as ce}from"./index-BCHo3nLu.js";import{u as le}from"./virtual-vendor-DDSEW9eW.js";import{B as ie}from"./badge-C7JnHIoR.js";import{P as de}from"./PinnedIcon-BrdtSFOl.js";import{f as M}from"./content-BrFHUpp8.js";import"./ui-vendor-Gb6mai95.js";function ue({post:s,sort:u="latest",onClick:h}){var g,f,_,c;const o=((f=(g=s.user)==null?void 0:g.nickname)==null?void 0:f[0])||"?",v=u==="reply"?s.last_reply_at?`${M(s.last_reply_at)} 回复`:"暂无回复":M(s.created_at);return e.jsxs("div",{className:"post-row",onClick:h,children:[e.jsx("div",{className:"post-avatar",children:(_=s.user)!=null&&_.avatar?e.jsx("img",{src:s.user.avatar,alt:""}):o}),e.jsxs("div",{className:"post-body",children:[e.jsxs("div",{className:"post-title",children:[s.pinned&&e.jsx(de,{className:"mr-1.5"}),s.title]}),e.jsxs("div",{className:"post-meta",children:[s.board&&e.jsx(ie,{variant:"green",children:s.board.name}),e.jsx("span",{children:((c=s.user)==null?void 0:c.nickname)||"匿名"}),e.jsx("span",{children:v})]})]}),e.jsxs("div",{className:"post-stats",children:[e.jsxs("span",{children:["💬 ",s.comment_count??0]}),e.jsxs("span",{children:["👍 ",s.like_count??0]})]})]})}function fe({posts:s,sort:u="latest",loading:h,hasMore:o,canAutoLoad:v,postTotal:g,onLoadMore:f,onSelect:_,restoreScrollTop:c,resetScrollKey:l=0,onScrollTopChange:n,onScrollRestored:r}){const p=t.useRef(null),b=t.useRef(!1),x=le({count:s.length,getScrollElement:()=>p.current,estimateSize:()=>72,overscan:8}),R=o&&!v&&!h,E=!o&&s.length>0&&!h;return t.useLayoutEffect(()=>{if(l<=0)return;const i=p.current;i&&(i.scrollTop=0,x.scrollToOffset(0)),b.current=!0,n==null||n(0)},[l,x,n]),t.useLayoutEffect(()=>{c==null||b.current||s.length===0||(x.scrollToOffset(c),b.current=!0,r==null||r())},[c,s.length,x,r]),t.useEffect(()=>{b.current=!1},[c]),t.useEffect(()=>{const i=p.current;if(!i)return;const m=()=>{n==null||n(i.scrollTop),i.scrollTop+i.clientHeight>=i.scrollHeight-120&&v&&o&&!h&&f()};return i.addEventListener("scroll",m),()=>i.removeEventListener("scroll",m)},[v,o,h,f,n]),e.jsxs("div",{className:"post-list-scroll",ref:p,children:[e.jsx("div",{className:"content-surface",style:{height:x.getTotalSize(),position:"relative"},children:x.getVirtualItems().map(i=>{const m=s[i.index];return e.jsx("div",{style:{position:"absolute",top:0,left:0,width:"100%",transform:`translateY(${i.start}px)`},children:e.jsx(ue,{post:m,sort:u,onClick:()=>_(m.id)})},m.id)})}),h&&e.jsx("div",{className:"feed-list-footer",children:e.jsx(Z,{})}),R&&e.jsxs("div",{className:"feed-list-footer feed-list-footer--history",children:[e.jsxs("p",{className:"feed-list-footer__hint",children:["已显示 ",s.length," / ",g," 条"]}),e.jsx(C,{type:"button",variant:"outline",size:"sm",onClick:f,children:"加载更多历史"})]}),E&&e.jsx("div",{className:"feed-list-footer feed-list-footer--end",children:"— 已加载全部 —"})]})}function me({boardId:s,keyword:u,boards:h,stats:o,postTotal:v}){const g=O(),f=h.find(l=>l.id===s),_=u?`搜索:${u}`:s&&f?f.name:"全部帖子",c=s&&f&&f.description||"";return e.jsxs("div",{className:`feed-head${u?" feed-head--solo":""}`,children:[e.jsxs("div",{className:"feed-head__title",children:[e.jsx("h2",{title:c||void 0,children:_}),!u&&o&&e.jsxs("span",{className:"feed-head__meta",children:["会员 ",e.jsx("strong",{children:o.users}),e.jsx("span",{className:"feed-head__dot","aria-hidden":!0,children:"·"}),"帖子 ",e.jsx("strong",{children:o.posts}),e.jsx("span",{className:"feed-head__dot","aria-hidden":!0,children:"·"}),"板块 ",e.jsx("strong",{children:o.boards})]})]}),u&&e.jsx("button",{type:"button",className:"feed-head__clear",onClick:()=>g("/"),children:"清除搜索"}),u&&e.jsxs("span",{className:"feed-toolbar__count",children:["共 ",v," 条"]})]})}function be(){const s=O(),u=J(),[h]=Q(),o=X(),{limits:v}=ee(),g=v.page_size_default,f=v.feed_max_pages,_=v.feed_max_items,c=Number(h.get("board"))||(o==null?void 0:o.boardId)||0,l=h.get("keyword")||"",n=se(h.get("sort")),r=V(c,l,n),[p,b]=t.useState(()=>(r==null?void 0:r.posts)??[]),[x,R]=t.useState(()=>(r==null?void 0:r.postTotal)??0),[E,i]=t.useState(()=>(r==null?void 0:r.page)??1),[m,k]=t.useState(()=>(r==null?void 0:r.hasMore)??!0),[F,z]=t.useState(()=>!r),[K,P]=t.useState(()=>(r==null?void 0:r.scrollTop)??null),[D,U]=t.useState(0),L=t.useRef((r==null?void 0:r.scrollTop)??0),S=t.useRef(null),T=t.useRef(!1),W=t.useMemo(()=>m&&E{var a;P(null),L.current=0,U(d=>d+1),(a=S.current)==null||a.scrollTo(0)},[]),y=t.useCallback(()=>{T.current=!0,te(),B()},[B]),N=t.useCallback(async(a,d=!1)=>{z(!0);try{const j=await $.posts({page:a,size:g,board_id:c||"",keyword:l,sort:n==="latest"?"":n}),w=Array.isArray(j.posts)?j.posts:[];b(H=>d?w:[...H,...w]),R(j.total??0),k(!!j.has_more),i(a)}catch(j){re.error(j instanceof Error?j.message:"加载失败"),d&&b([])}finally{z(!1)}},[c,l,n,g]),I=t.useCallback(async()=>{try{const a=await $.posts({page:1,size:g,board_id:c||"",keyword:l,sort:n==="latest"?"":n}),d=Array.isArray(a.posts)?a.posts:[],j=new Set(d.map(w=>w.id));b(w=>[...d,...w.filter(H=>!j.has(H.id))]),R(a.total??0),k(!!a.has_more)}catch{}},[c,l,n,g]),Y=t.useCallback(()=>{F||!m||N(E+1)},[F,m,E,N]);t.useEffect(()=>{var j;if((j=u.state)==null?void 0:j.refreshFeed){y(),N(1,!0);return}const d=V(c,l,n);if(d){b(d.posts),R(d.postTotal),i(d.page),k(d.hasMore),P(d.scrollTop),L.current=d.scrollTop,z(!1),I();return}P(null),L.current=0,N(1,!0)},[c,l,n,u.key,u.state,N,I,y]),t.useEffect(()=>()=>{T.current||p.length===0||ae(c,l,n,{posts:p,postTotal:x,page:E,hasMore:m,scrollTop:L.current})},[c,l,n,p,x,E,m]),t.useEffect(()=>{!F&&p.length>0&&(T.current=!1)},[F,p.length]),t.useEffect(()=>{const a=()=>{y()};return window.addEventListener(A,a),()=>window.removeEventListener(A,a)},[y]),t.useEffect(()=>{const a=()=>{y(),N(1,!0)};return window.addEventListener("posts-refresh",a),()=>window.removeEventListener("posts-refresh",a)},[y,N]);const q=a=>{if(a===n){y(),N(1,!0);return}oe(s,ce(c,a))},G=!l;return e.jsxs("div",{className:"page-wrap",ref:S,children:[e.jsxs("div",{className:"feed-top",children:[e.jsx(me,{boardId:c,keyword:l,boards:(o==null?void 0:o.boards)??[],stats:(o==null?void 0:o.stats)??null,postTotal:x}),G&&e.jsx(ne,{value:n,onChange:q,postTotal:x})]}),e.jsx(fe,{posts:p,sort:n,loading:F,hasMore:m,canAutoLoad:W,postTotal:x,onLoadMore:Y,onSelect:a=>s(`/post/${a}`),restoreScrollTop:K,resetScrollKey:D,onScrollTopChange:a=>{L.current=a},onScrollRestored:()=>P(null)})]})}export{be as default}; diff --git a/embed_static/static/spa/assets/LoginPage-CCZinbxI.js b/embed_static/static/spa/assets/LoginPage-puDI4GYE.js similarity index 89% rename from embed_static/static/spa/assets/LoginPage-CCZinbxI.js rename to embed_static/static/spa/assets/LoginPage-puDI4GYE.js index b83ed26..46bd8f1 100644 --- a/embed_static/static/spa/assets/LoginPage-CCZinbxI.js +++ b/embed_static/static/spa/assets/LoginPage-puDI4GYE.js @@ -1 +1 @@ -import{e as f,r as g,j as s,L as b}from"./react-vendor-1fwFMt02.js";import{u as w,a as F,F as y,b as t,c as n,d as l,e as c,f as i,o as N,s as m}from"./form-PYX6hP9B.js";import{u as v,B as L,a as S,n as d}from"./index-kfMSnNdB.js";import{I as u}from"./input-BjHCK3cg.js";import"./ui-vendor-Gb6mai95.js";const C=N({username:m().min(1,"请输入用户名"),password:m().min(1,"请输入密码")});function z(){const x=f(),{refresh:p}=v(),[h,a]=g.useState(!1),r=w({resolver:F(C),defaultValues:{username:"",password:""}}),j=async e=>{a(!0);try{await S.login(e.username,e.password),await p(),d.success("登录成功"),x("/",{replace:!0})}catch(o){d.error(o instanceof Error?o.message:"登录失败")}finally{a(!1)}};return s.jsx("div",{className:"auth-page",children:s.jsxs("div",{className:"auth-box",children:[s.jsx("div",{className:"logo-mark",children:"姜"}),s.jsx("h1",{children:"登录姜十三论坛"}),s.jsx("p",{className:"subtitle",children:"拾三一隅,自在交流"}),s.jsx(y,{...r,children:s.jsxs("form",{onSubmit:r.handleSubmit(j),className:"space-y-4",children:[s.jsx(t,{control:r.control,name:"username",render:({field:e})=>s.jsxs(n,{children:[s.jsx(l,{children:"用户名"}),s.jsx(c,{children:s.jsx(u,{placeholder:"用户名",autoComplete:"username",...e})}),s.jsx(i,{})]})}),s.jsx(t,{control:r.control,name:"password",render:({field:e})=>s.jsxs(n,{children:[s.jsx(l,{children:"密码"}),s.jsx(c,{children:s.jsx(u,{type:"password",placeholder:"密码",autoComplete:"current-password",...e})}),s.jsx(i,{})]})}),s.jsx(L,{type:"submit",className:"w-full",loading:h,children:"登录"})]})}),s.jsxs("p",{style:{textAlign:"center",marginTop:16,fontSize:13,color:"var(--color-text-3)"},children:["没有账号?",s.jsx(b,{to:"/register",children:"注册"})]})]})})}export{z as default}; +import{e as f,r as g,j as s,L as b}from"./react-vendor-1fwFMt02.js";import{u as w,a as F,F as y,b as t,c as n,d as l,e as c,f as i,o as N,s as m}from"./form-CB9KBlPG.js";import{h as v,B as L,a as S,n as d}from"./index-BCHo3nLu.js";import{I as u}from"./input-Dsk6No-h.js";import"./ui-vendor-Gb6mai95.js";const C=N({username:m().min(1,"请输入用户名"),password:m().min(1,"请输入密码")});function z(){const x=f(),{refresh:p}=v(),[h,a]=g.useState(!1),r=w({resolver:F(C),defaultValues:{username:"",password:""}}),j=async e=>{a(!0);try{await S.login(e.username,e.password),await p(),d.success("登录成功"),x("/",{replace:!0})}catch(o){d.error(o instanceof Error?o.message:"登录失败")}finally{a(!1)}};return s.jsx("div",{className:"auth-page",children:s.jsxs("div",{className:"auth-box",children:[s.jsx("div",{className:"logo-mark",children:"姜"}),s.jsx("h1",{children:"登录姜十三论坛"}),s.jsx("p",{className:"subtitle",children:"拾三一隅,自在交流"}),s.jsx(y,{...r,children:s.jsxs("form",{onSubmit:r.handleSubmit(j),className:"space-y-4",children:[s.jsx(t,{control:r.control,name:"username",render:({field:e})=>s.jsxs(n,{children:[s.jsx(l,{children:"用户名"}),s.jsx(c,{children:s.jsx(u,{placeholder:"用户名",autoComplete:"username",...e})}),s.jsx(i,{})]})}),s.jsx(t,{control:r.control,name:"password",render:({field:e})=>s.jsxs(n,{children:[s.jsx(l,{children:"密码"}),s.jsx(c,{children:s.jsx(u,{type:"password",placeholder:"密码",autoComplete:"current-password",...e})}),s.jsx(i,{})]})}),s.jsx(L,{type:"submit",className:"w-full",loading:h,children:"登录"})]})}),s.jsxs("p",{style:{textAlign:"center",marginTop:16,fontSize:13,color:"var(--color-text-3)"},children:["没有账号?",s.jsx(b,{to:"/register",children:"注册"})]})]})})}export{z as default}; diff --git a/embed_static/static/spa/assets/PinnedIcon-wXBQDLix.js b/embed_static/static/spa/assets/PinnedIcon-BrdtSFOl.js similarity index 78% rename from embed_static/static/spa/assets/PinnedIcon-wXBQDLix.js rename to embed_static/static/spa/assets/PinnedIcon-BrdtSFOl.js index a55de1d..2d9d74e 100644 --- a/embed_static/static/spa/assets/PinnedIcon-wXBQDLix.js +++ b/embed_static/static/spa/assets/PinnedIcon-BrdtSFOl.js @@ -1 +1 @@ -import{j as n}from"./react-vendor-1fwFMt02.js";import{f as i}from"./index-kfMSnNdB.js";import{N as s}from"./ui-vendor-Gb6mai95.js";function m({className:o,size:r=16}){return n.jsx(s,{className:i("post-pinned-icon",o),size:r,fill:"currentColor","aria-label":"置顶",role:"img"})}export{m as P}; +import{j as n}from"./react-vendor-1fwFMt02.js";import{f as i}from"./index-BCHo3nLu.js";import{N as s}from"./ui-vendor-Gb6mai95.js";function m({className:o,size:r=16}){return n.jsx(s,{className:i("post-pinned-icon",o),size:r,fill:"currentColor","aria-label":"置顶",role:"img"})}export{m as P}; diff --git a/embed_static/static/spa/assets/PostDetailPage-BXxbrPMM.js b/embed_static/static/spa/assets/PostDetailPage-fhZ7iAmD.js similarity index 99% rename from embed_static/static/spa/assets/PostDetailPage-BXxbrPMM.js rename to embed_static/static/spa/assets/PostDetailPage-fhZ7iAmD.js index 0cb85c2..dfc48a5 100644 --- a/embed_static/static/spa/assets/PostDetailPage-BXxbrPMM.js +++ b/embed_static/static/spa/assets/PostDetailPage-fhZ7iAmD.js @@ -1,4 +1,4 @@ -import{j as t,r as m,e as je,w as qe}from"./react-vendor-1fwFMt02.js";import{P as He}from"./PinnedIcon-wXBQDLix.js";import{f as le,a as z,n as E,S as Ne,u as Ue,B as T,c as Je}from"./index-kfMSnNdB.js";import{B as re}from"./badge-C0Go598m.js";import{h as Ve,a as Y,i as Xe}from"./content-BrFHUpp8.js";import{i as Ze,X as be,s as Qe,v as we,w as Ke,x as et,y as Ce,G as tt,r as st,z as nt,B as it,D as at,A as ot,E as ce,J as lt,j as rt,K as ct,N as dt}from"./ui-vendor-Gb6mai95.js";import{r as ut,P as mt}from"./postContent-ClrHK1rL.js";import{p as ft}from"./purify-vendor-Cx4rtWv4.js";function ht({content:n,onMentionClick:e}){return t.jsx("div",{className:"floor-body",dangerouslySetInnerHTML:{__html:Ve(n)}})}function q(n){var e;return(e=n.user)!=null&&e.nickname?n.user.nickname:n.guest_nick?n.guest_nick:"游客"}function vt(n){return q(n)[0]||"?"}function xt(n){return!n.user_id||n.user_id===0}function gt(n){const e=new Map,s=[];for(const i of n)e.set(i.id,{comment:i,children:[]});for(const i of n){const o=e.get(i.id);i.reply_to&&e.has(i.reply_to)?e.get(i.reply_to).children.push(o):s.push(o)}return s}function pt(n){const e=new Date(n),s=new Date,i=o=>String(o).padStart(2,"0");return e.getFullYear()===s.getFullYear()?`${i(e.getMonth()+1)}月${i(e.getDate())}日`:`${e.getFullYear()}年${e.getMonth()+1}月${e.getDate()}日`}function ke({node:n,nested:e,highlightFloor:s,replyToId:i,onReply:o,onCancelReply:a,renderReplyBox:l}){var v,b;const r=n.comment,d=q(r),f=xt(r),h=s===r.floor,w=!!r.content_hidden,C=i===r.id;return t.jsxs("div",{id:`floor-${r.floor}`,className:`waline-comment ${e?"nested":""} ${h?"highlight":""}`,children:[t.jsx("div",{className:`waline-comment-avatar ${f&&!((v=r.user)!=null&&v.avatar)?"guest":""}`,children:(b=r.user)!=null&&b.avatar?t.jsx("img",{src:r.user.avatar,alt:""}):vt(r)}),t.jsxs("div",{className:"waline-comment-main",children:[t.jsx("div",{className:"waline-comment-head",children:r.guest_url?t.jsx("a",{href:r.guest_url,target:"_blank",rel:"noopener noreferrer",className:"waline-comment-author",children:d}):t.jsx("span",{className:"waline-comment-author",children:d})}),w?t.jsx("div",{className:"waline-comment-private-mask",children:"该评论为私密评论,仅文章作者与评论发起者可见!"}):t.jsxs("div",{className:"waline-comment-bubble",children:[r.reply_target&&t.jsxs("span",{className:"waline-reply-at",children:["@",q(r.reply_target)]}),t.jsx(ht,{content:r.content})]}),t.jsxs("div",{className:"waline-comment-meta",children:[t.jsxs("span",{className:"waline-comment-date",children:[t.jsx(Ze,{size:14}),pt(r.created_at)]}),C?t.jsxs("button",{type:"button",className:"waline-comment-reply-btn cancel",onClick:a,children:[t.jsx(be,{size:14}),"取消"]}):t.jsxs("button",{type:"button",className:"waline-comment-reply-btn",onClick:()=>o(r),children:[t.jsx(Qe,{size:14}),"回复"]})]}),C&&l&&t.jsx("div",{id:`reply-box-${r.id}`,className:"comment-box-wrap inline",children:l(r)}),n.children.length>0&&t.jsx("div",{className:"waline-replies",children:n.children.map(S=>t.jsx(ke,{node:S,nested:!0,highlightFloor:s,replyToId:i,onReply:o,onCancelReply:a,renderReplyBox:l},S.comment.id))})]})]})}function jt({comments:n,highlightFloor:e,replyToId:s,onReply:i,onCancelReply:o,renderReplyBox:a}){const l=gt(n);return t.jsx("div",{className:"comment-thread-list",children:l.map(r=>t.jsx(ke,{node:r,highlightFloor:e,replyToId:s,onReply:i,onCancelReply:o,renderReplyBox:a},r.comment.id))})}const ye=m.forwardRef(({className:n,...e},s)=>t.jsx(we,{className:le("peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-[var(--j13-green)] data-[state=unchecked]:bg-input",n),...e,ref:s,children:t.jsx(Ke,{className:le("pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0")})}));ye.displayName=we.displayName;const Nt=["😀","😁","😂","🤣","😃","😄","😅","😆","😉","😊","😋","😎","😍","😘","🥰","😗","😙","😚","🙂","🤗","🤩","🤔","🤨","😐","😑","😶","🙄","😏","😣","😥","😮","🤐","😯","😪","😫","🥱","😴","😌","😛","😜","😝","🤤","😒","😓","😔","😕","🙃","🤑","😲","🙁","😖","😞","😟","😤","😢","😭","😦","😧","😨","😩","🤯","😬","😰","😱","🥵","🥶","😳","🤪","😵","🥴","😠","😡","🤬","😷","🤒","🤕","🤢","🤮","🤧","😇","🥳","🥺","🤠","🤡","🤥","🤫","🤭","🧐","🤓","😈","👻","💀","☠️","👽","👾","🤖","🎃","😺","😸","😹","😻","😼","😽","🙀","😿","😾","👋","🤚","🖐","✋","🖖","👌","🤏","✌️","🤞","🤟","🤘","🤙","👈","👉","👆","👇","☝️","👍","👎","✊","👊","🤛","🤜","👏","🙌","👐","🤲","🤝","🙏","💪","🦾","🦿","🦵","🦶","❤️","🧡","💛","💚","💙","💜","🖤","🤍","🤎","💔","❣️","💕","💞","💓","💗","💖","💘","💝","💟","☮️","✨","⭐","🌟","💫","🔥","💥","💯","✅","❌","❓","❗","💢","💤","💦","🎉","🎊","🎁","🏆","🥇","🥈"];function bt({onSelect:n}){return t.jsx("div",{className:"emoji-picker",children:Nt.map(e=>t.jsx("button",{type:"button",className:"emoji-picker-item",onClick:()=>n(e),children:e},e))})}const Se="j13_guest_nick",Ee="j13_guest_email",_e="j13_guest_url",Pe="j13_my_comment_ids";function wt(){return{nick:localStorage.getItem(Se)||"",email:localStorage.getItem(Ee)||"",url:localStorage.getItem(_e)||""}}function Ct(n){localStorage.setItem(Se,n.nick),localStorage.setItem(Ee,n.email),localStorage.setItem(_e,n.url)}function Ie(){try{const n=localStorage.getItem(Pe);if(!n)return[];const e=JSON.parse(n);return Array.isArray(e)?e.filter(s=>typeof s=="number"):[]}catch{return[]}}function kt(n){const e=Ie();e.includes(n)||(e.push(n),localStorage.setItem(Pe,JSON.stringify(e.slice(-200))))}function de({user:n,replyTo:e,inline:s,submitting:i,submitCount:o=0,onSubmit:a,onCancelReply:l}){var A;const r=wt(),[d,f]=m.useState(""),[h,w]=m.useState(r.nick),[C,v]=m.useState(r.email),[b,S]=m.useState(r.url),[p,k]=m.useState(!1),[x,u]=m.useState(!1),j=m.useRef(null),y=m.useRef(null);m.useEffect(()=>{var g;s&&e&&((g=j.current)==null||g.focus({preventScroll:!0}))},[e==null?void 0:e.id,s]),m.useEffect(()=>{f(""),u(!1),k(!1)},[o]),m.useEffect(()=>{if(!x)return;const g=_=>{y.current&&!y.current.contains(_.target)&&u(!1)};return document.addEventListener("mousedown",g),()=>document.removeEventListener("mousedown",g)},[x]);const P=g=>{const _=j.current;if(_){const D=_.selectionStart??d.length,F=_.selectionEnd??d.length,O=d.slice(0,D)+g+d.slice(F);f(O),requestAnimationFrame(()=>{_.focus();const B=D+g.length;_.setSelectionRange(B,B)})}else f(D=>D+g)},I=()=>{const g=d.trim();g&&(!n&&!h.trim()||(n||Ct({nick:h.trim(),email:C.trim(),url:b.trim()}),a({content:g,guestNick:n?void 0:h.trim(),guestEmail:n?void 0:C.trim(),guestUrl:n?void 0:b.trim(),isPrivate:p})))},L=g=>{g.key==="Enter"&&(g.ctrlKey||g.metaKey)&&(g.preventDefault(),I())},R=((A=n==null?void 0:n.nickname)==null?void 0:A[0])||(h==null?void 0:h[0])||"?";return t.jsxs("div",{className:"comment-box",ref:y,children:[t.jsx("div",{className:"comment-box-avatar",children:n!=null&&n.avatar?t.jsx("img",{src:n.avatar,alt:"",className:"comment-box-avatar-img"}):t.jsx("div",{className:`comment-box-avatar-placeholder ${n?"":"guest"}`,children:n?R:t.jsx("svg",{viewBox:"0 0 24 24",width:"20",height:"20",fill:"currentColor",children:t.jsx("path",{d:"M12 12c2.7 0 4.8-2.1 4.8-4.8S14.7 2.4 12 2.4 7.2 4.5 7.2 7.2 9.3 12 12 12zm0 2.4c-3.2 0-9.6 1.6-9.6 4.8v2.4h19.2v-2.4c0-3.2-6.4-4.8-9.6-4.8z"})})})}),t.jsxs("div",{className:"comment-box-main",children:[e&&!s&&t.jsxs("div",{className:"comment-box-reply-hint",children:[t.jsxs("span",{children:["回复 #",e.floor," ",q(e)]}),l&&t.jsx("button",{type:"button",className:"comment-box-reply-cancel",onClick:l,children:"取消"})]}),t.jsxs("div",{className:`comment-box-input-wrap ${p?"private-mode":""}`,children:[t.jsx("textarea",{ref:j,className:"comment-box-textarea",placeholder:p?"正在隐私评论中...":"说点什么吧",value:d,onChange:g=>f(g.target.value),onKeyDown:L,rows:3}),t.jsx("button",{type:"button",className:"comment-box-send",disabled:i||!d.trim()||!n&&!h.trim(),onClick:I,title:"发送",children:t.jsx(et,{size:16})})]}),!n&&t.jsxs("div",{className:"comment-box-guest-fields",children:[t.jsxs("label",{className:"comment-box-guest-field",children:[t.jsxs("span",{className:"comment-box-guest-label",children:["昵称",t.jsx("em",{className:"comment-box-guest-required",children:"必填"})]}),t.jsx("input",{className:"comment-box-guest-input",placeholder:"怎么称呼你",autoComplete:"nickname",value:h,onChange:g=>w(g.target.value)})]}),t.jsxs("label",{className:"comment-box-guest-field",children:[t.jsxs("span",{className:"comment-box-guest-label",children:["邮箱",t.jsx("em",{className:"comment-box-guest-optional",children:"选填"})]}),t.jsx("input",{className:"comment-box-guest-input",placeholder:"name@example.com",type:"email",autoComplete:"email",value:C,onChange:g=>v(g.target.value)})]}),t.jsxs("label",{className:"comment-box-guest-field",children:[t.jsxs("span",{className:"comment-box-guest-label",children:["网址",t.jsx("em",{className:"comment-box-guest-optional",children:"选填"})]}),t.jsx("input",{className:"comment-box-guest-input",placeholder:"https://example.com",type:"url",autoComplete:"url",value:b,onChange:g=>S(g.target.value)})]}),t.jsx("p",{className:"comment-box-guest-hint",children:"邮箱不会公开展示,仅用于站内记录。"})]}),t.jsxs("div",{className:"comment-box-toolbar",children:[t.jsx("button",{type:"button",className:`comment-box-owo ${x?"active":""}`,onClick:()=>u(g=>!g),children:"OwO"}),t.jsxs("label",{className:"comment-box-private",children:[t.jsx(ye,{checked:p,onCheckedChange:k}),t.jsx("span",{children:"隐私评论"})]})]}),x&&t.jsx(bt,{onSelect:P})]})]})}function J({html:n,isLoggedIn:e,className:s="post-detail-content"}){const i=je(),o=m.useMemo(()=>ut(n,e),[n,e]),a=m.useCallback(l=>{const r=l.target;if(r.closest("[data-members-login]")){l.preventDefault(),i("/login");return}r.closest("[data-members-register]")&&(l.preventDefault(),i("/register"))},[i]);return t.jsx("div",{className:s,onClick:a,dangerouslySetInnerHTML:{__html:o}})}class Le{diff(e,s,i={}){let o;typeof i=="function"?(o=i,i={}):"callback"in i&&(o=i.callback);const a=this.castInput(e,i),l=this.castInput(s,i),r=this.removeEmpty(this.tokenize(a,i)),d=this.removeEmpty(this.tokenize(l,i));return this.diffWithOptionsObj(r,d,i,o)}diffWithOptionsObj(e,s,i,o){var a;const l=x=>{if(x=this.postProcess(x,i),o){setTimeout(function(){o(x)},0);return}else return x},r=s.length,d=e.length;let f=1,h=r+d;i.maxEditLength!=null&&(h=Math.min(h,i.maxEditLength));const w=(a=i.timeout)!==null&&a!==void 0?a:1/0,C=Date.now()+w,v=[{oldPos:-1,lastComponent:void 0}];let b=this.extractCommon(v[0],s,e,0,i);if(v[0].oldPos+1>=d&&b+1>=r)return l(this.buildValues(v[0].lastComponent,s,e));let S=-1/0,p=1/0;const k=()=>{for(let x=Math.max(S,-f);x<=Math.min(p,f);x+=2){let u;const j=v[x-1],y=v[x+1];j&&(v[x-1]=void 0);let P=!1;if(y){const L=y.oldPos-x;P=y&&0<=L&&L=d&&b+1>=r)return l(this.buildValues(u.lastComponent,s,e))||!0;v[x]=u,u.oldPos+1>=d&&(p=Math.min(p,x-1)),b+1>=r&&(S=Math.max(S,x+1))}f++};if(o)(function x(){setTimeout(function(){if(f>h||Date.now()>C)return o(void 0);k()||x()},0)})();else for(;f<=h&&Date.now()<=C;){const x=k();if(x)return x}}addToPath(e,s,i,o,a){const l=e.lastComponent;return l&&!a.oneChangePerToken&&l.added===s&&l.removed===i?{oldPos:e.oldPos+o,lastComponent:{count:l.count+1,added:s,removed:i,previousComponent:l.previousComponent}}:{oldPos:e.oldPos+o,lastComponent:{count:1,added:s,removed:i,previousComponent:l}}}extractCommon(e,s,i,o,a){const l=s.length,r=i.length;let d=e.oldPos,f=d-o,h=0;for(;f+1C.length?b:C}),h.value=this.join(w)}else h.value=this.join(s.slice(d,d+h.count));d+=h.count,h.added||(f+=h.count)}}return o}}function ue(n,e){let s;for(s=0;se.length&&(s=n.length-e.length);let i=e.length;n.length0&&e[l]!=e[a];)a=o[a];e[l]==e[a]&&a++}a=0;for(let l=s;l0&&n[l]!=e[a];)a=o[a];n[l]==e[a]&&a++}return a}function Te(n,e){const s=[];for(const i of Array.from(e.segment(n))){const o=i.segment;s.length&&/\s/.test(s[s.length-1])&&/\s/.test(o)?s[s.length-1]+=o:s.push(o)}return s}function Z(n,e){if(e)return $(n,e)[1];let s;for(s=n.length-1;s>=0&&n[s].match(/\s/);s--);return n.substring(s+1)}function W(n,e){if(e)return $(n,e)[0];const s=n.match(/^\s*/);return s?s[0]:""}function $(n,e){if(!e)return[W(n),Z(n)];if(e.resolvedOptions().granularity!="word")throw new Error('The segmenter passed must have a granularity of "word"');const s=Te(n,e),i=s[0],o=s[s.length-1],a=/\s/.test(i)?i:"",l=/\s/.test(o)?o:"";return[a,l]}const he="a-zA-Z0-9_\\u{AD}\\u{C0}-\\u{D6}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}",St=new RegExp(`[${he}]+|\\s+|[^${he}]`,"ug");class Et extends Le{equals(e,s,i){return i.ignoreCase&&(e=e.toLowerCase(),s=s.toLowerCase()),e.trim()===s.trim()}tokenize(e,s={}){let i;if(s.intlSegmenter){const l=s.intlSegmenter;if(l.resolvedOptions().granularity!="word")throw new Error('The segmenter passed must have a granularity of "word"');i=Te(e,l)}else i=e.match(St)||[];const o=[];let a=null;return i.forEach(l=>{/\s/.test(l)?a==null?o.push(l):o.push(o.pop()+l):a!=null&&/\s/.test(a)?o[o.length-1]==a?o.push(o.pop()+l):o.push(a+l):o.push(l),a=l}),o}join(e){return e.map((s,i)=>i==0?s:s.replace(/^\s+/,"")).join("")}postProcess(e,s){if(!e||s.oneChangePerToken)return e;let i=null,o=null,a=null;return e.forEach(l=>{l.added?o=l:l.removed?a=l:((o||a)&&ve(i,a,o,l,s.intlSegmenter),i=l,o=null,a=null)}),(o||a)&&ve(i,a,o,null,s.intlSegmenter),e}}const _t=new Et;function Pt(n,e,s){return _t.diff(n,e,s)}function ve(n,e,s,i,o){if(e&&s){const[a,l]=$(e.value,o),[r,d]=$(s.value,o);if(n){const f=ue(a,r);n.value=X(n.value,r,f),e.value=M(e.value,f),s.value=M(s.value,f)}if(i){const f=me(l,d);i.value=V(i.value,d,f),e.value=G(e.value,f),s.value=G(s.value,f)}}else if(s){if(n){const a=W(s.value,o);s.value=s.value.substring(a.length)}if(i){const a=W(i.value,o);i.value=i.value.substring(a.length)}}else if(n&&i){const a=W(i.value,o),[l,r]=$(e.value,o),d=ue(a,l);e.value=M(e.value,d);const f=me(M(a,d),r);e.value=G(e.value,f),i.value=V(i.value,a,f),n.value=X(n.value,a,a.slice(0,a.length-f.length))}else if(i){const a=W(i.value,o),l=Z(e.value,o),r=fe(l,a);e.value=G(e.value,r)}else if(n){const a=Z(n.value,o),l=W(e.value,o),r=fe(a,l);e.value=M(e.value,r)}}class It extends Le{constructor(){super(...arguments),this.tokenize=zt}equals(e,s,i){return i.ignoreWhitespace?((!i.newlineIsToken||!e.includes(` +import{j as t,r as m,e as je,w as qe}from"./react-vendor-1fwFMt02.js";import{P as He}from"./PinnedIcon-BrdtSFOl.js";import{f as le,a as z,n as E,S as Ne,h as Ue,B as T,c as Je}from"./index-BCHo3nLu.js";import{B as re}from"./badge-C7JnHIoR.js";import{h as Ve,a as Y,i as Xe}from"./content-BrFHUpp8.js";import{i as Ze,X as be,s as Qe,v as we,w as Ke,x as et,y as Ce,G as tt,r as st,z as nt,B as it,D as at,A as ot,E as ce,J as lt,j as rt,K as ct,N as dt}from"./ui-vendor-Gb6mai95.js";import{r as ut,P as mt}from"./postContent-ClrHK1rL.js";import{p as ft}from"./purify-vendor-Cx4rtWv4.js";function ht({content:n,onMentionClick:e}){return t.jsx("div",{className:"floor-body",dangerouslySetInnerHTML:{__html:Ve(n)}})}function q(n){var e;return(e=n.user)!=null&&e.nickname?n.user.nickname:n.guest_nick?n.guest_nick:"游客"}function vt(n){return q(n)[0]||"?"}function xt(n){return!n.user_id||n.user_id===0}function gt(n){const e=new Map,s=[];for(const i of n)e.set(i.id,{comment:i,children:[]});for(const i of n){const o=e.get(i.id);i.reply_to&&e.has(i.reply_to)?e.get(i.reply_to).children.push(o):s.push(o)}return s}function pt(n){const e=new Date(n),s=new Date,i=o=>String(o).padStart(2,"0");return e.getFullYear()===s.getFullYear()?`${i(e.getMonth()+1)}月${i(e.getDate())}日`:`${e.getFullYear()}年${e.getMonth()+1}月${e.getDate()}日`}function ke({node:n,nested:e,highlightFloor:s,replyToId:i,onReply:o,onCancelReply:a,renderReplyBox:l}){var v,b;const r=n.comment,d=q(r),f=xt(r),h=s===r.floor,w=!!r.content_hidden,C=i===r.id;return t.jsxs("div",{id:`floor-${r.floor}`,className:`waline-comment ${e?"nested":""} ${h?"highlight":""}`,children:[t.jsx("div",{className:`waline-comment-avatar ${f&&!((v=r.user)!=null&&v.avatar)?"guest":""}`,children:(b=r.user)!=null&&b.avatar?t.jsx("img",{src:r.user.avatar,alt:""}):vt(r)}),t.jsxs("div",{className:"waline-comment-main",children:[t.jsx("div",{className:"waline-comment-head",children:r.guest_url?t.jsx("a",{href:r.guest_url,target:"_blank",rel:"noopener noreferrer",className:"waline-comment-author",children:d}):t.jsx("span",{className:"waline-comment-author",children:d})}),w?t.jsx("div",{className:"waline-comment-private-mask",children:"该评论为私密评论,仅文章作者与评论发起者可见!"}):t.jsxs("div",{className:"waline-comment-bubble",children:[r.reply_target&&t.jsxs("span",{className:"waline-reply-at",children:["@",q(r.reply_target)]}),t.jsx(ht,{content:r.content})]}),t.jsxs("div",{className:"waline-comment-meta",children:[t.jsxs("span",{className:"waline-comment-date",children:[t.jsx(Ze,{size:14}),pt(r.created_at)]}),C?t.jsxs("button",{type:"button",className:"waline-comment-reply-btn cancel",onClick:a,children:[t.jsx(be,{size:14}),"取消"]}):t.jsxs("button",{type:"button",className:"waline-comment-reply-btn",onClick:()=>o(r),children:[t.jsx(Qe,{size:14}),"回复"]})]}),C&&l&&t.jsx("div",{id:`reply-box-${r.id}`,className:"comment-box-wrap inline",children:l(r)}),n.children.length>0&&t.jsx("div",{className:"waline-replies",children:n.children.map(S=>t.jsx(ke,{node:S,nested:!0,highlightFloor:s,replyToId:i,onReply:o,onCancelReply:a,renderReplyBox:l},S.comment.id))})]})]})}function jt({comments:n,highlightFloor:e,replyToId:s,onReply:i,onCancelReply:o,renderReplyBox:a}){const l=gt(n);return t.jsx("div",{className:"comment-thread-list",children:l.map(r=>t.jsx(ke,{node:r,highlightFloor:e,replyToId:s,onReply:i,onCancelReply:o,renderReplyBox:a},r.comment.id))})}const ye=m.forwardRef(({className:n,...e},s)=>t.jsx(we,{className:le("peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-[var(--j13-green)] data-[state=unchecked]:bg-input",n),...e,ref:s,children:t.jsx(Ke,{className:le("pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0")})}));ye.displayName=we.displayName;const Nt=["😀","😁","😂","🤣","😃","😄","😅","😆","😉","😊","😋","😎","😍","😘","🥰","😗","😙","😚","🙂","🤗","🤩","🤔","🤨","😐","😑","😶","🙄","😏","😣","😥","😮","🤐","😯","😪","😫","🥱","😴","😌","😛","😜","😝","🤤","😒","😓","😔","😕","🙃","🤑","😲","🙁","😖","😞","😟","😤","😢","😭","😦","😧","😨","😩","🤯","😬","😰","😱","🥵","🥶","😳","🤪","😵","🥴","😠","😡","🤬","😷","🤒","🤕","🤢","🤮","🤧","😇","🥳","🥺","🤠","🤡","🤥","🤫","🤭","🧐","🤓","😈","👻","💀","☠️","👽","👾","🤖","🎃","😺","😸","😹","😻","😼","😽","🙀","😿","😾","👋","🤚","🖐","✋","🖖","👌","🤏","✌️","🤞","🤟","🤘","🤙","👈","👉","👆","👇","☝️","👍","👎","✊","👊","🤛","🤜","👏","🙌","👐","🤲","🤝","🙏","💪","🦾","🦿","🦵","🦶","❤️","🧡","💛","💚","💙","💜","🖤","🤍","🤎","💔","❣️","💕","💞","💓","💗","💖","💘","💝","💟","☮️","✨","⭐","🌟","💫","🔥","💥","💯","✅","❌","❓","❗","💢","💤","💦","🎉","🎊","🎁","🏆","🥇","🥈"];function bt({onSelect:n}){return t.jsx("div",{className:"emoji-picker",children:Nt.map(e=>t.jsx("button",{type:"button",className:"emoji-picker-item",onClick:()=>n(e),children:e},e))})}const Se="j13_guest_nick",Ee="j13_guest_email",_e="j13_guest_url",Pe="j13_my_comment_ids";function wt(){return{nick:localStorage.getItem(Se)||"",email:localStorage.getItem(Ee)||"",url:localStorage.getItem(_e)||""}}function Ct(n){localStorage.setItem(Se,n.nick),localStorage.setItem(Ee,n.email),localStorage.setItem(_e,n.url)}function Ie(){try{const n=localStorage.getItem(Pe);if(!n)return[];const e=JSON.parse(n);return Array.isArray(e)?e.filter(s=>typeof s=="number"):[]}catch{return[]}}function kt(n){const e=Ie();e.includes(n)||(e.push(n),localStorage.setItem(Pe,JSON.stringify(e.slice(-200))))}function de({user:n,replyTo:e,inline:s,submitting:i,submitCount:o=0,onSubmit:a,onCancelReply:l}){var A;const r=wt(),[d,f]=m.useState(""),[h,w]=m.useState(r.nick),[C,v]=m.useState(r.email),[b,S]=m.useState(r.url),[p,k]=m.useState(!1),[x,u]=m.useState(!1),j=m.useRef(null),y=m.useRef(null);m.useEffect(()=>{var g;s&&e&&((g=j.current)==null||g.focus({preventScroll:!0}))},[e==null?void 0:e.id,s]),m.useEffect(()=>{f(""),u(!1),k(!1)},[o]),m.useEffect(()=>{if(!x)return;const g=_=>{y.current&&!y.current.contains(_.target)&&u(!1)};return document.addEventListener("mousedown",g),()=>document.removeEventListener("mousedown",g)},[x]);const P=g=>{const _=j.current;if(_){const D=_.selectionStart??d.length,F=_.selectionEnd??d.length,O=d.slice(0,D)+g+d.slice(F);f(O),requestAnimationFrame(()=>{_.focus();const B=D+g.length;_.setSelectionRange(B,B)})}else f(D=>D+g)},I=()=>{const g=d.trim();g&&(!n&&!h.trim()||(n||Ct({nick:h.trim(),email:C.trim(),url:b.trim()}),a({content:g,guestNick:n?void 0:h.trim(),guestEmail:n?void 0:C.trim(),guestUrl:n?void 0:b.trim(),isPrivate:p})))},L=g=>{g.key==="Enter"&&(g.ctrlKey||g.metaKey)&&(g.preventDefault(),I())},R=((A=n==null?void 0:n.nickname)==null?void 0:A[0])||(h==null?void 0:h[0])||"?";return t.jsxs("div",{className:"comment-box",ref:y,children:[t.jsx("div",{className:"comment-box-avatar",children:n!=null&&n.avatar?t.jsx("img",{src:n.avatar,alt:"",className:"comment-box-avatar-img"}):t.jsx("div",{className:`comment-box-avatar-placeholder ${n?"":"guest"}`,children:n?R:t.jsx("svg",{viewBox:"0 0 24 24",width:"20",height:"20",fill:"currentColor",children:t.jsx("path",{d:"M12 12c2.7 0 4.8-2.1 4.8-4.8S14.7 2.4 12 2.4 7.2 4.5 7.2 7.2 9.3 12 12 12zm0 2.4c-3.2 0-9.6 1.6-9.6 4.8v2.4h19.2v-2.4c0-3.2-6.4-4.8-9.6-4.8z"})})})}),t.jsxs("div",{className:"comment-box-main",children:[e&&!s&&t.jsxs("div",{className:"comment-box-reply-hint",children:[t.jsxs("span",{children:["回复 #",e.floor," ",q(e)]}),l&&t.jsx("button",{type:"button",className:"comment-box-reply-cancel",onClick:l,children:"取消"})]}),t.jsxs("div",{className:`comment-box-input-wrap ${p?"private-mode":""}`,children:[t.jsx("textarea",{ref:j,className:"comment-box-textarea",placeholder:p?"正在隐私评论中...":"说点什么吧",value:d,onChange:g=>f(g.target.value),onKeyDown:L,rows:3}),t.jsx("button",{type:"button",className:"comment-box-send",disabled:i||!d.trim()||!n&&!h.trim(),onClick:I,title:"发送",children:t.jsx(et,{size:16})})]}),!n&&t.jsxs("div",{className:"comment-box-guest-fields",children:[t.jsxs("label",{className:"comment-box-guest-field",children:[t.jsxs("span",{className:"comment-box-guest-label",children:["昵称",t.jsx("em",{className:"comment-box-guest-required",children:"必填"})]}),t.jsx("input",{className:"comment-box-guest-input",placeholder:"怎么称呼你",autoComplete:"nickname",value:h,onChange:g=>w(g.target.value)})]}),t.jsxs("label",{className:"comment-box-guest-field",children:[t.jsxs("span",{className:"comment-box-guest-label",children:["邮箱",t.jsx("em",{className:"comment-box-guest-optional",children:"选填"})]}),t.jsx("input",{className:"comment-box-guest-input",placeholder:"name@example.com",type:"email",autoComplete:"email",value:C,onChange:g=>v(g.target.value)})]}),t.jsxs("label",{className:"comment-box-guest-field",children:[t.jsxs("span",{className:"comment-box-guest-label",children:["网址",t.jsx("em",{className:"comment-box-guest-optional",children:"选填"})]}),t.jsx("input",{className:"comment-box-guest-input",placeholder:"https://example.com",type:"url",autoComplete:"url",value:b,onChange:g=>S(g.target.value)})]}),t.jsx("p",{className:"comment-box-guest-hint",children:"邮箱不会公开展示,仅用于站内记录。"})]}),t.jsxs("div",{className:"comment-box-toolbar",children:[t.jsx("button",{type:"button",className:`comment-box-owo ${x?"active":""}`,onClick:()=>u(g=>!g),children:"OwO"}),t.jsxs("label",{className:"comment-box-private",children:[t.jsx(ye,{checked:p,onCheckedChange:k}),t.jsx("span",{children:"隐私评论"})]})]}),x&&t.jsx(bt,{onSelect:P})]})]})}function J({html:n,isLoggedIn:e,className:s="post-detail-content"}){const i=je(),o=m.useMemo(()=>ut(n,e),[n,e]),a=m.useCallback(l=>{const r=l.target;if(r.closest("[data-members-login]")){l.preventDefault(),i("/login");return}r.closest("[data-members-register]")&&(l.preventDefault(),i("/register"))},[i]);return t.jsx("div",{className:s,onClick:a,dangerouslySetInnerHTML:{__html:o}})}class Le{diff(e,s,i={}){let o;typeof i=="function"?(o=i,i={}):"callback"in i&&(o=i.callback);const a=this.castInput(e,i),l=this.castInput(s,i),r=this.removeEmpty(this.tokenize(a,i)),d=this.removeEmpty(this.tokenize(l,i));return this.diffWithOptionsObj(r,d,i,o)}diffWithOptionsObj(e,s,i,o){var a;const l=x=>{if(x=this.postProcess(x,i),o){setTimeout(function(){o(x)},0);return}else return x},r=s.length,d=e.length;let f=1,h=r+d;i.maxEditLength!=null&&(h=Math.min(h,i.maxEditLength));const w=(a=i.timeout)!==null&&a!==void 0?a:1/0,C=Date.now()+w,v=[{oldPos:-1,lastComponent:void 0}];let b=this.extractCommon(v[0],s,e,0,i);if(v[0].oldPos+1>=d&&b+1>=r)return l(this.buildValues(v[0].lastComponent,s,e));let S=-1/0,p=1/0;const k=()=>{for(let x=Math.max(S,-f);x<=Math.min(p,f);x+=2){let u;const j=v[x-1],y=v[x+1];j&&(v[x-1]=void 0);let P=!1;if(y){const L=y.oldPos-x;P=y&&0<=L&&L=d&&b+1>=r)return l(this.buildValues(u.lastComponent,s,e))||!0;v[x]=u,u.oldPos+1>=d&&(p=Math.min(p,x-1)),b+1>=r&&(S=Math.max(S,x+1))}f++};if(o)(function x(){setTimeout(function(){if(f>h||Date.now()>C)return o(void 0);k()||x()},0)})();else for(;f<=h&&Date.now()<=C;){const x=k();if(x)return x}}addToPath(e,s,i,o,a){const l=e.lastComponent;return l&&!a.oneChangePerToken&&l.added===s&&l.removed===i?{oldPos:e.oldPos+o,lastComponent:{count:l.count+1,added:s,removed:i,previousComponent:l.previousComponent}}:{oldPos:e.oldPos+o,lastComponent:{count:1,added:s,removed:i,previousComponent:l}}}extractCommon(e,s,i,o,a){const l=s.length,r=i.length;let d=e.oldPos,f=d-o,h=0;for(;f+1C.length?b:C}),h.value=this.join(w)}else h.value=this.join(s.slice(d,d+h.count));d+=h.count,h.added||(f+=h.count)}}return o}}function ue(n,e){let s;for(s=0;se.length&&(s=n.length-e.length);let i=e.length;n.length0&&e[l]!=e[a];)a=o[a];e[l]==e[a]&&a++}a=0;for(let l=s;l0&&n[l]!=e[a];)a=o[a];n[l]==e[a]&&a++}return a}function Te(n,e){const s=[];for(const i of Array.from(e.segment(n))){const o=i.segment;s.length&&/\s/.test(s[s.length-1])&&/\s/.test(o)?s[s.length-1]+=o:s.push(o)}return s}function Z(n,e){if(e)return $(n,e)[1];let s;for(s=n.length-1;s>=0&&n[s].match(/\s/);s--);return n.substring(s+1)}function W(n,e){if(e)return $(n,e)[0];const s=n.match(/^\s*/);return s?s[0]:""}function $(n,e){if(!e)return[W(n),Z(n)];if(e.resolvedOptions().granularity!="word")throw new Error('The segmenter passed must have a granularity of "word"');const s=Te(n,e),i=s[0],o=s[s.length-1],a=/\s/.test(i)?i:"",l=/\s/.test(o)?o:"";return[a,l]}const he="a-zA-Z0-9_\\u{AD}\\u{C0}-\\u{D6}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}",St=new RegExp(`[${he}]+|\\s+|[^${he}]`,"ug");class Et extends Le{equals(e,s,i){return i.ignoreCase&&(e=e.toLowerCase(),s=s.toLowerCase()),e.trim()===s.trim()}tokenize(e,s={}){let i;if(s.intlSegmenter){const l=s.intlSegmenter;if(l.resolvedOptions().granularity!="word")throw new Error('The segmenter passed must have a granularity of "word"');i=Te(e,l)}else i=e.match(St)||[];const o=[];let a=null;return i.forEach(l=>{/\s/.test(l)?a==null?o.push(l):o.push(o.pop()+l):a!=null&&/\s/.test(a)?o[o.length-1]==a?o.push(o.pop()+l):o.push(a+l):o.push(l),a=l}),o}join(e){return e.map((s,i)=>i==0?s:s.replace(/^\s+/,"")).join("")}postProcess(e,s){if(!e||s.oneChangePerToken)return e;let i=null,o=null,a=null;return e.forEach(l=>{l.added?o=l:l.removed?a=l:((o||a)&&ve(i,a,o,l,s.intlSegmenter),i=l,o=null,a=null)}),(o||a)&&ve(i,a,o,null,s.intlSegmenter),e}}const _t=new Et;function Pt(n,e,s){return _t.diff(n,e,s)}function ve(n,e,s,i,o){if(e&&s){const[a,l]=$(e.value,o),[r,d]=$(s.value,o);if(n){const f=ue(a,r);n.value=X(n.value,r,f),e.value=M(e.value,f),s.value=M(s.value,f)}if(i){const f=me(l,d);i.value=V(i.value,d,f),e.value=G(e.value,f),s.value=G(s.value,f)}}else if(s){if(n){const a=W(s.value,o);s.value=s.value.substring(a.length)}if(i){const a=W(i.value,o);i.value=i.value.substring(a.length)}}else if(n&&i){const a=W(i.value,o),[l,r]=$(e.value,o),d=ue(a,l);e.value=M(e.value,d);const f=me(M(a,d),r);e.value=G(e.value,f),i.value=V(i.value,a,f),n.value=X(n.value,a,a.slice(0,a.length-f.length))}else if(i){const a=W(i.value,o),l=Z(e.value,o),r=fe(l,a);e.value=G(e.value,r)}else if(n){const a=Z(n.value,o),l=W(e.value,o),r=fe(a,l);e.value=M(e.value,r)}}class It extends Le{constructor(){super(...arguments),this.tokenize=zt}equals(e,s,i){return i.ignoreWhitespace?((!i.newlineIsToken||!e.includes(` `))&&(e=e.trim()),(!i.newlineIsToken||!s.includes(` `))&&(s=s.trim())):i.ignoreNewlineAtEof&&!i.newlineIsToken&&(e.endsWith(` `)&&(e=e.slice(0,-1)),s.endsWith(` diff --git a/embed_static/static/spa/assets/ProfilePage-SfO7sDgP.js b/embed_static/static/spa/assets/ProfilePage-Bvftg6_b.js similarity index 99% rename from embed_static/static/spa/assets/ProfilePage-SfO7sDgP.js rename to embed_static/static/spa/assets/ProfilePage-Bvftg6_b.js index 99cc7a4..ca01508 100644 --- a/embed_static/static/spa/assets/ProfilePage-SfO7sDgP.js +++ b/embed_static/static/spa/assets/ProfilePage-Bvftg6_b.js @@ -1,4 +1,4 @@ -import{x as Gt,r as u,j as s,e as Ht}from"./react-vendor-1fwFMt02.js";import{u as ut,a as ft,F as mt,c as L,d as F,e as T,b as Z,f as G,o as Pt,s as X}from"./form-PYX6hP9B.js";import{S as et,B as P,n as z,u as Bt,h as Xt,a as H}from"./index-kfMSnNdB.js";import{I as W}from"./input-BjHCK3cg.js";import{B as Yt}from"./badge-C0Go598m.js";import{D as Vt,a as Kt,b as qt,c as Jt,d as Qt,e as $t}from"./dialog-DJohwkVv.js";import{A as te,a8 as ee,a9 as ie,X as oe,t as re,k as se}from"./ui-vendor-Gb6mai95.js";var gt=!1,E,it,ot,Y,V,Dt,K,rt,st,nt,Rt,at,ht,zt,Et;function C(){if(!gt){gt=!0;var i=navigator.userAgent,e=/(?:MSIE.(\d+\.\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\d+\.\d+))|(?:Opera(?:.+Version.|.)(\d+\.\d+))|(?:AppleWebKit.(\d+(?:\.\d+)?))|(?:Trident\/\d+\.\d+.*rv:(\d+\.\d+))/.exec(i),t=/(Mac OS X)|(Windows)|(Linux)/.exec(i);if(at=/\b(iPhone|iP[ao]d)/.exec(i),ht=/\b(iP[ao]d)/.exec(i),nt=/Android/i.exec(i),zt=/FBAN\/\w+;/i.exec(i),Et=/Mobile/i.exec(i),Rt=!!/Win64/.exec(i),e){E=e[1]?parseFloat(e[1]):e[5]?parseFloat(e[5]):NaN,E&&document&&document.documentMode&&(E=document.documentMode);var o=/(?:Trident\/(\d+.\d+))/.exec(i);Dt=o?parseFloat(o[1])+4:E,it=e[2]?parseFloat(e[2]):NaN,ot=e[3]?parseFloat(e[3]):NaN,Y=e[4]?parseFloat(e[4]):NaN,Y?(e=/(?:Chrome\/(\d+\.\d+))/.exec(i),V=e&&e[1]?parseFloat(e[1]):NaN):V=NaN}else E=it=ot=V=Y=NaN;if(t){if(t[1]){var r=/(?:Mac OS X (\d+(?:[._]\d+)?))/.exec(i);K=r?parseFloat(r[1].replace("_",".")):!0}else K=!1;rt=!!t[2],st=!!t[3]}else K=rt=st=!1}}var ct={ie:function(){return C()||E},ieCompatibilityMode:function(){return C()||Dt>E},ie64:function(){return ct.ie()&&Rt},firefox:function(){return C()||it},opera:function(){return C()||ot},webkit:function(){return C()||Y},safari:function(){return ct.webkit()},chrome:function(){return C()||V},windows:function(){return C()||rt},osx:function(){return C()||K},linux:function(){return C()||st},iphone:function(){return C()||at},mobile:function(){return C()||at||ht||nt||Et},nativeApp:function(){return C()||zt},android:function(){return C()||nt},ipad:function(){return C()||ht}},ne=ct,ae=!!(typeof window<"u"&&window.document&&window.document.createElement),he={canUseDOM:ae},ce=he,At=ce,Mt;At.canUseDOM&&(Mt=document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature("","")!==!0);/** +import{x as Gt,r as u,j as s,e as Ht}from"./react-vendor-1fwFMt02.js";import{u as ut,a as ft,F as mt,c as L,d as F,e as T,b as Z,f as G,o as Pt,s as X}from"./form-CB9KBlPG.js";import{S as et,B as P,n as z,h as Bt,u as Xt,a as H}from"./index-BCHo3nLu.js";import{I as W}from"./input-Dsk6No-h.js";import{B as Yt}from"./badge-C7JnHIoR.js";import{D as Vt,a as Kt,b as qt,c as Jt,d as Qt,e as $t}from"./dialog-CXDeMxB9.js";import{A as te,a8 as ee,a9 as ie,X as oe,t as re,k as se}from"./ui-vendor-Gb6mai95.js";var gt=!1,E,it,ot,Y,V,Dt,K,rt,st,nt,Rt,at,ht,zt,Et;function C(){if(!gt){gt=!0;var i=navigator.userAgent,e=/(?:MSIE.(\d+\.\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\d+\.\d+))|(?:Opera(?:.+Version.|.)(\d+\.\d+))|(?:AppleWebKit.(\d+(?:\.\d+)?))|(?:Trident\/\d+\.\d+.*rv:(\d+\.\d+))/.exec(i),t=/(Mac OS X)|(Windows)|(Linux)/.exec(i);if(at=/\b(iPhone|iP[ao]d)/.exec(i),ht=/\b(iP[ao]d)/.exec(i),nt=/Android/i.exec(i),zt=/FBAN\/\w+;/i.exec(i),Et=/Mobile/i.exec(i),Rt=!!/Win64/.exec(i),e){E=e[1]?parseFloat(e[1]):e[5]?parseFloat(e[5]):NaN,E&&document&&document.documentMode&&(E=document.documentMode);var o=/(?:Trident\/(\d+.\d+))/.exec(i);Dt=o?parseFloat(o[1])+4:E,it=e[2]?parseFloat(e[2]):NaN,ot=e[3]?parseFloat(e[3]):NaN,Y=e[4]?parseFloat(e[4]):NaN,Y?(e=/(?:Chrome\/(\d+\.\d+))/.exec(i),V=e&&e[1]?parseFloat(e[1]):NaN):V=NaN}else E=it=ot=V=Y=NaN;if(t){if(t[1]){var r=/(?:Mac OS X (\d+(?:[._]\d+)?))/.exec(i);K=r?parseFloat(r[1].replace("_",".")):!0}else K=!1;rt=!!t[2],st=!!t[3]}else K=rt=st=!1}}var ct={ie:function(){return C()||E},ieCompatibilityMode:function(){return C()||Dt>E},ie64:function(){return ct.ie()&&Rt},firefox:function(){return C()||it},opera:function(){return C()||ot},webkit:function(){return C()||Y},safari:function(){return ct.webkit()},chrome:function(){return C()||V},windows:function(){return C()||rt},osx:function(){return C()||K},linux:function(){return C()||st},iphone:function(){return C()||at},mobile:function(){return C()||at||ht||nt||Et},nativeApp:function(){return C()||zt},android:function(){return C()||nt},ipad:function(){return C()||ht}},ne=ct,ae=!!(typeof window<"u"&&window.document&&window.document.createElement),he={canUseDOM:ae},ce=he,At=ce,Mt;At.canUseDOM&&(Mt=document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature("","")!==!0);/** * Checks if an event is supported in the current execution environment. * * NOTE: This will not work correctly for non-generic events such as `change`, diff --git a/embed_static/static/spa/assets/RegisterPage-CVXuCuRY.js b/embed_static/static/spa/assets/RegisterPage-M2GcPscc.js similarity index 91% rename from embed_static/static/spa/assets/RegisterPage-CVXuCuRY.js rename to embed_static/static/spa/assets/RegisterPage-M2GcPscc.js index 61dfd4c..5001750 100644 --- a/embed_static/static/spa/assets/RegisterPage-CVXuCuRY.js +++ b/embed_static/static/spa/assets/RegisterPage-M2GcPscc.js @@ -1 +1 @@ -import{e as g,r as w,j as s,L as F}from"./react-vendor-1fwFMt02.js";import{u as b,a as y,F as k,b as n,c as o,d as t,e as i,f as l,o as N,s as c}from"./form-PYX6hP9B.js";import{h as S,u as v,B as C,a as L,n as x}from"./index-kfMSnNdB.js";import{I as m}from"./input-BjHCK3cg.js";import"./ui-vendor-Gb6mai95.js";const _=r=>N({username:c().min(1,"请输入用户名"),nickname:c().optional(),password:c().min(r,`密码至少 ${r} 位`)});function $(){const{limits:r}=S(),p=g(),{refresh:h}=v(),[j,d]=w.useState(!1),a=b({resolver:y(_(r.password_min_len)),defaultValues:{username:"",nickname:"",password:""}}),f=async e=>{d(!0);try{await L.register(e.username,e.password,e.nickname||e.username),await h(),x.success("注册成功"),p("/",{replace:!0})}catch(u){x.error(u instanceof Error?u.message:"注册失败")}finally{d(!1)}};return s.jsx("div",{className:"auth-page",children:s.jsxs("div",{className:"auth-box",children:[s.jsx("div",{className:"logo-mark",children:"姜"}),s.jsx("h1",{children:"注册账号"}),s.jsx("p",{className:"subtitle",children:"首个注册用户自动成为管理员"}),s.jsx(k,{...a,children:s.jsxs("form",{onSubmit:a.handleSubmit(f),className:"space-y-4",children:[s.jsx(n,{control:a.control,name:"username",render:({field:e})=>s.jsxs(o,{children:[s.jsx(t,{children:"用户名"}),s.jsx(i,{children:s.jsx(m,{placeholder:"3-32 位字母数字下划线",autoComplete:"username",...e})}),s.jsx(l,{})]})}),s.jsx(n,{control:a.control,name:"nickname",render:({field:e})=>s.jsxs(o,{children:[s.jsx(t,{children:"昵称"}),s.jsx(i,{children:s.jsx(m,{placeholder:"显示名称(可选)",autoComplete:"nickname",...e})}),s.jsx(l,{})]})}),s.jsx(n,{control:a.control,name:"password",render:({field:e})=>s.jsxs(o,{children:[s.jsx(t,{children:"密码"}),s.jsx(i,{children:s.jsx(m,{type:"password",placeholder:`至少 ${r.password_min_len} 位`,autoComplete:"new-password",...e})}),s.jsx(l,{})]})}),s.jsx(C,{type:"submit",className:"w-full",loading:j,children:"注册"})]})}),s.jsxs("p",{style:{textAlign:"center",marginTop:16,fontSize:13,color:"var(--color-text-3)"},children:["已有账号?",s.jsx(F,{to:"/login",children:"登录"})]})]})})}export{$ as default}; +import{e as g,r as w,j as s,L as F}from"./react-vendor-1fwFMt02.js";import{u as b,a as y,F as k,b as n,c as o,d as t,e as i,f as l,o as N,s as c}from"./form-CB9KBlPG.js";import{u as S,h as v,B as C,a as L,n as x}from"./index-BCHo3nLu.js";import{I as m}from"./input-Dsk6No-h.js";import"./ui-vendor-Gb6mai95.js";const _=r=>N({username:c().min(1,"请输入用户名"),nickname:c().optional(),password:c().min(r,`密码至少 ${r} 位`)});function $(){const{limits:r}=S(),p=g(),{refresh:h}=v(),[j,d]=w.useState(!1),a=b({resolver:y(_(r.password_min_len)),defaultValues:{username:"",nickname:"",password:""}}),f=async e=>{d(!0);try{await L.register(e.username,e.password,e.nickname||e.username),await h(),x.success("注册成功"),p("/",{replace:!0})}catch(u){x.error(u instanceof Error?u.message:"注册失败")}finally{d(!1)}};return s.jsx("div",{className:"auth-page",children:s.jsxs("div",{className:"auth-box",children:[s.jsx("div",{className:"logo-mark",children:"姜"}),s.jsx("h1",{children:"注册账号"}),s.jsx("p",{className:"subtitle",children:"首个注册用户自动成为管理员"}),s.jsx(k,{...a,children:s.jsxs("form",{onSubmit:a.handleSubmit(f),className:"space-y-4",children:[s.jsx(n,{control:a.control,name:"username",render:({field:e})=>s.jsxs(o,{children:[s.jsx(t,{children:"用户名"}),s.jsx(i,{children:s.jsx(m,{placeholder:"3-32 位字母数字下划线",autoComplete:"username",...e})}),s.jsx(l,{})]})}),s.jsx(n,{control:a.control,name:"nickname",render:({field:e})=>s.jsxs(o,{children:[s.jsx(t,{children:"昵称"}),s.jsx(i,{children:s.jsx(m,{placeholder:"显示名称(可选)",autoComplete:"nickname",...e})}),s.jsx(l,{})]})}),s.jsx(n,{control:a.control,name:"password",render:({field:e})=>s.jsxs(o,{children:[s.jsx(t,{children:"密码"}),s.jsx(i,{children:s.jsx(m,{type:"password",placeholder:`至少 ${r.password_min_len} 位`,autoComplete:"new-password",...e})}),s.jsx(l,{})]})}),s.jsx(C,{type:"submit",className:"w-full",loading:j,children:"注册"})]})}),s.jsxs("p",{style:{textAlign:"center",marginTop:16,fontSize:13,color:"var(--color-text-3)"},children:["已有账号?",s.jsx(F,{to:"/login",children:"登录"})]})]})})}export{$ as default}; diff --git a/embed_static/static/spa/assets/alert-dialog-_wPjKojj.js b/embed_static/static/spa/assets/alert-dialog-C_2cPHgh.js similarity index 96% rename from embed_static/static/spa/assets/alert-dialog-_wPjKojj.js rename to embed_static/static/spa/assets/alert-dialog-C_2cPHgh.js index 2180992..8aac73d 100644 --- a/embed_static/static/spa/assets/alert-dialog-_wPjKojj.js +++ b/embed_static/static/spa/assets/alert-dialog-C_2cPHgh.js @@ -1 +1 @@ -import{r as l,j as s}from"./react-vendor-1fwFMt02.js";import{aj as x,ak as g,al as N,am as r,an as i,ao as d,ap as n,aq as m,ar as c}from"./ui-vendor-Gb6mai95.js";import{f as o,k as f}from"./index-kfMSnNdB.js";const C=x,T=g,y=N,p=l.forwardRef(({className:a,...e},t)=>s.jsx(c,{className:o("fixed inset-0 z-[110] bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",a),...e,ref:t}));p.displayName=c.displayName;const u=l.forwardRef(({className:a,...e},t)=>s.jsxs(y,{children:[s.jsx(p,{}),s.jsx(r,{ref:t,className:o("fixed left-[50%] top-[50%] z-[110] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",a),...e})]}));u.displayName=r.displayName;const A=({className:a,...e})=>s.jsx("div",{className:o("flex flex-col space-y-2 text-center sm:text-left",a),...e});A.displayName="AlertDialogHeader";const D=({className:a,...e})=>s.jsx("div",{className:o("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",a),...e});D.displayName="AlertDialogFooter";const j=l.forwardRef(({className:a,...e},t)=>s.jsx(i,{ref:t,className:o("text-lg font-semibold",a),...e}));j.displayName=i.displayName;const w=l.forwardRef(({className:a,...e},t)=>s.jsx(d,{ref:t,className:o("text-sm text-muted-foreground",a),...e}));w.displayName=d.displayName;const b=l.forwardRef(({className:a,...e},t)=>s.jsx(m,{ref:t,className:o(f(),a),...e}));b.displayName=m.displayName;const R=l.forwardRef(({className:a,...e},t)=>s.jsx(n,{ref:t,className:o(f({variant:"outline"}),"mt-2 sm:mt-0",a),...e}));R.displayName=n.displayName;export{C as A,T as a,u as b,A as c,j as d,w as e,D as f,R as g,b as h}; +import{r as l,j as s}from"./react-vendor-1fwFMt02.js";import{aj as x,ak as g,al as N,am as r,an as i,ao as d,ap as n,aq as m,ar as c}from"./ui-vendor-Gb6mai95.js";import{f as o,k as f}from"./index-BCHo3nLu.js";const C=x,T=g,y=N,p=l.forwardRef(({className:a,...e},t)=>s.jsx(c,{className:o("fixed inset-0 z-[110] bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",a),...e,ref:t}));p.displayName=c.displayName;const u=l.forwardRef(({className:a,...e},t)=>s.jsxs(y,{children:[s.jsx(p,{}),s.jsx(r,{ref:t,className:o("fixed left-[50%] top-[50%] z-[110] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",a),...e})]}));u.displayName=r.displayName;const A=({className:a,...e})=>s.jsx("div",{className:o("flex flex-col space-y-2 text-center sm:text-left",a),...e});A.displayName="AlertDialogHeader";const D=({className:a,...e})=>s.jsx("div",{className:o("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",a),...e});D.displayName="AlertDialogFooter";const j=l.forwardRef(({className:a,...e},t)=>s.jsx(i,{ref:t,className:o("text-lg font-semibold",a),...e}));j.displayName=i.displayName;const w=l.forwardRef(({className:a,...e},t)=>s.jsx(d,{ref:t,className:o("text-sm text-muted-foreground",a),...e}));w.displayName=d.displayName;const b=l.forwardRef(({className:a,...e},t)=>s.jsx(m,{ref:t,className:o(f(),a),...e}));b.displayName=m.displayName;const R=l.forwardRef(({className:a,...e},t)=>s.jsx(n,{ref:t,className:o(f({variant:"outline"}),"mt-2 sm:mt-0",a),...e}));R.displayName=n.displayName;export{C as A,T as a,u as b,A as c,j as d,w as e,D as f,R as g,b as h}; diff --git a/embed_static/static/spa/assets/badge-C0Go598m.js b/embed_static/static/spa/assets/badge-C7JnHIoR.js similarity index 92% rename from embed_static/static/spa/assets/badge-C0Go598m.js rename to embed_static/static/spa/assets/badge-C7JnHIoR.js index 4b5a9dc..81aa537 100644 --- a/embed_static/static/spa/assets/badge-C0Go598m.js +++ b/embed_static/static/spa/assets/badge-C7JnHIoR.js @@ -1 +1 @@ -import{j as n}from"./react-vendor-1fwFMt02.js";import{f as a,j as o}from"./index-kfMSnNdB.js";const s=o("inline-flex items-center rounded-md border px-2 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow",secondary:"border-transparent bg-secondary text-secondary-foreground",destructive:"border-transparent bg-destructive text-destructive-foreground shadow",outline:"text-foreground",green:"border-transparent bg-[var(--j13-green-bg)] text-[var(--j13-green)]",orange:"border-transparent bg-orange-100 text-orange-700 dark:bg-orange-950 dark:text-orange-300"}},defaultVariants:{variant:"default"}});function g({className:r,variant:e,...t}){return n.jsx("div",{className:a(s({variant:e}),r),...t})}export{g as B}; +import{j as n}from"./react-vendor-1fwFMt02.js";import{f as a,j as o}from"./index-BCHo3nLu.js";const s=o("inline-flex items-center rounded-md border px-2 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow",secondary:"border-transparent bg-secondary text-secondary-foreground",destructive:"border-transparent bg-destructive text-destructive-foreground shadow",outline:"text-foreground",green:"border-transparent bg-[var(--j13-green-bg)] text-[var(--j13-green)]",orange:"border-transparent bg-orange-100 text-orange-700 dark:bg-orange-950 dark:text-orange-300"}},defaultVariants:{variant:"default"}});function g({className:r,variant:e,...t}){return n.jsx("div",{className:a(s({variant:e}),r),...t})}export{g as B}; diff --git a/embed_static/static/spa/assets/dialog-DJohwkVv.js b/embed_static/static/spa/assets/dialog-CXDeMxB9.js similarity index 97% rename from embed_static/static/spa/assets/dialog-DJohwkVv.js rename to embed_static/static/spa/assets/dialog-CXDeMxB9.js index a4586a0..d9d6455 100644 --- a/embed_static/static/spa/assets/dialog-DJohwkVv.js +++ b/embed_static/static/spa/assets/dialog-CXDeMxB9.js @@ -1 +1 @@ -import{r as l,j as t}from"./react-vendor-1fwFMt02.js";import{ab as f,ac as p,ad as d,ae as g,X as x,af as i,ag as n,ah as r}from"./ui-vendor-Gb6mai95.js";import{f as o}from"./index-kfMSnNdB.js";const R=f,u=p,c=l.forwardRef(({className:a,...e},s)=>t.jsx(r,{ref:s,className:o("fixed inset-0 z-[110] bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",a),...e}));c.displayName=r.displayName;const y=l.forwardRef(({className:a,children:e,...s},m)=>t.jsxs(u,{children:[t.jsx(c,{}),t.jsxs(d,{ref:m,className:o("fixed left-[50%] top-[50%] z-[110] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",a),...s,children:[e,t.jsxs(g,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[t.jsx(x,{className:"h-4 w-4"}),t.jsx("span",{className:"sr-only",children:"关闭"})]})]})]}));y.displayName=d.displayName;const N=({className:a,...e})=>t.jsx("div",{className:o("flex flex-col space-y-1.5 text-center sm:text-left",a),...e});N.displayName="DialogHeader";const j=({className:a,...e})=>t.jsx("div",{className:o("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",a),...e});j.displayName="DialogFooter";const D=l.forwardRef(({className:a,...e},s)=>t.jsx(i,{ref:s,className:o("text-lg font-semibold leading-none tracking-tight",a),...e}));D.displayName=i.displayName;const b=l.forwardRef(({className:a,...e},s)=>t.jsx(n,{ref:s,className:o("text-sm text-muted-foreground",a),...e}));b.displayName=n.displayName;export{R as D,y as a,N as b,D as c,b as d,j as e}; +import{r as l,j as t}from"./react-vendor-1fwFMt02.js";import{ab as f,ac as p,ad as d,ae as g,X as x,af as i,ag as n,ah as r}from"./ui-vendor-Gb6mai95.js";import{f as o}from"./index-BCHo3nLu.js";const R=f,u=p,c=l.forwardRef(({className:a,...e},s)=>t.jsx(r,{ref:s,className:o("fixed inset-0 z-[110] bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",a),...e}));c.displayName=r.displayName;const y=l.forwardRef(({className:a,children:e,...s},m)=>t.jsxs(u,{children:[t.jsx(c,{}),t.jsxs(d,{ref:m,className:o("fixed left-[50%] top-[50%] z-[110] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",a),...s,children:[e,t.jsxs(g,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[t.jsx(x,{className:"h-4 w-4"}),t.jsx("span",{className:"sr-only",children:"关闭"})]})]})]}));y.displayName=d.displayName;const N=({className:a,...e})=>t.jsx("div",{className:o("flex flex-col space-y-1.5 text-center sm:text-left",a),...e});N.displayName="DialogHeader";const j=({className:a,...e})=>t.jsx("div",{className:o("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",a),...e});j.displayName="DialogFooter";const D=l.forwardRef(({className:a,...e},s)=>t.jsx(i,{ref:s,className:o("text-lg font-semibold leading-none tracking-tight",a),...e}));D.displayName=i.displayName;const b=l.forwardRef(({className:a,...e},s)=>t.jsx(n,{ref:s,className:o("text-sm text-muted-foreground",a),...e}));b.displayName=n.displayName;export{R as D,y as a,N as b,D as c,b as d,j as e}; diff --git a/embed_static/static/spa/assets/form-PYX6hP9B.js b/embed_static/static/spa/assets/form-CB9KBlPG.js similarity index 99% rename from embed_static/static/spa/assets/form-PYX6hP9B.js rename to embed_static/static/spa/assets/form-CB9KBlPG.js index 84c0883..2420216 100644 --- a/embed_static/static/spa/assets/form-PYX6hP9B.js +++ b/embed_static/static/spa/assets/form-CB9KBlPG.js @@ -1,4 +1,4 @@ -import{k as S,r as me,j as ye}from"./react-vendor-1fwFMt02.js";import{aa as Gr,u as Gn}from"./ui-vendor-Gb6mai95.js";import{f as Ue,j as Kn}from"./index-kfMSnNdB.js";var Me=e=>e.type==="checkbox",$e=e=>e instanceof Date,Q=e=>e==null;const Kr=e=>typeof e=="object";var M=e=>!Q(e)&&!Array.isArray(e)&&Kr(e)&&!$e(e),$t=e=>M(e)&&e.target?Me(e.target)?e.target.checked:e.target.value:e,qr=(e,t)=>t.split(".").some((r,n,o)=>!isNaN(Number(r))&&e.has(o.slice(0,n).join("."))),Yr=e=>{const t=e.constructor&&e.constructor.prototype;return M(t)&&t.hasOwnProperty("isPrototypeOf")},ot=typeof window<"u"&&typeof window.HTMLElement<"u"&&typeof document<"u";function B(e){if(e instanceof Date)return new Date(e);const t=typeof FileList<"u"&&e instanceof FileList;if(ot&&(e instanceof Blob||t))return e;const r=Array.isArray(e);if(!r&&!(M(e)&&Yr(e)))return e;const n=r?[]:Object.create(Object.getPrototypeOf(e));for(const o in e)Object.prototype.hasOwnProperty.call(e,o)&&(n[o]=B(e[o]));return n}const ve={BLUR:"blur",FOCUS_OUT:"focusout",CHANGE:"change",SUBMIT:"submit",TRIGGER:"trigger",VALID:"valid"},pe={onBlur:"onBlur",onChange:"onChange",onSubmit:"onSubmit",onTouched:"onTouched",all:"all"},he={max:"max",min:"min",maxLength:"maxLength",minLength:"minLength",pattern:"pattern",required:"required",validate:"validate"},vt="form",Hr="root",Xr=["__proto__","constructor","prototype"];var Le=e=>/^\w*$/.test(e),R=e=>e===void 0,st=e=>e.split(/[.[\]'"]/g).filter(Boolean),v=(e,t,r)=>{if(!t||!M(e))return r;const n=Le(t)?[t]:st(t);if(n.some(s=>Xr.includes(s)))return r;const o=n.reduce((s,i)=>Q(s)?void 0:s[i],e);return R(o)||o===e?R(e[t])?r:e[t]:o},ue=e=>typeof e=="boolean",te=e=>typeof e=="function",C=(e,t,r)=>{let n=-1;const o=Le(t)?[t]:st(t),s=o.length,i=s-1;for(;++nS.useContext(Nt);var Qr=(e,t,r,n=!0)=>{const o={};for(const s in e)Object.defineProperty(o,s,{get:()=>{const i=s;return t._proxyFormState[i]!==pe.all&&(t._proxyFormState[i]=!n||pe.all),r&&(r[i]=!0),e[i]}});return o};const Dt=ot?S.useLayoutEffect:S.useEffect;function qn(e){const t=Pt(),{control:r=t,disabled:n,name:o,exact:s}=e||{},[i,u]=S.useState(()=>({...r._formState,defaultValues:r._defaultValues})),l=S.useRef({isDirty:!1,isLoading:!1,dirtyFields:!1,touchedFields:!1,validatingFields:!1,isValidating:!1,isValid:!1,errors:!1});return Dt(()=>r._subscribe({name:o,formState:l.current,exact:s,callback:h=>{!n&&u({...r._formState,...h,defaultValues:r._defaultValues})}}),[o,n,s]),S.useEffect(()=>{l.current.isValid&&r._setValid(!0)},[r]),S.useMemo(()=>Qr(i,r,l.current,!1),[i,r])}var re=e=>typeof e=="string",Ot=(e,t,r,n,o)=>re(e)?(n&&t.watch.add(e),v(r,e,o)):Array.isArray(e)?e.map(s=>(n&&t.watch.add(s),v(r,s))):(n&&(t.watchAll=!0),r),Et=e=>Q(e)||!Kr(e);const ur=(e,t)=>t.length===0&&!Array.isArray(e)&&!Yr(e);function ae(e,t,r=new WeakMap){if(e===t)return!0;if(Et(e)||Et(t))return Object.is(e,t);if($e(e)&&$e(t))return Object.is(e.getTime(),t.getTime());const n=Object.keys(e),o=Object.keys(t);if(n.length!==o.length)return!1;if(ur(e,n)||ur(t,o))return Object.is(e,t);const s=r.get(e);if(s&&s.has(t))return!0;s?s.add(t):r.set(e,new WeakSet([t]));for(const i of n){const u=e[i];if(!(i in t))return!1;if(i!=="ref"){const l=t[i];if($e(u)&&$e(l)||(M(u)||Array.isArray(u))&&(M(l)||Array.isArray(l))?!ae(u,l,r):!Object.is(u,l))return!1}}return!0}function Yn(e){const t=Pt(),{control:r=t,name:n,defaultValue:o,disabled:s,exact:i,compute:u}=e||{},l=S.useRef(o),h=S.useRef(u),m=S.useRef(void 0),d=S.useRef(r),g=S.useRef(n);h.current=u;const[p,Z]=S.useState(()=>{const O=r._getWatch(n,l.current);return h.current?h.current(O):O}),A=S.useCallback(O=>{const I=Ot(n,r._names,O||r._formValues,!1,l.current);return h.current?h.current(I):I},[r._formValues,r._names,n]),T=S.useCallback(O=>{if(!s){const I=Ot(n,r._names,O||r._formValues,!1,l.current);if(h.current){const V=h.current(I);ae(V,m.current)||(Z(V),m.current=V)}else Z(I)}},[r._formValues,r._names,s,n]);Dt(()=>((d.current!==r||!ae(g.current,n))&&(d.current=r,g.current=n,T()),r._subscribe({name:n,formState:{values:!0},exact:i,callback:O=>{T(O.values)}})),[r,i,n,T]),S.useEffect(()=>r._removeUnmounted());const F=d.current!==r,z=g.current,W=S.useMemo(()=>{if(s)return null;const O=!F&&!ae(z,n);return F||O?A():null},[s,F,n,z,A]);return W!==null?W:p}function Hn(e){const t=Pt(),{name:r,disabled:n,control:o=t,shouldUnregister:s,defaultValue:i,exact:u=!0}=e,l=qr(o._names.array,r),h=S.useMemo(()=>v(o._formValues,r,v(o._defaultValues,r,i)),[o,r,i]),m=Yn({control:o,name:r,defaultValue:h,exact:u}),d=qn({control:o,name:r,exact:u}),g=S.useRef(e),p=S.useRef(null),Z=S.useRef(o.register(r,{...e.rules,value:m,...ue(e.disabled)?{disabled:e.disabled}:{}}));g.current=e;const A=S.useMemo(()=>Object.defineProperties({},{invalid:{enumerable:!0,get:()=>!!v(d.errors,r)},isDirty:{enumerable:!0,get:()=>!!v(d.dirtyFields,r)},isTouched:{enumerable:!0,get:()=>!!v(d.touchedFields,r)},isValidating:{enumerable:!0,get:()=>!!v(d.validatingFields,r)},error:{enumerable:!0,get:()=>v(d.errors,r)}}),[d,r]),T=S.useCallback(O=>{const I=$t(O);return v(o._fields,r)||(Z.current=o.register(r,{...g.current.rules,value:I})),Z.current.onChange({target:{value:$t(O),name:r},type:ve.CHANGE})},[r,o]),F=S.useCallback(()=>Z.current.onBlur({target:{value:v(o._formValues,r),name:r},type:ve.BLUR}),[r,o._formValues]),z=S.useCallback(O=>{O&&(p.current={focus:()=>te(O.focus)&&O.focus(),select:()=>te(O.select)&&O.select(),setCustomValidity:V=>te(O.setCustomValidity)&&O.setCustomValidity(V),reportValidity:()=>te(O.reportValidity)&&O.reportValidity()});const I=v(o._fields,r);I&&I._f&&O&&(I._f.ref=p.current)},[o._fields,r]),W=S.useMemo(()=>({name:r,value:m,...ue(n)||d.disabled?{disabled:d.disabled||n}:{},onChange:T,onBlur:F,ref:z}),[r,n,d.disabled,T,F,z,m]);return S.useEffect(()=>{const O=o._options.shouldUnregister||s;o.register(r,{...g.current.rules,...ue(g.current.disabled)?{disabled:g.current.disabled}:{}});const I=(V,j)=>{const ne=v(o._fields,V);ne&&ne._f&&(ne._f.mount=j)};if(I(r,!0),O){const V=B(v(s?o._defaultValues:o._options.values||o._defaultValues,r,v(o._options.defaultValues,r,g.current.defaultValue)));C(o._defaultValues,r,V),R(v(o._formValues,r))&&C(o._formValues,r,V)}if(!l&&o.register(r),p.current){const V=v(o._fields,r);V&&V._f&&(V._f.ref=p.current)}return()=>{(l?O&&!o._state.action:O)?o.unregister(r):I(r,!1)}},[r,o,l,s]),S.useEffect(()=>{o._setDisabledField({disabled:n,name:r})},[n,r,o]),S.useMemo(()=>({field:W,formState:d,fieldState:A}),[W,d,A])}const Xn=e=>e.render(Hn(e)),Ct=S.createContext(null);Ct.displayName="HookFormContext";const Qn=()=>S.useContext(Ct),eo=({children:e,watch:t,getValues:r,getFieldState:n,setError:o,clearErrors:s,setValue:i,setValues:u,trigger:l,formState:h,resetField:m,reset:d,handleSubmit:g,unregister:p,control:Z,register:A,setFocus:T,subscribe:F})=>{const z=S.useMemo(()=>({watch:t,getValues:r,getFieldState:n,setError:o,clearErrors:s,setValue:i,setValues:u,trigger:l,formState:h,resetField:m,reset:d,handleSubmit:g,unregister:p,control:Z,register:A,setFocus:T,subscribe:F}),[s,Z,h,n,r,g,A,d,m,o,T,i,u,F,l,p,t]);return S.createElement(Ct.Provider,{value:z},S.createElement(Nt.Provider,{value:z.control},e))};var xt=(e,t,r,n,o)=>t?{...r[e],types:{...r[e]&&r[e].types?r[e].types:{},[n]:o||!0}}:{},en=e=>Array.isArray(e)?e.filter(Boolean):[],He=e=>Array.isArray(e)?e:[e],ar=()=>{let e=[];return{get observers(){return e},next:o=>{for(const s of e)s.next&&s.next(o)},subscribe:o=>(e.push(o),{unsubscribe:()=>{e=e.filter(s=>s!==o)}}),unsubscribe:()=>{e=[]}}};function tn(e,t){const r={};for(const n in e)if(e.hasOwnProperty(n)){const o=e[n],s=t[n];if(o&&M(o)&&s){const i=tn(o,s);M(i)&&(r[n]=i)}else e[n]&&(r[n]=s)}return r}var X=e=>M(e)&&!Object.keys(e).length,Rt=e=>e.type==="file",Xe=e=>{if(!ot)return!1;const t=e?e.ownerDocument:0;return e instanceof(t&&t.defaultView?t.defaultView.HTMLElement:HTMLElement)},rn=e=>e.type==="select-multiple",jt=e=>e.type==="radio",to=e=>jt(e)||Me(e),bt=e=>Xe(e)&&e.isConnected;function ro(e,t){const r=t.slice(0,-1).length;let n=0;for(;n{for(const t in e)if(te(e[t]))return!0;return!1};function nn(e){return Array.isArray(e)||M(e)&&!oo(e)}function Zt(e,t={}){for(const r in e){const n=e[r];nn(n)?(t[r]=Array.isArray(n)?[]:{},Zt(n,t[r])):R(n)||(t[r]=!0)}return t}function St(e){if(e!==!1){if(e===!0)return!0;if(Array.isArray(e)){const t=e.map(r=>St(r));return t.some(r=>r!==void 0)?t:void 0}if(M(e)){const t={};for(const r in e){const n=St(e[r]);R(n)||(t[r]=n)}return Object.keys(t).length?t:void 0}}}function ze(e,t,r){r||(r=Zt(t));for(const n in e){const o=e[n];if(nn(o))R(t)||Et(r[n])?r[n]=Zt(o,Array.isArray(o)?[]:{}):ze(o,Q(t)?{}:t[n],r[n]);else{const s=t[n];r[n]=!ae(o,s)}}return St(r)||{}}const cr={value:!1,isValid:!1},lr={value:!0,isValid:!0};var on=e=>{if(Array.isArray(e)){if(e.length>1){const t=e.filter(r=>r&&r.checked&&!r.disabled).map(r=>r.value);return{value:t,isValid:!!t.length}}return e[0].checked&&!e[0].disabled?e[0].attributes&&!R(e[0].attributes.value)?R(e[0].value)||e[0].value===""?lr:{value:e[0].value,isValid:!0}:lr:cr}return cr},sn=(e,{valueAsNumber:t,valueAsDate:r,setValueAs:n})=>R(e)?e:t?e===""?NaN:e&&+e:r&&re(e)?new Date(e):n?n(e):e;const fr={isValid:!1,value:null};var un=e=>Array.isArray(e)?e.reduce((t,r)=>r&&r.checked&&!r.disabled?{isValid:!0,value:r.value}:t,fr):fr;function dr(e){const t=e.ref;return Rt(t)?t.files:jt(t)?un(e.refs).value:rn(t)?[...t.selectedOptions].map(({value:r})=>r):Me(t)?on(e.refs).value:sn(R(t.value)?e.ref.value:t.value,e)}var so=(e,t,r,n)=>{const o={};for(const s of e){const i=v(t,s);i&&C(o,s,i._f)}return{criteriaMode:r,names:[...e],fields:o,shouldUseNativeValidation:n}},Qe=e=>e instanceof RegExp,De=e=>R(e)?e:Qe(e)?e.source:M(e)?Qe(e.value)?e.value.source:e.value:e,hr=e=>({isOnSubmit:!e||e===pe.onSubmit,isOnBlur:e===pe.onBlur,isOnChange:e===pe.onChange,isOnAll:e===pe.all,isOnTouch:e===pe.onTouched});const pr="AsyncFunction";var io=e=>!!e&&!!e.validate&&!!(te(e.validate)&&e.validate.constructor.name===pr||M(e.validate)&&Object.values(e.validate).find(t=>t.constructor.name===pr)),uo=e=>e.mount&&(e.required||e.min||e.max||e.maxLength||e.minLength||e.pattern||e.validate),wt=(e,t,r)=>!r&&(t.watchAll||t.watch.has(e)||[...t.watch].some(n=>e.startsWith(`${n}.`)));const xe=(e,t,r,n)=>{for(const o of r||Object.keys(e)){const s=v(e,o);if(s){const{_f:i,...u}=s;if(i){if(i.refs&&i.refs[0]&&t(i.refs[0],o)&&!n)return!0;if(i.ref&&t(i.ref,i.name)&&!n)return!0;if(xe(u,t))break}else if(M(u)&&xe(u,t))break}}};function mr(e,t,r){const n=v(e,r);if(n||Le(r))return{error:n,name:r};const o=r.split(".");for(;o.length;){const s=o.join("."),i=v(t,s),u=v(e,s);if(i&&!Array.isArray(i)&&r!==s)return{name:r};if(u&&u.type)return{name:s,error:u};if(u&&u.root&&u.root.type)return{name:`${s}.root`,error:u.root};o.pop()}return{name:r}}var ao=(e,t,r,n)=>{r(e);const{name:o,...s}=e;return X(s)||n&&Object.keys(s).length>=Object.keys(t).length||Object.keys(s).find(i=>t[i]===(!n||pe.all))},co=(e,t,r)=>!e||!t||e===t||He(e).some(n=>n&&(r?n===t:n.startsWith(t)||t.startsWith(n))),lo=(e,t,r,n,o)=>o.isOnAll?!1:!r&&o.isOnTouch?!(t||e):(r?n.isOnBlur:o.isOnBlur)?!e:(r?n.isOnChange:o.isOnChange)?e:!0,fo=(e,t)=>!en(v(e,t)).length&&q(e,t),_r=(e,t,r)=>{const n=v(e,r),o=Array.isArray(n)?n:[];return C(o,Hr,t[r]),C(e,r,o),e};function gr(e,t,r="validate"){if(re(e)||Array.isArray(e)&&e.every(re)||ue(e)&&!e)return{type:r,message:re(e)?e:"",ref:t}}var Ie=e=>M(e)&&!Qe(e)?e:{value:e,message:""},yr=async(e,t,r,n,o,s)=>{const{ref:i,refs:u,required:l,maxLength:h,minLength:m,min:d,max:g,pattern:p,validate:Z,name:A,valueAsNumber:T,mount:F}=e._f,z=v(r,A);if(!F||t.has(A))return{};const W=u?u[0]:i,O=D=>{if(o&&W.reportValidity){const N=ue(D)?"":D||"";u?u.forEach(G=>G.setCustomValidity(N)):W.setCustomValidity(N),W.reportValidity()}},I={},V=jt(i),j=Me(i),ne=V||j,_e=(T||Rt(i))&&R(i.value)&&R(z)||Xe(i)&&i.value===""||z===""||Array.isArray(z)&&!z.length,ie=xt.bind(null,A,n,I),Be=(D,N,G,J=he.maxLength,ce=he.minLength)=>{const ge=D?N:G;I[A]={type:D?J:ce,message:ge,ref:i,...ie(D?J:ce,ge)}};if(s?!Array.isArray(z)||!z.length:l&&(!ne&&(_e||Q(z))||ue(z)&&!z||j&&!on(u).isValid||V&&!un(u).isValid)){const{value:D,message:N}=re(l)?{value:!!l,message:l}:Ie(l);if(D&&(I[A]={type:he.required,message:N,ref:W,...ie(he.required,N)},!n))return O(N),I}if(!_e&&(!Q(d)||!Q(g))){let D,N;const G=Ie(g),J=Ie(d);if(!Q(z)&&!isNaN(z)){const ce=i.valueAsNumber||z&&+z;Q(G.value)||(D=ce>G.value),Q(J.value)||(N=cenew Date(new Date().toDateString()+" "+We),Se=i.type=="time",Te=i.type=="week";re(G.value)&&z&&(D=Se?ge(z)>ge(G.value):Te?z>G.value:ce>new Date(G.value)),re(J.value)&&z&&(N=Se?ge(z)+D.value,J=!Q(N.value)&&z.length<+N.value;if((G||J)&&(Be(G,D.message,N.message),!n))return O(I[A].message),I}if(p&&!_e&&re(z)){const{value:D,message:N}=Ie(p);if(Qe(D)&&!z.match(D)&&(I[A]={type:he.pattern,message:N,ref:i,...ie(he.pattern,N)},!n))return O(N),I}if(Z){if(te(Z)){const D=await Z(z,r),N=gr(D,W);if(N&&(I[A]={...N,...ie(he.validate,N.message)},!n))return O(N.message),I}else if(M(Z)){let D={};for(const N in Z){if(!X(D)&&!n)break;const G=gr(await Z[N](z,r),W,N);G&&(D={...G,...ie(N,G.message)},O(G.message),n&&(I[A]=D))}if(!X(D)&&(I[A]={ref:W,...D},!n))return I}}return O(!0),I};const ho={mode:pe.onSubmit,reValidateMode:pe.onChange,shouldFocusError:!0},an={submitCount:0,isDirty:!1,isReady:!1,isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,touchedFields:{},dirtyFields:{},validatingFields:{}};function po(e={}){let t={...ho,...e},r={...B(an),isLoading:te(t.defaultValues),errors:t.errors||{},disabled:t.disabled||!1},n={},o=M(t.defaultValues)||M(t.values)?B(t.defaultValues||t.values)||{}:{},s=t.shouldUnregister?{}:B(o),i={action:!1,mount:!1,watch:!1,keepIsValid:!1},u={mount:new Set,disabled:new Set,unMount:new Set,array:new Set,watch:new Set,registerName:new Set},l,h=0;const m={isDirty:!1,dirtyFields:!1,validatingFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1},d={...m};let g={...d};const p={array:ar(),state:ar()},Z=t.criteriaMode===pe.all,A=a=>c=>{clearTimeout(h),h=setTimeout(a,c)},T=async a=>{if(!i.keepIsValid&&!t.disabled&&(d.isValid||g.isValid||a)){let c;t.resolver?(c=X((await ie()).errors),F()):c=await N({fields:n,onlyCheckValid:!0,eventType:ve.VALID}),c!==r.isValid&&p.state.next({isValid:c})}},F=(a,c)=>{!t.disabled&&(d.isValidating||d.validatingFields||g.isValidating||g.validatingFields)&&((a||Array.from(u.mount)).forEach(f=>{f&&(c?C(r.validatingFields,f,c):q(r.validatingFields,f))}),p.state.next({validatingFields:r.validatingFields,isValidating:!X(r.validatingFields)}))},z=()=>{r.dirtyFields=ze(o,s)},W=(a,c=[],f,y,w=!0,k=!0)=>{if(y&&f&&!t.disabled){if(i.action=!0,k&&Array.isArray(v(n,a))){const b=f(v(n,a),y.argA,y.argB);w&&C(n,a,b)}if(k&&Array.isArray(v(r.errors,a))){const b=f(v(r.errors,a),y.argA,y.argB);w&&C(r.errors,a,b),fo(r.errors,a)}if((d.touchedFields||g.touchedFields)&&k&&Array.isArray(v(r.touchedFields,a))){const b=f(v(r.touchedFields,a),y.argA,y.argB);w&&C(r.touchedFields,a,b)}(d.dirtyFields||g.dirtyFields)&&z(),p.state.next({name:a,isDirty:J(a,c),dirtyFields:r.dirtyFields,errors:r.errors,isValid:r.isValid})}else C(s,a,c)},O=(a,c)=>{C(r.errors,a,c),r.errors={...r.errors},p.state.next({errors:r.errors})},I=a=>{r.errors=a,p.state.next({errors:r.errors,isValid:!1})},V=a=>{const c=Le(a)?[a]:st(a);let f=s,y=o;for(let w=0;w{const w=v(n,a);if(w){if(V(a))return;const k=R(v(s,a)),b=v(s,a,R(f)?v(o,a):f);R(b)||y&&y.defaultChecked||c?C(s,a,c?b:dr(w._f)):Se(a,b),i.mount&&!i.action&&(T(),k&&r.isDirty&&(d.isDirty||g.isDirty)&&(J()||(r.isDirty=!1,p.state.next({...r}))),e.shouldUnregister&&k&&!R(v(s,a))&&wt(a,u)&&(i.watch=!0))}},ne=(a,c,f,y,w)=>{let k=!1,b=!1;const $={name:a};if(!t.disabled){if(!f||y){(d.isDirty||g.isDirty)&&(b=r.isDirty,r.isDirty=$.isDirty=J(),k=b!==$.isDirty);const P=ae(v(o,a),c);b=!!v(r.dirtyFields,a),P!==r.isDirty?r.dirtyFields=ze(o,s):P?q(r.dirtyFields,a):C(r.dirtyFields,a,!0),$.dirtyFields=r.dirtyFields,k=k||(d.dirtyFields||g.dirtyFields)&&b!==!P}if(f){const P=v(r.touchedFields,a);P||(C(r.touchedFields,a,f),$.touchedFields=r.touchedFields,k=k||(d.touchedFields||g.touchedFields)&&P!==f)}k&&w&&p.state.next($)}return k?$:{}},_e=(a,c,f,y)=>{const w=v(r.errors,a),k=(d.isValid||g.isValid)&&ue(c)&&r.isValid!==c;if(t.delayError&&f?(l=A(()=>O(a,f)),l(t.delayError)):(clearTimeout(h),l=null,f?C(r.errors,a,f):q(r.errors,a),r.errors={...r.errors}),(f?!ae(w,f):w)||!X(y)||k){const b={...y,...k&&ue(c)?{isValid:c}:{},errors:r.errors,name:a};r={...r,...b},p.state.next(b)}},ie=async a=>(F(a,!0),await t.resolver(s,t.context,so(a||u.mount,n,t.criteriaMode,t.shouldUseNativeValidation))),Be=async a=>{const{errors:c}=await ie(a);if(F(a),a){for(const f of a){const y=v(c,f);y?u.array.has(f)&&M(y)&&!Object.keys(y).some(w=>!Number.isNaN(Number(w)))?_r(r.errors,{[f]:y},f):C(r.errors,f,y):q(r.errors,f)}r.errors={...r.errors}}else r.errors=c;return c},D=async({name:a,eventType:c})=>{if(e.validate){const f=await e.validate({formValues:s,formState:r,name:a,eventType:c});if(M(f))for(const y in f){const w=f[y];w&&Ge(`${vt}.${y}`,{message:re(w.message)?w.message:"",type:w.type||he.validate})}else re(f)||!f?Ge(vt,{message:f||"",type:he.validate}):Xt(vt);return f}return!0},N=async({fields:a,onlyCheckValid:c,name:f,eventType:y,context:w={valid:!0,runRootValidation:!1}})=>{if(e.validate&&(w.runRootValidation=!0,!await D({name:f,eventType:y})&&(w.valid=!1,c)))return w.valid;for(const k in a){const b=a[k];if(b){const{_f:$,...P}=b;if($){const K=u.array.has($.name),le=b._f&&io(b._f),de=d.validatingFields||d.isValidating||g.validatingFields||g.isValidating;le&&de&&F([$.name],!0);const ke=await yr(b,u.disabled,s,Z,t.shouldUseNativeValidation&&!c,K);if(le&&de&&F([$.name]),ke[$.name]&&(w.valid=!1,c)||(!c&&(v(ke,$.name)?K?_r(r.errors,ke,$.name):C(r.errors,$.name,ke[$.name]):q(r.errors,$.name)),e.shouldUseNativeValidation&&ke[$.name]))break}!X(P)&&await N({context:w,onlyCheckValid:c,fields:P,name:k,eventType:y})}}return w.valid},G=()=>{for(const a of u.unMount){const c=v(n,a);c&&(c._f.refs?c._f.refs.every(f=>!bt(f)):!bt(c._f.ref))&&mt(a)}u.unMount=new Set},J=(a,c)=>!t.disabled&&(a&&c&&C(s,a,c),!ae(Yt(),o)),ce=(a,c,f)=>Ot(a,u,{...i.mount?s:R(c)?o:re(a)?{[a]:c}:c},f,c),ge=a=>en(v(i.mount?s:o,a,t.shouldUnregister?v(o,a,[]):[])),Se=(a,c,f={},y=!1)=>{const w=v(n,a);let k=c;if(w){const b=w._f;b&&(!b.disabled&&C(s,a,sn(c,b)),k=Xe(b.ref)&&Q(c)?"":c,rn(b.ref)?[...b.ref.options].forEach($=>$.selected=k.includes($.value)):b.refs?Me(b.ref)?b.refs.forEach($=>{(!$.defaultChecked||!$.disabled)&&(Array.isArray(k)?$.checked=!!k.find(P=>P===$.value):$.checked=k===$.value||!!k)}):b.refs.forEach($=>$.checked=$.value===k):Rt(b.ref)?b.ref.value="":(b.ref.value=k,b.ref.type||p.state.next({name:a,values:y?s:B(s)})))}(f.shouldDirty||f.shouldTouch)&&ne(a,k,f.shouldTouch,f.shouldDirty,!0),f.shouldValidate&&pt(a)},Te=(a,c,f,y=!1)=>{for(const w in c){if(!c.hasOwnProperty(w))return;const k=c[w],b=a+"."+w,$=v(n,b);(u.array.has(a)||M(k)||$&&!$._f)&&!$e(k)?Te(b,k,f,y):Se(b,k,f,y)}},We=(a,c,f,y)=>{const w=v(n,a),k=u.array.has(a),b=y?c:B(c),$=v(s,a),P=ae($,b);if(P||C(s,a,b),k)p.array.next({name:a,values:y?s:B(s)}),(d.isDirty||d.dirtyFields||g.isDirty||g.dirtyFields)&&f.shouldDirty&&(z(),p.state.next({name:a,dirtyFields:r.dirtyFields,isDirty:J(a,b)}));else{const K=Array.isArray(b)&&!b.length||X(b);!w||w._f||Q(b)||K?Se(a,b,f,y):Te(a,b,f,y)}if(!P){const K=wt(a,u),le=y?s:B(s);p.state.next({...K&&r,name:i.mount||K?a:void 0,values:le})}},Ne=(a,c,f={})=>We(a,c,f,!1),xn=(a,c={})=>{const f=te(a)?a(s):a;if(!ae(s,f)){s={...s,...f};for(const y of u.mount)We(y,v(f,y),c,!0);p.state.next({...r,name:void 0,type:void 0,values:s}),c.shouldValidate&&T()}},Kt=async a=>{i.mount=!0;const c=a.target;let f=c.name,y=!0;const w=v(n,f),k=P=>{y=Number.isNaN(P)||$e(P)&&isNaN(P.getTime())||ae(P,v(s,f,P))},b=hr(t.mode),$=hr(t.reValidateMode);if(w){let P,K;const le=c.type?dr(w._f):$t(a),de=a.type===ve.BLUR||a.type===ve.FOCUS_OUT,ke=!uo(w._f)&&!e.validate&&!t.resolver&&!v(r.errors,f)&&!w._f.deps||lo(de,v(r.touchedFields,f),r.isSubmitted,$,b),yt=wt(f,u,de);C(s,f,le),de?(!c||!c.readOnly)&&(w._f.onBlur&&w._f.onBlur(a),l&&l(0)):w._f.onChange&&w._f.onChange(a);const Pe=ne(f,le,de),Bn=!X(Pe)||yt;if(!de&&p.state.next({name:f,type:a.type,values:B(s)}),ke)return(d.isValid||g.isValid)&&(t.mode==="onBlur"?de&&T():de||T()),Bn&&p.state.next({name:f,...yt?{}:Pe});if(!t.resolver&&e.validate&&await D({name:f,eventType:a.type}),!de&&yt&&p.state.next({...r}),t.resolver){const{errors:sr}=await ie([f]);if(F([f]),k(le),!y){!X(Pe)&&p.state.next(Pe);return}const Wn=mr(r.errors,n,f),ir=mr(sr,n,Wn.name||f);P=ir.error,f=ir.name,K=X(sr)}else F([f],!0),P=(await yr(w,u.disabled,s,Z,t.shouldUseNativeValidation))[f],F([f]),k(le),y&&(P?K=!1:(d.isValid||g.isValid)&&(K=await N({fields:n,onlyCheckValid:!0,name:f,eventType:a.type})));y&&(w._f.deps&&(!Array.isArray(w._f.deps)||w._f.deps.length>0)&&pt(w._f.deps),_e(f,K,P,Pe))}},qt=(a,c)=>{if(v(r.errors,c)&&a.focus)return a.focus(),1},pt=async(a,c={})=>{let f,y;const w=He(a);if(t.resolver){const k=await Be(R(a)?a:w);f=X(k),y=a?!w.some(b=>v(k,b)):f}else a?(y=(await Promise.all(w.map(async k=>{const b=v(n,k);return await N({fields:b&&b._f?{[k]:b}:b,eventType:ve.TRIGGER})}))).every(Boolean),!(!y&&!r.isValid)&&T()):y=f=await N({fields:n,name:a,eventType:ve.TRIGGER});return p.state.next({...!re(a)||(d.isValid||g.isValid)&&f!==r.isValid?{}:{name:a},...t.resolver||!a?{isValid:f}:{},errors:r.errors}),c.shouldFocus&&!y&&xe(n,qt,a?w:u.mount),y},Yt=(a,c)=>{let f={...i.mount?s:o};return c&&(f=tn(c.dirtyFields?r.dirtyFields:r.touchedFields,f)),R(a)?f:re(a)?v(f,a):a.map(y=>v(f,y))},Ht=(a,c)=>({invalid:!!v((c||r).errors,a),isDirty:!!v((c||r).dirtyFields,a),error:v((c||r).errors,a),isValidating:!!v(r.validatingFields,a),isTouched:!!v((c||r).touchedFields,a)}),Xt=a=>{const c=a?He(a):void 0;c==null||c.forEach(f=>q(r.errors,f)),c?c.forEach(f=>{p.state.next({name:f,errors:r.errors})}):p.state.next({errors:{}})},Ge=(a,c,f)=>{const y=(v(n,a,{_f:{}})._f||{}).ref,w=v(r.errors,a)||{},{ref:k,message:b,type:$,...P}=w;C(r.errors,a,{...P,...c,ref:y}),p.state.next({name:a,errors:r.errors,isValid:!1}),f&&f.shouldFocus&&y&&y.focus&&y.focus()},Rn=(a,c)=>te(a)?p.state.subscribe({next:f=>"values"in f&&a(f.values||ce(void 0,c),f)}):ce(a,c,!0),Qt=a=>p.state.subscribe({next:c=>{if(co(a.name,c.name,a.exact)&&ao(c,a.formState||d,Jn,a.reRenderRoot)){const f={...s};a.callback({values:f,...r,...c,defaultValues:o})}}}).unsubscribe,jn=a=>(i.mount=!0,g={...g,...a.formState},Qt({...a,formState:{...m,...a.formState}})),mt=(a,c={})=>{for(const f of a?He(a):u.mount)u.mount.delete(f),u.array.delete(f),c.keepValue||(q(n,f),q(s,f)),!c.keepError&&q(r.errors,f),!c.keepDirty&&q(r.dirtyFields,f),!c.keepTouched&&q(r.touchedFields,f),!c.keepIsValidating&&q(r.validatingFields,f),!t.shouldUnregister&&!c.keepDefaultValue&&q(o,f);p.state.next({values:B(s)}),p.state.next({...r,...c.keepDirty?{isDirty:J()}:{}}),!c.keepIsValid&&T()},er=({disabled:a,name:c})=>{if(ue(a)&&i.mount||a||u.disabled.has(c)){const w=u.disabled.has(c)!==!!a;a?u.disabled.add(c):u.disabled.delete(c),w&&i.mount&&!i.action&&T()}},_t=(a,c={})=>{let f=v(n,a);const y=ue(c.disabled)||ue(t.disabled),w=!u.registerName.has(a)&&f&&f._f&&!f._f.mount;return C(n,a,{...f||{},_f:{...f&&f._f?f._f:{ref:{name:a}},name:a,mount:!0,...c}}),u.mount.add(a),f&&!w?er({disabled:ue(c.disabled)?c.disabled:t.disabled,name:a}):j(a,!0,c.value),{...y?{disabled:c.disabled||t.disabled}:{},...t.progressive?{required:!!c.required,min:De(c.min),max:De(c.max),minLength:De(c.minLength),maxLength:De(c.maxLength),pattern:De(c.pattern)}:{},name:a,onChange:Kt,onBlur:Kt,ref:k=>{if(k){u.registerName.add(a),_t(a,c),u.registerName.delete(a),f=v(n,a);const b=R(k.value)&&k.querySelectorAll&&k.querySelectorAll("input,select,textarea")[0]||k,$=to(b),P=f._f.refs||[];if($?P.find(K=>K===b):b===f._f.ref)return;C(n,a,{_f:{...f._f,...$?{refs:[...P.filter(bt),b,...Array.isArray(v(o,a))?[{}]:[]],ref:{type:b.type,name:a}}:{ref:b}}}),j(a,!1,void 0,b)}else f=v(n,a,{}),f._f&&(f._f.mount=!1),(t.shouldUnregister||c.shouldUnregister)&&!(qr(u.array,a)&&i.action)&&u.unMount.add(a)}}},gt=()=>t.shouldFocusError&&!t.shouldUseNativeValidation&&xe(n,qt,u.mount),Un=a=>{ue(a)&&(p.state.next({disabled:a}),xe(n,(c,f)=>{const y=v(n,f);y&&(c.disabled=y._f.disabled||a,Array.isArray(y._f.refs)&&y._f.refs.forEach(w=>{w.disabled=y._f.disabled||a}))},0,!1))},tr=(a,c)=>async f=>{let y;f&&(f.preventDefault&&f.preventDefault(),f.persist&&f.persist());let w=B(s);if(p.state.next({isSubmitting:!0}),t.resolver){const{errors:k,values:b}=await ie();F(),r.errors=k,w=B(b)}else await N({fields:n,eventType:ve.SUBMIT});if(u.disabled.size)for(const k of u.disabled)q(w,k);if(q(r.errors,Hr),X(r.errors)){p.state.next({errors:{}});try{await a(w,f)}catch(k){y=k}}else c&&await c({...r.errors},f),gt(),setTimeout(gt);if(p.state.next({isSubmitted:!0,isSubmitting:!1,isSubmitSuccessful:X(r.errors)&&!y,submitCount:r.submitCount+1,errors:r.errors}),y)throw y},Mn=(a,c={})=>{v(n,a)&&(R(c.defaultValue)?Ne(a,B(v(o,a))):(Ne(a,c.defaultValue),C(o,a,B(c.defaultValue))),c.keepTouched||q(r.touchedFields,a),c.keepDirty||(q(r.dirtyFields,a),r.isDirty=c.defaultValue?J(a,B(v(o,a))):J()),c.keepError||(q(r.errors,a),d.isValid&&T()),p.state.next({...r}))},rr=(a,c={})=>{const f=a?B(a):o,y=B(f),w=X(a),k=y;if(c.keepDefaultValues||(o=f),!c.keepValues){if(c.keepDirtyValues){const b=new Set([...u.mount,...Object.keys(ze(o,s))]);for(const $ of Array.from(b)){const P=v(r.dirtyFields,$),K=v(s,$),le=v(k,$);P&&!R(K)?C(k,$,K):!P&&!R(le)&&Ne($,le)}}else{if(ot&&R(a))for(const b of u.mount){const $=v(n,b);if($&&$._f){const P=Array.isArray($._f.refs)?$._f.refs[0]:$._f.ref;if(Xe(P)){const K=P.closest("form");if(K){K.reset();break}}}}if(c.keepFieldsRef)for(const b of u.mount)Ne(b,v(k,b));else n={}}if(t.shouldUnregister){if(s=c.keepDefaultValues?B(o):{},c.keepFieldsRef)for(const b of u.mount)C(s,b,v(k,b))}else s=B(k);p.array.next({values:{...k}}),p.state.next({values:{...k}})}u={mount:c.keepDirtyValues?u.mount:new Set,unMount:new Set,array:new Set,registerName:new Set,disabled:new Set,watch:new Set,watchAll:!1,focus:""},i.mount=!d.isValid||!!c.keepIsValid||!!c.keepDirtyValues||!t.shouldUnregister&&!X(k),i.watch=!!t.shouldUnregister,i.keepIsValid=!!c.keepIsValid,i.action=!1,c.keepErrors||(r.errors={}),p.state.next({submitCount:c.keepSubmitCount?r.submitCount:0,isDirty:w?!1:c.keepDirty?r.isDirty:c.keepValues?J():!!(c.keepDefaultValues&&!ae(a,o)),isSubmitted:c.keepIsSubmitted?r.isSubmitted:!1,dirtyFields:w?{}:c.keepDirtyValues?c.keepDefaultValues&&s?ze(o,s):r.dirtyFields:c.keepDefaultValues&&a?ze(o,a):c.keepDirty?r.dirtyFields:{},touchedFields:c.keepTouched?r.touchedFields:{},errors:c.keepErrors?r.errors:{},isSubmitSuccessful:c.keepIsSubmitSuccessful?r.isSubmitSuccessful:!1,isSubmitting:!1,defaultValues:o})},nr=(a,c)=>rr(te(a)?a(s):a,{...t.resetOptions,...c}),Ln=(a,c={})=>{const f=v(n,a),y=f&&f._f;if(y){const w=y.refs?y.refs[0]:y.ref;w.focus&&setTimeout(()=>{w.focus(),c.shouldSelect&&te(w.select)&&w.select()})}},Jn=a=>{r={...r,...a}},or={control:{register:_t,unregister:mt,getFieldState:Ht,handleSubmit:tr,setError:Ge,_subscribe:Qt,_runSchema:ie,_updateIsValidating:F,_focusError:gt,_getWatch:ce,_getDirty:J,_setValid:T,_setFieldArray:W,_setDisabledField:er,_setErrors:I,_getFieldArray:ge,_reset:rr,_resetDefaultValues:()=>te(t.defaultValues)&&t.defaultValues().then(a=>{nr(a,t.resetOptions),p.state.next({isLoading:!1})}),_removeUnmounted:G,_disableForm:Un,_subjects:p,_proxyFormState:d,get _fields(){return n},get _formValues(){return s},get _state(){return i},set _state(a){i=a},get _defaultValues(){return o},get _names(){return u},set _names(a){u=a},get _formState(){return r},get _options(){return t},set _options(a){t={...t,...a}}},subscribe:jn,trigger:pt,register:_t,handleSubmit:tr,watch:Rn,setValue:Ne,setValues:xn,getValues:Yt,reset:nr,resetField:Mn,resetDefaultValues:(a,c={})=>{if(o=B(a),!c.keepDirty){const f=ze(o,s);r.dirtyFields=f,r.isDirty=!X(f)}c.keepIsValid||T(),p.state.next({...r,defaultValues:o})},clearErrors:Xt,unregister:mt,setError:Ge,setFocus:Ln,getFieldState:Ht};return{...or,formControl:or}}function uc(e={}){const t=S.useRef(void 0),r=S.useRef(void 0),n=S.useRef(e.formControl),[o,s]=S.useState(()=>({...B(an),isLoading:te(e.defaultValues),errors:e.errors||{},disabled:e.disabled||!1,defaultValues:te(e.defaultValues)?void 0:e.defaultValues}));if(!t.current||e.formControl&&n.current!==e.formControl)if(n.current=e.formControl,e.formControl)t.current={...e.formControl,formState:o},e.defaultValues&&!te(e.defaultValues)&&e.formControl.reset(e.defaultValues,e.resetOptions);else{const{formControl:u,...l}=po(e);t.current={...l,formState:o}}const i=t.current.control;return i._options=e,Dt(()=>{const u=i._subscribe({formState:i._proxyFormState,callback:()=>s({...i._formState,defaultValues:i._defaultValues}),reRenderRoot:!0});return s(l=>({...l,isReady:!0})),i._formState.isReady=!0,u},[i]),S.useEffect(()=>i._disableForm(e.disabled),[i,e.disabled]),S.useEffect(()=>{e.mode&&(i._options.mode=e.mode),e.reValidateMode&&(i._options.reValidateMode=e.reValidateMode)},[i,e.mode,e.reValidateMode]),S.useEffect(()=>{e.errors&&(i._setErrors(e.errors),i._focusError())},[i,e.errors]),S.useEffect(()=>{e.shouldUnregister&&i._subjects.state.next({values:i._getWatch()})},[i,e.shouldUnregister]),S.useEffect(()=>{if(i._proxyFormState.isDirty){const u=i._getDirty();u!==o.isDirty&&i._subjects.state.next({isDirty:u})}},[i,o.isDirty]),S.useEffect(()=>{var u;e.values&&!ae(e.values,r.current)?(i._reset(e.values,{keepFieldsRef:!0,...i._options.resetOptions}),!((u=i._options.resetOptions)===null||u===void 0)&&u.keepIsValid||i._setValid(),r.current=e.values,s(l=>({...l}))):i._resetDefaultValues()},[i,e.values]),S.useEffect(()=>{i._state.mount||(i._setValid(),i._state.mount=!0),i._state.watch&&(i._state.watch=!1,i._subjects.state.next({...i._formState})),i._removeUnmounted()}),t.current.formState=S.useMemo(()=>Qr(o,i),[i,o]),t.current}const vr=(e,t,r)=>{if(e&&"reportValidity"in e){const n=v(r,t);e.setCustomValidity(n&&n.message||""),e.reportValidity()}},It=(e,t)=>{for(const r in t.fields){const n=t.fields[r];n&&n.ref&&"reportValidity"in n.ref?vr(n.ref,r,e):n&&n.refs&&n.refs.forEach(o=>vr(o,r,e))}},br=(e,t)=>{t.shouldUseNativeValidation&&It(e,t);const r={};for(const n in e){const o=v(t.fields,n),s=Object.assign(e[n]||{},{ref:o&&o.ref});if(mo(t.names||Object.keys(e),n)){const i=Object.assign({},v(r,n));C(i,"root",s),C(r,n,i)}else C(r,n,s)}return r},mo=(e,t)=>{const r=wr(t).replace(/[.*+?^${}()|\\]/g,"\\$&");return e.some(n=>wr(n).match(`^${r}\\.\\d+`))};function wr(e){return e.replace(/[\[\]]/g,"")}var kr;function _(e,t,r){function n(u,l){if(u._zod||Object.defineProperty(u,"_zod",{value:{def:l,constr:i,traits:new Set},enumerable:!1}),u._zod.traits.has(e))return;u._zod.traits.add(e),t(u,l);const h=i.prototype,m=Object.keys(h);for(let d=0;d{var l,h;return r!=null&&r.Parent&&u instanceof r.Parent?!0:(h=(l=u==null?void 0:u._zod)==null?void 0:l.traits)==null?void 0:h.has(e)}}),Object.defineProperty(i,"name",{value:e}),i}class Fe extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}}class cn extends Error{constructor(t){super(`Encountered unidirectional transform during encode: ${t}`),this.name="ZodEncodeError"}}(kr=globalThis).__zod_globalConfig??(kr.__zod_globalConfig={});const Ut=globalThis.__zod_globalConfig;function Oe(e){return Ut}function ln(e){const t=Object.values(e).filter(n=>typeof n=="number");return Object.entries(e).filter(([n,o])=>t.indexOf(+n)===-1).map(([n,o])=>o)}function At(e,t){return typeof t=="bigint"?t.toString():t}function Mt(e){return{get value(){{const t=e();return Object.defineProperty(this,"value",{value:t}),t}}}}function Lt(e){return e==null}function Jt(e){const t=e.startsWith("^")?1:0,r=e.endsWith("$")?e.length-1:e.length;return e.slice(t,r)}function _o(e,t){const r=e/t,n=Math.round(r),o=Number.EPSILON*Math.max(Math.abs(r),1);return Math.abs(r-n){};function et(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}const yo=Mt(()=>{var e;if(Ut.jitless||typeof navigator<"u"&&((e=navigator==null?void 0:navigator.userAgent)!=null&&e.includes("Cloudflare")))return!1;try{const t=Function;return new t(""),!0}catch{return!1}});function Re(e){if(et(e)===!1)return!1;const t=e.constructor;if(t===void 0||typeof t!="function")return!0;const r=t.prototype;return!(et(r)===!1||Object.prototype.hasOwnProperty.call(r,"isPrototypeOf")===!1)}function dn(e){return Re(e)?{...e}:Array.isArray(e)?[...e]:e instanceof Map?new Map(e):e instanceof Set?new Set(e):e}const vo=new Set(["string","number","symbol"]);function it(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function we(e,t,r){const n=new e._zod.constr(t??e._zod.def);return(!t||r!=null&&r.parent)&&(n._zod.parent=e),n}function E(e){const t=e;if(!t)return{};if(typeof t=="string")return{error:()=>t};if((t==null?void 0:t.message)!==void 0){if((t==null?void 0:t.error)!==void 0)throw new Error("Cannot specify both `message` and `error` params");t.error=t.message}return delete t.message,typeof t.error=="string"?{...t,error:()=>t.error}:t}function bo(e){return Object.keys(e).filter(t=>e[t]._zod.optin==="optional"&&e[t]._zod.optout==="optional")}const wo={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function ko(e,t){const r=e._zod.def,n=r.checks;if(n&&n.length>0)throw new Error(".pick() cannot be used on object schemas containing refinements");const s=be(e._zod.def,{get shape(){const i={};for(const u in t){if(!(u in r.shape))throw new Error(`Unrecognized key: "${u}"`);t[u]&&(i[u]=r.shape[u])}return Ze(this,"shape",i),i},checks:[]});return we(e,s)}function zo(e,t){const r=e._zod.def,n=r.checks;if(n&&n.length>0)throw new Error(".omit() cannot be used on object schemas containing refinements");const s=be(e._zod.def,{get shape(){const i={...e._zod.def.shape};for(const u in t){if(!(u in r.shape))throw new Error(`Unrecognized key: "${u}"`);t[u]&&delete i[u]}return Ze(this,"shape",i),i},checks:[]});return we(e,s)}function $o(e,t){if(!Re(t))throw new Error("Invalid input to extend: expected a plain object");const r=e._zod.def.checks;if(r&&r.length>0){const s=e._zod.def.shape;for(const i in t)if(Object.getOwnPropertyDescriptor(s,i)!==void 0)throw new Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}const o=be(e._zod.def,{get shape(){const s={...e._zod.def.shape,...t};return Ze(this,"shape",s),s}});return we(e,o)}function Oo(e,t){if(!Re(t))throw new Error("Invalid input to safeExtend: expected a plain object");const r=be(e._zod.def,{get shape(){const n={...e._zod.def.shape,...t};return Ze(this,"shape",n),n}});return we(e,r)}function Eo(e,t){var n;if((n=e._zod.def.checks)!=null&&n.length)throw new Error(".merge() cannot be used on object schemas containing refinements. Use .safeExtend() instead.");const r=be(e._zod.def,{get shape(){const o={...e._zod.def.shape,...t._zod.def.shape};return Ze(this,"shape",o),o},get catchall(){return t._zod.def.catchall},checks:t._zod.def.checks??[]});return we(e,r)}function Zo(e,t,r){const o=t._zod.def.checks;if(o&&o.length>0)throw new Error(".partial() cannot be used on object schemas containing refinements");const i=be(t._zod.def,{get shape(){const u=t._zod.def.shape,l={...u};if(r)for(const h in r){if(!(h in u))throw new Error(`Unrecognized key: "${h}"`);r[h]&&(l[h]=e?new e({type:"optional",innerType:u[h]}):u[h])}else for(const h in u)l[h]=e?new e({type:"optional",innerType:u[h]}):u[h];return Ze(this,"shape",l),l},checks:[]});return we(t,i)}function So(e,t,r){const n=be(t._zod.def,{get shape(){const o=t._zod.def.shape,s={...o};if(r)for(const i in r){if(!(i in s))throw new Error(`Unrecognized key: "${i}"`);r[i]&&(s[i]=new e({type:"nonoptional",innerType:o[i]}))}else for(const i in o)s[i]=new e({type:"nonoptional",innerType:o[i]});return Ze(this,"shape",s),s}});return we(t,n)}function Ae(e,t=0){var r;if(e.aborted===!0)return!0;for(let n=t;n{var n;return(n=r).path??(n.path=[]),r.path.unshift(e),r})}function Ke(e){return typeof e=="string"?e:e==null?void 0:e.message}function Ee(e,t,r){var l,h,m,d,g,p;const n=e.message?e.message:Ke((m=(h=(l=e.inst)==null?void 0:l._zod.def)==null?void 0:h.error)==null?void 0:m.call(h,e))??Ke((d=t==null?void 0:t.error)==null?void 0:d.call(t,e))??Ke((g=r.customError)==null?void 0:g.call(r,e))??Ke((p=r.localeError)==null?void 0:p.call(r,e))??"Invalid input",{inst:o,continue:s,input:i,...u}=e;return u.path??(u.path=[]),u.message=n,t!=null&&t.reportInput&&(u.input=i),u}function Bt(e){return Array.isArray(e)?"array":typeof e=="string"?"string":"unknown"}function je(...e){const[t,r,n]=e;return typeof t=="string"?{message:t,code:"custom",input:r,inst:n}:{...t}}const pn=(e,t)=>{e.name="$ZodError",Object.defineProperty(e,"_zod",{value:e._zod,enumerable:!1}),Object.defineProperty(e,"issues",{value:t,enumerable:!1}),e.message=JSON.stringify(t,At,2),Object.defineProperty(e,"toString",{value:()=>e.message,enumerable:!1})},Wt=_("$ZodError",pn),ut=_("$ZodError",pn,{Parent:Error});function Ao(e,t=r=>r.message){const r={},n=[];for(const o of e.issues)o.path.length>0?(r[o.path[0]]=r[o.path[0]]||[],r[o.path[0]].push(t(o))):n.push(t(o));return{formErrors:n,fieldErrors:r}}function Fo(e,t=r=>r.message){const r={_errors:[]},n=(o,s=[])=>{for(const i of o.issues)if(i.code==="invalid_union"&&i.errors.length)i.errors.map(u=>n({issues:u},[...s,...i.path]));else if(i.code==="invalid_key")n({issues:i.issues},[...s,...i.path]);else if(i.code==="invalid_element")n({issues:i.issues},[...s,...i.path]);else{const u=[...s,...i.path];if(u.length===0)r._errors.push(t(i));else{let l=r,h=0;for(;h(t,r,n,o)=>{const s=n?{...n,async:!1}:{async:!1},i=t._zod.run({value:r,issues:[]},s);if(i instanceof Promise)throw new Fe;if(i.issues.length){const u=new((o==null?void 0:o.Err)??e)(i.issues.map(l=>Ee(l,s,Oe())));throw fn(u,o==null?void 0:o.callee),u}return i.value},Vo=at(ut),ct=e=>async(t,r,n,o)=>{const s=n?{...n,async:!0}:{async:!0};let i=t._zod.run({value:r,issues:[]},s);if(i instanceof Promise&&(i=await i),i.issues.length){const u=new((o==null?void 0:o.Err)??e)(i.issues.map(l=>Ee(l,s,Oe())));throw fn(u,o==null?void 0:o.callee),u}return i.value},To=ct(ut),lt=e=>(t,r,n)=>{const o=n?{...n,async:!1}:{async:!1},s=t._zod.run({value:r,issues:[]},o);if(s instanceof Promise)throw new Fe;return s.issues.length?{success:!1,error:new(e??Wt)(s.issues.map(i=>Ee(i,o,Oe())))}:{success:!0,data:s.value}},No=lt(ut),ft=e=>async(t,r,n)=>{const o=n?{...n,async:!0}:{async:!0};let s=t._zod.run({value:r,issues:[]},o);return s instanceof Promise&&(s=await s),s.issues.length?{success:!1,error:new e(s.issues.map(i=>Ee(i,o,Oe())))}:{success:!0,data:s.value}},Po=ft(ut),Do=e=>(t,r,n)=>{const o=n?{...n,direction:"backward"}:{direction:"backward"};return at(e)(t,r,o)},Co=e=>(t,r,n)=>at(e)(t,r,n),xo=e=>async(t,r,n)=>{const o=n?{...n,direction:"backward"}:{direction:"backward"};return ct(e)(t,r,o)},Ro=e=>async(t,r,n)=>ct(e)(t,r,n),jo=e=>(t,r,n)=>{const o=n?{...n,direction:"backward"}:{direction:"backward"};return lt(e)(t,r,o)},Uo=e=>(t,r,n)=>lt(e)(t,r,n),Mo=e=>async(t,r,n)=>{const o=n?{...n,direction:"backward"}:{direction:"backward"};return ft(e)(t,r,o)},Lo=e=>async(t,r,n)=>ft(e)(t,r,n),Jo=/^[cC][0-9a-z]{6,}$/,Bo=/^[0-9a-z]+$/,Wo=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,Go=/^[0-9a-vA-V]{20}$/,Ko=/^[A-Za-z0-9]{27}$/,qo=/^[a-zA-Z0-9_-]{21}$/,Yo=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,Ho=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/,Or=e=>e?new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${e}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`):/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/,Xo=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/,Qo="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";function es(){return new RegExp(Qo,"u")}const ts=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,rs=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/,ns=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/,os=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,ss=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,mn=/^[A-Za-z0-9_-]*$/,is=/^https?$/,us=/^\+[1-9]\d{6,14}$/,_n="(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))",as=new RegExp(`^${_n}$`);function gn(e){const t="(?:[01]\\d|2[0-3]):[0-5]\\d";return typeof e.precision=="number"?e.precision===-1?`${t}`:e.precision===0?`${t}:[0-5]\\d`:`${t}:[0-5]\\d\\.\\d{${e.precision}}`:`${t}(?::[0-5]\\d(?:\\.\\d+)?)?`}function cs(e){return new RegExp(`^${gn(e)}$`)}function ls(e){const t=gn({precision:e.precision}),r=["Z"];e.local&&r.push(""),e.offset&&r.push("([+-](?:[01]\\d|2[0-3]):[0-5]\\d)");const n=`${t}(?:${r.join("|")})`;return new RegExp(`^${_n}T(?:${n})$`)}const fs=e=>{const t=e?`[\\s\\S]{${(e==null?void 0:e.minimum)??0},${(e==null?void 0:e.maximum)??""}}`:"[\\s\\S]*";return new RegExp(`^${t}$`)},ds=/^-?\d+$/,hs=/^-?\d+(?:\.\d+)?$/,ps=/^[^A-Z]*$/,ms=/^[^a-z]*$/,se=_("$ZodCheck",(e,t)=>{var r;e._zod??(e._zod={}),e._zod.def=t,(r=e._zod).onattach??(r.onattach=[])}),yn={number:"number",bigint:"bigint",object:"date"},vn=_("$ZodCheckLessThan",(e,t)=>{se.init(e,t);const r=yn[typeof t.value];e._zod.onattach.push(n=>{const o=n._zod.bag,s=(t.inclusive?o.maximum:o.exclusiveMaximum)??Number.POSITIVE_INFINITY;t.value{(t.inclusive?n.value<=t.value:n.value{se.init(e,t);const r=yn[typeof t.value];e._zod.onattach.push(n=>{const o=n._zod.bag,s=(t.inclusive?o.minimum:o.exclusiveMinimum)??Number.NEGATIVE_INFINITY;t.value>s&&(t.inclusive?o.minimum=t.value:o.exclusiveMinimum=t.value)}),e._zod.check=n=>{(t.inclusive?n.value>=t.value:n.value>t.value)||n.issues.push({origin:r,code:"too_small",minimum:typeof t.value=="object"?t.value.getTime():t.value,input:n.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),_s=_("$ZodCheckMultipleOf",(e,t)=>{se.init(e,t),e._zod.onattach.push(r=>{var n;(n=r._zod.bag).multipleOf??(n.multipleOf=t.value)}),e._zod.check=r=>{if(typeof r.value!=typeof t.value)throw new Error("Cannot mix number and bigint in multiple_of check.");(typeof r.value=="bigint"?r.value%t.value===BigInt(0):_o(r.value,t.value)===0)||r.issues.push({origin:typeof r.value,code:"not_multiple_of",divisor:t.value,input:r.value,inst:e,continue:!t.abort})}}),gs=_("$ZodCheckNumberFormat",(e,t)=>{var i;se.init(e,t),t.format=t.format||"float64";const r=(i=t.format)==null?void 0:i.includes("int"),n=r?"int":"number",[o,s]=wo[t.format];e._zod.onattach.push(u=>{const l=u._zod.bag;l.format=t.format,l.minimum=o,l.maximum=s,r&&(l.pattern=ds)}),e._zod.check=u=>{const l=u.value;if(r){if(!Number.isInteger(l)){u.issues.push({expected:n,format:t.format,code:"invalid_type",continue:!1,input:l,inst:e});return}if(!Number.isSafeInteger(l)){l>0?u.issues.push({input:l,code:"too_big",maximum:Number.MAX_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst:e,origin:n,inclusive:!0,continue:!t.abort}):u.issues.push({input:l,code:"too_small",minimum:Number.MIN_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst:e,origin:n,inclusive:!0,continue:!t.abort});return}}ls&&u.issues.push({origin:"number",input:l,code:"too_big",maximum:s,inclusive:!0,inst:e,continue:!t.abort})}}),ys=_("$ZodCheckMaxLength",(e,t)=>{var r;se.init(e,t),(r=e._zod.def).when??(r.when=n=>{const o=n.value;return!Lt(o)&&o.length!==void 0}),e._zod.onattach.push(n=>{const o=n._zod.bag.maximum??Number.POSITIVE_INFINITY;t.maximum{const o=n.value;if(o.length<=t.maximum)return;const i=Bt(o);n.issues.push({origin:i,code:"too_big",maximum:t.maximum,inclusive:!0,input:o,inst:e,continue:!t.abort})}}),vs=_("$ZodCheckMinLength",(e,t)=>{var r;se.init(e,t),(r=e._zod.def).when??(r.when=n=>{const o=n.value;return!Lt(o)&&o.length!==void 0}),e._zod.onattach.push(n=>{const o=n._zod.bag.minimum??Number.NEGATIVE_INFINITY;t.minimum>o&&(n._zod.bag.minimum=t.minimum)}),e._zod.check=n=>{const o=n.value;if(o.length>=t.minimum)return;const i=Bt(o);n.issues.push({origin:i,code:"too_small",minimum:t.minimum,inclusive:!0,input:o,inst:e,continue:!t.abort})}}),bs=_("$ZodCheckLengthEquals",(e,t)=>{var r;se.init(e,t),(r=e._zod.def).when??(r.when=n=>{const o=n.value;return!Lt(o)&&o.length!==void 0}),e._zod.onattach.push(n=>{const o=n._zod.bag;o.minimum=t.length,o.maximum=t.length,o.length=t.length}),e._zod.check=n=>{const o=n.value,s=o.length;if(s===t.length)return;const i=Bt(o),u=s>t.length;n.issues.push({origin:i,...u?{code:"too_big",maximum:t.length}:{code:"too_small",minimum:t.length},inclusive:!0,exact:!0,input:n.value,inst:e,continue:!t.abort})}}),dt=_("$ZodCheckStringFormat",(e,t)=>{var r,n;se.init(e,t),e._zod.onattach.push(o=>{const s=o._zod.bag;s.format=t.format,t.pattern&&(s.patterns??(s.patterns=new Set),s.patterns.add(t.pattern))}),t.pattern?(r=e._zod).check??(r.check=o=>{t.pattern.lastIndex=0,!t.pattern.test(o.value)&&o.issues.push({origin:"string",code:"invalid_format",format:t.format,input:o.value,...t.pattern?{pattern:t.pattern.toString()}:{},inst:e,continue:!t.abort})}):(n=e._zod).check??(n.check=()=>{})}),ws=_("$ZodCheckRegex",(e,t)=>{dt.init(e,t),e._zod.check=r=>{t.pattern.lastIndex=0,!t.pattern.test(r.value)&&r.issues.push({origin:"string",code:"invalid_format",format:"regex",input:r.value,pattern:t.pattern.toString(),inst:e,continue:!t.abort})}}),ks=_("$ZodCheckLowerCase",(e,t)=>{t.pattern??(t.pattern=ps),dt.init(e,t)}),zs=_("$ZodCheckUpperCase",(e,t)=>{t.pattern??(t.pattern=ms),dt.init(e,t)}),$s=_("$ZodCheckIncludes",(e,t)=>{se.init(e,t);const r=it(t.includes),n=new RegExp(typeof t.position=="number"?`^.{${t.position}}${r}`:r);t.pattern=n,e._zod.onattach.push(o=>{const s=o._zod.bag;s.patterns??(s.patterns=new Set),s.patterns.add(n)}),e._zod.check=o=>{o.value.includes(t.includes,t.position)||o.issues.push({origin:"string",code:"invalid_format",format:"includes",includes:t.includes,input:o.value,inst:e,continue:!t.abort})}}),Os=_("$ZodCheckStartsWith",(e,t)=>{se.init(e,t);const r=new RegExp(`^${it(t.prefix)}.*`);t.pattern??(t.pattern=r),e._zod.onattach.push(n=>{const o=n._zod.bag;o.patterns??(o.patterns=new Set),o.patterns.add(r)}),e._zod.check=n=>{n.value.startsWith(t.prefix)||n.issues.push({origin:"string",code:"invalid_format",format:"starts_with",prefix:t.prefix,input:n.value,inst:e,continue:!t.abort})}}),Es=_("$ZodCheckEndsWith",(e,t)=>{se.init(e,t);const r=new RegExp(`.*${it(t.suffix)}$`);t.pattern??(t.pattern=r),e._zod.onattach.push(n=>{const o=n._zod.bag;o.patterns??(o.patterns=new Set),o.patterns.add(r)}),e._zod.check=n=>{n.value.endsWith(t.suffix)||n.issues.push({origin:"string",code:"invalid_format",format:"ends_with",suffix:t.suffix,input:n.value,inst:e,continue:!t.abort})}}),Zs=_("$ZodCheckOverwrite",(e,t)=>{se.init(e,t),e._zod.check=r=>{r.value=t.tx(r.value)}});class Ss{constructor(t=[]){this.content=[],this.indent=0,this&&(this.args=t)}indented(t){this.indent+=1,t(this),this.indent-=1}write(t){if(typeof t=="function"){t(this,{execution:"sync"}),t(this,{execution:"async"});return}const n=t.split(` +import{k as S,r as me,j as ye}from"./react-vendor-1fwFMt02.js";import{aa as Gr,u as Gn}from"./ui-vendor-Gb6mai95.js";import{f as Ue,j as Kn}from"./index-BCHo3nLu.js";var Me=e=>e.type==="checkbox",$e=e=>e instanceof Date,Q=e=>e==null;const Kr=e=>typeof e=="object";var M=e=>!Q(e)&&!Array.isArray(e)&&Kr(e)&&!$e(e),$t=e=>M(e)&&e.target?Me(e.target)?e.target.checked:e.target.value:e,qr=(e,t)=>t.split(".").some((r,n,o)=>!isNaN(Number(r))&&e.has(o.slice(0,n).join("."))),Yr=e=>{const t=e.constructor&&e.constructor.prototype;return M(t)&&t.hasOwnProperty("isPrototypeOf")},ot=typeof window<"u"&&typeof window.HTMLElement<"u"&&typeof document<"u";function B(e){if(e instanceof Date)return new Date(e);const t=typeof FileList<"u"&&e instanceof FileList;if(ot&&(e instanceof Blob||t))return e;const r=Array.isArray(e);if(!r&&!(M(e)&&Yr(e)))return e;const n=r?[]:Object.create(Object.getPrototypeOf(e));for(const o in e)Object.prototype.hasOwnProperty.call(e,o)&&(n[o]=B(e[o]));return n}const ve={BLUR:"blur",FOCUS_OUT:"focusout",CHANGE:"change",SUBMIT:"submit",TRIGGER:"trigger",VALID:"valid"},pe={onBlur:"onBlur",onChange:"onChange",onSubmit:"onSubmit",onTouched:"onTouched",all:"all"},he={max:"max",min:"min",maxLength:"maxLength",minLength:"minLength",pattern:"pattern",required:"required",validate:"validate"},vt="form",Hr="root",Xr=["__proto__","constructor","prototype"];var Le=e=>/^\w*$/.test(e),R=e=>e===void 0,st=e=>e.split(/[.[\]'"]/g).filter(Boolean),v=(e,t,r)=>{if(!t||!M(e))return r;const n=Le(t)?[t]:st(t);if(n.some(s=>Xr.includes(s)))return r;const o=n.reduce((s,i)=>Q(s)?void 0:s[i],e);return R(o)||o===e?R(e[t])?r:e[t]:o},ue=e=>typeof e=="boolean",te=e=>typeof e=="function",C=(e,t,r)=>{let n=-1;const o=Le(t)?[t]:st(t),s=o.length,i=s-1;for(;++nS.useContext(Nt);var Qr=(e,t,r,n=!0)=>{const o={};for(const s in e)Object.defineProperty(o,s,{get:()=>{const i=s;return t._proxyFormState[i]!==pe.all&&(t._proxyFormState[i]=!n||pe.all),r&&(r[i]=!0),e[i]}});return o};const Dt=ot?S.useLayoutEffect:S.useEffect;function qn(e){const t=Pt(),{control:r=t,disabled:n,name:o,exact:s}=e||{},[i,u]=S.useState(()=>({...r._formState,defaultValues:r._defaultValues})),l=S.useRef({isDirty:!1,isLoading:!1,dirtyFields:!1,touchedFields:!1,validatingFields:!1,isValidating:!1,isValid:!1,errors:!1});return Dt(()=>r._subscribe({name:o,formState:l.current,exact:s,callback:h=>{!n&&u({...r._formState,...h,defaultValues:r._defaultValues})}}),[o,n,s]),S.useEffect(()=>{l.current.isValid&&r._setValid(!0)},[r]),S.useMemo(()=>Qr(i,r,l.current,!1),[i,r])}var re=e=>typeof e=="string",Ot=(e,t,r,n,o)=>re(e)?(n&&t.watch.add(e),v(r,e,o)):Array.isArray(e)?e.map(s=>(n&&t.watch.add(s),v(r,s))):(n&&(t.watchAll=!0),r),Et=e=>Q(e)||!Kr(e);const ur=(e,t)=>t.length===0&&!Array.isArray(e)&&!Yr(e);function ae(e,t,r=new WeakMap){if(e===t)return!0;if(Et(e)||Et(t))return Object.is(e,t);if($e(e)&&$e(t))return Object.is(e.getTime(),t.getTime());const n=Object.keys(e),o=Object.keys(t);if(n.length!==o.length)return!1;if(ur(e,n)||ur(t,o))return Object.is(e,t);const s=r.get(e);if(s&&s.has(t))return!0;s?s.add(t):r.set(e,new WeakSet([t]));for(const i of n){const u=e[i];if(!(i in t))return!1;if(i!=="ref"){const l=t[i];if($e(u)&&$e(l)||(M(u)||Array.isArray(u))&&(M(l)||Array.isArray(l))?!ae(u,l,r):!Object.is(u,l))return!1}}return!0}function Yn(e){const t=Pt(),{control:r=t,name:n,defaultValue:o,disabled:s,exact:i,compute:u}=e||{},l=S.useRef(o),h=S.useRef(u),m=S.useRef(void 0),d=S.useRef(r),g=S.useRef(n);h.current=u;const[p,Z]=S.useState(()=>{const O=r._getWatch(n,l.current);return h.current?h.current(O):O}),A=S.useCallback(O=>{const I=Ot(n,r._names,O||r._formValues,!1,l.current);return h.current?h.current(I):I},[r._formValues,r._names,n]),T=S.useCallback(O=>{if(!s){const I=Ot(n,r._names,O||r._formValues,!1,l.current);if(h.current){const V=h.current(I);ae(V,m.current)||(Z(V),m.current=V)}else Z(I)}},[r._formValues,r._names,s,n]);Dt(()=>((d.current!==r||!ae(g.current,n))&&(d.current=r,g.current=n,T()),r._subscribe({name:n,formState:{values:!0},exact:i,callback:O=>{T(O.values)}})),[r,i,n,T]),S.useEffect(()=>r._removeUnmounted());const F=d.current!==r,z=g.current,W=S.useMemo(()=>{if(s)return null;const O=!F&&!ae(z,n);return F||O?A():null},[s,F,n,z,A]);return W!==null?W:p}function Hn(e){const t=Pt(),{name:r,disabled:n,control:o=t,shouldUnregister:s,defaultValue:i,exact:u=!0}=e,l=qr(o._names.array,r),h=S.useMemo(()=>v(o._formValues,r,v(o._defaultValues,r,i)),[o,r,i]),m=Yn({control:o,name:r,defaultValue:h,exact:u}),d=qn({control:o,name:r,exact:u}),g=S.useRef(e),p=S.useRef(null),Z=S.useRef(o.register(r,{...e.rules,value:m,...ue(e.disabled)?{disabled:e.disabled}:{}}));g.current=e;const A=S.useMemo(()=>Object.defineProperties({},{invalid:{enumerable:!0,get:()=>!!v(d.errors,r)},isDirty:{enumerable:!0,get:()=>!!v(d.dirtyFields,r)},isTouched:{enumerable:!0,get:()=>!!v(d.touchedFields,r)},isValidating:{enumerable:!0,get:()=>!!v(d.validatingFields,r)},error:{enumerable:!0,get:()=>v(d.errors,r)}}),[d,r]),T=S.useCallback(O=>{const I=$t(O);return v(o._fields,r)||(Z.current=o.register(r,{...g.current.rules,value:I})),Z.current.onChange({target:{value:$t(O),name:r},type:ve.CHANGE})},[r,o]),F=S.useCallback(()=>Z.current.onBlur({target:{value:v(o._formValues,r),name:r},type:ve.BLUR}),[r,o._formValues]),z=S.useCallback(O=>{O&&(p.current={focus:()=>te(O.focus)&&O.focus(),select:()=>te(O.select)&&O.select(),setCustomValidity:V=>te(O.setCustomValidity)&&O.setCustomValidity(V),reportValidity:()=>te(O.reportValidity)&&O.reportValidity()});const I=v(o._fields,r);I&&I._f&&O&&(I._f.ref=p.current)},[o._fields,r]),W=S.useMemo(()=>({name:r,value:m,...ue(n)||d.disabled?{disabled:d.disabled||n}:{},onChange:T,onBlur:F,ref:z}),[r,n,d.disabled,T,F,z,m]);return S.useEffect(()=>{const O=o._options.shouldUnregister||s;o.register(r,{...g.current.rules,...ue(g.current.disabled)?{disabled:g.current.disabled}:{}});const I=(V,j)=>{const ne=v(o._fields,V);ne&&ne._f&&(ne._f.mount=j)};if(I(r,!0),O){const V=B(v(s?o._defaultValues:o._options.values||o._defaultValues,r,v(o._options.defaultValues,r,g.current.defaultValue)));C(o._defaultValues,r,V),R(v(o._formValues,r))&&C(o._formValues,r,V)}if(!l&&o.register(r),p.current){const V=v(o._fields,r);V&&V._f&&(V._f.ref=p.current)}return()=>{(l?O&&!o._state.action:O)?o.unregister(r):I(r,!1)}},[r,o,l,s]),S.useEffect(()=>{o._setDisabledField({disabled:n,name:r})},[n,r,o]),S.useMemo(()=>({field:W,formState:d,fieldState:A}),[W,d,A])}const Xn=e=>e.render(Hn(e)),Ct=S.createContext(null);Ct.displayName="HookFormContext";const Qn=()=>S.useContext(Ct),eo=({children:e,watch:t,getValues:r,getFieldState:n,setError:o,clearErrors:s,setValue:i,setValues:u,trigger:l,formState:h,resetField:m,reset:d,handleSubmit:g,unregister:p,control:Z,register:A,setFocus:T,subscribe:F})=>{const z=S.useMemo(()=>({watch:t,getValues:r,getFieldState:n,setError:o,clearErrors:s,setValue:i,setValues:u,trigger:l,formState:h,resetField:m,reset:d,handleSubmit:g,unregister:p,control:Z,register:A,setFocus:T,subscribe:F}),[s,Z,h,n,r,g,A,d,m,o,T,i,u,F,l,p,t]);return S.createElement(Ct.Provider,{value:z},S.createElement(Nt.Provider,{value:z.control},e))};var xt=(e,t,r,n,o)=>t?{...r[e],types:{...r[e]&&r[e].types?r[e].types:{},[n]:o||!0}}:{},en=e=>Array.isArray(e)?e.filter(Boolean):[],He=e=>Array.isArray(e)?e:[e],ar=()=>{let e=[];return{get observers(){return e},next:o=>{for(const s of e)s.next&&s.next(o)},subscribe:o=>(e.push(o),{unsubscribe:()=>{e=e.filter(s=>s!==o)}}),unsubscribe:()=>{e=[]}}};function tn(e,t){const r={};for(const n in e)if(e.hasOwnProperty(n)){const o=e[n],s=t[n];if(o&&M(o)&&s){const i=tn(o,s);M(i)&&(r[n]=i)}else e[n]&&(r[n]=s)}return r}var X=e=>M(e)&&!Object.keys(e).length,Rt=e=>e.type==="file",Xe=e=>{if(!ot)return!1;const t=e?e.ownerDocument:0;return e instanceof(t&&t.defaultView?t.defaultView.HTMLElement:HTMLElement)},rn=e=>e.type==="select-multiple",jt=e=>e.type==="radio",to=e=>jt(e)||Me(e),bt=e=>Xe(e)&&e.isConnected;function ro(e,t){const r=t.slice(0,-1).length;let n=0;for(;n{for(const t in e)if(te(e[t]))return!0;return!1};function nn(e){return Array.isArray(e)||M(e)&&!oo(e)}function Zt(e,t={}){for(const r in e){const n=e[r];nn(n)?(t[r]=Array.isArray(n)?[]:{},Zt(n,t[r])):R(n)||(t[r]=!0)}return t}function St(e){if(e!==!1){if(e===!0)return!0;if(Array.isArray(e)){const t=e.map(r=>St(r));return t.some(r=>r!==void 0)?t:void 0}if(M(e)){const t={};for(const r in e){const n=St(e[r]);R(n)||(t[r]=n)}return Object.keys(t).length?t:void 0}}}function ze(e,t,r){r||(r=Zt(t));for(const n in e){const o=e[n];if(nn(o))R(t)||Et(r[n])?r[n]=Zt(o,Array.isArray(o)?[]:{}):ze(o,Q(t)?{}:t[n],r[n]);else{const s=t[n];r[n]=!ae(o,s)}}return St(r)||{}}const cr={value:!1,isValid:!1},lr={value:!0,isValid:!0};var on=e=>{if(Array.isArray(e)){if(e.length>1){const t=e.filter(r=>r&&r.checked&&!r.disabled).map(r=>r.value);return{value:t,isValid:!!t.length}}return e[0].checked&&!e[0].disabled?e[0].attributes&&!R(e[0].attributes.value)?R(e[0].value)||e[0].value===""?lr:{value:e[0].value,isValid:!0}:lr:cr}return cr},sn=(e,{valueAsNumber:t,valueAsDate:r,setValueAs:n})=>R(e)?e:t?e===""?NaN:e&&+e:r&&re(e)?new Date(e):n?n(e):e;const fr={isValid:!1,value:null};var un=e=>Array.isArray(e)?e.reduce((t,r)=>r&&r.checked&&!r.disabled?{isValid:!0,value:r.value}:t,fr):fr;function dr(e){const t=e.ref;return Rt(t)?t.files:jt(t)?un(e.refs).value:rn(t)?[...t.selectedOptions].map(({value:r})=>r):Me(t)?on(e.refs).value:sn(R(t.value)?e.ref.value:t.value,e)}var so=(e,t,r,n)=>{const o={};for(const s of e){const i=v(t,s);i&&C(o,s,i._f)}return{criteriaMode:r,names:[...e],fields:o,shouldUseNativeValidation:n}},Qe=e=>e instanceof RegExp,De=e=>R(e)?e:Qe(e)?e.source:M(e)?Qe(e.value)?e.value.source:e.value:e,hr=e=>({isOnSubmit:!e||e===pe.onSubmit,isOnBlur:e===pe.onBlur,isOnChange:e===pe.onChange,isOnAll:e===pe.all,isOnTouch:e===pe.onTouched});const pr="AsyncFunction";var io=e=>!!e&&!!e.validate&&!!(te(e.validate)&&e.validate.constructor.name===pr||M(e.validate)&&Object.values(e.validate).find(t=>t.constructor.name===pr)),uo=e=>e.mount&&(e.required||e.min||e.max||e.maxLength||e.minLength||e.pattern||e.validate),wt=(e,t,r)=>!r&&(t.watchAll||t.watch.has(e)||[...t.watch].some(n=>e.startsWith(`${n}.`)));const xe=(e,t,r,n)=>{for(const o of r||Object.keys(e)){const s=v(e,o);if(s){const{_f:i,...u}=s;if(i){if(i.refs&&i.refs[0]&&t(i.refs[0],o)&&!n)return!0;if(i.ref&&t(i.ref,i.name)&&!n)return!0;if(xe(u,t))break}else if(M(u)&&xe(u,t))break}}};function mr(e,t,r){const n=v(e,r);if(n||Le(r))return{error:n,name:r};const o=r.split(".");for(;o.length;){const s=o.join("."),i=v(t,s),u=v(e,s);if(i&&!Array.isArray(i)&&r!==s)return{name:r};if(u&&u.type)return{name:s,error:u};if(u&&u.root&&u.root.type)return{name:`${s}.root`,error:u.root};o.pop()}return{name:r}}var ao=(e,t,r,n)=>{r(e);const{name:o,...s}=e;return X(s)||n&&Object.keys(s).length>=Object.keys(t).length||Object.keys(s).find(i=>t[i]===(!n||pe.all))},co=(e,t,r)=>!e||!t||e===t||He(e).some(n=>n&&(r?n===t:n.startsWith(t)||t.startsWith(n))),lo=(e,t,r,n,o)=>o.isOnAll?!1:!r&&o.isOnTouch?!(t||e):(r?n.isOnBlur:o.isOnBlur)?!e:(r?n.isOnChange:o.isOnChange)?e:!0,fo=(e,t)=>!en(v(e,t)).length&&q(e,t),_r=(e,t,r)=>{const n=v(e,r),o=Array.isArray(n)?n:[];return C(o,Hr,t[r]),C(e,r,o),e};function gr(e,t,r="validate"){if(re(e)||Array.isArray(e)&&e.every(re)||ue(e)&&!e)return{type:r,message:re(e)?e:"",ref:t}}var Ie=e=>M(e)&&!Qe(e)?e:{value:e,message:""},yr=async(e,t,r,n,o,s)=>{const{ref:i,refs:u,required:l,maxLength:h,minLength:m,min:d,max:g,pattern:p,validate:Z,name:A,valueAsNumber:T,mount:F}=e._f,z=v(r,A);if(!F||t.has(A))return{};const W=u?u[0]:i,O=D=>{if(o&&W.reportValidity){const N=ue(D)?"":D||"";u?u.forEach(G=>G.setCustomValidity(N)):W.setCustomValidity(N),W.reportValidity()}},I={},V=jt(i),j=Me(i),ne=V||j,_e=(T||Rt(i))&&R(i.value)&&R(z)||Xe(i)&&i.value===""||z===""||Array.isArray(z)&&!z.length,ie=xt.bind(null,A,n,I),Be=(D,N,G,J=he.maxLength,ce=he.minLength)=>{const ge=D?N:G;I[A]={type:D?J:ce,message:ge,ref:i,...ie(D?J:ce,ge)}};if(s?!Array.isArray(z)||!z.length:l&&(!ne&&(_e||Q(z))||ue(z)&&!z||j&&!on(u).isValid||V&&!un(u).isValid)){const{value:D,message:N}=re(l)?{value:!!l,message:l}:Ie(l);if(D&&(I[A]={type:he.required,message:N,ref:W,...ie(he.required,N)},!n))return O(N),I}if(!_e&&(!Q(d)||!Q(g))){let D,N;const G=Ie(g),J=Ie(d);if(!Q(z)&&!isNaN(z)){const ce=i.valueAsNumber||z&&+z;Q(G.value)||(D=ce>G.value),Q(J.value)||(N=cenew Date(new Date().toDateString()+" "+We),Se=i.type=="time",Te=i.type=="week";re(G.value)&&z&&(D=Se?ge(z)>ge(G.value):Te?z>G.value:ce>new Date(G.value)),re(J.value)&&z&&(N=Se?ge(z)+D.value,J=!Q(N.value)&&z.length<+N.value;if((G||J)&&(Be(G,D.message,N.message),!n))return O(I[A].message),I}if(p&&!_e&&re(z)){const{value:D,message:N}=Ie(p);if(Qe(D)&&!z.match(D)&&(I[A]={type:he.pattern,message:N,ref:i,...ie(he.pattern,N)},!n))return O(N),I}if(Z){if(te(Z)){const D=await Z(z,r),N=gr(D,W);if(N&&(I[A]={...N,...ie(he.validate,N.message)},!n))return O(N.message),I}else if(M(Z)){let D={};for(const N in Z){if(!X(D)&&!n)break;const G=gr(await Z[N](z,r),W,N);G&&(D={...G,...ie(N,G.message)},O(G.message),n&&(I[A]=D))}if(!X(D)&&(I[A]={ref:W,...D},!n))return I}}return O(!0),I};const ho={mode:pe.onSubmit,reValidateMode:pe.onChange,shouldFocusError:!0},an={submitCount:0,isDirty:!1,isReady:!1,isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,touchedFields:{},dirtyFields:{},validatingFields:{}};function po(e={}){let t={...ho,...e},r={...B(an),isLoading:te(t.defaultValues),errors:t.errors||{},disabled:t.disabled||!1},n={},o=M(t.defaultValues)||M(t.values)?B(t.defaultValues||t.values)||{}:{},s=t.shouldUnregister?{}:B(o),i={action:!1,mount:!1,watch:!1,keepIsValid:!1},u={mount:new Set,disabled:new Set,unMount:new Set,array:new Set,watch:new Set,registerName:new Set},l,h=0;const m={isDirty:!1,dirtyFields:!1,validatingFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1},d={...m};let g={...d};const p={array:ar(),state:ar()},Z=t.criteriaMode===pe.all,A=a=>c=>{clearTimeout(h),h=setTimeout(a,c)},T=async a=>{if(!i.keepIsValid&&!t.disabled&&(d.isValid||g.isValid||a)){let c;t.resolver?(c=X((await ie()).errors),F()):c=await N({fields:n,onlyCheckValid:!0,eventType:ve.VALID}),c!==r.isValid&&p.state.next({isValid:c})}},F=(a,c)=>{!t.disabled&&(d.isValidating||d.validatingFields||g.isValidating||g.validatingFields)&&((a||Array.from(u.mount)).forEach(f=>{f&&(c?C(r.validatingFields,f,c):q(r.validatingFields,f))}),p.state.next({validatingFields:r.validatingFields,isValidating:!X(r.validatingFields)}))},z=()=>{r.dirtyFields=ze(o,s)},W=(a,c=[],f,y,w=!0,k=!0)=>{if(y&&f&&!t.disabled){if(i.action=!0,k&&Array.isArray(v(n,a))){const b=f(v(n,a),y.argA,y.argB);w&&C(n,a,b)}if(k&&Array.isArray(v(r.errors,a))){const b=f(v(r.errors,a),y.argA,y.argB);w&&C(r.errors,a,b),fo(r.errors,a)}if((d.touchedFields||g.touchedFields)&&k&&Array.isArray(v(r.touchedFields,a))){const b=f(v(r.touchedFields,a),y.argA,y.argB);w&&C(r.touchedFields,a,b)}(d.dirtyFields||g.dirtyFields)&&z(),p.state.next({name:a,isDirty:J(a,c),dirtyFields:r.dirtyFields,errors:r.errors,isValid:r.isValid})}else C(s,a,c)},O=(a,c)=>{C(r.errors,a,c),r.errors={...r.errors},p.state.next({errors:r.errors})},I=a=>{r.errors=a,p.state.next({errors:r.errors,isValid:!1})},V=a=>{const c=Le(a)?[a]:st(a);let f=s,y=o;for(let w=0;w{const w=v(n,a);if(w){if(V(a))return;const k=R(v(s,a)),b=v(s,a,R(f)?v(o,a):f);R(b)||y&&y.defaultChecked||c?C(s,a,c?b:dr(w._f)):Se(a,b),i.mount&&!i.action&&(T(),k&&r.isDirty&&(d.isDirty||g.isDirty)&&(J()||(r.isDirty=!1,p.state.next({...r}))),e.shouldUnregister&&k&&!R(v(s,a))&&wt(a,u)&&(i.watch=!0))}},ne=(a,c,f,y,w)=>{let k=!1,b=!1;const $={name:a};if(!t.disabled){if(!f||y){(d.isDirty||g.isDirty)&&(b=r.isDirty,r.isDirty=$.isDirty=J(),k=b!==$.isDirty);const P=ae(v(o,a),c);b=!!v(r.dirtyFields,a),P!==r.isDirty?r.dirtyFields=ze(o,s):P?q(r.dirtyFields,a):C(r.dirtyFields,a,!0),$.dirtyFields=r.dirtyFields,k=k||(d.dirtyFields||g.dirtyFields)&&b!==!P}if(f){const P=v(r.touchedFields,a);P||(C(r.touchedFields,a,f),$.touchedFields=r.touchedFields,k=k||(d.touchedFields||g.touchedFields)&&P!==f)}k&&w&&p.state.next($)}return k?$:{}},_e=(a,c,f,y)=>{const w=v(r.errors,a),k=(d.isValid||g.isValid)&&ue(c)&&r.isValid!==c;if(t.delayError&&f?(l=A(()=>O(a,f)),l(t.delayError)):(clearTimeout(h),l=null,f?C(r.errors,a,f):q(r.errors,a),r.errors={...r.errors}),(f?!ae(w,f):w)||!X(y)||k){const b={...y,...k&&ue(c)?{isValid:c}:{},errors:r.errors,name:a};r={...r,...b},p.state.next(b)}},ie=async a=>(F(a,!0),await t.resolver(s,t.context,so(a||u.mount,n,t.criteriaMode,t.shouldUseNativeValidation))),Be=async a=>{const{errors:c}=await ie(a);if(F(a),a){for(const f of a){const y=v(c,f);y?u.array.has(f)&&M(y)&&!Object.keys(y).some(w=>!Number.isNaN(Number(w)))?_r(r.errors,{[f]:y},f):C(r.errors,f,y):q(r.errors,f)}r.errors={...r.errors}}else r.errors=c;return c},D=async({name:a,eventType:c})=>{if(e.validate){const f=await e.validate({formValues:s,formState:r,name:a,eventType:c});if(M(f))for(const y in f){const w=f[y];w&&Ge(`${vt}.${y}`,{message:re(w.message)?w.message:"",type:w.type||he.validate})}else re(f)||!f?Ge(vt,{message:f||"",type:he.validate}):Xt(vt);return f}return!0},N=async({fields:a,onlyCheckValid:c,name:f,eventType:y,context:w={valid:!0,runRootValidation:!1}})=>{if(e.validate&&(w.runRootValidation=!0,!await D({name:f,eventType:y})&&(w.valid=!1,c)))return w.valid;for(const k in a){const b=a[k];if(b){const{_f:$,...P}=b;if($){const K=u.array.has($.name),le=b._f&&io(b._f),de=d.validatingFields||d.isValidating||g.validatingFields||g.isValidating;le&&de&&F([$.name],!0);const ke=await yr(b,u.disabled,s,Z,t.shouldUseNativeValidation&&!c,K);if(le&&de&&F([$.name]),ke[$.name]&&(w.valid=!1,c)||(!c&&(v(ke,$.name)?K?_r(r.errors,ke,$.name):C(r.errors,$.name,ke[$.name]):q(r.errors,$.name)),e.shouldUseNativeValidation&&ke[$.name]))break}!X(P)&&await N({context:w,onlyCheckValid:c,fields:P,name:k,eventType:y})}}return w.valid},G=()=>{for(const a of u.unMount){const c=v(n,a);c&&(c._f.refs?c._f.refs.every(f=>!bt(f)):!bt(c._f.ref))&&mt(a)}u.unMount=new Set},J=(a,c)=>!t.disabled&&(a&&c&&C(s,a,c),!ae(Yt(),o)),ce=(a,c,f)=>Ot(a,u,{...i.mount?s:R(c)?o:re(a)?{[a]:c}:c},f,c),ge=a=>en(v(i.mount?s:o,a,t.shouldUnregister?v(o,a,[]):[])),Se=(a,c,f={},y=!1)=>{const w=v(n,a);let k=c;if(w){const b=w._f;b&&(!b.disabled&&C(s,a,sn(c,b)),k=Xe(b.ref)&&Q(c)?"":c,rn(b.ref)?[...b.ref.options].forEach($=>$.selected=k.includes($.value)):b.refs?Me(b.ref)?b.refs.forEach($=>{(!$.defaultChecked||!$.disabled)&&(Array.isArray(k)?$.checked=!!k.find(P=>P===$.value):$.checked=k===$.value||!!k)}):b.refs.forEach($=>$.checked=$.value===k):Rt(b.ref)?b.ref.value="":(b.ref.value=k,b.ref.type||p.state.next({name:a,values:y?s:B(s)})))}(f.shouldDirty||f.shouldTouch)&&ne(a,k,f.shouldTouch,f.shouldDirty,!0),f.shouldValidate&&pt(a)},Te=(a,c,f,y=!1)=>{for(const w in c){if(!c.hasOwnProperty(w))return;const k=c[w],b=a+"."+w,$=v(n,b);(u.array.has(a)||M(k)||$&&!$._f)&&!$e(k)?Te(b,k,f,y):Se(b,k,f,y)}},We=(a,c,f,y)=>{const w=v(n,a),k=u.array.has(a),b=y?c:B(c),$=v(s,a),P=ae($,b);if(P||C(s,a,b),k)p.array.next({name:a,values:y?s:B(s)}),(d.isDirty||d.dirtyFields||g.isDirty||g.dirtyFields)&&f.shouldDirty&&(z(),p.state.next({name:a,dirtyFields:r.dirtyFields,isDirty:J(a,b)}));else{const K=Array.isArray(b)&&!b.length||X(b);!w||w._f||Q(b)||K?Se(a,b,f,y):Te(a,b,f,y)}if(!P){const K=wt(a,u),le=y?s:B(s);p.state.next({...K&&r,name:i.mount||K?a:void 0,values:le})}},Ne=(a,c,f={})=>We(a,c,f,!1),xn=(a,c={})=>{const f=te(a)?a(s):a;if(!ae(s,f)){s={...s,...f};for(const y of u.mount)We(y,v(f,y),c,!0);p.state.next({...r,name:void 0,type:void 0,values:s}),c.shouldValidate&&T()}},Kt=async a=>{i.mount=!0;const c=a.target;let f=c.name,y=!0;const w=v(n,f),k=P=>{y=Number.isNaN(P)||$e(P)&&isNaN(P.getTime())||ae(P,v(s,f,P))},b=hr(t.mode),$=hr(t.reValidateMode);if(w){let P,K;const le=c.type?dr(w._f):$t(a),de=a.type===ve.BLUR||a.type===ve.FOCUS_OUT,ke=!uo(w._f)&&!e.validate&&!t.resolver&&!v(r.errors,f)&&!w._f.deps||lo(de,v(r.touchedFields,f),r.isSubmitted,$,b),yt=wt(f,u,de);C(s,f,le),de?(!c||!c.readOnly)&&(w._f.onBlur&&w._f.onBlur(a),l&&l(0)):w._f.onChange&&w._f.onChange(a);const Pe=ne(f,le,de),Bn=!X(Pe)||yt;if(!de&&p.state.next({name:f,type:a.type,values:B(s)}),ke)return(d.isValid||g.isValid)&&(t.mode==="onBlur"?de&&T():de||T()),Bn&&p.state.next({name:f,...yt?{}:Pe});if(!t.resolver&&e.validate&&await D({name:f,eventType:a.type}),!de&&yt&&p.state.next({...r}),t.resolver){const{errors:sr}=await ie([f]);if(F([f]),k(le),!y){!X(Pe)&&p.state.next(Pe);return}const Wn=mr(r.errors,n,f),ir=mr(sr,n,Wn.name||f);P=ir.error,f=ir.name,K=X(sr)}else F([f],!0),P=(await yr(w,u.disabled,s,Z,t.shouldUseNativeValidation))[f],F([f]),k(le),y&&(P?K=!1:(d.isValid||g.isValid)&&(K=await N({fields:n,onlyCheckValid:!0,name:f,eventType:a.type})));y&&(w._f.deps&&(!Array.isArray(w._f.deps)||w._f.deps.length>0)&&pt(w._f.deps),_e(f,K,P,Pe))}},qt=(a,c)=>{if(v(r.errors,c)&&a.focus)return a.focus(),1},pt=async(a,c={})=>{let f,y;const w=He(a);if(t.resolver){const k=await Be(R(a)?a:w);f=X(k),y=a?!w.some(b=>v(k,b)):f}else a?(y=(await Promise.all(w.map(async k=>{const b=v(n,k);return await N({fields:b&&b._f?{[k]:b}:b,eventType:ve.TRIGGER})}))).every(Boolean),!(!y&&!r.isValid)&&T()):y=f=await N({fields:n,name:a,eventType:ve.TRIGGER});return p.state.next({...!re(a)||(d.isValid||g.isValid)&&f!==r.isValid?{}:{name:a},...t.resolver||!a?{isValid:f}:{},errors:r.errors}),c.shouldFocus&&!y&&xe(n,qt,a?w:u.mount),y},Yt=(a,c)=>{let f={...i.mount?s:o};return c&&(f=tn(c.dirtyFields?r.dirtyFields:r.touchedFields,f)),R(a)?f:re(a)?v(f,a):a.map(y=>v(f,y))},Ht=(a,c)=>({invalid:!!v((c||r).errors,a),isDirty:!!v((c||r).dirtyFields,a),error:v((c||r).errors,a),isValidating:!!v(r.validatingFields,a),isTouched:!!v((c||r).touchedFields,a)}),Xt=a=>{const c=a?He(a):void 0;c==null||c.forEach(f=>q(r.errors,f)),c?c.forEach(f=>{p.state.next({name:f,errors:r.errors})}):p.state.next({errors:{}})},Ge=(a,c,f)=>{const y=(v(n,a,{_f:{}})._f||{}).ref,w=v(r.errors,a)||{},{ref:k,message:b,type:$,...P}=w;C(r.errors,a,{...P,...c,ref:y}),p.state.next({name:a,errors:r.errors,isValid:!1}),f&&f.shouldFocus&&y&&y.focus&&y.focus()},Rn=(a,c)=>te(a)?p.state.subscribe({next:f=>"values"in f&&a(f.values||ce(void 0,c),f)}):ce(a,c,!0),Qt=a=>p.state.subscribe({next:c=>{if(co(a.name,c.name,a.exact)&&ao(c,a.formState||d,Jn,a.reRenderRoot)){const f={...s};a.callback({values:f,...r,...c,defaultValues:o})}}}).unsubscribe,jn=a=>(i.mount=!0,g={...g,...a.formState},Qt({...a,formState:{...m,...a.formState}})),mt=(a,c={})=>{for(const f of a?He(a):u.mount)u.mount.delete(f),u.array.delete(f),c.keepValue||(q(n,f),q(s,f)),!c.keepError&&q(r.errors,f),!c.keepDirty&&q(r.dirtyFields,f),!c.keepTouched&&q(r.touchedFields,f),!c.keepIsValidating&&q(r.validatingFields,f),!t.shouldUnregister&&!c.keepDefaultValue&&q(o,f);p.state.next({values:B(s)}),p.state.next({...r,...c.keepDirty?{isDirty:J()}:{}}),!c.keepIsValid&&T()},er=({disabled:a,name:c})=>{if(ue(a)&&i.mount||a||u.disabled.has(c)){const w=u.disabled.has(c)!==!!a;a?u.disabled.add(c):u.disabled.delete(c),w&&i.mount&&!i.action&&T()}},_t=(a,c={})=>{let f=v(n,a);const y=ue(c.disabled)||ue(t.disabled),w=!u.registerName.has(a)&&f&&f._f&&!f._f.mount;return C(n,a,{...f||{},_f:{...f&&f._f?f._f:{ref:{name:a}},name:a,mount:!0,...c}}),u.mount.add(a),f&&!w?er({disabled:ue(c.disabled)?c.disabled:t.disabled,name:a}):j(a,!0,c.value),{...y?{disabled:c.disabled||t.disabled}:{},...t.progressive?{required:!!c.required,min:De(c.min),max:De(c.max),minLength:De(c.minLength),maxLength:De(c.maxLength),pattern:De(c.pattern)}:{},name:a,onChange:Kt,onBlur:Kt,ref:k=>{if(k){u.registerName.add(a),_t(a,c),u.registerName.delete(a),f=v(n,a);const b=R(k.value)&&k.querySelectorAll&&k.querySelectorAll("input,select,textarea")[0]||k,$=to(b),P=f._f.refs||[];if($?P.find(K=>K===b):b===f._f.ref)return;C(n,a,{_f:{...f._f,...$?{refs:[...P.filter(bt),b,...Array.isArray(v(o,a))?[{}]:[]],ref:{type:b.type,name:a}}:{ref:b}}}),j(a,!1,void 0,b)}else f=v(n,a,{}),f._f&&(f._f.mount=!1),(t.shouldUnregister||c.shouldUnregister)&&!(qr(u.array,a)&&i.action)&&u.unMount.add(a)}}},gt=()=>t.shouldFocusError&&!t.shouldUseNativeValidation&&xe(n,qt,u.mount),Un=a=>{ue(a)&&(p.state.next({disabled:a}),xe(n,(c,f)=>{const y=v(n,f);y&&(c.disabled=y._f.disabled||a,Array.isArray(y._f.refs)&&y._f.refs.forEach(w=>{w.disabled=y._f.disabled||a}))},0,!1))},tr=(a,c)=>async f=>{let y;f&&(f.preventDefault&&f.preventDefault(),f.persist&&f.persist());let w=B(s);if(p.state.next({isSubmitting:!0}),t.resolver){const{errors:k,values:b}=await ie();F(),r.errors=k,w=B(b)}else await N({fields:n,eventType:ve.SUBMIT});if(u.disabled.size)for(const k of u.disabled)q(w,k);if(q(r.errors,Hr),X(r.errors)){p.state.next({errors:{}});try{await a(w,f)}catch(k){y=k}}else c&&await c({...r.errors},f),gt(),setTimeout(gt);if(p.state.next({isSubmitted:!0,isSubmitting:!1,isSubmitSuccessful:X(r.errors)&&!y,submitCount:r.submitCount+1,errors:r.errors}),y)throw y},Mn=(a,c={})=>{v(n,a)&&(R(c.defaultValue)?Ne(a,B(v(o,a))):(Ne(a,c.defaultValue),C(o,a,B(c.defaultValue))),c.keepTouched||q(r.touchedFields,a),c.keepDirty||(q(r.dirtyFields,a),r.isDirty=c.defaultValue?J(a,B(v(o,a))):J()),c.keepError||(q(r.errors,a),d.isValid&&T()),p.state.next({...r}))},rr=(a,c={})=>{const f=a?B(a):o,y=B(f),w=X(a),k=y;if(c.keepDefaultValues||(o=f),!c.keepValues){if(c.keepDirtyValues){const b=new Set([...u.mount,...Object.keys(ze(o,s))]);for(const $ of Array.from(b)){const P=v(r.dirtyFields,$),K=v(s,$),le=v(k,$);P&&!R(K)?C(k,$,K):!P&&!R(le)&&Ne($,le)}}else{if(ot&&R(a))for(const b of u.mount){const $=v(n,b);if($&&$._f){const P=Array.isArray($._f.refs)?$._f.refs[0]:$._f.ref;if(Xe(P)){const K=P.closest("form");if(K){K.reset();break}}}}if(c.keepFieldsRef)for(const b of u.mount)Ne(b,v(k,b));else n={}}if(t.shouldUnregister){if(s=c.keepDefaultValues?B(o):{},c.keepFieldsRef)for(const b of u.mount)C(s,b,v(k,b))}else s=B(k);p.array.next({values:{...k}}),p.state.next({values:{...k}})}u={mount:c.keepDirtyValues?u.mount:new Set,unMount:new Set,array:new Set,registerName:new Set,disabled:new Set,watch:new Set,watchAll:!1,focus:""},i.mount=!d.isValid||!!c.keepIsValid||!!c.keepDirtyValues||!t.shouldUnregister&&!X(k),i.watch=!!t.shouldUnregister,i.keepIsValid=!!c.keepIsValid,i.action=!1,c.keepErrors||(r.errors={}),p.state.next({submitCount:c.keepSubmitCount?r.submitCount:0,isDirty:w?!1:c.keepDirty?r.isDirty:c.keepValues?J():!!(c.keepDefaultValues&&!ae(a,o)),isSubmitted:c.keepIsSubmitted?r.isSubmitted:!1,dirtyFields:w?{}:c.keepDirtyValues?c.keepDefaultValues&&s?ze(o,s):r.dirtyFields:c.keepDefaultValues&&a?ze(o,a):c.keepDirty?r.dirtyFields:{},touchedFields:c.keepTouched?r.touchedFields:{},errors:c.keepErrors?r.errors:{},isSubmitSuccessful:c.keepIsSubmitSuccessful?r.isSubmitSuccessful:!1,isSubmitting:!1,defaultValues:o})},nr=(a,c)=>rr(te(a)?a(s):a,{...t.resetOptions,...c}),Ln=(a,c={})=>{const f=v(n,a),y=f&&f._f;if(y){const w=y.refs?y.refs[0]:y.ref;w.focus&&setTimeout(()=>{w.focus(),c.shouldSelect&&te(w.select)&&w.select()})}},Jn=a=>{r={...r,...a}},or={control:{register:_t,unregister:mt,getFieldState:Ht,handleSubmit:tr,setError:Ge,_subscribe:Qt,_runSchema:ie,_updateIsValidating:F,_focusError:gt,_getWatch:ce,_getDirty:J,_setValid:T,_setFieldArray:W,_setDisabledField:er,_setErrors:I,_getFieldArray:ge,_reset:rr,_resetDefaultValues:()=>te(t.defaultValues)&&t.defaultValues().then(a=>{nr(a,t.resetOptions),p.state.next({isLoading:!1})}),_removeUnmounted:G,_disableForm:Un,_subjects:p,_proxyFormState:d,get _fields(){return n},get _formValues(){return s},get _state(){return i},set _state(a){i=a},get _defaultValues(){return o},get _names(){return u},set _names(a){u=a},get _formState(){return r},get _options(){return t},set _options(a){t={...t,...a}}},subscribe:jn,trigger:pt,register:_t,handleSubmit:tr,watch:Rn,setValue:Ne,setValues:xn,getValues:Yt,reset:nr,resetField:Mn,resetDefaultValues:(a,c={})=>{if(o=B(a),!c.keepDirty){const f=ze(o,s);r.dirtyFields=f,r.isDirty=!X(f)}c.keepIsValid||T(),p.state.next({...r,defaultValues:o})},clearErrors:Xt,unregister:mt,setError:Ge,setFocus:Ln,getFieldState:Ht};return{...or,formControl:or}}function uc(e={}){const t=S.useRef(void 0),r=S.useRef(void 0),n=S.useRef(e.formControl),[o,s]=S.useState(()=>({...B(an),isLoading:te(e.defaultValues),errors:e.errors||{},disabled:e.disabled||!1,defaultValues:te(e.defaultValues)?void 0:e.defaultValues}));if(!t.current||e.formControl&&n.current!==e.formControl)if(n.current=e.formControl,e.formControl)t.current={...e.formControl,formState:o},e.defaultValues&&!te(e.defaultValues)&&e.formControl.reset(e.defaultValues,e.resetOptions);else{const{formControl:u,...l}=po(e);t.current={...l,formState:o}}const i=t.current.control;return i._options=e,Dt(()=>{const u=i._subscribe({formState:i._proxyFormState,callback:()=>s({...i._formState,defaultValues:i._defaultValues}),reRenderRoot:!0});return s(l=>({...l,isReady:!0})),i._formState.isReady=!0,u},[i]),S.useEffect(()=>i._disableForm(e.disabled),[i,e.disabled]),S.useEffect(()=>{e.mode&&(i._options.mode=e.mode),e.reValidateMode&&(i._options.reValidateMode=e.reValidateMode)},[i,e.mode,e.reValidateMode]),S.useEffect(()=>{e.errors&&(i._setErrors(e.errors),i._focusError())},[i,e.errors]),S.useEffect(()=>{e.shouldUnregister&&i._subjects.state.next({values:i._getWatch()})},[i,e.shouldUnregister]),S.useEffect(()=>{if(i._proxyFormState.isDirty){const u=i._getDirty();u!==o.isDirty&&i._subjects.state.next({isDirty:u})}},[i,o.isDirty]),S.useEffect(()=>{var u;e.values&&!ae(e.values,r.current)?(i._reset(e.values,{keepFieldsRef:!0,...i._options.resetOptions}),!((u=i._options.resetOptions)===null||u===void 0)&&u.keepIsValid||i._setValid(),r.current=e.values,s(l=>({...l}))):i._resetDefaultValues()},[i,e.values]),S.useEffect(()=>{i._state.mount||(i._setValid(),i._state.mount=!0),i._state.watch&&(i._state.watch=!1,i._subjects.state.next({...i._formState})),i._removeUnmounted()}),t.current.formState=S.useMemo(()=>Qr(o,i),[i,o]),t.current}const vr=(e,t,r)=>{if(e&&"reportValidity"in e){const n=v(r,t);e.setCustomValidity(n&&n.message||""),e.reportValidity()}},It=(e,t)=>{for(const r in t.fields){const n=t.fields[r];n&&n.ref&&"reportValidity"in n.ref?vr(n.ref,r,e):n&&n.refs&&n.refs.forEach(o=>vr(o,r,e))}},br=(e,t)=>{t.shouldUseNativeValidation&&It(e,t);const r={};for(const n in e){const o=v(t.fields,n),s=Object.assign(e[n]||{},{ref:o&&o.ref});if(mo(t.names||Object.keys(e),n)){const i=Object.assign({},v(r,n));C(i,"root",s),C(r,n,i)}else C(r,n,s)}return r},mo=(e,t)=>{const r=wr(t).replace(/[.*+?^${}()|\\]/g,"\\$&");return e.some(n=>wr(n).match(`^${r}\\.\\d+`))};function wr(e){return e.replace(/[\[\]]/g,"")}var kr;function _(e,t,r){function n(u,l){if(u._zod||Object.defineProperty(u,"_zod",{value:{def:l,constr:i,traits:new Set},enumerable:!1}),u._zod.traits.has(e))return;u._zod.traits.add(e),t(u,l);const h=i.prototype,m=Object.keys(h);for(let d=0;d{var l,h;return r!=null&&r.Parent&&u instanceof r.Parent?!0:(h=(l=u==null?void 0:u._zod)==null?void 0:l.traits)==null?void 0:h.has(e)}}),Object.defineProperty(i,"name",{value:e}),i}class Fe extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}}class cn extends Error{constructor(t){super(`Encountered unidirectional transform during encode: ${t}`),this.name="ZodEncodeError"}}(kr=globalThis).__zod_globalConfig??(kr.__zod_globalConfig={});const Ut=globalThis.__zod_globalConfig;function Oe(e){return Ut}function ln(e){const t=Object.values(e).filter(n=>typeof n=="number");return Object.entries(e).filter(([n,o])=>t.indexOf(+n)===-1).map(([n,o])=>o)}function At(e,t){return typeof t=="bigint"?t.toString():t}function Mt(e){return{get value(){{const t=e();return Object.defineProperty(this,"value",{value:t}),t}}}}function Lt(e){return e==null}function Jt(e){const t=e.startsWith("^")?1:0,r=e.endsWith("$")?e.length-1:e.length;return e.slice(t,r)}function _o(e,t){const r=e/t,n=Math.round(r),o=Number.EPSILON*Math.max(Math.abs(r),1);return Math.abs(r-n){};function et(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}const yo=Mt(()=>{var e;if(Ut.jitless||typeof navigator<"u"&&((e=navigator==null?void 0:navigator.userAgent)!=null&&e.includes("Cloudflare")))return!1;try{const t=Function;return new t(""),!0}catch{return!1}});function Re(e){if(et(e)===!1)return!1;const t=e.constructor;if(t===void 0||typeof t!="function")return!0;const r=t.prototype;return!(et(r)===!1||Object.prototype.hasOwnProperty.call(r,"isPrototypeOf")===!1)}function dn(e){return Re(e)?{...e}:Array.isArray(e)?[...e]:e instanceof Map?new Map(e):e instanceof Set?new Set(e):e}const vo=new Set(["string","number","symbol"]);function it(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function we(e,t,r){const n=new e._zod.constr(t??e._zod.def);return(!t||r!=null&&r.parent)&&(n._zod.parent=e),n}function E(e){const t=e;if(!t)return{};if(typeof t=="string")return{error:()=>t};if((t==null?void 0:t.message)!==void 0){if((t==null?void 0:t.error)!==void 0)throw new Error("Cannot specify both `message` and `error` params");t.error=t.message}return delete t.message,typeof t.error=="string"?{...t,error:()=>t.error}:t}function bo(e){return Object.keys(e).filter(t=>e[t]._zod.optin==="optional"&&e[t]._zod.optout==="optional")}const wo={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function ko(e,t){const r=e._zod.def,n=r.checks;if(n&&n.length>0)throw new Error(".pick() cannot be used on object schemas containing refinements");const s=be(e._zod.def,{get shape(){const i={};for(const u in t){if(!(u in r.shape))throw new Error(`Unrecognized key: "${u}"`);t[u]&&(i[u]=r.shape[u])}return Ze(this,"shape",i),i},checks:[]});return we(e,s)}function zo(e,t){const r=e._zod.def,n=r.checks;if(n&&n.length>0)throw new Error(".omit() cannot be used on object schemas containing refinements");const s=be(e._zod.def,{get shape(){const i={...e._zod.def.shape};for(const u in t){if(!(u in r.shape))throw new Error(`Unrecognized key: "${u}"`);t[u]&&delete i[u]}return Ze(this,"shape",i),i},checks:[]});return we(e,s)}function $o(e,t){if(!Re(t))throw new Error("Invalid input to extend: expected a plain object");const r=e._zod.def.checks;if(r&&r.length>0){const s=e._zod.def.shape;for(const i in t)if(Object.getOwnPropertyDescriptor(s,i)!==void 0)throw new Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}const o=be(e._zod.def,{get shape(){const s={...e._zod.def.shape,...t};return Ze(this,"shape",s),s}});return we(e,o)}function Oo(e,t){if(!Re(t))throw new Error("Invalid input to safeExtend: expected a plain object");const r=be(e._zod.def,{get shape(){const n={...e._zod.def.shape,...t};return Ze(this,"shape",n),n}});return we(e,r)}function Eo(e,t){var n;if((n=e._zod.def.checks)!=null&&n.length)throw new Error(".merge() cannot be used on object schemas containing refinements. Use .safeExtend() instead.");const r=be(e._zod.def,{get shape(){const o={...e._zod.def.shape,...t._zod.def.shape};return Ze(this,"shape",o),o},get catchall(){return t._zod.def.catchall},checks:t._zod.def.checks??[]});return we(e,r)}function Zo(e,t,r){const o=t._zod.def.checks;if(o&&o.length>0)throw new Error(".partial() cannot be used on object schemas containing refinements");const i=be(t._zod.def,{get shape(){const u=t._zod.def.shape,l={...u};if(r)for(const h in r){if(!(h in u))throw new Error(`Unrecognized key: "${h}"`);r[h]&&(l[h]=e?new e({type:"optional",innerType:u[h]}):u[h])}else for(const h in u)l[h]=e?new e({type:"optional",innerType:u[h]}):u[h];return Ze(this,"shape",l),l},checks:[]});return we(t,i)}function So(e,t,r){const n=be(t._zod.def,{get shape(){const o=t._zod.def.shape,s={...o};if(r)for(const i in r){if(!(i in s))throw new Error(`Unrecognized key: "${i}"`);r[i]&&(s[i]=new e({type:"nonoptional",innerType:o[i]}))}else for(const i in o)s[i]=new e({type:"nonoptional",innerType:o[i]});return Ze(this,"shape",s),s}});return we(t,n)}function Ae(e,t=0){var r;if(e.aborted===!0)return!0;for(let n=t;n{var n;return(n=r).path??(n.path=[]),r.path.unshift(e),r})}function Ke(e){return typeof e=="string"?e:e==null?void 0:e.message}function Ee(e,t,r){var l,h,m,d,g,p;const n=e.message?e.message:Ke((m=(h=(l=e.inst)==null?void 0:l._zod.def)==null?void 0:h.error)==null?void 0:m.call(h,e))??Ke((d=t==null?void 0:t.error)==null?void 0:d.call(t,e))??Ke((g=r.customError)==null?void 0:g.call(r,e))??Ke((p=r.localeError)==null?void 0:p.call(r,e))??"Invalid input",{inst:o,continue:s,input:i,...u}=e;return u.path??(u.path=[]),u.message=n,t!=null&&t.reportInput&&(u.input=i),u}function Bt(e){return Array.isArray(e)?"array":typeof e=="string"?"string":"unknown"}function je(...e){const[t,r,n]=e;return typeof t=="string"?{message:t,code:"custom",input:r,inst:n}:{...t}}const pn=(e,t)=>{e.name="$ZodError",Object.defineProperty(e,"_zod",{value:e._zod,enumerable:!1}),Object.defineProperty(e,"issues",{value:t,enumerable:!1}),e.message=JSON.stringify(t,At,2),Object.defineProperty(e,"toString",{value:()=>e.message,enumerable:!1})},Wt=_("$ZodError",pn),ut=_("$ZodError",pn,{Parent:Error});function Ao(e,t=r=>r.message){const r={},n=[];for(const o of e.issues)o.path.length>0?(r[o.path[0]]=r[o.path[0]]||[],r[o.path[0]].push(t(o))):n.push(t(o));return{formErrors:n,fieldErrors:r}}function Fo(e,t=r=>r.message){const r={_errors:[]},n=(o,s=[])=>{for(const i of o.issues)if(i.code==="invalid_union"&&i.errors.length)i.errors.map(u=>n({issues:u},[...s,...i.path]));else if(i.code==="invalid_key")n({issues:i.issues},[...s,...i.path]);else if(i.code==="invalid_element")n({issues:i.issues},[...s,...i.path]);else{const u=[...s,...i.path];if(u.length===0)r._errors.push(t(i));else{let l=r,h=0;for(;h(t,r,n,o)=>{const s=n?{...n,async:!1}:{async:!1},i=t._zod.run({value:r,issues:[]},s);if(i instanceof Promise)throw new Fe;if(i.issues.length){const u=new((o==null?void 0:o.Err)??e)(i.issues.map(l=>Ee(l,s,Oe())));throw fn(u,o==null?void 0:o.callee),u}return i.value},Vo=at(ut),ct=e=>async(t,r,n,o)=>{const s=n?{...n,async:!0}:{async:!0};let i=t._zod.run({value:r,issues:[]},s);if(i instanceof Promise&&(i=await i),i.issues.length){const u=new((o==null?void 0:o.Err)??e)(i.issues.map(l=>Ee(l,s,Oe())));throw fn(u,o==null?void 0:o.callee),u}return i.value},To=ct(ut),lt=e=>(t,r,n)=>{const o=n?{...n,async:!1}:{async:!1},s=t._zod.run({value:r,issues:[]},o);if(s instanceof Promise)throw new Fe;return s.issues.length?{success:!1,error:new(e??Wt)(s.issues.map(i=>Ee(i,o,Oe())))}:{success:!0,data:s.value}},No=lt(ut),ft=e=>async(t,r,n)=>{const o=n?{...n,async:!0}:{async:!0};let s=t._zod.run({value:r,issues:[]},o);return s instanceof Promise&&(s=await s),s.issues.length?{success:!1,error:new e(s.issues.map(i=>Ee(i,o,Oe())))}:{success:!0,data:s.value}},Po=ft(ut),Do=e=>(t,r,n)=>{const o=n?{...n,direction:"backward"}:{direction:"backward"};return at(e)(t,r,o)},Co=e=>(t,r,n)=>at(e)(t,r,n),xo=e=>async(t,r,n)=>{const o=n?{...n,direction:"backward"}:{direction:"backward"};return ct(e)(t,r,o)},Ro=e=>async(t,r,n)=>ct(e)(t,r,n),jo=e=>(t,r,n)=>{const o=n?{...n,direction:"backward"}:{direction:"backward"};return lt(e)(t,r,o)},Uo=e=>(t,r,n)=>lt(e)(t,r,n),Mo=e=>async(t,r,n)=>{const o=n?{...n,direction:"backward"}:{direction:"backward"};return ft(e)(t,r,o)},Lo=e=>async(t,r,n)=>ft(e)(t,r,n),Jo=/^[cC][0-9a-z]{6,}$/,Bo=/^[0-9a-z]+$/,Wo=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,Go=/^[0-9a-vA-V]{20}$/,Ko=/^[A-Za-z0-9]{27}$/,qo=/^[a-zA-Z0-9_-]{21}$/,Yo=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,Ho=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/,Or=e=>e?new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${e}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`):/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/,Xo=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/,Qo="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";function es(){return new RegExp(Qo,"u")}const ts=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,rs=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/,ns=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/,os=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,ss=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,mn=/^[A-Za-z0-9_-]*$/,is=/^https?$/,us=/^\+[1-9]\d{6,14}$/,_n="(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))",as=new RegExp(`^${_n}$`);function gn(e){const t="(?:[01]\\d|2[0-3]):[0-5]\\d";return typeof e.precision=="number"?e.precision===-1?`${t}`:e.precision===0?`${t}:[0-5]\\d`:`${t}:[0-5]\\d\\.\\d{${e.precision}}`:`${t}(?::[0-5]\\d(?:\\.\\d+)?)?`}function cs(e){return new RegExp(`^${gn(e)}$`)}function ls(e){const t=gn({precision:e.precision}),r=["Z"];e.local&&r.push(""),e.offset&&r.push("([+-](?:[01]\\d|2[0-3]):[0-5]\\d)");const n=`${t}(?:${r.join("|")})`;return new RegExp(`^${_n}T(?:${n})$`)}const fs=e=>{const t=e?`[\\s\\S]{${(e==null?void 0:e.minimum)??0},${(e==null?void 0:e.maximum)??""}}`:"[\\s\\S]*";return new RegExp(`^${t}$`)},ds=/^-?\d+$/,hs=/^-?\d+(?:\.\d+)?$/,ps=/^[^A-Z]*$/,ms=/^[^a-z]*$/,se=_("$ZodCheck",(e,t)=>{var r;e._zod??(e._zod={}),e._zod.def=t,(r=e._zod).onattach??(r.onattach=[])}),yn={number:"number",bigint:"bigint",object:"date"},vn=_("$ZodCheckLessThan",(e,t)=>{se.init(e,t);const r=yn[typeof t.value];e._zod.onattach.push(n=>{const o=n._zod.bag,s=(t.inclusive?o.maximum:o.exclusiveMaximum)??Number.POSITIVE_INFINITY;t.value{(t.inclusive?n.value<=t.value:n.value{se.init(e,t);const r=yn[typeof t.value];e._zod.onattach.push(n=>{const o=n._zod.bag,s=(t.inclusive?o.minimum:o.exclusiveMinimum)??Number.NEGATIVE_INFINITY;t.value>s&&(t.inclusive?o.minimum=t.value:o.exclusiveMinimum=t.value)}),e._zod.check=n=>{(t.inclusive?n.value>=t.value:n.value>t.value)||n.issues.push({origin:r,code:"too_small",minimum:typeof t.value=="object"?t.value.getTime():t.value,input:n.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),_s=_("$ZodCheckMultipleOf",(e,t)=>{se.init(e,t),e._zod.onattach.push(r=>{var n;(n=r._zod.bag).multipleOf??(n.multipleOf=t.value)}),e._zod.check=r=>{if(typeof r.value!=typeof t.value)throw new Error("Cannot mix number and bigint in multiple_of check.");(typeof r.value=="bigint"?r.value%t.value===BigInt(0):_o(r.value,t.value)===0)||r.issues.push({origin:typeof r.value,code:"not_multiple_of",divisor:t.value,input:r.value,inst:e,continue:!t.abort})}}),gs=_("$ZodCheckNumberFormat",(e,t)=>{var i;se.init(e,t),t.format=t.format||"float64";const r=(i=t.format)==null?void 0:i.includes("int"),n=r?"int":"number",[o,s]=wo[t.format];e._zod.onattach.push(u=>{const l=u._zod.bag;l.format=t.format,l.minimum=o,l.maximum=s,r&&(l.pattern=ds)}),e._zod.check=u=>{const l=u.value;if(r){if(!Number.isInteger(l)){u.issues.push({expected:n,format:t.format,code:"invalid_type",continue:!1,input:l,inst:e});return}if(!Number.isSafeInteger(l)){l>0?u.issues.push({input:l,code:"too_big",maximum:Number.MAX_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst:e,origin:n,inclusive:!0,continue:!t.abort}):u.issues.push({input:l,code:"too_small",minimum:Number.MIN_SAFE_INTEGER,note:"Integers must be within the safe integer range.",inst:e,origin:n,inclusive:!0,continue:!t.abort});return}}ls&&u.issues.push({origin:"number",input:l,code:"too_big",maximum:s,inclusive:!0,inst:e,continue:!t.abort})}}),ys=_("$ZodCheckMaxLength",(e,t)=>{var r;se.init(e,t),(r=e._zod.def).when??(r.when=n=>{const o=n.value;return!Lt(o)&&o.length!==void 0}),e._zod.onattach.push(n=>{const o=n._zod.bag.maximum??Number.POSITIVE_INFINITY;t.maximum{const o=n.value;if(o.length<=t.maximum)return;const i=Bt(o);n.issues.push({origin:i,code:"too_big",maximum:t.maximum,inclusive:!0,input:o,inst:e,continue:!t.abort})}}),vs=_("$ZodCheckMinLength",(e,t)=>{var r;se.init(e,t),(r=e._zod.def).when??(r.when=n=>{const o=n.value;return!Lt(o)&&o.length!==void 0}),e._zod.onattach.push(n=>{const o=n._zod.bag.minimum??Number.NEGATIVE_INFINITY;t.minimum>o&&(n._zod.bag.minimum=t.minimum)}),e._zod.check=n=>{const o=n.value;if(o.length>=t.minimum)return;const i=Bt(o);n.issues.push({origin:i,code:"too_small",minimum:t.minimum,inclusive:!0,input:o,inst:e,continue:!t.abort})}}),bs=_("$ZodCheckLengthEquals",(e,t)=>{var r;se.init(e,t),(r=e._zod.def).when??(r.when=n=>{const o=n.value;return!Lt(o)&&o.length!==void 0}),e._zod.onattach.push(n=>{const o=n._zod.bag;o.minimum=t.length,o.maximum=t.length,o.length=t.length}),e._zod.check=n=>{const o=n.value,s=o.length;if(s===t.length)return;const i=Bt(o),u=s>t.length;n.issues.push({origin:i,...u?{code:"too_big",maximum:t.length}:{code:"too_small",minimum:t.length},inclusive:!0,exact:!0,input:n.value,inst:e,continue:!t.abort})}}),dt=_("$ZodCheckStringFormat",(e,t)=>{var r,n;se.init(e,t),e._zod.onattach.push(o=>{const s=o._zod.bag;s.format=t.format,t.pattern&&(s.patterns??(s.patterns=new Set),s.patterns.add(t.pattern))}),t.pattern?(r=e._zod).check??(r.check=o=>{t.pattern.lastIndex=0,!t.pattern.test(o.value)&&o.issues.push({origin:"string",code:"invalid_format",format:t.format,input:o.value,...t.pattern?{pattern:t.pattern.toString()}:{},inst:e,continue:!t.abort})}):(n=e._zod).check??(n.check=()=>{})}),ws=_("$ZodCheckRegex",(e,t)=>{dt.init(e,t),e._zod.check=r=>{t.pattern.lastIndex=0,!t.pattern.test(r.value)&&r.issues.push({origin:"string",code:"invalid_format",format:"regex",input:r.value,pattern:t.pattern.toString(),inst:e,continue:!t.abort})}}),ks=_("$ZodCheckLowerCase",(e,t)=>{t.pattern??(t.pattern=ps),dt.init(e,t)}),zs=_("$ZodCheckUpperCase",(e,t)=>{t.pattern??(t.pattern=ms),dt.init(e,t)}),$s=_("$ZodCheckIncludes",(e,t)=>{se.init(e,t);const r=it(t.includes),n=new RegExp(typeof t.position=="number"?`^.{${t.position}}${r}`:r);t.pattern=n,e._zod.onattach.push(o=>{const s=o._zod.bag;s.patterns??(s.patterns=new Set),s.patterns.add(n)}),e._zod.check=o=>{o.value.includes(t.includes,t.position)||o.issues.push({origin:"string",code:"invalid_format",format:"includes",includes:t.includes,input:o.value,inst:e,continue:!t.abort})}}),Os=_("$ZodCheckStartsWith",(e,t)=>{se.init(e,t);const r=new RegExp(`^${it(t.prefix)}.*`);t.pattern??(t.pattern=r),e._zod.onattach.push(n=>{const o=n._zod.bag;o.patterns??(o.patterns=new Set),o.patterns.add(r)}),e._zod.check=n=>{n.value.startsWith(t.prefix)||n.issues.push({origin:"string",code:"invalid_format",format:"starts_with",prefix:t.prefix,input:n.value,inst:e,continue:!t.abort})}}),Es=_("$ZodCheckEndsWith",(e,t)=>{se.init(e,t);const r=new RegExp(`.*${it(t.suffix)}$`);t.pattern??(t.pattern=r),e._zod.onattach.push(n=>{const o=n._zod.bag;o.patterns??(o.patterns=new Set),o.patterns.add(r)}),e._zod.check=n=>{n.value.endsWith(t.suffix)||n.issues.push({origin:"string",code:"invalid_format",format:"ends_with",suffix:t.suffix,input:n.value,inst:e,continue:!t.abort})}}),Zs=_("$ZodCheckOverwrite",(e,t)=>{se.init(e,t),e._zod.check=r=>{r.value=t.tx(r.value)}});class Ss{constructor(t=[]){this.content=[],this.indent=0,this&&(this.args=t)}indented(t){this.indent+=1,t(this),this.indent-=1}write(t){if(typeof t=="function"){t(this,{execution:"sync"}),t(this,{execution:"async"});return}const n=t.split(` `).filter(i=>i),o=Math.min(...n.map(i=>i.length-i.trimStart().length)),s=n.map(i=>i.slice(o)).map(i=>" ".repeat(this.indent*2)+i);for(const i of s)this.content.push(i)}compile(){const t=Function,r=this==null?void 0:this.args,o=[...((this==null?void 0:this.content)??[""]).map(s=>` ${s}`)];return new t(...r,o.join(` `))}}const Is={major:4,minor:4,patch:3},Y=_("$ZodType",(e,t)=>{var o;var r;e??(e={}),e._zod.def=t,e._zod.bag=e._zod.bag||{},e._zod.version=Is;const n=[...e._zod.def.checks??[]];e._zod.traits.has("$ZodCheck")&&n.unshift(e);for(const s of n)for(const i of s._zod.onattach)i(e);if(n.length===0)(r=e._zod).deferred??(r.deferred=[]),(o=e._zod.deferred)==null||o.push(()=>{e._zod.run=e._zod.parse});else{const s=(u,l,h)=>{let m=Ae(u),d;for(const g of l){if(g._zod.def.when){if(Io(u)||!g._zod.def.when(u))continue}else if(m)continue;const p=u.issues.length,Z=g._zod.check(u);if(Z instanceof Promise&&(h==null?void 0:h.async)===!1)throw new Fe;if(d||Z instanceof Promise)d=(d??Promise.resolve()).then(async()=>{await Z,u.issues.length!==p&&(m||(m=Ae(u,p)))});else{if(u.issues.length===p)continue;m||(m=Ae(u,p))}}return d?d.then(()=>u):u},i=(u,l,h)=>{if(Ae(u))return u.aborted=!0,u;const m=s(l,n,h);if(m instanceof Promise){if(h.async===!1)throw new Fe;return m.then(d=>e._zod.parse(d,h))}return e._zod.parse(m,h)};e._zod.run=(u,l)=>{if(l.skipChecks)return e._zod.parse(u,l);if(l.direction==="backward"){const m=e._zod.parse({value:u.value,issues:[]},{...l,skipChecks:!0});return m instanceof Promise?m.then(d=>i(d,u,l)):i(m,u,l)}const h=e._zod.parse(u,l);if(h instanceof Promise){if(l.async===!1)throw new Fe;return h.then(m=>s(m,n,l))}return s(h,n,l)}}x(e,"~standard",()=>({validate:s=>{var i;try{const u=No(e,s);return u.success?{value:u.data}:{issues:(i=u.error)==null?void 0:i.issues}}catch{return Po(e,s).then(l=>{var h;return l.success?{value:l.data}:{issues:(h=l.error)==null?void 0:h.issues}})}},vendor:"zod",version:1}))}),Gt=_("$ZodString",(e,t)=>{var r;Y.init(e,t),e._zod.pattern=[...((r=e==null?void 0:e._zod.bag)==null?void 0:r.patterns)??[]].pop()??fs(e._zod.bag),e._zod.parse=(n,o)=>{if(t.coerce)try{n.value=String(n.value)}catch{}return typeof n.value=="string"||n.issues.push({expected:"string",code:"invalid_type",input:n.value,inst:e}),n}}),U=_("$ZodStringFormat",(e,t)=>{dt.init(e,t),Gt.init(e,t)}),As=_("$ZodGUID",(e,t)=>{t.pattern??(t.pattern=Ho),U.init(e,t)}),Fs=_("$ZodUUID",(e,t)=>{if(t.version){const n={v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8}[t.version];if(n===void 0)throw new Error(`Invalid UUID version: "${t.version}"`);t.pattern??(t.pattern=Or(n))}else t.pattern??(t.pattern=Or());U.init(e,t)}),Vs=_("$ZodEmail",(e,t)=>{t.pattern??(t.pattern=Xo),U.init(e,t)}),Ts=_("$ZodURL",(e,t)=>{U.init(e,t),e._zod.check=r=>{var n;try{const o=r.value.trim();if(!t.normalize&&((n=t.protocol)==null?void 0:n.source)===is.source&&!/^https?:\/\//i.test(o)){r.issues.push({code:"invalid_format",format:"url",note:"Invalid URL format",input:r.value,inst:e,continue:!t.abort});return}const s=new URL(o);t.hostname&&(t.hostname.lastIndex=0,t.hostname.test(s.hostname)||r.issues.push({code:"invalid_format",format:"url",note:"Invalid hostname",pattern:t.hostname.source,input:r.value,inst:e,continue:!t.abort})),t.protocol&&(t.protocol.lastIndex=0,t.protocol.test(s.protocol.endsWith(":")?s.protocol.slice(0,-1):s.protocol)||r.issues.push({code:"invalid_format",format:"url",note:"Invalid protocol",pattern:t.protocol.source,input:r.value,inst:e,continue:!t.abort})),t.normalize?r.value=s.href:r.value=o;return}catch{r.issues.push({code:"invalid_format",format:"url",input:r.value,inst:e,continue:!t.abort})}}}),Ns=_("$ZodEmoji",(e,t)=>{t.pattern??(t.pattern=es()),U.init(e,t)}),Ps=_("$ZodNanoID",(e,t)=>{t.pattern??(t.pattern=qo),U.init(e,t)}),Ds=_("$ZodCUID",(e,t)=>{t.pattern??(t.pattern=Jo),U.init(e,t)}),Cs=_("$ZodCUID2",(e,t)=>{t.pattern??(t.pattern=Bo),U.init(e,t)}),xs=_("$ZodULID",(e,t)=>{t.pattern??(t.pattern=Wo),U.init(e,t)}),Rs=_("$ZodXID",(e,t)=>{t.pattern??(t.pattern=Go),U.init(e,t)}),js=_("$ZodKSUID",(e,t)=>{t.pattern??(t.pattern=Ko),U.init(e,t)}),Us=_("$ZodISODateTime",(e,t)=>{t.pattern??(t.pattern=ls(t)),U.init(e,t)}),Ms=_("$ZodISODate",(e,t)=>{t.pattern??(t.pattern=as),U.init(e,t)}),Ls=_("$ZodISOTime",(e,t)=>{t.pattern??(t.pattern=cs(t)),U.init(e,t)}),Js=_("$ZodISODuration",(e,t)=>{t.pattern??(t.pattern=Yo),U.init(e,t)}),Bs=_("$ZodIPv4",(e,t)=>{t.pattern??(t.pattern=ts),U.init(e,t),e._zod.bag.format="ipv4"}),Ws=_("$ZodIPv6",(e,t)=>{t.pattern??(t.pattern=rs),U.init(e,t),e._zod.bag.format="ipv6",e._zod.check=r=>{try{new URL(`http://[${r.value}]`)}catch{r.issues.push({code:"invalid_format",format:"ipv6",input:r.value,inst:e,continue:!t.abort})}}}),Gs=_("$ZodCIDRv4",(e,t)=>{t.pattern??(t.pattern=ns),U.init(e,t)}),Ks=_("$ZodCIDRv6",(e,t)=>{t.pattern??(t.pattern=os),U.init(e,t),e._zod.check=r=>{const n=r.value.split("/");try{if(n.length!==2)throw new Error;const[o,s]=n;if(!s)throw new Error;const i=Number(s);if(`${i}`!==s)throw new Error;if(i<0||i>128)throw new Error;new URL(`http://[${o}]`)}catch{r.issues.push({code:"invalid_format",format:"cidrv6",input:r.value,inst:e,continue:!t.abort})}}});function wn(e){if(e==="")return!0;if(/\s/.test(e)||e.length%4!==0)return!1;try{return atob(e),!0}catch{return!1}}const qs=_("$ZodBase64",(e,t)=>{t.pattern??(t.pattern=ss),U.init(e,t),e._zod.bag.contentEncoding="base64",e._zod.check=r=>{wn(r.value)||r.issues.push({code:"invalid_format",format:"base64",input:r.value,inst:e,continue:!t.abort})}});function Ys(e){if(!mn.test(e))return!1;const t=e.replace(/[-_]/g,n=>n==="-"?"+":"/"),r=t.padEnd(Math.ceil(t.length/4)*4,"=");return wn(r)}const Hs=_("$ZodBase64URL",(e,t)=>{t.pattern??(t.pattern=mn),U.init(e,t),e._zod.bag.contentEncoding="base64url",e._zod.check=r=>{Ys(r.value)||r.issues.push({code:"invalid_format",format:"base64url",input:r.value,inst:e,continue:!t.abort})}}),Xs=_("$ZodE164",(e,t)=>{t.pattern??(t.pattern=us),U.init(e,t)});function Qs(e,t=null){try{const r=e.split(".");if(r.length!==3)return!1;const[n]=r;if(!n)return!1;const o=JSON.parse(atob(n));return!("typ"in o&&(o==null?void 0:o.typ)!=="JWT"||!o.alg||t&&(!("alg"in o)||o.alg!==t))}catch{return!1}}const ei=_("$ZodJWT",(e,t)=>{U.init(e,t),e._zod.check=r=>{Qs(r.value,t.alg)||r.issues.push({code:"invalid_format",format:"jwt",input:r.value,inst:e,continue:!t.abort})}}),kn=_("$ZodNumber",(e,t)=>{Y.init(e,t),e._zod.pattern=e._zod.bag.pattern??hs,e._zod.parse=(r,n)=>{if(t.coerce)try{r.value=Number(r.value)}catch{}const o=r.value;if(typeof o=="number"&&!Number.isNaN(o)&&Number.isFinite(o))return r;const s=typeof o=="number"?Number.isNaN(o)?"NaN":Number.isFinite(o)?void 0:"Infinity":void 0;return r.issues.push({expected:"number",code:"invalid_type",input:o,inst:e,...s?{received:s}:{}}),r}}),ti=_("$ZodNumberFormat",(e,t)=>{gs.init(e,t),kn.init(e,t)}),ri=_("$ZodUnknown",(e,t)=>{Y.init(e,t),e._zod.parse=r=>r}),ni=_("$ZodNever",(e,t)=>{Y.init(e,t),e._zod.parse=(r,n)=>(r.issues.push({expected:"never",code:"invalid_type",input:r.value,inst:e}),r)});function Er(e,t,r){e.issues.length&&t.issues.push(...hn(r,e.issues)),t.value[r]=e.value}const oi=_("$ZodArray",(e,t)=>{Y.init(e,t),e._zod.parse=(r,n)=>{const o=r.value;if(!Array.isArray(o))return r.issues.push({expected:"array",code:"invalid_type",input:o,inst:e}),r;r.value=Array(o.length);const s=[];for(let i=0;iEr(h,r,i))):Er(l,r,i)}return s.length?Promise.all(s).then(()=>r):r}});function tt(e,t,r,n,o,s){const i=r in n;if(e.issues.length){if(o&&s&&!i)return;t.issues.push(...hn(r,e.issues))}if(!i&&!o){e.issues.length||t.issues.push({code:"invalid_type",expected:"nonoptional",input:void 0,path:[r]});return}e.value===void 0?i&&(t.value[r]=void 0):t.value[r]=e.value}function zn(e){var n,o,s,i;const t=Object.keys(e.shape);for(const u of t)if(!((i=(s=(o=(n=e.shape)==null?void 0:n[u])==null?void 0:o._zod)==null?void 0:s.traits)!=null&&i.has("$ZodType")))throw new Error(`Invalid element at key "${u}": expected a Zod schema`);const r=bo(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(r)}}function $n(e,t,r,n,o,s){const i=[],u=o.keySet,l=o.catchall._zod,h=l.def.type,m=l.optin==="optional",d=l.optout==="optional";for(const g in t){if(g==="__proto__"||u.has(g))continue;if(h==="never"){i.push(g);continue}const p=l.run({value:t[g],issues:[]},n);p instanceof Promise?e.push(p.then(Z=>tt(Z,r,g,t,m,d))):tt(p,r,g,t,m,d)}return i.length&&r.issues.push({code:"unrecognized_keys",keys:i,input:t,inst:s}),e.length?Promise.all(e).then(()=>r):r}const si=_("$ZodObject",(e,t)=>{Y.init(e,t);const r=Object.getOwnPropertyDescriptor(t,"shape");if(!(r!=null&&r.get)){const u=t.shape;Object.defineProperty(t,"shape",{get:()=>{const l={...u};return Object.defineProperty(t,"shape",{value:l}),l}})}const n=Mt(()=>zn(t));x(e._zod,"propValues",()=>{const u=t.shape,l={};for(const h in u){const m=u[h]._zod;if(m.values){l[h]??(l[h]=new Set);for(const d of m.values)l[h].add(d)}}return l});const o=et,s=t.catchall;let i;e._zod.parse=(u,l)=>{i??(i=n.value);const h=u.value;if(!o(h))return u.issues.push({expected:"object",code:"invalid_type",input:h,inst:e}),u;u.value={};const m=[],d=i.shape;for(const g of i.keys){const p=d[g],Z=p._zod.optin==="optional",A=p._zod.optout==="optional",T=p._zod.run({value:h[g],issues:[]},l);T instanceof Promise?m.push(T.then(F=>tt(F,u,g,h,Z,A))):tt(T,u,g,h,Z,A)}return s?$n(m,h,u,l,n.value,e):m.length?Promise.all(m).then(()=>u):u}}),ii=_("$ZodObjectJIT",(e,t)=>{si.init(e,t);const r=e._zod.parse,n=Mt(()=>zn(t)),o=g=>{var W,O;const p=new Ss(["shape","payload","ctx"]),Z=n.value,A=I=>{const V=$r(I);return`shape[${V}]._zod.run({ value: input[${V}], issues: [] }, ctx)`};p.write("const input = payload.value;");const T=Object.create(null);let F=0;for(const I of Z.keys)T[I]=`key_${F++}`;p.write("const newResult = {};");for(const I of Z.keys){const V=T[I],j=$r(I),ne=g[I],_e=((W=ne==null?void 0:ne._zod)==null?void 0:W.optin)==="optional",ie=((O=ne==null?void 0:ne._zod)==null?void 0:O.optout)==="optional";p.write(`const ${V} = ${A(I)};`),_e&&ie?p.write(` if (${V}.issues.length) { diff --git a/embed_static/static/spa/assets/index-BCHo3nLu.js b/embed_static/static/spa/assets/index-BCHo3nLu.js new file mode 100644 index 0000000..38e4e28 --- /dev/null +++ b/embed_static/static/spa/assets/index-BCHo3nLu.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/HomePage-DTZV5yFZ.js","assets/react-vendor-1fwFMt02.js","assets/virtual-vendor-DDSEW9eW.js","assets/badge-C7JnHIoR.js","assets/PinnedIcon-BrdtSFOl.js","assets/ui-vendor-Gb6mai95.js","assets/content-BrFHUpp8.js","assets/PostDetailPage-fhZ7iAmD.js","assets/postContent-ClrHK1rL.js","assets/purify-vendor-Cx4rtWv4.js","assets/LoginPage-puDI4GYE.js","assets/form-CB9KBlPG.js","assets/input-Dsk6No-h.js","assets/RegisterPage-M2GcPscc.js","assets/ComposePage-CW_vWd31.js","assets/dialog-CXDeMxB9.js","assets/BoardsManagePage-CkQP_LEp.js","assets/textarea-BPVvpwYr.js","assets/alert-dialog-C_2cPHgh.js","assets/ProfilePage-Bvftg6_b.js","assets/FavoritesPage-CZ210yAP.js","assets/AdminDashboardPage-BJzAuroX.js","assets/AdminPostsPage-Y2jb5HlP.js","assets/AdminCommentsPage-CGuslsQh.js","assets/AdminUsersPage-Br2jBqxw.js","assets/AdminSettingsPage-D_QJX2YW.js"])))=>i.map(i=>d[i]); +var Is=Object.defineProperty;var Os=(e,t,s)=>t in e?Is(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var ft=(e,t,s)=>Os(e,typeof t!="symbol"?t+"":t,s);import{r as b,j as r,e as qe,g as Pt,i as Rt,k as u,m as Ls,O as zt,N as Ds,B as Ms,n as Bs,p as G,q as ht,t as $s}from"./react-vendor-1fwFMt02.js";import{S as At,C as Fs,a as It,P as Vs,b as Ot,I as Lt,c as Dt,d as Mt,e as Us,R as Bt,f as Gs,L as $t,g as Ft,h as Ws,T as Hs,i as Ys,M as qs,F as Js,H as Ks,j as Xs,k as Vt,l as Qs,m as Zs,n as eo,o as to,p as Ut,A as so,q as oo,r as ro,s as ao,U as no,t as io,u as lo}from"./ui-vendor-Gb6mai95.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))o(i);new MutationObserver(i=>{for(const l of i)if(l.type==="childList")for(const n of l.addedNodes)n.tagName==="LINK"&&n.rel==="modulepreload"&&o(n)}).observe(document,{childList:!0,subtree:!0});function s(i){const l={};return i.integrity&&(l.integrity=i.integrity),i.referrerPolicy&&(l.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?l.credentials="include":i.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function o(i){if(i.ep)return;i.ep=!0;const l=s(i);fetch(i.href,l)}})();const Gt="j13-theme";function Wt(){return localStorage.getItem(Gt)==="dark"?"dark":"light"}function Ht(e){const t=document.documentElement;t.classList.toggle("dark",e==="dark"),t.style.colorScheme=e,localStorage.setItem(Gt,e)}const co="modulepreload",uo=function(e){return"/"+e},gt={},re=function(t,s,o){let i=Promise.resolve();if(s&&s.length>0){document.getElementsByTagName("link");const n=document.querySelector("meta[property=csp-nonce]"),d=(n==null?void 0:n.nonce)||(n==null?void 0:n.getAttribute("nonce"));i=Promise.allSettled(s.map(m=>{if(m=uo(m),m in gt)return;gt[m]=!0;const c=m.endsWith(".css"),x=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${m}"]${x}`))return;const a=document.createElement("link");if(a.rel=c?"stylesheet":co,c||(a.as="script"),a.crossOrigin="",a.href=m,d&&a.setAttribute("nonce",d),document.head.appendChild(a),c)return new Promise((E,T)=>{a.addEventListener("load",E),a.addEventListener("error",()=>T(new Error(`Unable to preload CSS for ${m}`)))})}))}function l(n){const d=new Event("vite:preloadError",{cancelable:!0});if(d.payload=n,window.dispatchEvent(d),!d.defaultPrevented)throw n}return i.then(n=>{for(const d of n||[])d.status==="rejected"&&l(d.reason);return t().catch(l)})},mo="";async function y(e,t={}){const s=await fetch(mo+e,{credentials:"same-origin",...t,headers:{...t.body instanceof FormData?{}:{"Content-Type":"application/json"},...t.headers}});let o;try{o=await s.json()}catch{throw new Error("服务器响应异常")}if(!s.ok)throw new Error(o.error||"请求失败");return o}const he={me:()=>y("/api/me"),stats:()=>y("/api/stats"),forumLimits:()=>y("/api/forum-limits"),boards:()=>y("/api/boards"),posts:e=>{const t=new URLSearchParams(e).toString();return y(`/api/posts?${t}`)},hotPosts:()=>y("/api/posts/hot"),post:(e,t)=>{const s=t!=null&&t.skipView?"?skip_view=1":"";return y(`/api/posts/${e}${s}`)},comments:(e,t)=>{const s=t!=null&&t.length?`?my_ids=${t.join(",")}`:"";return y(`/api/posts/${e}/comments${s}`)},notifications:()=>y("/api/notifications"),online:()=>y("/api/online"),presence:()=>y("/api/presence",{method:"POST"}),favorites:()=>y("/api/favorites"),createBoard:e=>y("/api/admin/boards",{method:"POST",body:JSON.stringify(e)}),updateBoard:(e,t)=>y(`/api/admin/boards/${e}`,{method:"PUT",body:JSON.stringify(t)}),deleteBoard:e=>y(`/api/admin/boards/${e}`,{method:"DELETE"}),adminDashboard:()=>y("/api/admin/dashboard"),adminSettings:()=>y("/api/admin/settings"),adminPosts:e=>{const t=new URLSearchParams;e.page&&t.set("page",String(e.page)),e.keyword&&t.set("keyword",e.keyword);const s=t.toString();return y(`/api/admin/posts${s?`?${s}`:""}`)},adminPinPost:(e,t)=>y(`/api/admin/posts/${e}/pin`,{method:"POST",body:JSON.stringify({pinned:t})}),adminLockPost:(e,t)=>y(`/api/admin/posts/${e}/lock`,{method:"POST",body:JSON.stringify({locked:t})}),adminUpdateForumSettings:e=>y("/api/admin/settings/forum",{method:"PUT",body:JSON.stringify(e)}),adminUpdateFilterWords:e=>y("/api/admin/settings/filter-words",{method:"PUT",body:JSON.stringify({content:e})}),postRevisions:e=>y(`/api/posts/${e}/revisions`),postRevision:(e,t)=>y(`/api/posts/${e}/revisions/${t}`),adminDeletePost:e=>y(`/api/admin/posts/${e}`,{method:"DELETE"}),adminComments:(e=1)=>y(`/api/admin/comments?page=${e}`),adminDeleteComment:e=>y(`/api/admin/comments/${e}`,{method:"DELETE"}),adminUsers:(e=1)=>y(`/api/admin/users?page=${e}`),adminBanUser:(e,t)=>y(`/api/admin/users/${e}/ban`,{method:"POST",body:JSON.stringify({banned:t})}),adminBackup:()=>y("/api/admin/backup",{method:"POST"}),updateNickname:e=>{const t=new FormData;return t.append("nickname",e),y("/api/profile/nickname",{method:"POST",body:t,headers:{}})},updatePassword:(e,t)=>{const s=new FormData;return s.append("old_password",e),s.append("new_password",t),y("/api/profile/password",{method:"POST",body:s,headers:{}})},uploadAvatar:e=>{const t=new FormData;return t.append("avatar",e),y("/api/profile/avatar",{method:"POST",body:t,headers:{}})},uploadPostImage:e=>{const t=new FormData;return t.append("image",e),y("/api/uploads/image",{method:"POST",body:t,headers:{}})},createPost:e=>{const t=new FormData;return t.append("board_id",e.board_id),t.append("title",e.title),t.append("content",e.content),t.append("tags",e.tags||""),y("/api/posts",{method:"POST",body:t,headers:{}})},updatePost:(e,t)=>{const s=new FormData;return s.append("title",t.title),s.append("content",t.content),s.append("tags",t.tags||""),y(`/api/posts/${e}`,{method:"PUT",body:s,headers:{}})},login:(e,t)=>{const s=new FormData;return s.append("username",e),s.append("password",t),y("/api/login",{method:"POST",body:s,headers:{}})},register:(e,t,s)=>{const o=new FormData;return o.append("username",e),o.append("password",t),o.append("nickname",s),y("/api/register",{method:"POST",body:o,headers:{}})},logout:()=>y("/api/logout",{method:"POST"}),like:e=>y(`/api/posts/${e}/like`,{method:"POST"}),favorite:e=>y(`/api/posts/${e}/favorite`,{method:"POST"}),addComment:(e,t)=>{const s=new FormData;return s.append("content",t.content),t.replyTo&&s.append("reply_to",String(t.replyTo)),t.guestNick&&s.append("guest_nick",t.guestNick),t.guestEmail&&s.append("guest_email",t.guestEmail),t.guestUrl&&s.append("guest_url",t.guestUrl),t.isPrivate&&s.append("is_private","1"),y(`/api/posts/${e}/comments`,{method:"POST",body:s,headers:{}})},ping:()=>y("/api/ping",{method:"POST"})},Yt=b.createContext({user:null,loading:!0,refresh:async()=>{},logout:async()=>{}});function po({children:e}){const[t,s]=b.useState(null),[o,i]=b.useState(!0),l=b.useCallback(async()=>{try{const d=await he.me();s(d.user??null)}catch{s(null)}finally{i(!1)}},[]);b.useEffect(()=>{l()},[l]);const n=async()=>{await he.logout(),s(null)};return r.jsx(Yt.Provider,{value:{user:t,loading:o,refresh:l,logout:n},children:e})}const Je=()=>b.useContext(Yt),qt=b.createContext({theme:"light",toggle:()=>{}});function fo({children:e}){const[t,s]=b.useState(Wt);b.useLayoutEffect(()=>{Ht(t)},[t]);const o=()=>s(i=>i==="light"?"dark":"light");return r.jsx(qt.Provider,{value:{theme:t,toggle:o},children:e})}const Jt=()=>b.useContext(qt);function ho(e){const[t,s]=b.useState(()=>window.matchMedia(e).matches);return b.useLayoutEffect(()=>{const o=window.matchMedia(e),i=()=>s(o.matches);return o.addEventListener("change",i),()=>o.removeEventListener("change",i)},[e]),t}function ye(){return r.jsxs("div",{className:"page-loader",role:"status","aria-live":"polite",children:[r.jsx("span",{className:"page-loader__dot"}),"加载中…"]})}function Kt(e){var t,s,o="";if(typeof e=="string"||typeof e=="number")o+=e;else if(typeof e=="object")if(Array.isArray(e)){var i=e.length;for(t=0;t{const s=new Array(e.length+t.length);for(let o=0;o({classGroupId:e,validator:t}),Qt=(e=new Map,t=null,s)=>({nextPart:e,validators:t,classGroupId:s}),We="-",bt=[],xo="arbitrary..",yo=e=>{const t=wo(e),{conflictingClassGroups:s,conflictingClassGroupModifiers:o}=e;return{getClassGroupId:n=>{if(n.startsWith("[")&&n.endsWith("]"))return vo(n);const d=n.split(We),m=d[0]===""&&d.length>1?1:0;return Zt(d,m,t)},getConflictingClassGroupIds:(n,d)=>{if(d){const m=o[n],c=s[n];return m?c?go(c,m):m:c||bt}return s[n]||bt}}},Zt=(e,t,s)=>{if(e.length-t===0)return s.classGroupId;const i=e[t],l=s.nextPart.get(i);if(l){const c=Zt(e,t+1,l);if(c)return c}const n=s.validators;if(n===null)return;const d=t===0?e.join(We):e.slice(t).join(We),m=n.length;for(let c=0;ce.slice(1,-1).indexOf(":")===-1?void 0:(()=>{const t=e.slice(1,-1),s=t.indexOf(":"),o=t.slice(0,s);return o?xo+o:void 0})(),wo=e=>{const{theme:t,classGroups:s}=e;return ko(s,t)},ko=(e,t)=>{const s=Qt();for(const o in e){const i=e[o];ot(i,s,o,t)}return s},ot=(e,t,s,o)=>{const i=e.length;for(let l=0;l{if(typeof e=="string"){So(e,t,s);return}if(typeof e=="function"){No(e,t,s,o);return}Eo(e,t,s,o)},So=(e,t,s)=>{const o=e===""?t:es(t,e);o.classGroupId=s},No=(e,t,s,o)=>{if(_o(e)){ot(e(o),t,s,o);return}t.validators===null&&(t.validators=[]),t.validators.push(bo(s,e))},Eo=(e,t,s,o)=>{const i=Object.entries(e),l=i.length;for(let n=0;n{let s=e;const o=t.split(We),i=o.length;for(let l=0;l"isThemeGetter"in e&&e.isThemeGetter===!0,To=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,s=Object.create(null),o=Object.create(null);const i=(l,n)=>{s[l]=n,t++,t>e&&(t=0,o=s,s=Object.create(null))};return{get(l){let n=s[l];if(n!==void 0)return n;if((n=o[l])!==void 0)return i(l,n),n},set(l,n){l in s?s[l]=n:i(l,n)}}},et="!",xt=":",Co=[],yt=(e,t,s,o,i)=>({modifiers:e,hasImportantModifier:t,baseClassName:s,maybePostfixModifierPosition:o,isExternal:i}),Po=e=>{const{prefix:t,experimentalParseClassName:s}=e;let o=i=>{const l=[];let n=0,d=0,m=0,c;const x=i.length;for(let L=0;Lm?c-m:void 0;return yt(l,T,E,R)};if(t){const i=t+xt,l=o;o=n=>n.startsWith(i)?l(n.slice(i.length)):yt(Co,!1,n,void 0,!0)}if(s){const i=o;o=l=>s({className:l,parseClassName:i})}return o},Ro=e=>{const t=new Map;return e.orderSensitiveModifiers.forEach((s,o)=>{t.set(s,1e6+o)}),s=>{const o=[];let i=[];for(let l=0;l0&&(i.sort(),o.push(...i),i=[]),o.push(n)):i.push(n)}return i.length>0&&(i.sort(),o.push(...i)),o}},zo=e=>({cache:To(e.cacheSize),parseClassName:Po(e),sortModifiers:Ro(e),postfixLookupClassGroupIds:Ao(e),...yo(e)}),Ao=e=>{const t=Object.create(null),s=e.postfixLookupClassGroups;if(s)for(let o=0;o{const{parseClassName:s,getClassGroupId:o,getConflictingClassGroupIds:i,sortModifiers:l,postfixLookupClassGroupIds:n}=t,d=[],m=e.trim().split(Io);let c="";for(let x=m.length-1;x>=0;x-=1){const a=m[x],{isExternal:E,modifiers:T,hasImportantModifier:R,baseClassName:L,maybePostfixModifierPosition:O}=s(a);if(E){c=a+(c.length>0?" "+c:c);continue}let N=!!O,B;if(N){const D=L.substring(0,O);B=o(D);const p=B&&n[B]?o(L):void 0;p&&p!==B&&(B=p,N=!1)}else B=o(L);if(!B){if(!N){c=a+(c.length>0?" "+c:c);continue}if(B=o(L),!B){c=a+(c.length>0?" "+c:c);continue}N=!1}const X=T.length===0?"":T.length===1?T[0]:l(T).join(":"),te=R?X+et:X,ae=te+B;if(d.indexOf(ae)>-1)continue;d.push(ae);const $=i(B,N);for(let D=0;D<$.length;++D){const p=$[D];d.push(te+p)}c=a+(c.length>0?" "+c:c)}return c},Lo=(...e)=>{let t=0,s,o,i="";for(;t{if(typeof e=="string")return e;let t,s="";for(let o=0;o{let s,o,i,l;const n=m=>{const c=t.reduce((x,a)=>a(x),e());return s=zo(c),o=s.cache.get,i=s.cache.set,l=d,d(m)},d=m=>{const c=o(m);if(c)return c;const x=Oo(m,s);return i(m,x),x};return l=n,(...m)=>l(Lo(...m))},Mo=[],V=e=>{const t=s=>s[e]||Mo;return t.isThemeGetter=!0,t},ss=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,os=/^\((?:(\w[\w-]*):)?(.+)\)$/i,Bo=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,$o=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Fo=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Vo=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Uo=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Go=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ke=e=>Bo.test(e),j=e=>!!e&&!Number.isNaN(Number(e)),pe=e=>!!e&&Number.isInteger(Number(e)),Qe=e=>e.endsWith("%")&&j(e.slice(0,-1)),xe=e=>$o.test(e),rs=()=>!0,Wo=e=>Fo.test(e)&&!Vo.test(e),rt=()=>!1,Ho=e=>Uo.test(e),Yo=e=>Go.test(e),qo=e=>!f(e)&&!g(e),Jo=e=>e.startsWith("@container")&&(e[10]==="/"&&e[11]!==void 0||e[11]==="s"&&e[16]!==void 0&&e.startsWith("-size/",10)||e[11]==="n"&&e[18]!==void 0&&e.startsWith("-normal/",10)),Ko=e=>je(e,is,rt),f=e=>ss.test(e),_e=e=>je(e,ls,Wo),vt=e=>je(e,rr,j),Xo=e=>je(e,ds,rs),Qo=e=>je(e,cs,rt),wt=e=>je(e,as,rt),Zo=e=>je(e,ns,Yo),Ve=e=>je(e,us,Ho),g=e=>os.test(e),Oe=e=>Te(e,ls),er=e=>Te(e,cs),kt=e=>Te(e,as),tr=e=>Te(e,is),sr=e=>Te(e,ns),Ue=e=>Te(e,us,!0),or=e=>Te(e,ds,!0),je=(e,t,s)=>{const o=ss.exec(e);return o?o[1]?t(o[1]):s(o[2]):!1},Te=(e,t,s=!1)=>{const o=os.exec(e);return o?o[1]?t(o[1]):s:!1},as=e=>e==="position"||e==="percentage",ns=e=>e==="image"||e==="url",is=e=>e==="length"||e==="size"||e==="bg-size",ls=e=>e==="length",rr=e=>e==="number",cs=e=>e==="family-name",ds=e=>e==="number"||e==="weight",us=e=>e==="shadow",ar=()=>{const e=V("color"),t=V("font"),s=V("text"),o=V("font-weight"),i=V("tracking"),l=V("leading"),n=V("breakpoint"),d=V("container"),m=V("spacing"),c=V("radius"),x=V("shadow"),a=V("inset-shadow"),E=V("text-shadow"),T=V("drop-shadow"),R=V("blur"),L=V("perspective"),O=V("aspect"),N=V("ease"),B=V("animate"),X=()=>["auto","avoid","all","avoid-page","page","left","right","column"],te=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],ae=()=>[...te(),g,f],$=()=>["auto","hidden","clip","visible","scroll"],D=()=>["auto","contain","none"],p=()=>[g,f,m],M=()=>[ke,"full","auto",...p()],ue=()=>[pe,"none","subgrid",g,f],J=()=>["auto",{span:["full",pe,g,f]},pe,g,f],K=()=>[pe,"auto",g,f],W=()=>["auto","min","max","fr",g,f],me=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],Q=()=>["start","end","center","stretch","center-safe","end-safe"],w=()=>["auto",...p()],C=()=>[ke,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...p()],v=()=>[ke,"screen","full","dvw","lvw","svw","min","max","fit",...p()],F=()=>[ke,"screen","full","lh","dvh","lvh","svh","min","max","fit",...p()],h=()=>[e,g,f],Y=()=>[...te(),kt,wt,{position:[g,f]}],Se=()=>["no-repeat",{repeat:["","x","y","space","round"]}],_=()=>["auto","cover","contain",tr,Ko,{size:[g,f]}],A=()=>[Qe,Oe,_e],S=()=>["","none","full",c,g,f],P=()=>["",j,Oe,_e],ie=()=>["solid","dashed","dotted","double"],z=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],I=()=>[j,Qe,kt,wt],Ne=()=>["","none",R,g,f],ge=()=>["none",j,g,f],le=()=>["none",j,g,f],Ae=()=>[j,g,f],ve=()=>[ke,"full",...p()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[xe],breakpoint:[xe],color:[rs],container:[xe],"drop-shadow":[xe],ease:["in","out","in-out"],font:[qo],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[xe],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[xe],shadow:[xe],spacing:["px",j],text:[xe],"text-shadow":[xe],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",ke,f,g,O]}],container:["container"],"container-type":[{"@container":["","normal","size",g,f]}],"container-named":[Jo],columns:[{columns:[j,f,g,d]}],"break-after":[{"break-after":X()}],"break-before":[{"break-before":X()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:ae()}],overflow:[{overflow:$()}],"overflow-x":[{"overflow-x":$()}],"overflow-y":[{"overflow-y":$()}],overscroll:[{overscroll:D()}],"overscroll-x":[{"overscroll-x":D()}],"overscroll-y":[{"overscroll-y":D()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:M()}],"inset-x":[{"inset-x":M()}],"inset-y":[{"inset-y":M()}],start:[{"inset-s":M(),start:M()}],end:[{"inset-e":M(),end:M()}],"inset-bs":[{"inset-bs":M()}],"inset-be":[{"inset-be":M()}],top:[{top:M()}],right:[{right:M()}],bottom:[{bottom:M()}],left:[{left:M()}],visibility:["visible","invisible","collapse"],z:[{z:[pe,"auto",g,f]}],basis:[{basis:[ke,"full","auto",d,...p()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[j,ke,"auto","initial","none",f]}],grow:[{grow:["",j,g,f]}],shrink:[{shrink:["",j,g,f]}],order:[{order:[pe,"first","last","none",g,f]}],"grid-cols":[{"grid-cols":ue()}],"col-start-end":[{col:J()}],"col-start":[{"col-start":K()}],"col-end":[{"col-end":K()}],"grid-rows":[{"grid-rows":ue()}],"row-start-end":[{row:J()}],"row-start":[{"row-start":K()}],"row-end":[{"row-end":K()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":W()}],"auto-rows":[{"auto-rows":W()}],gap:[{gap:p()}],"gap-x":[{"gap-x":p()}],"gap-y":[{"gap-y":p()}],"justify-content":[{justify:[...me(),"normal"]}],"justify-items":[{"justify-items":[...Q(),"normal"]}],"justify-self":[{"justify-self":["auto",...Q()]}],"align-content":[{content:["normal",...me()]}],"align-items":[{items:[...Q(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...Q(),{baseline:["","last"]}]}],"place-content":[{"place-content":me()}],"place-items":[{"place-items":[...Q(),"baseline"]}],"place-self":[{"place-self":["auto",...Q()]}],p:[{p:p()}],px:[{px:p()}],py:[{py:p()}],ps:[{ps:p()}],pe:[{pe:p()}],pbs:[{pbs:p()}],pbe:[{pbe:p()}],pt:[{pt:p()}],pr:[{pr:p()}],pb:[{pb:p()}],pl:[{pl:p()}],m:[{m:w()}],mx:[{mx:w()}],my:[{my:w()}],ms:[{ms:w()}],me:[{me:w()}],mbs:[{mbs:w()}],mbe:[{mbe:w()}],mt:[{mt:w()}],mr:[{mr:w()}],mb:[{mb:w()}],ml:[{ml:w()}],"space-x":[{"space-x":p()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":p()}],"space-y-reverse":["space-y-reverse"],size:[{size:C()}],"inline-size":[{inline:["auto",...v()]}],"min-inline-size":[{"min-inline":["auto",...v()]}],"max-inline-size":[{"max-inline":["none",...v()]}],"block-size":[{block:["auto",...F()]}],"min-block-size":[{"min-block":["auto",...F()]}],"max-block-size":[{"max-block":["none",...F()]}],w:[{w:[d,"screen",...C()]}],"min-w":[{"min-w":[d,"screen","none",...C()]}],"max-w":[{"max-w":[d,"screen","none","prose",{screen:[n]},...C()]}],h:[{h:["screen","lh",...C()]}],"min-h":[{"min-h":["screen","lh","none",...C()]}],"max-h":[{"max-h":["screen","lh",...C()]}],"font-size":[{text:["base",s,Oe,_e]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[o,or,Xo]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",Qe,f]}],"font-family":[{font:[er,Qo,t]}],"font-features":[{"font-features":[f]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[i,g,f]}],"line-clamp":[{"line-clamp":[j,"none",g,vt]}],leading:[{leading:[l,...p()]}],"list-image":[{"list-image":["none",g,f]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",g,f]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:h()}],"text-color":[{text:h()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...ie(),"wavy"]}],"text-decoration-thickness":[{decoration:[j,"from-font","auto",g,_e]}],"text-decoration-color":[{decoration:h()}],"underline-offset":[{"underline-offset":[j,"auto",g,f]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:p()}],"tab-size":[{tab:[pe,g,f]}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",g,f]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",g,f]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:Y()}],"bg-repeat":[{bg:Se()}],"bg-size":[{bg:_()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},pe,g,f],radial:["",g,f],conic:[pe,g,f]},sr,Zo]}],"bg-color":[{bg:h()}],"gradient-from-pos":[{from:A()}],"gradient-via-pos":[{via:A()}],"gradient-to-pos":[{to:A()}],"gradient-from":[{from:h()}],"gradient-via":[{via:h()}],"gradient-to":[{to:h()}],rounded:[{rounded:S()}],"rounded-s":[{"rounded-s":S()}],"rounded-e":[{"rounded-e":S()}],"rounded-t":[{"rounded-t":S()}],"rounded-r":[{"rounded-r":S()}],"rounded-b":[{"rounded-b":S()}],"rounded-l":[{"rounded-l":S()}],"rounded-ss":[{"rounded-ss":S()}],"rounded-se":[{"rounded-se":S()}],"rounded-ee":[{"rounded-ee":S()}],"rounded-es":[{"rounded-es":S()}],"rounded-tl":[{"rounded-tl":S()}],"rounded-tr":[{"rounded-tr":S()}],"rounded-br":[{"rounded-br":S()}],"rounded-bl":[{"rounded-bl":S()}],"border-w":[{border:P()}],"border-w-x":[{"border-x":P()}],"border-w-y":[{"border-y":P()}],"border-w-s":[{"border-s":P()}],"border-w-e":[{"border-e":P()}],"border-w-bs":[{"border-bs":P()}],"border-w-be":[{"border-be":P()}],"border-w-t":[{"border-t":P()}],"border-w-r":[{"border-r":P()}],"border-w-b":[{"border-b":P()}],"border-w-l":[{"border-l":P()}],"divide-x":[{"divide-x":P()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":P()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...ie(),"hidden","none"]}],"divide-style":[{divide:[...ie(),"hidden","none"]}],"border-color":[{border:h()}],"border-color-x":[{"border-x":h()}],"border-color-y":[{"border-y":h()}],"border-color-s":[{"border-s":h()}],"border-color-e":[{"border-e":h()}],"border-color-bs":[{"border-bs":h()}],"border-color-be":[{"border-be":h()}],"border-color-t":[{"border-t":h()}],"border-color-r":[{"border-r":h()}],"border-color-b":[{"border-b":h()}],"border-color-l":[{"border-l":h()}],"divide-color":[{divide:h()}],"outline-style":[{outline:[...ie(),"none","hidden"]}],"outline-offset":[{"outline-offset":[j,g,f]}],"outline-w":[{outline:["",j,Oe,_e]}],"outline-color":[{outline:h()}],shadow:[{shadow:["","none",x,Ue,Ve]}],"shadow-color":[{shadow:h()}],"inset-shadow":[{"inset-shadow":["none",a,Ue,Ve]}],"inset-shadow-color":[{"inset-shadow":h()}],"ring-w":[{ring:P()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:h()}],"ring-offset-w":[{"ring-offset":[j,_e]}],"ring-offset-color":[{"ring-offset":h()}],"inset-ring-w":[{"inset-ring":P()}],"inset-ring-color":[{"inset-ring":h()}],"text-shadow":[{"text-shadow":["none",E,Ue,Ve]}],"text-shadow-color":[{"text-shadow":h()}],opacity:[{opacity:[j,g,f]}],"mix-blend":[{"mix-blend":[...z(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":z()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[j]}],"mask-image-linear-from-pos":[{"mask-linear-from":I()}],"mask-image-linear-to-pos":[{"mask-linear-to":I()}],"mask-image-linear-from-color":[{"mask-linear-from":h()}],"mask-image-linear-to-color":[{"mask-linear-to":h()}],"mask-image-t-from-pos":[{"mask-t-from":I()}],"mask-image-t-to-pos":[{"mask-t-to":I()}],"mask-image-t-from-color":[{"mask-t-from":h()}],"mask-image-t-to-color":[{"mask-t-to":h()}],"mask-image-r-from-pos":[{"mask-r-from":I()}],"mask-image-r-to-pos":[{"mask-r-to":I()}],"mask-image-r-from-color":[{"mask-r-from":h()}],"mask-image-r-to-color":[{"mask-r-to":h()}],"mask-image-b-from-pos":[{"mask-b-from":I()}],"mask-image-b-to-pos":[{"mask-b-to":I()}],"mask-image-b-from-color":[{"mask-b-from":h()}],"mask-image-b-to-color":[{"mask-b-to":h()}],"mask-image-l-from-pos":[{"mask-l-from":I()}],"mask-image-l-to-pos":[{"mask-l-to":I()}],"mask-image-l-from-color":[{"mask-l-from":h()}],"mask-image-l-to-color":[{"mask-l-to":h()}],"mask-image-x-from-pos":[{"mask-x-from":I()}],"mask-image-x-to-pos":[{"mask-x-to":I()}],"mask-image-x-from-color":[{"mask-x-from":h()}],"mask-image-x-to-color":[{"mask-x-to":h()}],"mask-image-y-from-pos":[{"mask-y-from":I()}],"mask-image-y-to-pos":[{"mask-y-to":I()}],"mask-image-y-from-color":[{"mask-y-from":h()}],"mask-image-y-to-color":[{"mask-y-to":h()}],"mask-image-radial":[{"mask-radial":[g,f]}],"mask-image-radial-from-pos":[{"mask-radial-from":I()}],"mask-image-radial-to-pos":[{"mask-radial-to":I()}],"mask-image-radial-from-color":[{"mask-radial-from":h()}],"mask-image-radial-to-color":[{"mask-radial-to":h()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":te()}],"mask-image-conic-pos":[{"mask-conic":[j]}],"mask-image-conic-from-pos":[{"mask-conic-from":I()}],"mask-image-conic-to-pos":[{"mask-conic-to":I()}],"mask-image-conic-from-color":[{"mask-conic-from":h()}],"mask-image-conic-to-color":[{"mask-conic-to":h()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:Y()}],"mask-repeat":[{mask:Se()}],"mask-size":[{mask:_()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",g,f]}],filter:[{filter:["","none",g,f]}],blur:[{blur:Ne()}],brightness:[{brightness:[j,g,f]}],contrast:[{contrast:[j,g,f]}],"drop-shadow":[{"drop-shadow":["","none",T,Ue,Ve]}],"drop-shadow-color":[{"drop-shadow":h()}],grayscale:[{grayscale:["",j,g,f]}],"hue-rotate":[{"hue-rotate":[j,g,f]}],invert:[{invert:["",j,g,f]}],saturate:[{saturate:[j,g,f]}],sepia:[{sepia:["",j,g,f]}],"backdrop-filter":[{"backdrop-filter":["","none",g,f]}],"backdrop-blur":[{"backdrop-blur":Ne()}],"backdrop-brightness":[{"backdrop-brightness":[j,g,f]}],"backdrop-contrast":[{"backdrop-contrast":[j,g,f]}],"backdrop-grayscale":[{"backdrop-grayscale":["",j,g,f]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[j,g,f]}],"backdrop-invert":[{"backdrop-invert":["",j,g,f]}],"backdrop-opacity":[{"backdrop-opacity":[j,g,f]}],"backdrop-saturate":[{"backdrop-saturate":[j,g,f]}],"backdrop-sepia":[{"backdrop-sepia":["",j,g,f]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":p()}],"border-spacing-x":[{"border-spacing-x":p()}],"border-spacing-y":[{"border-spacing-y":p()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",g,f]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[j,"initial",g,f]}],ease:[{ease:["linear","initial",N,g,f]}],delay:[{delay:[j,g,f]}],animate:[{animate:["none",B,g,f]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[L,g,f]}],"perspective-origin":[{"perspective-origin":ae()}],rotate:[{rotate:ge()}],"rotate-x":[{"rotate-x":ge()}],"rotate-y":[{"rotate-y":ge()}],"rotate-z":[{"rotate-z":ge()}],scale:[{scale:le()}],"scale-x":[{"scale-x":le()}],"scale-y":[{"scale-y":le()}],"scale-z":[{"scale-z":le()}],"scale-3d":["scale-3d"],skew:[{skew:Ae()}],"skew-x":[{"skew-x":Ae()}],"skew-y":[{"skew-y":Ae()}],transform:[{transform:[g,f,"","none","gpu","cpu"]}],"transform-origin":[{origin:ae()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:ve()}],"translate-x":[{"translate-x":ve()}],"translate-y":[{"translate-y":ve()}],"translate-z":[{"translate-z":ve()}],"translate-none":["translate-none"],zoom:[{zoom:[pe,g,f]}],accent:[{accent:h()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:h()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",g,f]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scrollbar-thumb-color":[{"scrollbar-thumb":h()}],"scrollbar-track-color":[{"scrollbar-track":h()}],"scrollbar-gutter":[{"scrollbar-gutter":["auto","stable","both"]}],"scrollbar-w":[{scrollbar:["auto","thin","none"]}],"scroll-m":[{"scroll-m":p()}],"scroll-mx":[{"scroll-mx":p()}],"scroll-my":[{"scroll-my":p()}],"scroll-ms":[{"scroll-ms":p()}],"scroll-me":[{"scroll-me":p()}],"scroll-mbs":[{"scroll-mbs":p()}],"scroll-mbe":[{"scroll-mbe":p()}],"scroll-mt":[{"scroll-mt":p()}],"scroll-mr":[{"scroll-mr":p()}],"scroll-mb":[{"scroll-mb":p()}],"scroll-ml":[{"scroll-ml":p()}],"scroll-p":[{"scroll-p":p()}],"scroll-px":[{"scroll-px":p()}],"scroll-py":[{"scroll-py":p()}],"scroll-ps":[{"scroll-ps":p()}],"scroll-pe":[{"scroll-pe":p()}],"scroll-pbs":[{"scroll-pbs":p()}],"scroll-pbe":[{"scroll-pbe":p()}],"scroll-pt":[{"scroll-pt":p()}],"scroll-pr":[{"scroll-pr":p()}],"scroll-pb":[{"scroll-pb":p()}],"scroll-pl":[{"scroll-pl":p()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",g,f]}],fill:[{fill:["none",...h()]}],"stroke-w":[{stroke:[j,Oe,_e,vt]}],stroke:[{stroke:["none",...h()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{"container-named":["container-type"],overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","inset-bs","inset-be","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pbs","pbe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mbs","mbe","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-bs","border-w-be","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-bs","border-color-be","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mbs","scroll-mbe","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pbs","scroll-pbe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},postfixLookupClassGroups:["container-type"],orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},nr=Do(ar);function ee(...e){return nr(Xt(e))}const ir=Ws,lr=Hs,cr=b.forwardRef(({className:e,inset:t,children:s,...o},i)=>r.jsxs(At,{ref:i,className:ee("flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",t&&"pl-8",e),...o,children:[s,r.jsx(Fs,{className:"ml-auto"})]}));cr.displayName=At.displayName;const dr=b.forwardRef(({className:e,...t},s)=>r.jsx(It,{ref:s,className:ee("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...t}));dr.displayName=It.displayName;const ms=b.forwardRef(({className:e,sideOffset:t=4,...s},o)=>r.jsx(Vs,{children:r.jsx(Ot,{ref:o,sideOffset:t,className:ee("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...s})}));ms.displayName=Ot.displayName;const De=b.forwardRef(({className:e,inset:t,...s},o)=>r.jsx(Lt,{ref:o,className:ee("relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0",t&&"pl-8",e),...s}));De.displayName=Lt.displayName;const ur=b.forwardRef(({className:e,children:t,checked:s,...o},i)=>r.jsxs(Dt,{ref:i,className:ee("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),checked:s,...o,children:[r.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:r.jsx(Mt,{children:r.jsx(Us,{className:"h-4 w-4"})})}),t]}));ur.displayName=Dt.displayName;const mr=b.forwardRef(({className:e,children:t,...s},o)=>r.jsxs(Bt,{ref:o,className:ee("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...s,children:[r.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:r.jsx(Mt,{children:r.jsx(Gs,{className:"h-2 w-2 fill-current"})})}),t]}));mr.displayName=Bt.displayName;const pr=b.forwardRef(({className:e,inset:t,...s},o)=>r.jsx($t,{ref:o,className:ee("px-2 py-1.5 text-sm font-semibold",t&&"pl-8",e),...s}));pr.displayName=$t.displayName;const tt=b.forwardRef(({className:e,...t},s)=>r.jsx(Ft,{ref:s,className:ee("-mx-1 my-1 h-px bg-muted",e),...t}));tt.displayName=Ft.displayName;const ps="j13-cache-boards",fs="j13-cache-stats";function hs(e){try{const t=sessionStorage.getItem(e);return t?JSON.parse(t):null}catch{return null}}function gs(e,t){try{sessionStorage.setItem(e,JSON.stringify(t))}catch{}}function jt(){return hs(ps)??[]}function St(){return hs(fs)}function fr(e){gs(ps,e)}function hr(e){gs(fs,e)}const gr=[{key:"latest",label:"最新发帖",hint:"按发布时间",icon:Ys},{key:"reply",label:"最新回复",hint:"最近有人回复",icon:qs},{key:"hot",label:"热门讨论",hint:"按互动热度",icon:Js}];function bs(e){return e==="reply"||e==="hot"?e:"latest"}function He(e,t="latest"){const s=new URLSearchParams;e&&s.set("board",String(e)),t!=="latest"&&s.set("sort",t);const o=s.toString();return o?`/?${o}`:"/"}function Sa({value:e,onChange:t,postTotal:s}){return r.jsxs("div",{className:"feed-toolbar",children:[r.jsx("div",{className:"feed-sort-bar",role:"tablist","aria-label":"帖子排序",children:gr.map(({key:o,label:i,hint:l,icon:n})=>r.jsxs("button",{type:"button",role:"tab","aria-selected":e===o,title:`${i} · ${l}`,className:ee("feed-sort-tab",e===o&&"active"),onClick:()=>t(o),children:[r.jsx(n,{"aria-hidden":!0}),r.jsx("span",{className:"feed-sort-tab__label",children:i})]},o))}),s!=null&&r.jsxs("span",{className:"feed-toolbar__count",children:["共 ",s," 条"]})]})}const xs="j13-feed-cache:";function ys(e,t,s){return`${xs}${e}:${t}:${s}`}function Na(e,t,s){try{const o=sessionStorage.getItem(ys(e,t,s));return o?JSON.parse(o):null}catch{return null}}function Ea(e,t,s,o){try{sessionStorage.setItem(ys(e,t,s),JSON.stringify(o))}catch{}}function br(){try{for(let e=sessionStorage.length-1;e>=0;e--){const t=sessionStorage.key(e);t!=null&&t.startsWith(xs)&&sessionStorage.removeItem(t)}}catch{}}const xr="feed-reset";function Me(e,t){br(),window.dispatchEvent(new Event(xr)),e(t,{state:{refreshFeed:!0}})}const yr=["/post/","/profile"];function vs(e){return yr.some(t=>e.startsWith(t))}function vr(e,t){return vs(e)?null:e.startsWith("/favorites")?"favorites":e.startsWith("/admin")?"admin":t===0?"all":String(t)}function wr({boards:e,activeBoard:t,onSelectBoard:s}){const o=qe(),i=Pt(),[l]=Rt(),n=bs(l.get("sort")),{user:d}=Je(),m=(d==null?void 0:d.role)==="admin",c=vr(i.pathname,t),x=(a,E,T,R)=>r.jsxs("button",{type:"button",className:ee("sidebar-nav-item",c!=null&&c===a&&"active"),onClick:R,children:[T,r.jsx("span",{className:"flex-1 truncate",children:E})]},a);return r.jsxs("aside",{className:"sidebar",children:[r.jsx("div",{className:"sidebar-section",children:"浏览"}),r.jsxs("nav",{className:"sidebar-nav",children:[x("all","全部帖子",r.jsx(Ks,{}),()=>{s(0),Me(o,He(0,n))}),d&&x("favorites","我的收藏",r.jsx(Xs,{}),()=>o("/favorites"))]}),e.length>0&&r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"sidebar-section",style:{marginTop:8},children:"板块"}),r.jsx("nav",{className:"sidebar-nav",children:e.map(a=>r.jsx("button",{type:"button",className:ee("sidebar-nav-item",c!=null&&c===String(a.id)&&"active"),onClick:()=>{s(a.id),Me(o,He(a.id,n))},children:r.jsx("span",{className:"flex-1 truncate",children:a.name})},a.id))})]}),m&&r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"sidebar-section",style:{marginTop:8},children:"管理"}),r.jsx("nav",{className:"sidebar-nav",children:x("admin","管理后台",r.jsx(Vt,{}),()=>o("/admin/dashboard"))})]})]})}function kr({hot:e,notifications:t,online:s,onPostClick:o}){const i=(e==null?void 0:e.slice(0,8))??[],l=(t==null?void 0:t.slice(0,6))??[],n=(s==null?void 0:s.users)??[];return r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"widget-card",children:[r.jsx("div",{className:"widget-card-head",children:"🔥 热门帖子"}),r.jsx("div",{className:"widget-card-body",children:i.length===0?r.jsx("div",{style:{fontSize:13,color:"var(--color-text-3)",padding:"8px 0"},children:"暂无数据"}):i.map((d,m)=>r.jsxs("div",{className:"widget-item",onClick:()=>o(d.id),children:[r.jsx("span",{style:{color:m<3?"#e74c3c":"var(--color-text-3)",fontWeight:600,minWidth:18},children:m+1}),r.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:d.title})]},d.id))})]}),r.jsxs("div",{className:"widget-card",children:[r.jsx("div",{className:"widget-card-head",children:"📢 最新动态"}),r.jsx("div",{className:"widget-card-body",children:l.length===0?r.jsx("div",{style:{fontSize:13,color:"var(--color-text-3)",padding:"8px 0"},children:"暂无动态"}):l.map(d=>r.jsxs("div",{className:"widget-item",onClick:()=>o(d.id),children:[r.jsx("span",{style:{flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:d.title}),r.jsx("span",{style:{fontSize:11,color:"var(--color-text-4)",flexShrink:0},children:d.created_at})]},d.id))})]}),r.jsxs("div",{className:"widget-card",children:[r.jsxs("div",{className:"widget-card-head",children:["👀 当前浏览 ",(s==null?void 0:s.count)??"—"," 人"]}),r.jsxs("div",{className:"widget-card-body",children:[r.jsxs("div",{style:{fontSize:12,color:"var(--color-text-3)",marginBottom:8},children:["会员 ",(s==null?void 0:s.members)??0," · 游客 ",(s==null?void 0:s.guests)??0]}),r.jsxs("div",{className:"widget-online-list",children:[n.map(d=>{var m;return r.jsx("span",{className:"widget-online-avatar",title:d.nickname,children:d.avatar?r.jsx("img",{src:d.avatar,alt:""}):((m=d.nickname)==null?void 0:m[0])||"?"},d.id)}),n.length===0&&r.jsx("span",{style:{fontSize:13,color:"var(--color-text-3)"},children:"暂无会员在线"})]})]})]}),r.jsx("div",{className:"widget-card widget-card--about",children:r.jsx("div",{className:"widget-card-body",children:r.jsxs("p",{className:"widget-about-text",children:[r.jsx("strong",{children:"姜十三论坛"}),"拾三一隅,自在交流。轻量社区,专为小圈子打造。"]})})})]})}const ws={post_title_max:128,post_tags_max:256,post_content_max:5e4,comment_max:5e3,search_keyword_min:1,search_keyword_max:50,page_size_default:30,feed_max_pages:10,feed_max_items:300,password_min_len:6,avatar_max_mb:2};let ze=null,Le=null;function jr(){return ze?Promise.resolve(ze):Le||(Le=he.forumLimits().then(e=>(ze=e,e)).catch(()=>ws).finally(()=>{Le=null}),Le)}function Sr(){const[e,t]=b.useState(ze??ws),[s,o]=b.useState(!ze);return b.useEffect(()=>{jr().then(t).finally(()=>o(!1))},[]),{limits:e,loading:s}}function _a(){ze=null}function Nr(e){if(typeof document>"u")return;let t=document.head||document.getElementsByTagName("head")[0],s=document.createElement("style");s.type="text/css",t.appendChild(s),s.styleSheet?s.styleSheet.cssText=e:s.appendChild(document.createTextNode(e))}const Er=e=>{switch(e){case"success":return Cr;case"info":return Rr;case"warning":return Pr;case"error":return zr;default:return null}},_r=Array(12).fill(0),Tr=({visible:e,className:t})=>u.createElement("div",{className:["sonner-loading-wrapper",t].filter(Boolean).join(" "),"data-visible":e},u.createElement("div",{className:"sonner-spinner"},_r.map((s,o)=>u.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${o}`})))),Cr=u.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},u.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),Pr=u.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},u.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),Rr=u.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},u.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),zr=u.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},u.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),Ar=u.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},u.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),u.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),Ir=()=>{const[e,t]=u.useState(document.hidden);return u.useEffect(()=>{const s=()=>{t(document.hidden)};return document.addEventListener("visibilitychange",s),()=>window.removeEventListener("visibilitychange",s)},[]),e};let st=1;class Or{constructor(){this.subscribe=t=>(this.subscribers.push(t),()=>{const s=this.subscribers.indexOf(t);this.subscribers.splice(s,1)}),this.publish=t=>{this.subscribers.forEach(s=>s(t))},this.addToast=t=>{this.publish(t),this.toasts=[...this.toasts,t]},this.create=t=>{var s;const{message:o,...i}=t,l=typeof(t==null?void 0:t.id)=="number"||((s=t.id)==null?void 0:s.length)>0?t.id:st++,n=this.toasts.find(m=>m.id===l),d=t.dismissible===void 0?!0:t.dismissible;return this.dismissedToasts.has(l)&&this.dismissedToasts.delete(l),n?this.toasts=this.toasts.map(m=>m.id===l?(this.publish({...m,...t,id:l,title:o}),{...m,...t,id:l,dismissible:d,title:o}):m):this.addToast({title:o,...i,dismissible:d,id:l}),l},this.dismiss=t=>(t?(this.dismissedToasts.add(t),requestAnimationFrame(()=>this.subscribers.forEach(s=>s({id:t,dismiss:!0})))):this.toasts.forEach(s=>{this.subscribers.forEach(o=>o({id:s.id,dismiss:!0}))}),t),this.message=(t,s)=>this.create({...s,message:t}),this.error=(t,s)=>this.create({...s,message:t,type:"error"}),this.success=(t,s)=>this.create({...s,type:"success",message:t}),this.info=(t,s)=>this.create({...s,type:"info",message:t}),this.warning=(t,s)=>this.create({...s,type:"warning",message:t}),this.loading=(t,s)=>this.create({...s,type:"loading",message:t}),this.promise=(t,s)=>{if(!s)return;let o;s.loading!==void 0&&(o=this.create({...s,promise:t,type:"loading",message:s.loading,description:typeof s.description!="function"?s.description:void 0}));const i=Promise.resolve(t instanceof Function?t():t);let l=o!==void 0,n;const d=i.then(async c=>{if(n=["resolve",c],u.isValidElement(c))l=!1,this.create({id:o,type:"default",message:c});else if(Dr(c)&&!c.ok){l=!1;const a=typeof s.error=="function"?await s.error(`HTTP error! status: ${c.status}`):s.error,E=typeof s.description=="function"?await s.description(`HTTP error! status: ${c.status}`):s.description,R=typeof a=="object"&&!u.isValidElement(a)?a:{message:a};this.create({id:o,type:"error",description:E,...R})}else if(c instanceof Error){l=!1;const a=typeof s.error=="function"?await s.error(c):s.error,E=typeof s.description=="function"?await s.description(c):s.description,R=typeof a=="object"&&!u.isValidElement(a)?a:{message:a};this.create({id:o,type:"error",description:E,...R})}else if(s.success!==void 0){l=!1;const a=typeof s.success=="function"?await s.success(c):s.success,E=typeof s.description=="function"?await s.description(c):s.description,R=typeof a=="object"&&!u.isValidElement(a)?a:{message:a};this.create({id:o,type:"success",description:E,...R})}}).catch(async c=>{if(n=["reject",c],s.error!==void 0){l=!1;const x=typeof s.error=="function"?await s.error(c):s.error,a=typeof s.description=="function"?await s.description(c):s.description,T=typeof x=="object"&&!u.isValidElement(x)?x:{message:x};this.create({id:o,type:"error",description:a,...T})}}).finally(()=>{l&&(this.dismiss(o),o=void 0),s.finally==null||s.finally.call(s)}),m=()=>new Promise((c,x)=>d.then(()=>n[0]==="reject"?x(n[1]):c(n[1])).catch(x));return typeof o!="string"&&typeof o!="number"?{unwrap:m}:Object.assign(o,{unwrap:m})},this.custom=(t,s)=>{const o=(s==null?void 0:s.id)||st++;return this.create({jsx:t(o),id:o,...s}),o},this.getActiveToasts=()=>this.toasts.filter(t=>!this.dismissedToasts.has(t.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}}const Z=new Or,Lr=(e,t)=>{const s=(t==null?void 0:t.id)||st++;return Z.addToast({title:e,...t,id:s}),s},Dr=e=>e&&typeof e=="object"&&"ok"in e&&typeof e.ok=="boolean"&&"status"in e&&typeof e.status=="number",Mr=Lr,Br=()=>Z.toasts,$r=()=>Z.getActiveToasts(),Ze=Object.assign(Mr,{success:Z.success,info:Z.info,warning:Z.warning,error:Z.error,custom:Z.custom,message:Z.message,promise:Z.promise,dismiss:Z.dismiss,loading:Z.loading},{getHistory:Br,getToasts:$r});Nr("[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}");function Ge(e){return e.label!==void 0}const Fr=3,Vr="24px",Ur="16px",Nt=4e3,Gr=356,Wr=14,Hr=45,Yr=200;function fe(...e){return e.filter(Boolean).join(" ")}function qr(e){const[t,s]=e.split("-"),o=[];return t&&o.push(t),s&&o.push(s),o}const Jr=e=>{var t,s,o,i,l,n,d,m,c;const{invert:x,toast:a,unstyled:E,interacting:T,setHeights:R,visibleToasts:L,heights:O,index:N,toasts:B,expanded:X,removeToast:te,defaultRichColors:ae,closeButton:$,style:D,cancelButtonStyle:p,actionButtonStyle:M,className:ue="",descriptionClassName:J="",duration:K,position:W,gap:me,expandByDefault:Q,classNames:w,icons:C,closeButtonAriaLabel:v="Close toast"}=e,[F,h]=u.useState(null),[Y,Se]=u.useState(null),[_,A]=u.useState(!1),[S,P]=u.useState(!1),[ie,z]=u.useState(!1),[I,Ne]=u.useState(!1),[ge,le]=u.useState(!1),[Ae,ve]=u.useState(0),[js,at]=u.useState(0),Ie=u.useRef(a.duration||K||Nt),nt=u.useRef(null),be=u.useRef(null),Ss=N===0,Ns=N+1<=L,se=a.type,Ce=a.dismissible!==!1,Es=a.className||"",_s=a.descriptionClassName||"",Be=u.useMemo(()=>O.findIndex(k=>k.toastId===a.id)||0,[O,a.id]),Ts=u.useMemo(()=>{var k;return(k=a.closeButton)!=null?k:$},[a.closeButton,$]),it=u.useMemo(()=>a.duration||K||Nt,[a.duration,K]),Ke=u.useRef(0),Pe=u.useRef(0),lt=u.useRef(0),Re=u.useRef(null),[Cs,Ps]=W.split("-"),ct=u.useMemo(()=>O.reduce((k,U,q)=>q>=Be?k:k+U.height,0),[O,Be]),dt=Ir(),Rs=a.invert||x,Xe=se==="loading";Pe.current=u.useMemo(()=>Be*me+ct,[Be,ct]),u.useEffect(()=>{Ie.current=it},[it]),u.useEffect(()=>{A(!0)},[]),u.useEffect(()=>{const k=be.current;if(k){const U=k.getBoundingClientRect().height;return at(U),R(q=>[{toastId:a.id,height:U,position:a.position},...q]),()=>R(q=>q.filter(oe=>oe.toastId!==a.id))}},[R,a.id]),u.useLayoutEffect(()=>{if(!_)return;const k=be.current,U=k.style.height;k.style.height="auto";const q=k.getBoundingClientRect().height;k.style.height=U,at(q),R(oe=>oe.find(H=>H.toastId===a.id)?oe.map(H=>H.toastId===a.id?{...H,height:q}:H):[{toastId:a.id,height:q,position:a.position},...oe])},[_,a.title,a.description,R,a.id,a.jsx,a.action,a.cancel]);const we=u.useCallback(()=>{P(!0),ve(Pe.current),R(k=>k.filter(U=>U.toastId!==a.id)),setTimeout(()=>{te(a)},Yr)},[a,te,R,Pe]);u.useEffect(()=>{if(a.promise&&se==="loading"||a.duration===1/0||a.type==="loading")return;let k;return X||T||dt?(()=>{if(lt.current{Ie.current!==1/0&&(Ke.current=new Date().getTime(),k=setTimeout(()=>{a.onAutoClose==null||a.onAutoClose.call(a,a),we()},Ie.current))})(),()=>clearTimeout(k)},[X,T,a,se,dt,we]),u.useEffect(()=>{a.delete&&(we(),a.onDismiss==null||a.onDismiss.call(a,a))},[we,a.delete]);function zs(){var k;if(C!=null&&C.loading){var U;return u.createElement("div",{className:fe(w==null?void 0:w.loader,a==null||(U=a.classNames)==null?void 0:U.loader,"sonner-loader"),"data-visible":se==="loading"},C.loading)}return u.createElement(Tr,{className:fe(w==null?void 0:w.loader,a==null||(k=a.classNames)==null?void 0:k.loader),visible:se==="loading"})}const As=a.icon||(C==null?void 0:C[se])||Er(se);var ut,mt;return u.createElement("li",{tabIndex:0,ref:be,className:fe(ue,Es,w==null?void 0:w.toast,a==null||(t=a.classNames)==null?void 0:t.toast,w==null?void 0:w.default,w==null?void 0:w[se],a==null||(s=a.classNames)==null?void 0:s[se]),"data-sonner-toast":"","data-rich-colors":(ut=a.richColors)!=null?ut:ae,"data-styled":!(a.jsx||a.unstyled||E),"data-mounted":_,"data-promise":!!a.promise,"data-swiped":ge,"data-removed":S,"data-visible":Ns,"data-y-position":Cs,"data-x-position":Ps,"data-index":N,"data-front":Ss,"data-swiping":ie,"data-dismissible":Ce,"data-type":se,"data-invert":Rs,"data-swipe-out":I,"data-swipe-direction":Y,"data-expanded":!!(X||Q&&_),"data-testid":a.testId,style:{"--index":N,"--toasts-before":N,"--z-index":B.length-N,"--offset":`${S?Ae:Pe.current}px`,"--initial-height":Q?"auto":`${js}px`,...D,...a.style},onDragEnd:()=>{z(!1),h(null),Re.current=null},onPointerDown:k=>{k.button!==2&&(Xe||!Ce||(nt.current=new Date,ve(Pe.current),k.target.setPointerCapture(k.pointerId),k.target.tagName!=="BUTTON"&&(z(!0),Re.current={x:k.clientX,y:k.clientY})))},onPointerUp:()=>{var k,U,q;if(I||!Ce)return;Re.current=null;const oe=Number(((k=be.current)==null?void 0:k.style.getPropertyValue("--swipe-amount-x").replace("px",""))||0),$e=Number(((U=be.current)==null?void 0:U.style.getPropertyValue("--swipe-amount-y").replace("px",""))||0),H=new Date().getTime()-((q=nt.current)==null?void 0:q.getTime()),ne=F==="x"?oe:$e,Fe=Math.abs(ne)/H;if(Math.abs(ne)>=Hr||Fe>.11){ve(Pe.current),a.onDismiss==null||a.onDismiss.call(a,a),Se(F==="x"?oe>0?"right":"left":$e>0?"down":"up"),we(),Ne(!0);return}else{var ce,de;(ce=be.current)==null||ce.style.setProperty("--swipe-amount-x","0px"),(de=be.current)==null||de.style.setProperty("--swipe-amount-y","0px")}le(!1),z(!1),h(null)},onPointerMove:k=>{var U,q,oe;if(!Re.current||!Ce||((U=window.getSelection())==null?void 0:U.toString().length)>0)return;const H=k.clientY-Re.current.y,ne=k.clientX-Re.current.x;var Fe;const ce=(Fe=e.swipeDirections)!=null?Fe:qr(W);!F&&(Math.abs(ne)>1||Math.abs(H)>1)&&h(Math.abs(ne)>Math.abs(H)?"x":"y");let de={x:0,y:0};const pt=Ee=>1/(1.5+Math.abs(Ee)/20);if(F==="y"){if(ce.includes("top")||ce.includes("bottom"))if(ce.includes("top")&&H<0||ce.includes("bottom")&&H>0)de.y=H;else{const Ee=H*pt(H);de.y=Math.abs(Ee)0)de.x=ne;else{const Ee=ne*pt(ne);de.x=Math.abs(Ee)0||Math.abs(de.y)>0)&&le(!0),(q=be.current)==null||q.style.setProperty("--swipe-amount-x",`${de.x}px`),(oe=be.current)==null||oe.style.setProperty("--swipe-amount-y",`${de.y}px`)}},Ts&&!a.jsx&&se!=="loading"?u.createElement("button",{"aria-label":v,"data-disabled":Xe,"data-close-button":!0,onClick:Xe||!Ce?()=>{}:()=>{we(),a.onDismiss==null||a.onDismiss.call(a,a)},className:fe(w==null?void 0:w.closeButton,a==null||(o=a.classNames)==null?void 0:o.closeButton)},(mt=C==null?void 0:C.close)!=null?mt:Ar):null,(se||a.icon||a.promise)&&a.icon!==null&&((C==null?void 0:C[se])!==null||a.icon)?u.createElement("div",{"data-icon":"",className:fe(w==null?void 0:w.icon,a==null||(i=a.classNames)==null?void 0:i.icon)},a.promise||a.type==="loading"&&!a.icon?a.icon||zs():null,a.type!=="loading"?As:null):null,u.createElement("div",{"data-content":"",className:fe(w==null?void 0:w.content,a==null||(l=a.classNames)==null?void 0:l.content)},u.createElement("div",{"data-title":"",className:fe(w==null?void 0:w.title,a==null||(n=a.classNames)==null?void 0:n.title)},a.jsx?a.jsx:typeof a.title=="function"?a.title():a.title),a.description?u.createElement("div",{"data-description":"",className:fe(J,_s,w==null?void 0:w.description,a==null||(d=a.classNames)==null?void 0:d.description)},typeof a.description=="function"?a.description():a.description):null),u.isValidElement(a.cancel)?a.cancel:a.cancel&&Ge(a.cancel)?u.createElement("button",{"data-button":!0,"data-cancel":!0,style:a.cancelButtonStyle||p,onClick:k=>{Ge(a.cancel)&&Ce&&(a.cancel.onClick==null||a.cancel.onClick.call(a.cancel,k),we())},className:fe(w==null?void 0:w.cancelButton,a==null||(m=a.classNames)==null?void 0:m.cancelButton)},a.cancel.label):null,u.isValidElement(a.action)?a.action:a.action&&Ge(a.action)?u.createElement("button",{"data-button":!0,"data-action":!0,style:a.actionButtonStyle||M,onClick:k=>{Ge(a.action)&&(a.action.onClick==null||a.action.onClick.call(a.action,k),!k.defaultPrevented&&we())},className:fe(w==null?void 0:w.actionButton,a==null||(c=a.classNames)==null?void 0:c.actionButton)},a.action.label):null)};function Et(){if(typeof window>"u"||typeof document>"u")return"ltr";const e=document.documentElement.getAttribute("dir");return e==="auto"||!e?window.getComputedStyle(document.documentElement).direction:e}function Kr(e,t){const s={};return[e,t].forEach((o,i)=>{const l=i===1,n=l?"--mobile-offset":"--offset",d=l?Ur:Vr;function m(c){["top","right","bottom","left"].forEach(x=>{s[`${n}-${x}`]=typeof c=="number"?`${c}px`:c})}typeof o=="number"||typeof o=="string"?m(o):typeof o=="object"?["top","right","bottom","left"].forEach(c=>{o[c]===void 0?s[`${n}-${c}`]=d:s[`${n}-${c}`]=typeof o[c]=="number"?`${o[c]}px`:o[c]}):m(d)}),s}const Xr=u.forwardRef(function(t,s){const{id:o,invert:i,position:l="bottom-right",hotkey:n=["altKey","KeyT"],expand:d,closeButton:m,className:c,offset:x,mobileOffset:a,theme:E="light",richColors:T,duration:R,style:L,visibleToasts:O=Fr,toastOptions:N,dir:B=Et(),gap:X=Wr,icons:te,containerAriaLabel:ae="Notifications"}=t,[$,D]=u.useState([]),p=u.useMemo(()=>o?$.filter(_=>_.toasterId===o):$.filter(_=>!_.toasterId),[$,o]),M=u.useMemo(()=>Array.from(new Set([l].concat(p.filter(_=>_.position).map(_=>_.position)))),[p,l]),[ue,J]=u.useState([]),[K,W]=u.useState(!1),[me,Q]=u.useState(!1),[w,C]=u.useState(E!=="system"?E:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),v=u.useRef(null),F=n.join("+").replace(/Key/g,"").replace(/Digit/g,""),h=u.useRef(null),Y=u.useRef(!1),Se=u.useCallback(_=>{D(A=>{var S;return(S=A.find(P=>P.id===_.id))!=null&&S.delete||Z.dismiss(_.id),A.filter(({id:P})=>P!==_.id)})},[]);return u.useEffect(()=>Z.subscribe(_=>{if(_.dismiss){requestAnimationFrame(()=>{D(A=>A.map(S=>S.id===_.id?{...S,delete:!0}:S))});return}setTimeout(()=>{Ls.flushSync(()=>{D(A=>{const S=A.findIndex(P=>P.id===_.id);return S!==-1?[...A.slice(0,S),{...A[S],..._},...A.slice(S+1)]:[_,...A]})})})}),[$]),u.useEffect(()=>{if(E!=="system"){C(E);return}if(E==="system"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?C("dark"):C("light")),typeof window>"u")return;const _=window.matchMedia("(prefers-color-scheme: dark)");try{_.addEventListener("change",({matches:A})=>{C(A?"dark":"light")})}catch{_.addListener(({matches:S})=>{try{C(S?"dark":"light")}catch(P){console.error(P)}})}},[E]),u.useEffect(()=>{$.length<=1&&W(!1)},[$]),u.useEffect(()=>{const _=A=>{var S;if(n.every(z=>A[z]||A.code===z)){var ie;W(!0),(ie=v.current)==null||ie.focus()}A.code==="Escape"&&(document.activeElement===v.current||(S=v.current)!=null&&S.contains(document.activeElement))&&W(!1)};return document.addEventListener("keydown",_),()=>document.removeEventListener("keydown",_)},[n]),u.useEffect(()=>{if(v.current)return()=>{h.current&&(h.current.focus({preventScroll:!0}),h.current=null,Y.current=!1)}},[v.current]),u.createElement("section",{ref:s,"aria-label":`${ae} ${F}`,tabIndex:-1,"aria-live":"polite","aria-relevant":"additions text","aria-atomic":"false",suppressHydrationWarning:!0},M.map((_,A)=>{var S;const[P,ie]=_.split("-");return p.length?u.createElement("ol",{key:_,dir:B==="auto"?Et():B,tabIndex:-1,ref:v,className:c,"data-sonner-toaster":!0,"data-sonner-theme":w,"data-y-position":P,"data-x-position":ie,style:{"--front-toast-height":`${((S=ue[0])==null?void 0:S.height)||0}px`,"--width":`${Gr}px`,"--gap":`${X}px`,...L,...Kr(x,a)},onBlur:z=>{Y.current&&!z.currentTarget.contains(z.relatedTarget)&&(Y.current=!1,h.current&&(h.current.focus({preventScroll:!0}),h.current=null))},onFocus:z=>{z.target instanceof HTMLElement&&z.target.dataset.dismissible==="false"||Y.current||(Y.current=!0,h.current=z.relatedTarget)},onMouseEnter:()=>W(!0),onMouseMove:()=>W(!0),onMouseLeave:()=>{me||W(!1)},onDragEnd:()=>W(!1),onPointerDown:z=>{z.target instanceof HTMLElement&&z.target.dataset.dismissible==="false"||Q(!0)},onPointerUp:()=>Q(!1)},p.filter(z=>!z.position&&A===0||z.position===_).map((z,I)=>{var Ne,ge;return u.createElement(Jr,{key:z.id,icons:te,index:I,toast:z,defaultRichColors:T,duration:(Ne=N==null?void 0:N.duration)!=null?Ne:R,className:N==null?void 0:N.className,descriptionClassName:N==null?void 0:N.descriptionClassName,invert:i,visibleToasts:O,closeButton:(ge=N==null?void 0:N.closeButton)!=null?ge:m,interacting:me,position:_,style:N==null?void 0:N.style,unstyled:N==null?void 0:N.unstyled,classNames:N==null?void 0:N.classNames,cancelButtonStyle:N==null?void 0:N.cancelButtonStyle,actionButtonStyle:N==null?void 0:N.actionButtonStyle,closeButtonAriaLabel:N==null?void 0:N.closeButtonAriaLabel,removeToast:Se,toasts:p.filter(le=>le.position==z.position),heights:ue.filter(le=>le.position==z.position),setHeights:J,expandByDefault:d,gap:X,expanded:K,swipeDirections:t.swipeDirections})})):null}))}),Ye={success:e=>Ze.success(e),error:e=>Ze.error(e),warning:e=>Ze.warning(e)};function Qr(){var C;const{user:e,loading:t,logout:s}=Je(),{theme:o,toggle:i}=Jt(),l=ho("(max-width: 768px)"),n=qe(),d=Pt(),[m]=Rt(),c=d.pathname.startsWith("/compose")||/\/post\/\d+\/edit$/.test(d.pathname),[x,a]=b.useState(()=>jt()),[E,T]=b.useState(()=>St()),[R,L]=b.useState(()=>jt().length>0||!!St()),[O,N]=b.useState([]),[B,X]=b.useState([]),[te,ae]=b.useState(null),[$,D]=b.useState(Number(m.get("board"))||0),[p,M]=b.useState(m.get("keyword")||""),ue=bs(m.get("sort")),{limits:J}=Sr();b.useEffect(()=>{D(Number(m.get("board"))||0)},[m]),b.useEffect(()=>{M(m.get("keyword")||"")},[m]);const K=b.useCallback(()=>{Promise.all([he.boards().then(v=>{const F=v.boards??[];return a(F),fr(F),F}).catch(()=>[]),he.stats().then(v=>(T(v),hr(v),v)).catch(()=>null)]).finally(()=>L(!0))},[]),W=b.useCallback(()=>{he.online().then(v=>{ae({count:v.count??0,members:v.members??0,guests:v.guests??0,users:Array.isArray(v.users)?v.users:[]})}).catch(()=>{})},[]);b.useEffect(()=>{K(),he.hotPosts().then(Y=>N(Array.isArray(Y.posts)?Y.posts:[])).catch(()=>{}),he.notifications().then(Y=>X(Array.isArray(Y.notifications)?Y.notifications:[])).catch(()=>{}),W(),he.presence().catch(()=>{});const v=setInterval(W,3e4),F=setInterval(()=>he.presence().catch(()=>{}),6e4),h=()=>K();return window.addEventListener("boards-refresh",h),()=>{clearInterval(v),clearInterval(F),window.removeEventListener("boards-refresh",h)}},[K,W]);const me=()=>{const v=p.trim();if(!v){n("/");return}const F=[...v].length;if(J.search_keyword_min>0&&F0&&F>J.search_keyword_max){Ye.warning(`搜索关键词最多 ${J.search_keyword_max} 个字`);return}n(`/?keyword=${encodeURIComponent(v)}`)},Q=((C=e==null?void 0:e.nickname)==null?void 0:C.charAt(0))||"?",w=vs(d.pathname)?-1:$;return r.jsx("div",{className:"app-shell",children:r.jsxs("div",{className:"app-frame",children:[r.jsx("header",{className:"app-header",children:r.jsxs("div",{className:"header-inner",children:[r.jsxs("button",{type:"button",className:"header-brand",onClick:()=>Me(n,"/"),children:[r.jsx("span",{className:"header-logo-mark",children:"姜"}),!l&&r.jsx("span",{className:"header-logo-text",children:"姜十三论坛"})]}),!c&&r.jsxs("div",{className:"header-search-wrap",children:[r.jsx(Qs,{className:"header-search-icon",size:16}),r.jsx("input",{className:"header-search-input",type:"search",placeholder:"搜索帖子...",value:p,onChange:v=>M(v.target.value),maxLength:J.search_keyword_max>0?J.search_keyword_max:void 0,onKeyDown:v=>v.key==="Enter"&&me()}),p&&r.jsx("button",{type:"button",className:"header-search-clear",onClick:()=>{M(""),n("/")},"aria-label":"清除搜索",children:"×"})]}),r.jsxs("div",{className:"header-actions",children:[!c&&r.jsxs("button",{type:"button",className:"header-compose-btn",onClick:()=>n(e?"/compose":"/login"),children:[r.jsx(Zs,{size:16}),!l&&r.jsx("span",{children:"发帖"})]}),r.jsxs("div",{className:"header-action-group",children:[r.jsx("button",{type:"button",className:"header-icon-btn",onClick:i,title:o==="light"?"切换暗色模式":"切换亮色模式",children:o==="light"?r.jsx(eo,{size:18}):r.jsx(to,{size:18})}),t?r.jsx("span",{className:"header-auth-slot header-auth-slot--loading","aria-hidden":!0}):e?r.jsxs(ir,{children:[r.jsx(lr,{asChild:!0,children:r.jsx("button",{type:"button",className:"header-user-btn",title:e.nickname,children:e.avatar?r.jsx("img",{src:e.avatar,alt:"",className:"header-user-avatar"}):r.jsx("span",{className:"header-user-initial",children:Q})})}),r.jsxs(ms,{align:"end",className:"w-40",children:[r.jsx(De,{onClick:()=>n("/profile"),children:"个人中心"}),r.jsx(De,{onClick:()=>n("/favorites"),children:"我的收藏"}),e.role==="admin"&&r.jsxs(r.Fragment,{children:[r.jsx(tt,{}),r.jsx(De,{onClick:()=>n("/admin/dashboard"),children:"管理后台"})]}),r.jsx(tt,{}),r.jsx(De,{onClick:()=>s().then(()=>n("/login")),children:"退出登录"})]})]}):r.jsx("button",{type:"button",className:"header-login-btn",onClick:()=>n("/login"),children:"登录"})]})]})]})}),r.jsxs("div",{className:`app-body${c?" app-body--compose":""}`,children:[!c&&r.jsx(wr,{boards:x,activeBoard:$,onSelectBoard:D}),r.jsxs("div",{className:`content-workspace${c?" content-workspace--compose":""}`,children:[r.jsxs("main",{className:`main-content${c?" main-content--compose":""}`,children:[l&&!c&&r.jsxs("div",{className:"mobile-board-bar",children:[r.jsx("span",{className:`board-chip ${w===0?"active":""}`,onClick:()=>{D(0),Me(n,He(0,ue))},children:"全部"}),x.map(v=>r.jsx("span",{className:`board-chip ${w===v.id?"active":""}`,onClick:()=>{D(v.id),Me(n,He(v.id,ue))},children:v.name},v.id))]}),r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(zt,{context:{boardId:$,keyword:m.get("keyword")||"",setBoardId:D,boards:x,stats:E,layoutReady:R,refreshBoards:K,isMobile:l}})})]}),!c&&r.jsx("aside",{className:"aside-panel",children:r.jsx(kr,{hot:O,notifications:B,online:te,onPostClick:v=>n(`/post/${v}`)})})]})]})]})})}const Zr={sm:"h-4 w-4",md:"h-5 w-5",lg:"h-8 w-8"};function ea({className:e,size:t="md"}){return r.jsx(Ut,{className:ee("animate-spin text-[var(--j13-green)]",Zr[t],e),"aria-label":"加载中"})}const ta=[{to:"/admin/dashboard",label:"仪表盘",icon:Vt},{to:"/admin/boards",label:"板块管理",icon:oo},{to:"/admin/posts",label:"帖子管理",icon:ro},{to:"/admin/comments",label:"评论管理",icon:ao},{to:"/admin/users",label:"用户管理",icon:no},{to:"/admin/settings",label:"系统设置",icon:io}];function sa(){const{user:e,loading:t}=Je(),s=qe();return b.useEffect(()=>{if(!t){if(!e){s("/login");return}e.role!=="admin"&&(Ye.warning("需要管理员权限"),s("/"))}},[e,t,s]),t?r.jsx("div",{className:"flex justify-center py-24",children:r.jsx(ea,{size:"lg"})}):!e||e.role!=="admin"?null:r.jsxs("div",{className:"admin-shell",children:[r.jsxs("header",{className:"admin-topbar",children:[r.jsxs("div",{className:"admin-topbar-brand",children:[r.jsx("div",{className:"admin-topbar-mark",children:"姜"}),r.jsxs("div",{children:[r.jsx("div",{className:"admin-topbar-title",children:"姜十三论坛"}),r.jsx("div",{className:"admin-topbar-sub",children:"管理后台"})]})]}),r.jsxs("div",{className:"admin-topbar-actions",children:[r.jsxs("button",{type:"button",className:"admin-link-btn",onClick:()=>s("/"),children:[r.jsx(so,{size:16}),"返回论坛"]}),r.jsx("span",{className:"admin-topbar-user",children:e.nickname})]})]}),r.jsxs("div",{className:"admin-body",children:[r.jsx("aside",{className:"admin-sidebar",children:ta.map(({to:o,label:i,icon:l})=>r.jsxs(Ds,{to:o,className:({isActive:n})=>ee("admin-nav-item",n&&"active"),children:[r.jsx(l,{size:16}),i]},o))}),r.jsx("main",{className:"admin-main",children:r.jsx(zt,{})})]})]})}function Ta(){const{user:e,loading:t}=Je(),s=qe();return b.useEffect(()=>{t||(e?e.role!=="admin"&&(Ye.warning("需要管理员权限"),s("/")):s("/login"))},[e,t,s]),{user:e,loading:t,ready:!t&&!!e&&e.role==="admin"}}const _t=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,Tt=Xt,oa=(e,t)=>s=>{var o;if((t==null?void 0:t.variants)==null)return Tt(e,s==null?void 0:s.class,s==null?void 0:s.className);const{variants:i,defaultVariants:l}=t,n=Object.keys(i).map(c=>{const x=s==null?void 0:s[c],a=l==null?void 0:l[c];if(x===null)return null;const E=_t(x)||_t(a);return i[c][E]}),d=s&&Object.entries(s).reduce((c,x)=>{let[a,E]=x;return E===void 0||(c[a]=E),c},{}),m=t==null||(o=t.compoundVariants)===null||o===void 0?void 0:o.reduce((c,x)=>{let{class:a,className:E,...T}=x;return Object.entries(T).every(R=>{let[L,O]=R;return Array.isArray(O)?O.includes({...l,...d}[L]):{...l,...d}[L]===O})?[...c,a,E]:c},[]);return Tt(e,n,m,s==null?void 0:s.class,s==null?void 0:s.className)},ra=oa("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),ks=b.forwardRef(({className:e,variant:t,size:s,asChild:o=!1,loading:i,children:l,disabled:n,...d},m)=>{const c=o?lo:"button";return r.jsxs(c,{className:ee(ra({variant:t,size:s,className:e})),ref:m,disabled:n||i,...d,children:[i?r.jsx(Ut,{className:"animate-spin"}):null,l]})});ks.displayName="Button";class aa extends b.Component{constructor(){super(...arguments);ft(this,"state",{error:null})}static getDerivedStateFromError(s){return{error:s}}componentDidCatch(s,o){console.error("[Jiang13Forum]",s,o.componentStack)}render(){return this.state.error?r.jsxs("div",{style:{padding:24,textAlign:"center"},children:[r.jsx("h3",{children:"页面渲染出错"}),r.jsx("p",{style:{color:"var(--color-text-3)",fontSize:13},children:this.state.error.message}),r.jsx(ks,{size:"sm",onClick:()=>{this.setState({error:null}),window.location.reload()},children:"刷新页面"})]}):this.props.children}}function na(){const{theme:e}=Jt();return r.jsx(Xr,{theme:e,position:"top-center",richColors:!0,closeButton:!0,toastOptions:{classNames:{toast:"font-sans"}}})}const ia=b.lazy(()=>re(()=>import("./HomePage-DTZV5yFZ.js"),__vite__mapDeps([0,1,2,3,4,5,6]))),la=b.lazy(()=>re(()=>import("./PostDetailPage-fhZ7iAmD.js"),__vite__mapDeps([7,1,4,5,3,6,8,9]))),ca=b.lazy(()=>re(()=>import("./LoginPage-puDI4GYE.js"),__vite__mapDeps([10,1,11,5,12]))),da=b.lazy(()=>re(()=>import("./RegisterPage-M2GcPscc.js"),__vite__mapDeps([13,1,11,5,12]))),Ct=b.lazy(()=>re(()=>import("./ComposePage-CW_vWd31.js"),__vite__mapDeps([14,1,8,9,5,15,12]))),ua=b.lazy(()=>re(()=>import("./BoardsManagePage-CkQP_LEp.js"),__vite__mapDeps([16,1,11,5,12,17,3,15,18]))),ma=b.lazy(()=>re(()=>import("./ProfilePage-Bvftg6_b.js"),__vite__mapDeps([19,1,11,5,12,3,15]))),pa=b.lazy(()=>re(()=>import("./FavoritesPage-CZ210yAP.js"),__vite__mapDeps([20,1,6,5]))),fa=b.lazy(()=>re(()=>import("./AdminDashboardPage-BJzAuroX.js"),__vite__mapDeps([21,1,3,5]))),ha=b.lazy(()=>re(()=>import("./AdminPostsPage-Y2jb5HlP.js"),__vite__mapDeps([22,1,12,3,18,5,6]))),ga=b.lazy(()=>re(()=>import("./AdminCommentsPage-CGuslsQh.js"),__vite__mapDeps([23,1,3,18,5]))),ba=b.lazy(()=>re(()=>import("./AdminUsersPage-Br2jBqxw.js"),__vite__mapDeps([24,1,3,5]))),xa=b.lazy(()=>re(()=>import("./AdminSettingsPage-D_QJX2YW.js"),__vite__mapDeps([25,1,12,17,5])));function ya(){return r.jsx(fo,{children:r.jsx(po,{children:r.jsxs(aa,{children:[r.jsx(Ms,{children:r.jsxs(Bs,{children:[r.jsx(G,{path:"/login",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(ca,{})})}),r.jsx(G,{path:"/register",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(da,{})})}),r.jsx(G,{path:"/boards",element:r.jsx(ht,{to:"/admin/boards",replace:!0})}),r.jsxs(G,{path:"/admin",element:r.jsx(sa,{}),children:[r.jsx(G,{index:!0,element:r.jsx(ht,{to:"/admin/dashboard",replace:!0})}),r.jsx(G,{path:"dashboard",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(fa,{})})}),r.jsx(G,{path:"boards",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(ua,{})})}),r.jsx(G,{path:"posts",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(ha,{})})}),r.jsx(G,{path:"comments",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(ga,{})})}),r.jsx(G,{path:"users",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(ba,{})})}),r.jsx(G,{path:"settings",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(xa,{})})})]}),r.jsxs(G,{element:r.jsx(Qr,{}),children:[r.jsx(G,{path:"/",element:r.jsx(ia,{})}),r.jsx(G,{path:"/post/:id",element:r.jsx(la,{})}),r.jsx(G,{path:"/post/:id/edit",element:r.jsx(Ct,{})}),r.jsx(G,{path:"/compose",element:r.jsx(Ct,{})}),r.jsx(G,{path:"/profile",element:r.jsx(ma,{})}),r.jsx(G,{path:"/favorites",element:r.jsx(pa,{})})]})]})}),r.jsx(na,{})]})})})}Ht(Wt());$s.createRoot(document.getElementById("root")).render(r.jsx(u.StrictMode,{children:r.jsx(ya,{})}));export{ks as B,xr as F,ea as S,he as a,Sa as b,br as c,Me as d,He as e,ee as f,Na as g,Je as h,Ta as i,oa as j,ra as k,_a as l,Ye as n,bs as p,Ea as s,Sr as u}; diff --git a/embed_static/static/spa/assets/index-BH_9j3kA.css b/embed_static/static/spa/assets/index-BH_9j3kA.css new file mode 100644 index 0000000..a5d720f --- /dev/null +++ b/embed_static/static/spa/assets/index-BH_9j3kA.css @@ -0,0 +1 @@ +*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--j13-font-family);font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 210 20% 98%;--foreground: 222 47% 11%;--card: 0 0% 100%;--card-foreground: 222 47% 11%;--popover: 0 0% 100%;--popover-foreground: 222 47% 11%;--primary: 152 72% 36%;--primary-foreground: 0 0% 100%;--secondary: 210 20% 96%;--secondary-foreground: 222 47% 11%;--muted: 210 20% 96%;--muted-foreground: 215 16% 47%;--accent: 152 45% 95%;--accent-foreground: 152 72% 28%;--destructive: 0 84% 60%;--destructive-foreground: 0 0% 100%;--border: 214 20% 91%;--input: 214 20% 91%;--ring: 152 72% 36%;--radius: .375rem;--color-text-1: hsl(var(--foreground));--color-text-2: hsl(215 16% 35%);--color-text-3: hsl(var(--muted-foreground));--color-text-4: hsl(215 12% 65%);--color-fill-3: hsl(210 20% 94%)}.dark{--background: 240 6% 10%;--foreground: 0 0% 95%;--card: 240 5% 13%;--card-foreground: 0 0% 95%;--popover: 240 5% 13%;--popover-foreground: 0 0% 95%;--primary: 152 58% 46%;--primary-foreground: 0 0% 100%;--secondary: 240 4% 16%;--secondary-foreground: 0 0% 95%;--muted: 240 4% 16%;--muted-foreground: 240 5% 65%;--accent: 152 30% 14%;--accent-foreground: 152 58% 55%;--destructive: 0 63% 45%;--destructive-foreground: 0 0% 95%;--border: 240 4% 18%;--input: 240 4% 18%;--ring: 152 58% 46%;--color-text-1: hsl(var(--foreground));--color-text-2: hsl(240 5% 75%);--color-text-3: hsl(var(--muted-foreground));--color-text-4: hsl(240 5% 50%);--color-fill-3: hsl(240 4% 20%)}.\!container{width:100%!important}.container{width:100%}@media (min-width: 640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width: 768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width: 1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width: 1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width: 1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.left-2{left:.5rem}.left-\[50\%\]{left:50%}.right-4{right:1rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-50{z-index:50}.z-\[110\]{z-index:110}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-auto{margin-left:auto}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.block{display:block}.\!inline{display:inline!important}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-2{height:.5rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-px{height:1px}.min-h-\[60px\]{min-height:60px}.w-2{width:.5rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-40{width:10rem}.w-5{width:1.25rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[160px\]{width:160px}.w-\[60px\]{width:60px}.w-\[70px\]{width:70px}.w-\[80px\]{width:80px}.w-full{width:100%}.min-w-\[8rem\]{min-width:8rem}.max-w-\[120px\]{max-width:120px}.max-w-\[200px\]{max-width:200px}.max-w-lg{max-width:32rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.rounded-full{border-radius:9999px}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-input{border-color:hsl(var(--input))}.border-transparent{border-color:transparent}.bg-\[var\(--j13-green-bg\)\]{background-color:var(--j13-green-bg)}.bg-background{background-color:hsl(var(--background))}.bg-black\/80{background-color:#000c}.bg-destructive{background-color:hsl(var(--destructive))}.bg-muted{background-color:hsl(var(--muted))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-secondary{background-color:hsl(var(--secondary))}.fill-current{fill:currentColor}.p-1{padding:.25rem}.p-3{padding:.75rem}.p-6{padding:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.text-left{text-align:left}.text-center{text-align:center}.align-middle{vertical-align:middle}.font-sans{font-family:var(--j13-font-family)}.text-\[0\.8rem\]{font-size:.8rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.italic{font-style:italic}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.tracking-widest{letter-spacing:.1em}.text-\[var\(--j13-green\)\]{color:var(--j13-green)}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-orange-700{--tw-text-opacity: 1;color:rgb(194 65 12 / var(--tw-text-opacity, 1))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.duration-200{animation-duration:.2s}:root{--j13-font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans SC", "WenQuanYi Micro Hei", system-ui, -apple-system, "Segoe UI", sans-serif;--j13-green: #18a058;--j13-green-hover: #138f4c;--j13-green-bg: rgba(24, 160, 88, .08);--j13-green-soft: #edfbf3;--j13-border: #e8edf2;--j13-border-light: #f0f3f7;--j13-sidebar-w: 210px;--j13-aside-w: 280px;--j13-header-h: 56px;--j13-max-w: 1400px;--j13-article-read-w: 820px;--j13-bg-page: #f5f7fa;--j13-bg-workspace: #f8fafc;--j13-bg-surface: #ffffff;--j13-bg-block: #ffffff;--j13-bg-block-muted: #f1f4f8;--j13-bg-block-accent: #f0faf5;--j13-shadow-soft: 0 1px 2px rgba(15, 23, 42, .04);--j13-shadow-card: 0 2px 8px rgba(15, 23, 42, .05)}.dark{--j13-green: #23c36b;--j13-green-hover: #1fb35f;--j13-green-bg: rgba(35, 195, 107, .12);--j13-green-soft: rgba(35, 195, 107, .08);--j13-border: #2e2e32;--j13-border-light: #262629;--j13-bg-page: #141416;--j13-bg-workspace: #18181b;--j13-bg-surface: #1f1f23;--j13-bg-block: #232328;--j13-bg-block-muted: #1c1c20;--j13-bg-block-accent: rgba(35, 195, 107, .06);--j13-shadow-soft: 0 1px 2px rgba(0, 0, 0, .2);--j13-shadow-card: 0 2px 8px rgba(0, 0, 0, .28)}*{box-sizing:border-box}html{scrollbar-gutter:stable;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto;font-family:var(--j13-font-family);text-rendering:optimizeLegibility}html,body,#root{height:100%;margin:0}body{font-family:var(--j13-font-family);font-size:14px;line-height:1.5;color:var(--color-text-1);background:var(--j13-bg-page);overflow:hidden}a{color:var(--j13-green);text-decoration:none}a:hover{text-decoration:underline}.app-shell{height:100%;max-height:100dvh;display:flex;flex-direction:column;overflow:hidden;background:var(--j13-bg-page)}.app-frame{flex:1;min-height:0;height:100%;max-width:var(--j13-max-w);width:100%;margin:0 auto;display:flex;flex-direction:column;overflow:hidden;border-left:1px solid var(--j13-border);border-right:1px solid var(--j13-border);background:var(--j13-bg-surface)}.app-header{height:var(--j13-header-h);flex-shrink:0;z-index:100;background:var(--j13-bg-surface);border-bottom:1px solid var(--j13-border)}.header-inner{height:100%;width:100%;padding:0 20px;display:flex;align-items:center;gap:20px}.header-brand{display:flex;align-items:center;gap:10px;flex-shrink:0;border:none;background:none;padding:4px 0;cursor:pointer;color:inherit;font:inherit}.header-brand:hover .header-logo-text{color:var(--j13-green)}.header-logo-mark{width:34px;height:34px;border-radius:10px;background:linear-gradient(135deg,var(--j13-green) 0%,#34c471 100%);color:#fff;font-weight:700;font-size:17px;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px #1a7f4b47}.header-logo-text{font-size:15px;font-weight:600;letter-spacing:.02em;transition:color .15s}.header-search-wrap{flex:1;min-width:0;max-width:420px;display:flex;align-items:center;gap:8px;height:36px;padding:0 14px;border-radius:999px;background:var(--j13-bg-block-muted);border:1px solid var(--j13-border-light);transition:border-color .2s,background .2s,box-shadow .2s}.header-search-wrap:focus-within{background:var(--j13-bg-surface);border-color:color-mix(in srgb,var(--j13-green) 30%,transparent);box-shadow:0 0 0 3px var(--j13-green-bg)}.header-search-icon{flex-shrink:0;font-size:15px;color:var(--color-text-3)}.header-search-input{flex:1;min-width:0;border:none;outline:none;background:transparent;font-size:14px;color:var(--color-text-1);font-family:inherit}.header-search-input::-moz-placeholder{color:var(--color-text-4)}.header-search-input::placeholder{color:var(--color-text-4)}.header-search-input::-webkit-search-cancel-button{display:none}.header-search-clear{flex-shrink:0;width:20px;height:20px;border:none;border-radius:50%;background:var(--color-fill-3);color:var(--color-text-3);font-size:14px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;transition:background .15s,color .15s}.header-search-clear:hover{background:var(--color-fill-4);color:var(--color-text-1)}.header-actions{display:flex;align-items:center;gap:10px;flex-shrink:0;margin-left:auto}.header-compose-btn{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 16px;border:none;border-radius:999px;background:var(--j13-green);color:#fff;font-size:13px;font-weight:500;font-family:inherit;cursor:pointer;transition:background .15s,transform .1s,box-shadow .15s;box-shadow:0 2px 6px #1a7f4b38}.header-compose-btn:hover{background:var(--j13-green-hover);box-shadow:0 3px 10px #1a7f4b4d}.header-compose-btn:active{transform:scale(.97)}.header-action-group{display:flex;align-items:center;gap:4px;padding:3px;border-radius:999px;background:var(--j13-bg-block-muted);border:1px solid var(--j13-border-light)}.header-icon-btn{width:32px;height:32px;border:none;border-radius:50%;background:transparent;color:var(--color-text-2);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .15s,color .15s}.header-icon-btn:hover{background:var(--color-fill-3);color:var(--color-text-1)}.header-user-btn{width:32px;height:32px;border:none;border-radius:50%;padding:0;cursor:pointer;overflow:hidden;background:var(--j13-green);display:flex;align-items:center;justify-content:center;transition:box-shadow .15s,transform .1s}.header-user-btn:hover,.header-user-btn:focus-visible{box-shadow:0 0 0 2px var(--j13-green-bg),0 0 0 3px var(--j13-green)}.header-user-btn:focus{outline:none}.header-user-avatar{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.header-user-initial{color:#fff;font-size:14px;font-weight:600}.header-login-btn{height:32px;padding:0 14px;border:none;border-radius:999px;background:transparent;color:var(--j13-green);font-size:13px;font-weight:500;font-family:inherit;cursor:pointer;transition:background .15s}.header-login-btn:hover{background:var(--j13-green-bg)}.header-auth-slot{display:inline-block;width:32px;height:32px;border-radius:50%;flex-shrink:0}.header-auth-slot--loading{background:var(--color-fill-3)}.app-body{flex:1;display:flex;min-height:0;width:100%;overflow:hidden;background:var(--j13-bg-surface)}.sidebar{width:var(--j13-sidebar-w);flex-shrink:0;border-right:1px solid var(--j13-border-light);background:var(--j13-bg-surface);overflow-y:auto;padding:12px 0}.sidebar-section{padding:4px 12px 8px;font-size:11px;font-weight:600;color:var(--color-text-3)}.sidebar-nav{display:flex;flex-direction:column;gap:2px;padding:0 8px}.sidebar-nav-item{display:flex;align-items:center;gap:8px;width:100%;margin:0;padding:0 12px;height:36px;border:none;border-radius:6px;background:transparent;color:var(--color-text-1);font-size:14px;cursor:pointer;text-align:left;transition:background .15s,color .15s}.sidebar-nav-item:hover{background:var(--j13-bg-block-muted)}.sidebar-nav-item.active{background:var(--j13-green-bg);color:var(--j13-green);font-weight:600}.sidebar-nav-item svg{width:16px;height:16px;flex-shrink:0}.sidebar-nav-item__meta{margin-left:auto;color:var(--color-text-4);font-size:12px}.sidebar-actions{padding:12px;border-top:1px solid var(--j13-border);margin-top:8px}.main-content{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden}.content-workspace{flex:1;display:flex;min-width:0;min-height:0;overflow:hidden;background:var(--j13-bg-surface)}.aside-panel{width:var(--j13-aside-w);flex-shrink:0;border-left:1px solid var(--j13-border-light);overflow-y:auto;padding:0;display:flex;flex-direction:column;background:var(--j13-bg-surface)}@media (max-width: 1100px){.aside-panel{display:none}}@media (max-width: 768px){.app-frame{border-left:none;border-right:none}.sidebar{display:none}.header-inner{padding:0 12px;gap:10px}.header-search-wrap{max-width:none}.header-compose-btn{width:34px;padding:0;justify-content:center}.feed-banner-row{flex-direction:row;gap:10px}.board-grid{flex-wrap:nowrap;overflow-x:auto;padding:8px 12px;scrollbar-width:none}.board-grid::-webkit-scrollbar{display:none}}.page-wrap{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;display:flex;flex-direction:column;scrollbar-width:none;-ms-overflow-style:none}.page-wrap::-webkit-scrollbar{display:none}.virtual-list-wrap,.post-list-scroll{flex:1;overflow:auto;min-height:0;scrollbar-width:none;-ms-overflow-style:none}.virtual-list-wrap::-webkit-scrollbar,.post-list-scroll::-webkit-scrollbar{display:none}.feed-list-footer{display:flex;justify-content:center;align-items:center;padding:16px 12px}.feed-list-footer--end{font-size:12px;color:var(--color-text-3);padding:10px 12px}.feed-list-footer--history{flex-direction:column;gap:10px}.feed-list-footer__hint{margin:0;font-size:12px;color:var(--color-text-3)}.page-inner{padding:20px 24px;max-width:720px}.page-inner-wide{padding:20px 24px}.page-title{font-size:20px;font-weight:600;margin:0 0 4px}.page-desc{font-size:13px;color:var(--color-text-3);margin:0 0 20px}.content-surface{background:var(--j13-bg-block);border:1px solid var(--j13-border-light);border-radius:12px;box-shadow:var(--j13-shadow-soft);overflow:hidden}.section-card{background:var(--j13-bg-block);border:1px solid var(--j13-border-light);border-radius:12px;box-shadow:var(--j13-shadow-soft);padding:20px;margin-bottom:16px}.section-card-title{font-size:15px;font-weight:600;margin:0 0 16px;padding-bottom:12px;border-bottom:1px solid var(--j13-border-light)}.feed-top{flex-shrink:0;border-bottom:1px solid var(--j13-border-light);background:var(--j13-bg-block)}@media (min-width: 900px){.feed-top:not(:has(.feed-head--solo)){display:flex;align-items:center;gap:16px;padding:6px 16px}.feed-top:not(:has(.feed-head--solo)) .feed-head{padding:0;flex-shrink:0}.feed-top:not(:has(.feed-head--solo)) .feed-toolbar{padding:0;flex:1;min-width:0}}.feed-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 16px 6px}.feed-head--solo{padding-bottom:8px}.feed-head__title{display:flex;align-items:baseline;gap:10px;min-width:0;flex:1}.feed-head h2{margin:0;font-size:15px;font-weight:600;white-space:nowrap}.feed-head__meta{font-size:12px;color:var(--color-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.feed-head__meta strong{color:var(--j13-green);font-weight:600}.feed-head__dot{margin:0 4px;opacity:.55}.feed-head__clear{flex-shrink:0;border:none;background:transparent;padding:0;font-size:12px;color:var(--j13-green);cursor:pointer;font-family:inherit}.feed-head__clear:hover{text-decoration:underline}.feed-toolbar{display:flex;align-items:center;gap:10px;padding:0 16px 8px}.feed-toolbar__count{flex-shrink:0;font-size:12px;color:var(--color-text-3);white-space:nowrap}.feed-banner{padding:8px 16px;border-bottom:1px solid var(--j13-border-light)}.feed-banner-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.feed-banner-title{flex:1;min-width:0}.feed-banner h2{margin:0;font-size:15px;font-weight:600}.feed-banner p{margin:0;font-size:12px;color:var(--color-text-3);line-height:1.45}.feed-stats{display:flex;flex-wrap:wrap;gap:8px 12px;margin-top:6px;font-size:12px;color:var(--color-text-3)}.feed-stats strong{color:var(--j13-green);font-weight:600}.feed-action-slot{display:inline-block;width:88px;height:28px;border-radius:4px;background:var(--color-fill-3)}.feed-actions{min-height:28px}.mobile-board-bar{display:none;padding:8px 12px;gap:8px;overflow-x:auto;border-bottom:1px solid var(--j13-border);background:var(--j13-bg-surface)}@media (max-width: 768px){.mobile-board-bar{display:flex}}.board-chip{flex-shrink:0;padding:4px 12px;border-radius:16px;font-size:13px;border:1px solid var(--j13-border-light);background:var(--j13-bg-block);cursor:pointer}.board-chip.active{background:var(--j13-green-bg);border-color:transparent;color:var(--j13-green);font-weight:600}.board-grid{display:flex;flex-wrap:wrap;gap:8px;padding:10px 20px;border-bottom:1px solid var(--j13-border-light)}.feed-sort-bar{display:flex;align-items:center;gap:2px;flex:1;min-width:0;overflow-x:auto;scrollbar-width:none}.feed-sort-bar::-webkit-scrollbar{display:none}.feed-sort-tab{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border:none;border-radius:6px;background:transparent;color:var(--color-text-2);font-family:inherit;font-size:12px;cursor:pointer;flex-shrink:0;white-space:nowrap;transition:background .15s,color .15s}.feed-sort-tab:hover{background:var(--j13-bg-block-muted);color:var(--color-text-1)}.feed-sort-tab.active{background:var(--j13-green-bg);color:var(--j13-green);font-weight:600}.feed-sort-tab svg{width:14px;height:14px;flex-shrink:0}@media (max-width: 768px){.feed-head{flex-wrap:wrap;padding:8px 12px 6px}.feed-head__meta{display:none}.feed-toolbar{padding:0 12px 8px}}.board-grid-empty{padding:20px;border-bottom:1px solid var(--j13-border-light)}.board-tab{display:flex;align-items:center;gap:6px;height:36px;max-width:220px;padding:0 14px;border:1px solid var(--j13-border-light);border-radius:8px;background:var(--j13-bg-block);cursor:pointer;transition:border-color .15s,background .15s;font-family:inherit;color:inherit;flex-shrink:0}.board-tab:hover{border-color:var(--j13-green-light, #7cb87c);background:var(--j13-bg-block-muted)}.board-tab.active{border-color:var(--j13-green);background:color-mix(in srgb,var(--j13-green) 10%,var(--j13-bg-block))}.board-tab-icon{font-size:14px;color:var(--j13-green);line-height:1;flex-shrink:0}.board-tab-name{font-size:13px;font-weight:500;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.board-tab-count{flex-shrink:0;min-width:18px;padding:0 6px;height:20px;line-height:20px;font-size:11px;text-align:center;border-radius:10px;background:var(--color-fill-2);color:var(--color-text-3)}.board-tab.active .board-tab-count{background:color-mix(in srgb,var(--j13-green) 20%,transparent);color:var(--j13-green)}.board-tab--skeleton{width:140px;border-color:transparent;background:linear-gradient(90deg,var(--color-fill-2) 25%,var(--color-fill-3) 50%,var(--color-fill-2) 75%);background-size:200% 100%;animation:board-skeleton-shimmer 1.2s ease-in-out infinite;pointer-events:none}.board-grid--skeleton{pointer-events:none}@keyframes board-skeleton-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.post-list-bar{display:flex;justify-content:space-between;padding:10px 20px;font-size:13px;color:var(--color-text-3);border-bottom:1px solid var(--j13-border-light)}.post-row{display:flex;align-items:flex-start;gap:12px;padding:12px 20px;border-bottom:1px solid var(--j13-border-light);cursor:pointer;transition:background .15s}.post-row:hover{background:var(--j13-bg-block-muted)}.post-avatar{width:36px;height:36px;border-radius:50%;background:var(--j13-green);color:#fff;font-size:14px;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden}.post-avatar img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.post-body{flex:1;min-width:0}.post-title{font-size:14px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-bottom:4px}.post-pinned-icon{display:inline-block;vertical-align:-.15em;flex-shrink:0;color:#e53935;stroke-width:1.5}.post-meta{font-size:12px;color:var(--color-text-3);display:flex;flex-wrap:wrap;gap:8px}.post-stats{display:flex;gap:12px;font-size:12px;color:var(--color-text-3);flex-shrink:0;padding-top:4px}.empty-state{text-align:center;padding:60px 24px;color:var(--color-text-3)}.empty-feed{text-align:center;padding:48px 24px;color:var(--color-text-3)}.empty-feed-icon{font-size:36px;margin-bottom:8px}.post-detail-loading{display:flex;align-items:center;justify-content:center;padding:60px;flex:1}.post-detail-page{display:flex;flex-direction:column;min-height:0;gap:16px;padding:16px 20px 24px;background:var(--j13-bg-workspace)}.post-detail-header{padding:16px 20px 20px;background:var(--j13-bg-surface);border:1px solid var(--j13-border-light);border-radius:12px;box-shadow:var(--j13-shadow-card);flex-shrink:0}.post-detail-nav{display:flex;align-items:center;gap:8px;margin-bottom:8px}.post-detail-board-tag{margin:0!important}.post-detail-head{margin-bottom:12px}.post-detail-title{font-size:20px;font-weight:600;margin:0 0 12px;line-height:1.45;word-break:break-word}.post-detail-author-row{display:flex;align-items:center;gap:10px}.post-avatar-lg{width:40px;height:40px;font-size:16px}.post-detail-author-info{display:flex;flex-direction:column;gap:2px}.post-detail-author-name{font-size:14px;font-weight:600;color:var(--color-text-1)}.post-detail-meta-line{font-size:12px;color:var(--color-text-3);display:flex;flex-wrap:wrap;align-items:center;gap:4px}.post-detail-locked-tag{display:inline-flex;align-items:center;gap:3px;margin-left:6px;color:hsl(var(--destructive));font-size:11px}.post-detail-edit-hint{font-size:12px;color:var(--color-text-3);align-self:center}.post-revision-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;background:#00000080;display:flex;align-items:center;justify-content:center;padding:16px}.post-revision-overlay--fullscreen{padding:0}.post-revision-panel{background:hsl(var(--background));border-radius:12px;width:min(1080px,100%);height:min(88vh,900px);display:flex;flex-direction:column;box-shadow:0 12px 48px #00000038;overflow:hidden}.post-revision-panel--fullscreen{width:100%;height:100%;max-height:none;border-radius:0}.post-revision-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px;border-bottom:1px solid var(--j13-border-light);flex-shrink:0}.post-revision-head-left{display:flex;align-items:center;gap:8px;min-width:0}.post-revision-head-left h3{font-size:15px;font-weight:600;margin:0}.post-revision-head-sub{font-size:12px;color:var(--color-text-3);padding-left:8px;border-left:1px solid var(--j13-border-light)}.post-revision-head-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.post-revision-view-tabs{display:flex;gap:2px;background:hsl(var(--muted));border-radius:8px;padding:3px}.post-revision-tab{display:inline-flex;align-items:center;gap:4px;padding:5px 10px;border:none;background:none;border-radius:6px;font-size:12px;color:var(--color-text-2);cursor:pointer;white-space:nowrap}.post-revision-tab:hover{color:var(--color-text-1)}.post-revision-tab.active{background:hsl(var(--background));color:var(--color-text-1);font-weight:500;box-shadow:0 1px 3px #00000014}.post-revision-icon-btn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;border-radius:8px;cursor:pointer;color:var(--color-text-3)}.post-revision-icon-btn:hover{background:hsl(var(--muted));color:var(--color-text-1)}.post-revision-loading,.post-revision-empty{flex:1;display:flex;align-items:center;justify-content:center;padding:48px 24px;color:var(--color-text-3);font-size:14px}.post-revision-body{display:flex;flex:1;min-height:0;overflow:hidden}.post-revision-sidebar{width:260px;flex-shrink:0;display:flex;flex-direction:column;border-right:1px solid var(--j13-border-light);min-height:0}.post-revision-sidebar-label{padding:10px 14px 6px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-3)}.post-revision-list{list-style:none;margin:0;padding:4px 8px;overflow-y:auto;flex:1;min-height:0}.post-revision-item{display:flex;flex-direction:column;gap:4px;width:100%;text-align:left;padding:10px 12px;border:none;background:none;border-radius:8px;cursor:pointer;font-size:13px;margin-bottom:2px}.post-revision-item:hover,.post-revision-item.active{background:hsl(var(--muted))}.post-revision-item-head{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.post-revision-item-num{font-size:11px;font-weight:600;color:var(--color-text-3)}.post-revision-item-title{font-weight:500;color:var(--color-text-1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.post-revision-item-meta{font-size:11px;color:var(--color-text-3)}.post-revision-badge{font-size:10px;padding:1px 6px;border-radius:4px;background:hsl(var(--primary) / .12);color:hsl(var(--primary));font-weight:500}.post-revision-badge--none{background:hsl(var(--muted));color:var(--color-text-3)}.post-revision-current{padding:12px 14px;border-top:1px solid var(--j13-border-light);background:hsl(var(--muted) / .4);flex-shrink:0}.post-revision-current-label{display:block;font-size:11px;color:var(--color-text-3);margin-bottom:4px}.post-revision-current-title{font-size:13px;font-weight:500;color:var(--color-text-1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.post-revision-main{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0}.post-revision-main-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 20px;border-bottom:1px solid var(--j13-border-light);flex-shrink:0}.post-revision-main-editor{font-size:14px;font-weight:600;color:var(--color-text-1);margin-right:8px}.post-revision-main-time{font-size:12px;color:var(--color-text-3)}.post-revision-scroll{flex:1;overflow-y:auto;overflow-x:hidden;min-height:0;padding:16px 20px 24px;-webkit-overflow-scrolling:touch}.revision-diff-view{display:flex;flex-direction:column;gap:20px}.revision-diff-section h4{font-size:12px;font-weight:600;color:var(--color-text-3);text-transform:uppercase;letter-spacing:.04em;margin:0 0 8px}.revision-diff-block{padding:12px 14px;background:hsl(var(--muted) / .35);border-radius:8px;font-size:14px;line-height:1.6;word-break:break-word}.revision-diff-inline del{background:#fbe9e9;color:#8f2424;text-decoration:line-through;border-radius:2px;padding:0 2px}.revision-diff-inline ins{background:#e2f8ea;color:#246b3c;text-decoration:none;border-radius:2px;padding:0 2px}.revision-diff-unchanged{color:var(--color-text-3);font-size:13px}.revision-diff-stats{display:flex;gap:8px;margin-bottom:8px}.revision-diff-stat{font-size:11px;padding:2px 8px;border-radius:4px;font-weight:500}.revision-diff-stat--add{background:#e2f8ea;color:#246b3c}.revision-diff-stat--del{background:#fbe9e9;color:#8f2424}.revision-diff-pre{margin:0;font-family:ui-monospace,Cascadia Code,Source Code Pro,Menlo,monospace;font-size:13px;line-height:1.55;border:1px solid var(--j13-border-light);border-radius:8px;overflow:hidden}.revision-diff-line{display:flex;padding:1px 0;white-space:pre-wrap;word-break:break-word}.revision-diff-line--add{background:#ebfaf0}.revision-diff-line--del{background:#fceeee}.revision-diff-line--same{background:hsl(var(--background))}.revision-diff-gutter{flex-shrink:0;width:24px;text-align:center;color:var(--color-text-3);-webkit-user-select:none;-moz-user-select:none;user-select:none;font-size:12px}.revision-diff-line--add .revision-diff-gutter{color:#395}.revision-diff-line--del .revision-diff-gutter{color:#b82e2e}.revision-diff-text{flex:1;padding-right:12px}.revision-diff-line--add .revision-diff-text{color:#1f5130}.revision-diff-line--del .revision-diff-text{color:#722;text-decoration:line-through}.revision-full-view h4{font-size:18px;font-weight:600;margin:0 0 8px;line-height:1.4}.revision-full-tags{font-size:13px;color:var(--color-text-3);margin:0 0 16px}@media (max-width: 768px){.post-revision-overlay:not(.post-revision-overlay--fullscreen){padding:0;align-items:stretch}.post-revision-panel:not(.post-revision-panel--fullscreen){width:100%;height:100%;border-radius:0}.post-revision-head{flex-wrap:wrap}.post-revision-head-actions{width:100%;justify-content:space-between}.post-revision-view-tabs{flex:1}.post-revision-tab-label{display:none}.post-revision-tab.active .post-revision-tab-label{display:inline}.post-revision-body{flex-direction:column}.post-revision-sidebar{width:100%;max-height:180px;border-right:none;border-bottom:1px solid var(--j13-border-light)}.post-revision-current{display:none}}.post-detail-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}.post-detail-actions{display:flex;flex-wrap:wrap;justify-content:center;gap:12px;margin-top:28px;padding-top:20px;border-top:1px solid var(--j13-border-light)}.post-detail-content{font-size:15px;line-height:1.75;word-break:break-word;color:var(--color-text-1)}.post-detail-content h1,.post-detail-content h2,.post-detail-content h3,.post-detail-content h4,.post-detail-content h5,.post-detail-content h6{font-weight:700;line-height:1.35;letter-spacing:-.02em;color:var(--color-text-1);margin:1.4em 0 .55em}.post-detail-content>:first-child,.post-detail-content h1:first-child,.post-detail-content h2:first-child,.post-detail-content h3:first-child,.post-detail-content h4:first-child,.post-detail-content h5:first-child,.post-detail-content h6:first-child{margin-top:0}.post-detail-content h1{font-size:1.85em}.post-detail-content h2{font-size:1.55em}.post-detail-content h3{font-size:1.3em}.post-detail-content h4{font-size:1.12em}.post-detail-content h5{font-size:1em}.post-detail-content h6{font-size:.92em;color:var(--color-text-2);font-weight:600}.post-detail-content ul,.post-detail-content ol{margin:0 0 12px;padding-left:1.6em}.post-detail-content ul{list-style-type:disc}.post-detail-content ol{list-style-type:decimal}.post-detail-content li{display:list-item;margin-bottom:4px}.post-detail-content li>ul,.post-detail-content li>ol{margin-top:4px;margin-bottom:0}.post-detail-content hr{margin:24px 0;border:none;border-top:1px solid var(--j13-border)}.post-detail-content members-only,.post-detail-content .post-members-only{display:block;margin:20px 0;border-radius:12px;overflow:hidden}.post-detail-content .post-members-only--visible{border:1px solid rgba(24,160,88,.35);background:linear-gradient(135deg,#18a0580f,#18a05805);box-shadow:inset 0 1px #fff9}.post-detail-content .post-members-only__badge{display:inline-flex;align-items:center;gap:6px;margin:12px 16px 0;padding:4px 10px;border-radius:20px;background:#18a0581f;color:var(--j13-green);font-size:12px;font-weight:600;letter-spacing:.02em}.post-detail-content .post-members-only__badge-icon{display:inline-flex;align-items:center;justify-content:center}.post-detail-content .post-members-only__body{padding:12px 18px 18px}.post-detail-content .post-members-only__body--empty{color:var(--color-text-4);font-style:italic}.post-detail-content .post-members-only--locked{position:relative;border:1px solid rgba(24,160,88,.22);background:var(--j13-bg-surface)}.post-detail-content .post-members-only__locked-wrap{position:relative;min-height:160px}.post-detail-content .post-members-only__badge--locked{position:relative;z-index:2;background:#18a0581a}.post-detail-content .post-members-only__preview{position:relative;z-index:0;padding:8px 20px 20px;filter:blur(5px);opacity:.45;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none}.post-detail-content .post-members-only__preview-line{height:11px;margin-bottom:12px;border-radius:6px;background:linear-gradient(90deg,var(--j13-bg-block-muted) 0%,var(--color-fill-3) 100%)}.post-detail-content .post-members-only__preview-line--medium{width:88%}.post-detail-content .post-members-only__preview-line--short{width:62%;margin-bottom:0}.post-detail-content .post-members-only__gate{position:absolute;top:0;right:0;bottom:0;left:0;z-index:3;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:24px 20px 20px;gap:6px;background:linear-gradient(180deg,#ffffff8c,#ffffffe0 38%,#ffffffeb);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}.post-detail-content .post-members-only__gate-icon{width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:var(--j13-bg-surface);color:var(--color-text-3);border:1px solid var(--j13-border);margin-bottom:4px;box-shadow:var(--j13-shadow-soft)}.post-detail-content .post-members-only__gate-title{margin:0;font-size:15px;font-weight:600;color:var(--color-text-1)}.post-detail-content .post-members-only__gate-desc{margin:0 0 8px;font-size:13px;color:var(--color-text-3);line-height:1.5;max-width:280px}.post-detail-content .post-members-only__gate-btn{padding:8px 20px;border:none;border-radius:8px;background:var(--j13-green);color:#fff;font-size:13px;font-weight:600;cursor:pointer;transition:background .15s,transform .1s}.post-detail-content .post-members-only__gate-btn:hover{background:var(--j13-green-hover);transform:translateY(-1px)}.post-detail-content .post-members-only__gate-alt{margin-top:4px;font-size:12px;color:var(--color-text-3)}.post-detail-content .post-members-only__gate-link{padding:0;border:none;background:none;color:var(--j13-green);font-size:12px;font-weight:600;cursor:pointer;text-decoration:underline;text-underline-offset:2px}.post-detail-content .post-members-only__gate-link:hover{color:var(--j13-green-hover)}.dark .post-detail-content .post-members-only--visible{border-color:#23c36b59;background:linear-gradient(135deg,#23c36b1a,#23c36b08);box-shadow:none}.dark .post-detail-content .post-members-only--locked{border-color:#23c36b40;background:var(--j13-bg-surface)}.dark .post-detail-content .post-members-only__gate{background:linear-gradient(180deg,#18181b80,#18181bd1 38%,#18181be6)}.dark .post-detail-content .post-members-only__preview-line{background:linear-gradient(90deg,var(--j13-bg-block-muted) 0%,rgba(255,255,255,.08) 100%)}.article-editor-tools-members{display:inline-flex;align-items:center;gap:6px;margin-left:4px}.article-editor-tools-sep{display:inline-block;width:1px;height:20px;background:var(--j13-border-light);flex-shrink:0}.article-editor-tools .article-tool-btn--members{color:var(--j13-green)}.article-editor-tools .article-tool-btn--members:hover,.article-editor-tools .article-tool-btn--members.active{background:var(--j13-green-bg);color:var(--j13-green-hover)}.post-members-only__exit-btn,.post-members-only__unwrap-btn{margin-left:4px;padding:2px 8px;border:none;border-radius:12px;background:#18a05829;color:var(--j13-green);font-size:11px;font-weight:500;cursor:pointer;display:inline-flex;align-items:center;gap:3px;transition:background .12s,color .12s}.post-members-only__unwrap-btn{background:transparent;color:var(--color-text-3)}.post-members-only__exit-btn:hover{background:#18a05847;color:var(--j13-green-hover)}.post-members-only__unwrap-btn:hover{background:var(--j13-bg-block-muted);color:var(--color-text-2)}.post-detail-content strong,.post-detail-content b{font-weight:700;color:var(--color-text-1)}.post-detail-content em,.post-detail-content i{font-style:italic}.post-detail-content img{max-width:100%;border-radius:6px}.post-detail-content p{margin:0 0 12px}.post-detail-content p:last-child{margin-bottom:0}.post-detail-content a{color:var(--j13-green)}.post-detail-content blockquote{margin:12px 0;padding:8px 14px;border-left:3px solid var(--j13-green);background:var(--j13-bg-block-muted);color:var(--color-text-3);border-radius:0 6px 6px 0}.post-detail-content pre,.post-detail-content code{font-family:ui-monospace,Cascadia Code,Consolas,monospace;font-size:13px}.post-detail-content pre{padding:12px;background:var(--j13-bg-block-muted);border-radius:6px;overflow-x:auto}.post-detail-content code{padding:2px 6px;background:var(--j13-bg-block-muted);border-radius:4px}.comment-section{display:flex;flex-direction:column;background:var(--j13-bg-surface);border:1px solid var(--j13-border-light);border-radius:12px;box-shadow:var(--j13-shadow-card);flex-shrink:0;overflow:hidden}.comment-section-bar{position:relative;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 20px 12px;font-size:15px;font-weight:600;flex-shrink:0;border-bottom:1px solid var(--j13-border-light)}.comment-section-bar:after{content:"";position:absolute;bottom:-1px;left:20px;width:36px;height:2px;background:var(--j13-green);border-radius:1px;transition:width .35s cubic-bezier(.4,0,.2,1)}.comment-section:hover .comment-section-bar:after{width:52px}.comment-section-title{color:var(--color-text-1)}.comment-section-count{font-size:13px;font-weight:400;color:var(--color-text-3)}.floor-jump-tools{display:flex;align-items:center;gap:4px}.comment-list-area{display:flex;flex-direction:column}.comment-empty{text-align:center;padding:48px 24px;color:var(--color-text-3)}.comment-empty-icon{font-size:32px;margin-bottom:8px;opacity:.6}.comment-empty p{margin:0;font-size:13px}.reply-bar{padding:12px 20px 16px;border-top:1px solid var(--j13-border-light);background:var(--j13-bg-block-muted);flex-shrink:0}.comment-box-wrap{padding:16px 20px;border-bottom:1px solid var(--j13-border-light);background:var(--j13-bg-surface);flex-shrink:0}.comment-box-wrap.inline{padding:12px 0 4px;border-bottom:none;background:transparent}.comment-box-wrap.inline .comment-box-avatar,.comment-box-wrap.inline .comment-box-avatar-img,.comment-box-wrap.inline .comment-box-avatar-placeholder{width:32px;height:32px;font-size:13px}.waline-comment-reply-btn.cancel{color:#e74c3c}.waline-comment-reply-btn.cancel:hover{color:#c0392b}.comment-box{display:flex;gap:12px;align-items:flex-start}.comment-box-avatar{flex-shrink:0}.comment-box-avatar-img,.comment-box-avatar-placeholder{width:40px;height:40px;border-radius:50%;-o-object-fit:cover;object-fit:cover}.comment-box-avatar-placeholder{display:flex;align-items:center;justify-content:center;background:var(--j13-green);color:#fff;font-size:16px;font-weight:600}.comment-box-avatar-placeholder.guest{background:var(--color-fill-3);color:var(--color-text-3)}.comment-box-main{flex:1;min-width:0}.comment-box-reply-hint{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--j13-green);margin-bottom:8px}.comment-box-reply-cancel{border:none;background:none;color:var(--color-text-3);cursor:pointer;font-size:12px;padding:0}.comment-box-reply-cancel:hover{color:var(--color-text-1)}.comment-box-input-wrap{position:relative;border:1px solid var(--j13-border-light);border-radius:10px;background:var(--j13-bg-block);transition:border-color .2s,background .2s}.comment-box-input-wrap:focus-within{border-color:rgb(var(--primary-6))}.comment-box-input-wrap.private-mode{background:var(--j13-bg-block-muted);border-color:var(--j13-border)}.comment-box-textarea{display:block;width:100%;min-height:72px;max-height:200px;padding:10px 48px 10px 12px;border:none;outline:none;resize:vertical;font-size:14px;line-height:1.6;font-family:inherit;color:var(--color-text-1);background:transparent;box-sizing:border-box}.comment-box-textarea::-moz-placeholder{color:var(--color-text-4)}.comment-box-textarea::placeholder{color:var(--color-text-4)}.comment-box-send{position:absolute;right:8px;bottom:8px;width:32px;height:32px;border:none;border-radius:50%;background:#27c;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;transition:background .15s,opacity .15s}.comment-box-send:hover:not(:disabled){background:#1a9bd8}.comment-box-send:disabled{opacity:.45;cursor:not-allowed}.comment-box-guest-fields{display:grid;grid-template-columns:repeat(3,1fr);gap:8px 10px;margin-top:8px}.comment-box-guest-field{display:flex;flex-direction:column;gap:4px;min-width:0}.comment-box-guest-label{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--color-text-3)}.comment-box-guest-required,.comment-box-guest-optional{font-style:normal;font-size:11px;line-height:1;padding:2px 6px;border-radius:4px}.comment-box-guest-required{color:rgb(var(--danger-6));background:color-mix(in srgb,rgb(var(--danger-6)) 12%,transparent)}.comment-box-guest-optional{color:var(--color-text-4);background:var(--color-fill-2)}.comment-box-guest-hint{grid-column:1 / -1;margin:0;font-size:12px;color:var(--color-text-4);line-height:1.5}.comment-box-guest-input{height:32px;padding:0 10px;border:1px solid var(--j13-border);border-radius:6px;font-size:13px;color:var(--color-text-1);background:var(--color-bg-1);outline:none;transition:border-color .2s}.comment-box-guest-input:focus{border-color:rgb(var(--primary-6))}.comment-box-guest-input::-moz-placeholder{color:var(--color-text-4)}.comment-box-guest-input::placeholder{color:var(--color-text-4)}.comment-box-toolbar{display:flex;align-items:center;gap:16px;margin-top:8px}.comment-box-owo{border:none;background:none;padding:2px 6px;font-size:13px;font-weight:600;color:var(--color-text-2);cursor:pointer;border-radius:4px;transition:background .15s,color .15s}.comment-box-owo:hover,.comment-box-owo.active{background:#27ccff1f;color:#27c}.comment-box-private{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--color-text-3);cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.emoji-picker{display:grid;grid-template-columns:repeat(12,1fr);gap:2px;margin-top:8px;padding:10px;border:1px solid #dcdfe6;border-radius:8px;background:var(--color-bg-1);max-height:200px;overflow-y:auto;box-shadow:0 2px 12px #00000014}.emoji-picker-item{border:none;background:none;font-size:20px;line-height:1;padding:4px;cursor:pointer;border-radius:4px;transition:background .1s}.emoji-picker-item:hover{background:var(--color-fill-2)}.waline-comment{display:flex;gap:12px;padding:16px 20px;border-bottom:1px solid var(--j13-border-light)}.waline-comment.nested{padding:12px 0 0;border-bottom:none}.waline-comment.highlight{animation:floor-highlight 2s ease-out}@keyframes floor-highlight{0%,30%{background:var(--j13-green-bg)}to{background:transparent}}.waline-replies{margin-top:8px}.waline-comment.nested .waline-comment-avatar{width:32px;height:32px;font-size:13px}.waline-comment-avatar{flex-shrink:0;width:40px;height:40px;border-radius:50%;overflow:hidden;background:var(--j13-green);color:#fff;font-size:16px;font-weight:600;display:flex;align-items:center;justify-content:center}.waline-comment-avatar img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.waline-comment-avatar.guest{background:var(--color-fill-3);color:var(--color-text-3)}.waline-comment-main{flex:1;min-width:0}.waline-comment-head{display:flex;align-items:center;gap:8px;margin-bottom:6px}.waline-comment-author{font-size:14px;font-weight:600;color:var(--color-text-1);text-decoration:none}a.waline-comment-author:hover{color:var(--j13-green)}.waline-comment-bubble{padding:10px 14px;background:var(--j13-bg-block-muted);border-radius:10px;font-size:14px;line-height:1.65;color:var(--color-text-1);word-break:break-word}.waline-reply-at{display:block;color:#27c;font-weight:600;margin-bottom:4px;line-height:1.5}.waline-comment-private-mask{padding:14px 16px;text-align:center;font-size:13px;color:#999;line-height:1.5;border-radius:8px;background:repeating-linear-gradient(-45deg,#f6f6f6,#f6f6f6 8px,#ececec 8px,#ececec 16px)}.waline-comment-bubble .floor-body{font-size:inherit;line-height:inherit;word-break:break-word}.floor-body{font-size:14px;line-height:1.65;word-break:break-word}.waline-comment-bubble .quote-block{margin:6px 0;background:var(--j13-bg-block)}.waline-comment-meta{display:flex;align-items:center;gap:16px;margin-top:8px;font-size:12px;color:var(--color-text-3)}.waline-comment-date{display:flex;align-items:center;gap:4px}.waline-comment-reply-btn{display:flex;align-items:center;gap:4px;border:none;background:none;padding:0;font-size:12px;color:var(--color-text-3);cursor:pointer;transition:color .15s}.waline-comment-reply-btn:hover{color:var(--j13-green)}@media (max-width: 768px){.comment-box-wrap{padding:12px 14px}.comment-box-guest-fields{grid-template-columns:1fr}.emoji-picker{grid-template-columns:repeat(8,1fr)}.waline-comment{padding:12px 14px}}.mention{color:var(--j13-green);font-weight:600}.quote-block{border-left:3px solid var(--j13-green);padding:8px 12px;margin:6px 0 8px;background:var(--j13-bg-block-muted);font-size:13px;color:var(--color-text-3);border-radius:0 8px 8px 0;line-height:1.5;white-space:pre-wrap;word-break:break-word}.quote-block.clickable{cursor:pointer;transition:background .15s,border-color .15s}.quote-block.clickable:hover{background:var(--j13-green-bg);border-left-color:var(--j13-green-hover)}@media (max-width: 768px){.post-detail-page{padding:12px 14px 20px;gap:12px}.post-detail-header{padding:12px 14px 16px}.post-detail-title{font-size:17px}.post-detail-actions{margin-top:20px;padding-top:16px;gap:10px}.comment-section-bar{padding:12px 14px 10px}.comment-section-bar:after{left:14px;width:32px}.comment-section:hover .comment-section-bar:after{width:46px}}.widget-card{background:transparent;border:none;border-radius:0;box-shadow:none;margin-bottom:0;overflow:hidden;border-bottom:1px solid var(--j13-border-light);flex-shrink:0}.widget-card-head{padding:12px 16px 8px;font-size:13px;font-weight:600;border-bottom:none;background:transparent;color:var(--color-text-2)}.widget-card-body{padding:0 16px 14px}.widget-card--about{flex:1;display:flex;flex-direction:column;border-bottom:none;min-height:72px}.widget-card--about .widget-card-body{flex:1;display:flex;align-items:center;justify-content:center;text-align:center;padding:20px 16px}.widget-about-text{margin:0;font-size:12px;color:var(--color-text-3);line-height:1.65}.widget-about-text strong{display:block;margin-bottom:4px;color:var(--j13-green);font-size:13px}.widget-item{padding:6px 0;font-size:13px;cursor:pointer;border-bottom:1px solid var(--j13-border-light);display:flex;align-items:center;gap:6px}.widget-item:last-child{border-bottom:none}.widget-item:hover{color:var(--j13-green)}.widget-online-list{display:flex;flex-wrap:wrap;gap:6px}.widget-online-avatar{width:28px;height:28px;border-radius:50%;background:var(--j13-green);color:#fff;font-size:12px;display:inline-flex;align-items:center;justify-content:center;overflow:hidden;flex-shrink:0}.widget-online-avatar img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.profile-header{display:flex;align-items:center;gap:16px;margin-bottom:24px}.profile-header-card{position:relative;display:flex;align-items:center;gap:20px;padding:24px;margin-bottom:16px;background:var(--j13-bg-block);border:1px solid var(--j13-border-light);border-radius:12px;box-shadow:var(--j13-shadow-soft);transition:border-color .2s,box-shadow .2s}.profile-header-card--dragover{border-color:color-mix(in srgb,var(--j13-green) 50%,var(--j13-border-light));box-shadow:0 0 0 3px color-mix(in srgb,var(--j13-green) 15%,transparent)}.profile-drop-overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;border-radius:12px;background:color-mix(in srgb,var(--j13-green) 12%,var(--j13-bg-block));color:var(--j13-green);font-size:14px;font-weight:500;pointer-events:none}.profile-avatar-btn{flex-shrink:0;padding:0;border:none;background:none;cursor:pointer;border-radius:50%;line-height:0}.profile-avatar-btn:disabled{cursor:not-allowed}.profile-avatar-lg{position:relative;width:88px;height:88px;border-radius:50%;background:var(--j13-green);color:#fff;font-size:32px;font-weight:600;display:flex;align-items:center;justify-content:center;overflow:hidden;transition:box-shadow .2s}.profile-avatar-lg--pending{box-shadow:0 0 0 3px color-mix(in srgb,var(--j13-green) 40%,transparent)}.profile-avatar-lg img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.profile-avatar-overlay{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:#00000073;color:#fff;opacity:0;transition:opacity .2s}.profile-avatar-btn:hover .profile-avatar-overlay,.profile-avatar-btn:focus-visible .profile-avatar-overlay{opacity:1}.profile-avatar-btn:disabled .profile-avatar-overlay{opacity:1}.profile-header-info{flex:1;min-width:0;display:flex;align-items:center;justify-content:space-between;gap:16px}.profile-header-main{min-width:0}.profile-display-name{margin:0 0 4px;font-size:20px;font-weight:600;line-height:1.3}.profile-username{font-size:13px;color:var(--color-text-3)}.profile-avatar-tip{margin:6px 0 0;font-size:12px;color:var(--color-text-3);line-height:1.4}.profile-avatar-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}.profile-avatar-hint{font-size:13px;color:var(--color-text-3);white-space:nowrap}.profile-form{display:flex;flex-direction:column;gap:16px}.profile-form-footer{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:4px}.profile-form-footer--end{justify-content:flex-end}.profile-form-hint{font-size:12px;color:var(--color-text-3);line-height:1.4}@media (max-width: 520px){.profile-header-card{flex-direction:column;text-align:center;padding:20px 16px}.profile-header-info{flex-direction:column;align-items:center}.profile-form-footer{flex-direction:column;align-items:stretch}.profile-form-hint{text-align:center}}.avatar-crop-dialog{max-width:420px;padding:20px}.avatar-crop-stage{position:relative;width:100%;height:280px;border-radius:8px;overflow:hidden;background:#111}.avatar-crop-loading{display:flex;align-items:center;justify-content:center;height:100%}.avatar-crop-zoom{display:flex;align-items:center;gap:12px;padding:4px 0}.avatar-crop-zoom-label{flex-shrink:0;font-size:13px;color:var(--color-text-3);width:32px}.avatar-crop-zoom input[type=range]{flex:1;height:4px;accent-color:var(--j13-green);cursor:pointer}.admin-entry-card{border-color:color-mix(in srgb,var(--j13-green) 25%,var(--j13-border));background:var(--j13-bg-block-accent)}.auth-page{height:100%;min-height:100dvh;overflow-y:auto;display:flex;align-items:center;justify-content:center;background:var(--j13-bg-page);padding:24px}.auth-box{width:100%;max-width:400px;background:var(--j13-bg-surface);border:1px solid var(--j13-border);border-radius:12px;box-shadow:var(--j13-shadow-card);padding:32px}.auth-box .logo-mark{width:48px;height:48px;border-radius:12px;background:var(--j13-green);color:#fff;font-size:22px;font-weight:700;display:flex;align-items:center;justify-content:center;margin:0 auto 16px}.auth-box h1{text-align:center;font-size:20px;margin:0 0 4px}.auth-box .subtitle{text-align:center;font-size:13px;color:var(--color-text-3);margin-bottom:24px}.app-body--compose,.content-workspace--compose{background:var(--j13-bg-workspace)}.main-content--compose{overflow-y:auto;overflow-x:hidden}.compose-page{flex:1;display:flex;flex-direction:column;min-height:min(100%,100vh - var(--j13-header-h));overflow:visible;background:radial-gradient(ellipse 80% 50% at 50% -10%,var(--j13-green-bg),transparent),var(--j13-bg-workspace)}.compose-page--empty{align-items:center;justify-content:center}.compose-empty-card{text-align:center;padding:48px 40px;background:var(--j13-bg-surface);border:1px solid var(--j13-border);border-radius:16px;box-shadow:var(--j13-shadow-card);max-width:400px}.compose-empty-icon{width:56px;height:56px;margin:0 auto 20px;border-radius:14px;background:var(--j13-green-bg);color:var(--j13-green);font-size:24px;display:flex;align-items:center;justify-content:center}.compose-empty-card h2{margin:0 0 8px;font-size:18px;font-weight:600}.compose-empty-card p{margin:0 0 24px;font-size:14px;color:var(--color-text-3);line-height:1.5}.compose-primary-btn,.compose-ghost-btn{padding:10px 24px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:background .15s,transform .1s}.compose-primary-btn{background:var(--j13-green);color:#fff}.compose-primary-btn:hover{background:var(--j13-green-hover)}.compose-ghost-btn{background:var(--j13-bg-block-muted);color:var(--color-text-2)}.compose-canvas{flex:1;display:flex;flex-direction:column;min-height:min(100%,100vh - var(--j13-header-h));max-width:1200px;width:100%;margin:0 auto;padding:0 32px 32px}.compose-header{display:flex;align-items:center;justify-content:space-between;padding:16px 0 12px;flex-shrink:0}.compose-back{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border:1px solid var(--j13-border);border-radius:8px;background:var(--j13-bg-surface);color:var(--color-text-2);font-size:13px;cursor:pointer;transition:border-color .15s,color .15s,box-shadow .15s;box-shadow:var(--j13-shadow-soft)}.compose-back:hover{border-color:var(--j13-green);color:var(--j13-green)}.compose-publish-btn{display:inline-flex;align-items:center;gap:8px;padding:10px 22px;border:none;border-radius:8px;background:linear-gradient(135deg,var(--j13-green),var(--j13-green-hover));color:#fff;font-size:14px;font-weight:600;cursor:pointer;box-shadow:0 2px 8px #18a0584d;transition:transform .1s,box-shadow .15s,opacity .15s}.compose-publish-btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 14px #18a05859}.compose-publish-btn:disabled{opacity:.65;cursor:not-allowed}.compose-meta{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-bottom:20px;flex-shrink:0;flex-wrap:wrap}.compose-board-pills{display:flex;flex-wrap:wrap;gap:8px}.compose-board-pill{padding:6px 14px;border:1px solid var(--j13-border);border-radius:20px;background:var(--j13-bg-surface);color:var(--color-text-2);font-size:13px;cursor:pointer;transition:all .15s}.compose-board-pill:hover{border-color:var(--j13-green);color:var(--j13-green)}.compose-board-pill.active{background:var(--j13-green);border-color:var(--j13-green);color:#fff;font-weight:500}.compose-tags-field{display:flex;align-items:center;gap:8px;padding:6px 14px;border:1px solid var(--j13-border);border-radius:20px;background:var(--j13-bg-surface);min-width:220px;transition:border-color .15s}.compose-tags-field:focus-within{border-color:var(--j13-green)}.compose-tags-icon{color:var(--color-text-4);font-size:14px;flex-shrink:0}.compose-tags-field input{flex:1;border:none;background:transparent;outline:none;font-size:13px;color:var(--color-text-1);min-width:0}.compose-tags-field input::-moz-placeholder{color:var(--color-text-4)}.compose-tags-field input::placeholder{color:var(--color-text-4)}.compose-writing{flex:1;display:flex;flex-direction:column;background:var(--j13-bg-surface);border:1px solid var(--j13-border);border-radius:16px;box-shadow:var(--j13-shadow-card);padding:28px 32px 0;overflow:visible}.compose-title{width:100%;padding:0;border:none;background:transparent;font-size:32px;font-weight:700;line-height:1.3;letter-spacing:-.02em;color:var(--color-text-1);outline:none}.compose-title::-moz-placeholder{color:var(--color-text-4)}.compose-title::placeholder{color:var(--color-text-4)}.compose-subtitle{margin-top:8px;font-size:13px;color:var(--color-text-3)}.compose-subtitle strong{color:var(--j13-green);font-weight:500}.article-editor{flex:1;display:flex;flex-direction:column;margin-top:24px;border-top:1px solid var(--j13-border-light)}.article-editor-bar{position:sticky;top:0;z-index:30;display:flex;align-items:center;gap:12px;margin:0 -32px;padding:10px 32px;flex-shrink:0;flex-wrap:wrap;background:var(--j13-bg-surface);border-bottom:1px solid var(--j13-border-light);box-shadow:0 4px 12px #0f172a0a}.ui-tooltip{position:relative;display:inline-flex}.ui-tooltip-bubble{position:absolute;z-index:50;pointer-events:none;opacity:0;visibility:hidden;width:-moz-max-content;width:max-content;background:var(--j13-bg-surface);border:1px solid var(--j13-border);border-radius:8px;box-shadow:var(--j13-shadow-card);transition:opacity .1s ease,transform .1s ease,visibility .1s}.ui-tooltip-bubble--compact{padding:5px 10px}.ui-tooltip-bubble--rich{min-width:148px;max-width:220px;padding:7px 12px}.ui-tooltip-bubble__title{display:block;font-size:12px;font-weight:500;line-height:1.4;color:var(--color-text-1)}.ui-tooltip-bubble--compact .ui-tooltip-bubble__title{white-space:nowrap}.ui-tooltip-bubble__hint{display:block;margin-top:3px;font-size:11px;line-height:1.45;color:var(--color-text-3)}.ui-tooltip-bubble--bottom{top:calc(100% + 8px)}.ui-tooltip-bubble--top{bottom:calc(100% + 8px)}.ui-tooltip-bubble--center.ui-tooltip-bubble--bottom{left:50%;transform:translate(-50%) translateY(-2px)}.ui-tooltip-bubble--center.ui-tooltip-bubble--top{left:50%;transform:translate(-50%) translateY(2px)}.ui-tooltip-bubble--start.ui-tooltip-bubble--bottom,.ui-tooltip-bubble--start.ui-tooltip-bubble--top{left:0;transform:translateY(-2px)}.ui-tooltip-bubble--end.ui-tooltip-bubble--bottom,.ui-tooltip-bubble--end.ui-tooltip-bubble--top{right:0;left:auto;transform:translateY(-2px)}.ui-tooltip:hover .ui-tooltip-bubble,.ui-tooltip:focus-within .ui-tooltip-bubble{opacity:1;visibility:visible}.ui-tooltip:hover .ui-tooltip-bubble--center.ui-tooltip-bubble--bottom,.ui-tooltip:focus-within .ui-tooltip-bubble--center.ui-tooltip-bubble--bottom{transform:translate(-50%) translateY(0)}.ui-tooltip:hover .ui-tooltip-bubble--center.ui-tooltip-bubble--top,.ui-tooltip:focus-within .ui-tooltip-bubble--center.ui-tooltip-bubble--top{transform:translate(-50%) translateY(0)}.ui-tooltip:hover .ui-tooltip-bubble--start.ui-tooltip-bubble--bottom,.ui-tooltip:hover .ui-tooltip-bubble--start.ui-tooltip-bubble--top,.ui-tooltip:hover .ui-tooltip-bubble--end.ui-tooltip-bubble--bottom,.ui-tooltip:hover .ui-tooltip-bubble--end.ui-tooltip-bubble--top,.ui-tooltip:focus-within .ui-tooltip-bubble--start.ui-tooltip-bubble--bottom,.ui-tooltip:focus-within .ui-tooltip-bubble--start.ui-tooltip-bubble--top,.ui-tooltip:focus-within .ui-tooltip-bubble--end.ui-tooltip-bubble--bottom,.ui-tooltip:focus-within .ui-tooltip-bubble--end.ui-tooltip-bubble--top{transform:translateY(0)}.article-editor-tools{display:flex;align-items:center;gap:2px;flex-wrap:wrap}.article-tool-btn{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:6px;background:transparent;color:var(--color-text-2);font-size:13px;cursor:pointer;transition:background .12s,color .12s}.article-tool-btn:hover{background:var(--j13-bg-block-muted);color:var(--j13-green)}.article-tool-btn.active{background:#18a0581f;color:var(--j13-green)}.article-tool-btn strong{font-size:12px;font-weight:700}.article-editor-body{flex:1;display:flex;flex-direction:column;min-height:280px}.article-editor-pane{display:flex;flex:1;min-height:280px;border:1px solid var(--j13-border);border-radius:10px;overflow:hidden;background:var(--j13-bg-block);box-shadow:inset 0 1px #ffffffa6}.article-editor-pane--source{min-height:320px}.article-editor-scroll ::-moz-selection,.article-editor-markdown-input::-moz-selection{background:color-mix(in srgb,var(--j13-green) 24%,#d6e8f0);color:inherit}.article-editor-scroll ::selection,.article-editor-markdown-input::selection{background:color-mix(in srgb,var(--j13-green) 24%,#d6e8f0);color:inherit}.article-prosemirror ::-moz-selection{background:color-mix(in srgb,var(--j13-green) 24%,#d6e8f0);color:inherit}.article-prosemirror ::selection{background:color-mix(in srgb,var(--j13-green) 24%,#d6e8f0);color:inherit}.article-prosemirror .ProseMirror-selectednode{outline:2px solid color-mix(in srgb,var(--j13-green) 45%,transparent);outline-offset:2px}.dark .article-editor-scroll ::-moz-selection,.dark .article-editor-markdown-input::-moz-selection,.dark .article-prosemirror ::-moz-selection{background:color-mix(in srgb,var(--j13-green) 35%,#2a3f50);color:inherit}.dark .article-editor-scroll ::selection,.dark .article-editor-markdown-input::selection,.dark .article-prosemirror ::selection{background:color-mix(in srgb,var(--j13-green) 35%,#2a3f50);color:inherit}.article-editor-scroll{flex:1;min-width:0;overflow:auto;background:var(--j13-bg-block)}.article-editor-content{flex:1;display:flex;flex-direction:column}.article-editor-content .tiptap,.article-prosemirror{flex:1;min-height:280px;padding:14px 20px 20px;outline:none}.article-prosemirror p.is-editor-empty:first-child:before{color:var(--color-text-4);content:attr(data-placeholder);float:left;height:0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.article-prosemirror p.is-editor-empty::-moz-selection,.article-prosemirror p.is-editor-empty *::-moz-selection{background:transparent}.article-prosemirror p.is-editor-empty::selection,.article-prosemirror p.is-editor-empty *::selection{background:transparent}.article-prosemirror.ProseMirror-focused p.is-editor-empty::-moz-selection{background:transparent}.article-prosemirror.ProseMirror-focused p.is-editor-empty::selection{background:transparent}.article-prosemirror a{color:var(--j13-green);text-decoration:underline;text-underline-offset:2px}.article-prosemirror img{max-width:100%;height:auto;border-radius:8px;margin:12px 0}.editor-members-only.post-members-only--visible{border:1px solid rgba(24,160,88,.45);background:linear-gradient(135deg,#18a05814,#18a05805);border-radius:12px;overflow:hidden;box-shadow:inset 0 1px #ffffff8c}.editor-members-only .post-members-only__badge{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin:0;padding:10px 14px;border-bottom:1px dashed rgba(24,160,88,.28);border-radius:0;background:#18a0581a;width:100%}.editor-members-only .post-members-only__body{padding:14px 18px 18px;min-height:96px;background:#ffffff73}.dark .editor-members-only .post-members-only__body{background:#0000001f}.post-members-only__shortcut-hint{margin-left:auto;font-size:11px;font-weight:400;color:var(--color-text-3)}.editor-members-only{margin:20px 0}.editor-members-only--selected{box-shadow:0 0 0 2px #18a05859}.article-editor-status{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0 16px;border-top:1px solid var(--j13-border-light);font-size:12px;color:var(--color-text-4);flex-shrink:0}.article-editor-status-meta{display:flex;align-items:center;flex-wrap:wrap;gap:6px;min-width:0}.article-editor-status-sep{color:var(--color-text-4);opacity:.6}.article-editor-status-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}.article-editor-view-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--j13-border-light);border-radius:8px;background:var(--j13-bg-block);color:var(--color-text-2);font-size:12px;font-weight:500;cursor:pointer;transition:background .12s,border-color .12s,color .12s;flex-shrink:0}.article-editor-view-btn:hover{border-color:var(--j13-green);color:var(--j13-green);background:#18a0580f}.article-editor-view-btn.active{border-color:#18a05873;color:var(--j13-green);background:#18a0581a}.article-editor--fullscreen{position:fixed;top:0;right:0;bottom:0;left:0;z-index:120;margin:0!important;padding:0 32px 24px;background:var(--j13-bg-surface);border-top:none}.article-editor--fullscreen .article-editor-bar{margin:0;padding:12px 0}.article-editor--fullscreen.article-editor--rich .article-editor-bar{width:100%;max-width:var(--j13-article-read-w);margin:0 auto}.article-editor--fullscreen .article-editor-body{min-height:0;flex:1}.article-editor--fullscreen.article-editor--rich .article-editor-body{overflow-y:auto;padding:20px 0 0;background:var(--j13-bg-workspace)}.article-editor--fullscreen.article-editor--rich .article-editor-pane{width:100%;max-width:var(--j13-article-read-w);margin:0 auto;min-height:calc(100vh - 176px)}.article-editor--fullscreen .article-editor-scroll,.article-editor--fullscreen .article-editor-content .tiptap,.article-editor--fullscreen .article-prosemirror{min-height:calc(100vh - 220px)}.article-editor--fullscreen .article-editor-markdown{min-height:calc(100vh - 176px)}.article-editor--fullscreen .article-editor-markdown-input,.article-editor--fullscreen .article-editor-markdown-preview,.article-editor--fullscreen .article-editor-pane--source{min-height:calc(100vh - 220px)}.article-editor-tools--markdown{display:flex;align-items:center;gap:8px}.article-editor-tools--markdown-hint{font-size:12px;color:var(--color-text-3)}.article-link-dialog__footer{gap:8px}.article-editor-markdown{flex:1;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px;min-height:320px}.article-editor-markdown-input{display:block;width:100%;min-height:100%;padding:14px 16px 20px;border:none;outline:none;resize:none;font-family:ui-monospace,Cascadia Code,Consolas,monospace;font-size:13px;line-height:1.65;color:var(--color-text-1);background:transparent}.article-editor-markdown-preview{display:flex;flex-direction:column;min-height:320px;background:var(--j13-bg-surface);border:1px solid var(--j13-border);border-radius:10px;overflow:hidden}.article-editor-markdown-preview-label{padding:8px 16px;border-bottom:1px solid var(--j13-border-light);font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--color-text-4);flex-shrink:0}.article-editor-markdown-preview-body{flex:1;padding:14px 16px;overflow-y:auto}@media (max-width: 768px){.compose-canvas{padding:0 16px}.compose-writing{padding:20px 16px 0;border-radius:12px}.article-editor--fullscreen{padding:0 16px 16px}.article-editor--fullscreen .article-editor-bar{margin:0;padding:10px 0}.article-editor-markdown{grid-template-columns:1fr;grid-template-rows:minmax(240px,1fr) minmax(240px,1fr)}.article-editor-pane--source{min-height:240px}.article-editor--fullscreen.article-editor--rich .article-editor-pane{max-width:none;margin:0}.article-editor-bar{margin:0 -16px;padding:10px 16px}.article-editor-status{flex-wrap:wrap;align-items:flex-start}.article-editor-status-actions{width:100%;justify-content:flex-end}.compose-title{font-size:24px}.compose-meta{flex-direction:column;align-items:stretch}.compose-tags-field{min-width:0}.compose-header{padding-top:12px}.compose-publish-btn span{display:none}}.page-loader{display:flex;flex:1;align-items:center;justify-content:center;gap:8px;min-height:240px;color:var(--j13-green);font-size:14px}.page-loader__dot{width:8px;height:8px;border-radius:50%;background:currentColor;animation:page-loader-pulse .9s ease-in-out infinite}@keyframes page-loader-pulse{0%,to{opacity:.35;transform:scale(.85)}50%{opacity:1;transform:scale(1)}}.admin-shell{min-height:100vh;background:hsl(var(--background))}.admin-topbar{display:flex;align-items:center;justify-content:space-between;height:56px;padding:0 20px;border-bottom:1px solid var(--j13-border);background:hsl(var(--card))}.admin-topbar-brand{display:flex;align-items:center;gap:10px}.admin-topbar-mark{width:32px;height:32px;border-radius:8px;background:var(--j13-green);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700}.admin-topbar-title{font-size:14px;font-weight:600;line-height:1.2}.admin-topbar-sub{font-size:12px;color:hsl(var(--muted-foreground))}.admin-topbar-actions{display:flex;align-items:center;gap:12px}.admin-topbar-user{font-size:13px;color:hsl(var(--muted-foreground))}.admin-link-btn{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--j13-green);background:none;border:none;cursor:pointer}.admin-body{display:flex;height:calc(100vh - 56px);overflow:hidden}.admin-sidebar{width:200px;flex-shrink:0;padding:16px 10px;border-right:1px solid var(--j13-border);background:hsl(var(--card));overflow-y:auto}.admin-nav-item{display:flex;align-items:center;gap:8px;width:100%;padding:9px 12px;margin-bottom:2px;border-radius:8px;font-size:13px;color:hsl(var(--muted-foreground));text-decoration:none;transition:background .15s,color .15s}.admin-nav-item:hover{background:var(--j13-green-bg);color:var(--j13-green)}.admin-nav-item.active{background:var(--j13-green-bg);color:var(--j13-green);font-weight:600}.admin-main{flex:1;min-width:0;min-height:0;padding:24px;overflow-y:auto}.admin-page-head{margin-bottom:20px}.admin-page-head h1{font-size:22px;font-weight:700;margin-bottom:4px}.admin-page-head p{font-size:13px;color:hsl(var(--muted-foreground))}.admin-stat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px;margin-bottom:20px}.admin-stat-card{padding:16px;border-radius:10px;border:1px solid var(--j13-border);background:hsl(var(--card))}.admin-stat-value{font-size:24px;font-weight:700;color:var(--j13-green)}.admin-stat-label{font-size:12px;color:hsl(var(--muted-foreground));margin-top:4px}.admin-card{border:1px solid var(--j13-border);border-radius:10px;background:hsl(var(--card));margin-bottom:16px}.admin-card-body{padding:16px 20px 20px}.admin-card-head{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--j13-border);font-weight:600;font-size:14px}.admin-card-desc{padding:12px 16px 0;font-size:13px;color:hsl(var(--muted-foreground));line-height:1.5}.admin-card .admin-card-desc+button{margin:12px 16px 16px}.admin-form-row{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:12px 16px 16px;font-size:13px}.admin-form-row label{color:hsl(var(--muted-foreground));white-space:nowrap}.admin-settings-page{max-width:880px;padding-bottom:24px}.admin-settings-tabs{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:20px;padding-bottom:0;border-bottom:1px solid var(--j13-border)}.admin-settings-tab{display:inline-flex;align-items:center;gap:6px;padding:10px 14px;margin-bottom:-1px;border:none;border-bottom:2px solid transparent;background:none;font-size:13px;font-weight:500;color:hsl(var(--muted-foreground));cursor:pointer;transition:color .15s,border-color .15s}.admin-settings-tab:hover{color:hsl(var(--foreground))}.admin-settings-tab.active{color:var(--j13-green);border-bottom-color:var(--j13-green)}.admin-settings-panel{display:flex;flex-direction:column;gap:0}.admin-settings-card{margin-bottom:0}.admin-settings-card-badge{font-size:12px;font-weight:500;color:hsl(var(--muted-foreground));padding:2px 8px;border-radius:999px;background:hsl(var(--muted) / .45)}.admin-settings-sections{display:flex;flex-direction:column;gap:20px}.admin-settings-section-head h3{font-size:13px;font-weight:600;margin-bottom:2px}.admin-settings-section-head p{font-size:12px;color:hsl(var(--muted-foreground));line-height:1.45;margin-bottom:10px}.admin-settings-table{border:1px solid var(--j13-border);border-radius:8px;overflow:hidden;background:hsl(var(--background))}.admin-settings-row{display:grid;grid-template-columns:140px 140px 1fr;align-items:center;gap:8px 16px;padding:10px 14px;border-bottom:1px solid var(--j13-border);font-size:13px}.admin-settings-row:last-child{border-bottom:none}.admin-settings-row-label{color:hsl(var(--foreground));font-weight:500}.admin-settings-row-input{display:flex;align-items:center;gap:8px}.admin-settings-input{width:88px;height:32px;padding-top:0;padding-bottom:0}.admin-settings-unit{font-size:12px;color:hsl(var(--muted-foreground));white-space:nowrap}.admin-settings-row-hint{font-size:12px;color:hsl(var(--muted-foreground))}.admin-settings-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;padding:14px 16px;border:1px solid var(--j13-border);border-radius:10px;background:hsl(var(--card))}.admin-settings-bar p{margin:0;font-size:12px;color:hsl(var(--muted-foreground));line-height:1.45;max-width:420px}.admin-settings-filter-body{display:flex;flex-direction:column;gap:12px}.admin-settings-filter-tip{margin:0;font-size:12px;color:hsl(var(--muted-foreground));line-height:1.5}.admin-settings-filter-tip code,.admin-settings-backup-name code{font-size:11px;background:hsl(var(--muted));padding:1px 5px;border-radius:4px}.admin-settings-filter-textarea{min-height:320px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;line-height:1.55;resize:vertical}.admin-settings-info{display:flex;flex-direction:column;gap:0}.admin-settings-info-row{display:grid;grid-template-columns:88px 1fr;gap:12px 16px;padding:10px 0;border-bottom:1px solid var(--j13-border);font-size:13px}.admin-settings-info-row:last-child{border-bottom:none;padding-bottom:0}.admin-settings-info-row:first-child{padding-top:0}.admin-settings-info-row dt{color:hsl(var(--muted-foreground))}.admin-settings-info-row dd{margin:0;word-break:break-all}.admin-settings-info-row dd code{font-size:12px;background:hsl(var(--muted));padding:2px 6px;border-radius:4px}.admin-settings-backup-body{display:flex;flex-direction:column;align-items:flex-start;gap:10px}.admin-settings-backup-body>p{margin:0;font-size:13px;color:hsl(var(--muted-foreground));line-height:1.5}.admin-settings-backup-name{font-size:12px!important}@media (max-width: 640px){.admin-settings-row{grid-template-columns:1fr;gap:6px;padding:12px 14px}.admin-settings-row-hint{padding-left:0}.admin-settings-bar{flex-direction:column;align-items:stretch}.admin-settings-bar p{max-width:none}.admin-settings-info-row{grid-template-columns:1fr;gap:4px}}.admin-table{width:100%;border-collapse:collapse;font-size:13px}.admin-table th,.admin-table td{padding:10px 14px;text-align:left;border-bottom:1px solid var(--j13-border)}.admin-table th{font-weight:600;color:hsl(var(--muted-foreground));background:hsl(var(--muted) / .3)}.admin-table tr:last-child td{border-bottom:none}.admin-empty{padding:32px;text-align:center;color:hsl(var(--muted-foreground));font-size:13px}.admin-text-link{background:none;border:none;padding:0;color:var(--j13-green);cursor:pointer;font-size:inherit}.admin-text-link:hover{text-decoration:underline}.admin-search-bar{display:flex;gap:8px;margin-bottom:16px;max-width:480px}.admin-pagination{display:flex;align-items:center;justify-content:center;gap:12px;padding:12px;border-top:1px solid var(--j13-border);font-size:13px}.admin-dl{padding:16px;display:grid;grid-template-columns:120px 1fr;gap:10px 16px;font-size:13px}.admin-dl dt{color:hsl(var(--muted-foreground))}.admin-dl dd code{font-size:12px;background:hsl(var(--muted));padding:2px 6px;border-radius:4px}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color: hsl(var(--background))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:bg-\[var\(--j13-green\)\][data-state=checked]{background-color:var(--j13-green)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.dark\:bg-orange-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(67 20 7 / var(--tw-bg-opacity, 1))}.dark\:text-orange-300:is(.dark *){--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}@media (min-width: 640px){.sm\:mt-0{margin-top:0}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>svg\]\:size-4>svg{width:1rem;height:1rem}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0px}.\[\&_tr\]\:border-b tr{border-bottom-width:1px} diff --git a/embed_static/static/spa/assets/index-BsZMEGDY.css b/embed_static/static/spa/assets/index-BsZMEGDY.css deleted file mode 100644 index 3a9525c..0000000 --- a/embed_static/static/spa/assets/index-BsZMEGDY.css +++ /dev/null @@ -1 +0,0 @@ -*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--j13-font-family);font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 210 20% 98%;--foreground: 222 47% 11%;--card: 0 0% 100%;--card-foreground: 222 47% 11%;--popover: 0 0% 100%;--popover-foreground: 222 47% 11%;--primary: 152 72% 36%;--primary-foreground: 0 0% 100%;--secondary: 210 20% 96%;--secondary-foreground: 222 47% 11%;--muted: 210 20% 96%;--muted-foreground: 215 16% 47%;--accent: 152 45% 95%;--accent-foreground: 152 72% 28%;--destructive: 0 84% 60%;--destructive-foreground: 0 0% 100%;--border: 214 20% 91%;--input: 214 20% 91%;--ring: 152 72% 36%;--radius: .375rem;--color-text-1: hsl(var(--foreground));--color-text-2: hsl(215 16% 35%);--color-text-3: hsl(var(--muted-foreground));--color-text-4: hsl(215 12% 65%);--color-fill-3: hsl(210 20% 94%)}.dark{--background: 240 6% 10%;--foreground: 0 0% 95%;--card: 240 5% 13%;--card-foreground: 0 0% 95%;--popover: 240 5% 13%;--popover-foreground: 0 0% 95%;--primary: 152 58% 46%;--primary-foreground: 0 0% 100%;--secondary: 240 4% 16%;--secondary-foreground: 0 0% 95%;--muted: 240 4% 16%;--muted-foreground: 240 5% 65%;--accent: 152 30% 14%;--accent-foreground: 152 58% 55%;--destructive: 0 63% 45%;--destructive-foreground: 0 0% 95%;--border: 240 4% 18%;--input: 240 4% 18%;--ring: 152 58% 46%;--color-text-1: hsl(var(--foreground));--color-text-2: hsl(240 5% 75%);--color-text-3: hsl(var(--muted-foreground));--color-text-4: hsl(240 5% 50%);--color-fill-3: hsl(240 4% 20%)}.\!container{width:100%!important}.container{width:100%}@media (min-width: 640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width: 768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width: 1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width: 1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width: 1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.left-2{left:.5rem}.left-\[50\%\]{left:50%}.right-4{right:1rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-50{z-index:50}.z-\[110\]{z-index:110}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-auto{margin-left:auto}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.block{display:block}.\!inline{display:inline!important}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-2{height:.5rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-px{height:1px}.min-h-\[60px\]{min-height:60px}.w-2{width:.5rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-40{width:10rem}.w-5{width:1.25rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[160px\]{width:160px}.w-\[60px\]{width:60px}.w-\[70px\]{width:70px}.w-\[80px\]{width:80px}.w-full{width:100%}.min-w-\[8rem\]{min-width:8rem}.max-w-\[120px\]{max-width:120px}.max-w-\[200px\]{max-width:200px}.max-w-lg{max-width:32rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.rounded-full{border-radius:9999px}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-input{border-color:hsl(var(--input))}.border-transparent{border-color:transparent}.bg-\[var\(--j13-green-bg\)\]{background-color:var(--j13-green-bg)}.bg-background{background-color:hsl(var(--background))}.bg-black\/80{background-color:#000c}.bg-destructive{background-color:hsl(var(--destructive))}.bg-muted{background-color:hsl(var(--muted))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-secondary{background-color:hsl(var(--secondary))}.fill-current{fill:currentColor}.p-1{padding:.25rem}.p-3{padding:.75rem}.p-6{padding:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.text-left{text-align:left}.text-center{text-align:center}.align-middle{vertical-align:middle}.font-sans{font-family:var(--j13-font-family)}.text-\[0\.8rem\]{font-size:.8rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.italic{font-style:italic}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.tracking-widest{letter-spacing:.1em}.text-\[var\(--j13-green\)\]{color:var(--j13-green)}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-orange-700{--tw-text-opacity: 1;color:rgb(194 65 12 / var(--tw-text-opacity, 1))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.duration-200{animation-duration:.2s}:root{--j13-font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans SC", "WenQuanYi Micro Hei", system-ui, -apple-system, "Segoe UI", sans-serif;--j13-green: #18a058;--j13-green-hover: #138f4c;--j13-green-bg: rgba(24, 160, 88, .08);--j13-green-soft: #edfbf3;--j13-border: #e8edf2;--j13-border-light: #f0f3f7;--j13-sidebar-w: 210px;--j13-aside-w: 280px;--j13-header-h: 56px;--j13-max-w: 1400px;--j13-article-read-w: 820px;--j13-bg-page: #f5f7fa;--j13-bg-workspace: #f8fafc;--j13-bg-surface: #ffffff;--j13-bg-block: #ffffff;--j13-bg-block-muted: #f1f4f8;--j13-bg-block-accent: #f0faf5;--j13-shadow-soft: 0 1px 2px rgba(15, 23, 42, .04);--j13-shadow-card: 0 2px 8px rgba(15, 23, 42, .05)}.dark{--j13-green: #23c36b;--j13-green-hover: #1fb35f;--j13-green-bg: rgba(35, 195, 107, .12);--j13-green-soft: rgba(35, 195, 107, .08);--j13-border: #2e2e32;--j13-border-light: #262629;--j13-bg-page: #141416;--j13-bg-workspace: #18181b;--j13-bg-surface: #1f1f23;--j13-bg-block: #232328;--j13-bg-block-muted: #1c1c20;--j13-bg-block-accent: rgba(35, 195, 107, .06);--j13-shadow-soft: 0 1px 2px rgba(0, 0, 0, .2);--j13-shadow-card: 0 2px 8px rgba(0, 0, 0, .28)}*{box-sizing:border-box}html{scrollbar-gutter:stable;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto;font-family:var(--j13-font-family);text-rendering:optimizeLegibility}html,body,#root{height:100%;margin:0}body{font-family:var(--j13-font-family);font-size:14px;line-height:1.5;color:var(--color-text-1);background:var(--j13-bg-page);overflow:hidden}a{color:var(--j13-green);text-decoration:none}a:hover{text-decoration:underline}.app-shell{height:100%;max-height:100dvh;display:flex;flex-direction:column;overflow:hidden;background:var(--j13-bg-page)}.app-frame{flex:1;min-height:0;height:100%;max-width:var(--j13-max-w);width:100%;margin:0 auto;display:flex;flex-direction:column;overflow:hidden;border-left:1px solid var(--j13-border);border-right:1px solid var(--j13-border);background:var(--j13-bg-surface)}.app-header{height:var(--j13-header-h);flex-shrink:0;z-index:100;background:var(--j13-bg-surface);border-bottom:1px solid var(--j13-border)}.header-inner{height:100%;width:100%;padding:0 20px;display:flex;align-items:center;gap:20px}.header-brand{display:flex;align-items:center;gap:10px;flex-shrink:0;border:none;background:none;padding:4px 0;cursor:pointer;color:inherit;font:inherit}.header-brand:hover .header-logo-text{color:var(--j13-green)}.header-logo-mark{width:34px;height:34px;border-radius:10px;background:linear-gradient(135deg,var(--j13-green) 0%,#34c471 100%);color:#fff;font-weight:700;font-size:17px;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px #1a7f4b47}.header-logo-text{font-size:15px;font-weight:600;letter-spacing:.02em;transition:color .15s}.header-search-wrap{flex:1;min-width:0;max-width:420px;display:flex;align-items:center;gap:8px;height:36px;padding:0 14px;border-radius:999px;background:var(--j13-bg-block-muted);border:1px solid var(--j13-border-light);transition:border-color .2s,background .2s,box-shadow .2s}.header-search-wrap:focus-within{background:var(--j13-bg-surface);border-color:color-mix(in srgb,var(--j13-green) 30%,transparent);box-shadow:0 0 0 3px var(--j13-green-bg)}.header-search-icon{flex-shrink:0;font-size:15px;color:var(--color-text-3)}.header-search-input{flex:1;min-width:0;border:none;outline:none;background:transparent;font-size:14px;color:var(--color-text-1);font-family:inherit}.header-search-input::-moz-placeholder{color:var(--color-text-4)}.header-search-input::placeholder{color:var(--color-text-4)}.header-search-input::-webkit-search-cancel-button{display:none}.header-search-clear{flex-shrink:0;width:20px;height:20px;border:none;border-radius:50%;background:var(--color-fill-3);color:var(--color-text-3);font-size:14px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;transition:background .15s,color .15s}.header-search-clear:hover{background:var(--color-fill-4);color:var(--color-text-1)}.header-actions{display:flex;align-items:center;gap:10px;flex-shrink:0;margin-left:auto}.header-compose-btn{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 16px;border:none;border-radius:999px;background:var(--j13-green);color:#fff;font-size:13px;font-weight:500;font-family:inherit;cursor:pointer;transition:background .15s,transform .1s,box-shadow .15s;box-shadow:0 2px 6px #1a7f4b38}.header-compose-btn:hover{background:var(--j13-green-hover);box-shadow:0 3px 10px #1a7f4b4d}.header-compose-btn:active{transform:scale(.97)}.header-action-group{display:flex;align-items:center;gap:4px;padding:3px;border-radius:999px;background:var(--j13-bg-block-muted);border:1px solid var(--j13-border-light)}.header-icon-btn{width:32px;height:32px;border:none;border-radius:50%;background:transparent;color:var(--color-text-2);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .15s,color .15s}.header-icon-btn:hover{background:var(--color-fill-3);color:var(--color-text-1)}.header-user-btn{width:32px;height:32px;border:none;border-radius:50%;padding:0;cursor:pointer;overflow:hidden;background:var(--j13-green);display:flex;align-items:center;justify-content:center;transition:box-shadow .15s,transform .1s}.header-user-btn:hover,.header-user-btn:focus-visible{box-shadow:0 0 0 2px var(--j13-green-bg),0 0 0 3px var(--j13-green)}.header-user-btn:focus{outline:none}.header-user-avatar{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.header-user-initial{color:#fff;font-size:14px;font-weight:600}.header-login-btn{height:32px;padding:0 14px;border:none;border-radius:999px;background:transparent;color:var(--j13-green);font-size:13px;font-weight:500;font-family:inherit;cursor:pointer;transition:background .15s}.header-login-btn:hover{background:var(--j13-green-bg)}.header-auth-slot{display:inline-block;width:32px;height:32px;border-radius:50%;flex-shrink:0}.header-auth-slot--loading{background:var(--color-fill-3)}.app-body{flex:1;display:flex;min-height:0;width:100%;overflow:hidden;background:var(--j13-bg-surface)}.sidebar{width:var(--j13-sidebar-w);flex-shrink:0;border-right:1px solid var(--j13-border-light);background:var(--j13-bg-surface);overflow-y:auto;padding:12px 0}.sidebar-section{padding:4px 12px 8px;font-size:11px;font-weight:600;color:var(--color-text-3)}.sidebar-nav{display:flex;flex-direction:column;gap:2px;padding:0 8px}.sidebar-nav-item{display:flex;align-items:center;gap:8px;width:100%;margin:0;padding:0 12px;height:36px;border:none;border-radius:6px;background:transparent;color:var(--color-text-1);font-size:14px;cursor:pointer;text-align:left;transition:background .15s,color .15s}.sidebar-nav-item:hover{background:var(--j13-bg-block-muted)}.sidebar-nav-item.active{background:var(--j13-green-bg);color:var(--j13-green);font-weight:600}.sidebar-nav-item svg{width:16px;height:16px;flex-shrink:0}.sidebar-nav-item__meta{margin-left:auto;color:var(--color-text-4);font-size:12px}.sidebar-actions{padding:12px;border-top:1px solid var(--j13-border);margin-top:8px}.main-content{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden}.content-workspace{flex:1;display:flex;min-width:0;min-height:0;overflow:hidden;background:var(--j13-bg-surface)}.aside-panel{width:var(--j13-aside-w);flex-shrink:0;border-left:1px solid var(--j13-border-light);overflow-y:auto;padding:0;display:flex;flex-direction:column;background:var(--j13-bg-surface)}@media (max-width: 1100px){.aside-panel{display:none}}@media (max-width: 768px){.app-frame{border-left:none;border-right:none}.sidebar{display:none}.header-inner{padding:0 12px;gap:10px}.header-search-wrap{max-width:none}.header-compose-btn{width:34px;padding:0;justify-content:center}.feed-banner-row{flex-direction:row;gap:10px}.board-grid{flex-wrap:nowrap;overflow-x:auto;padding:8px 12px;scrollbar-width:none}.board-grid::-webkit-scrollbar{display:none}}.page-wrap{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;display:flex;flex-direction:column;scrollbar-width:none;-ms-overflow-style:none}.page-wrap::-webkit-scrollbar{display:none}.virtual-list-wrap,.post-list-scroll{flex:1;overflow:auto;min-height:0;scrollbar-width:none;-ms-overflow-style:none}.virtual-list-wrap::-webkit-scrollbar,.post-list-scroll::-webkit-scrollbar{display:none}.page-inner{padding:20px 24px;max-width:720px}.page-inner-wide{padding:20px 24px}.page-title{font-size:20px;font-weight:600;margin:0 0 4px}.page-desc{font-size:13px;color:var(--color-text-3);margin:0 0 20px}.content-surface{background:var(--j13-bg-block);border:1px solid var(--j13-border-light);border-radius:12px;box-shadow:var(--j13-shadow-soft);overflow:hidden}.section-card{background:var(--j13-bg-block);border:1px solid var(--j13-border-light);border-radius:12px;box-shadow:var(--j13-shadow-soft);padding:20px;margin-bottom:16px}.section-card-title{font-size:15px;font-weight:600;margin:0 0 16px;padding-bottom:12px;border-bottom:1px solid var(--j13-border-light)}.feed-top{flex-shrink:0;border-bottom:1px solid var(--j13-border-light);background:var(--j13-bg-block)}@media (min-width: 900px){.feed-top:not(:has(.feed-head--solo)){display:flex;align-items:center;gap:16px;padding:6px 16px}.feed-top:not(:has(.feed-head--solo)) .feed-head{padding:0;flex-shrink:0}.feed-top:not(:has(.feed-head--solo)) .feed-toolbar{padding:0;flex:1;min-width:0}}.feed-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 16px 6px}.feed-head--solo{padding-bottom:8px}.feed-head__title{display:flex;align-items:baseline;gap:10px;min-width:0;flex:1}.feed-head h2{margin:0;font-size:15px;font-weight:600;white-space:nowrap}.feed-head__meta{font-size:12px;color:var(--color-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.feed-head__meta strong{color:var(--j13-green);font-weight:600}.feed-head__dot{margin:0 4px;opacity:.55}.feed-head__clear{flex-shrink:0;border:none;background:transparent;padding:0;font-size:12px;color:var(--j13-green);cursor:pointer;font-family:inherit}.feed-head__clear:hover{text-decoration:underline}.feed-toolbar{display:flex;align-items:center;gap:10px;padding:0 16px 8px}.feed-toolbar__count{flex-shrink:0;font-size:12px;color:var(--color-text-3);white-space:nowrap}.feed-banner{padding:8px 16px;border-bottom:1px solid var(--j13-border-light)}.feed-banner-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.feed-banner-title{flex:1;min-width:0}.feed-banner h2{margin:0;font-size:15px;font-weight:600}.feed-banner p{margin:0;font-size:12px;color:var(--color-text-3);line-height:1.45}.feed-stats{display:flex;flex-wrap:wrap;gap:8px 12px;margin-top:6px;font-size:12px;color:var(--color-text-3)}.feed-stats strong{color:var(--j13-green);font-weight:600}.feed-action-slot{display:inline-block;width:88px;height:28px;border-radius:4px;background:var(--color-fill-3)}.feed-actions{min-height:28px}.mobile-board-bar{display:none;padding:8px 12px;gap:8px;overflow-x:auto;border-bottom:1px solid var(--j13-border);background:var(--j13-bg-surface)}@media (max-width: 768px){.mobile-board-bar{display:flex}}.board-chip{flex-shrink:0;padding:4px 12px;border-radius:16px;font-size:13px;border:1px solid var(--j13-border-light);background:var(--j13-bg-block);cursor:pointer}.board-chip.active{background:var(--j13-green-bg);border-color:transparent;color:var(--j13-green);font-weight:600}.board-grid{display:flex;flex-wrap:wrap;gap:8px;padding:10px 20px;border-bottom:1px solid var(--j13-border-light)}.feed-sort-bar{display:flex;align-items:center;gap:2px;flex:1;min-width:0;overflow-x:auto;scrollbar-width:none}.feed-sort-bar::-webkit-scrollbar{display:none}.feed-sort-tab{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border:none;border-radius:6px;background:transparent;color:var(--color-text-2);font-family:inherit;font-size:12px;cursor:pointer;flex-shrink:0;white-space:nowrap;transition:background .15s,color .15s}.feed-sort-tab:hover{background:var(--j13-bg-block-muted);color:var(--color-text-1)}.feed-sort-tab.active{background:var(--j13-green-bg);color:var(--j13-green);font-weight:600}.feed-sort-tab svg{width:14px;height:14px;flex-shrink:0}@media (max-width: 768px){.feed-head{flex-wrap:wrap;padding:8px 12px 6px}.feed-head__meta{display:none}.feed-toolbar{padding:0 12px 8px}}.board-grid-empty{padding:20px;border-bottom:1px solid var(--j13-border-light)}.board-tab{display:flex;align-items:center;gap:6px;height:36px;max-width:220px;padding:0 14px;border:1px solid var(--j13-border-light);border-radius:8px;background:var(--j13-bg-block);cursor:pointer;transition:border-color .15s,background .15s;font-family:inherit;color:inherit;flex-shrink:0}.board-tab:hover{border-color:var(--j13-green-light, #7cb87c);background:var(--j13-bg-block-muted)}.board-tab.active{border-color:var(--j13-green);background:color-mix(in srgb,var(--j13-green) 10%,var(--j13-bg-block))}.board-tab-icon{font-size:14px;color:var(--j13-green);line-height:1;flex-shrink:0}.board-tab-name{font-size:13px;font-weight:500;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.board-tab-count{flex-shrink:0;min-width:18px;padding:0 6px;height:20px;line-height:20px;font-size:11px;text-align:center;border-radius:10px;background:var(--color-fill-2);color:var(--color-text-3)}.board-tab.active .board-tab-count{background:color-mix(in srgb,var(--j13-green) 20%,transparent);color:var(--j13-green)}.board-tab--skeleton{width:140px;border-color:transparent;background:linear-gradient(90deg,var(--color-fill-2) 25%,var(--color-fill-3) 50%,var(--color-fill-2) 75%);background-size:200% 100%;animation:board-skeleton-shimmer 1.2s ease-in-out infinite;pointer-events:none}.board-grid--skeleton{pointer-events:none}@keyframes board-skeleton-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.post-list-bar{display:flex;justify-content:space-between;padding:10px 20px;font-size:13px;color:var(--color-text-3);border-bottom:1px solid var(--j13-border-light)}.post-row{display:flex;align-items:flex-start;gap:12px;padding:12px 20px;border-bottom:1px solid var(--j13-border-light);cursor:pointer;transition:background .15s}.post-row:hover{background:var(--j13-bg-block-muted)}.post-avatar{width:36px;height:36px;border-radius:50%;background:var(--j13-green);color:#fff;font-size:14px;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden}.post-avatar img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.post-body{flex:1;min-width:0}.post-title{font-size:14px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-bottom:4px}.post-pinned-icon{display:inline-block;vertical-align:-.15em;flex-shrink:0;color:#e53935;stroke-width:1.5}.post-meta{font-size:12px;color:var(--color-text-3);display:flex;flex-wrap:wrap;gap:8px}.post-stats{display:flex;gap:12px;font-size:12px;color:var(--color-text-3);flex-shrink:0;padding-top:4px}.empty-state{text-align:center;padding:60px 24px;color:var(--color-text-3)}.empty-feed{text-align:center;padding:48px 24px;color:var(--color-text-3)}.empty-feed-icon{font-size:36px;margin-bottom:8px}.post-detail-loading{display:flex;align-items:center;justify-content:center;padding:60px;flex:1}.post-detail-page{display:flex;flex-direction:column;min-height:0;gap:16px;padding:16px 20px 24px;background:var(--j13-bg-workspace)}.post-detail-header{padding:16px 20px 20px;background:var(--j13-bg-surface);border:1px solid var(--j13-border-light);border-radius:12px;box-shadow:var(--j13-shadow-card);flex-shrink:0}.post-detail-nav{display:flex;align-items:center;gap:8px;margin-bottom:8px}.post-detail-board-tag{margin:0!important}.post-detail-head{margin-bottom:12px}.post-detail-title{font-size:20px;font-weight:600;margin:0 0 12px;line-height:1.45;word-break:break-word}.post-detail-author-row{display:flex;align-items:center;gap:10px}.post-avatar-lg{width:40px;height:40px;font-size:16px}.post-detail-author-info{display:flex;flex-direction:column;gap:2px}.post-detail-author-name{font-size:14px;font-weight:600;color:var(--color-text-1)}.post-detail-meta-line{font-size:12px;color:var(--color-text-3);display:flex;flex-wrap:wrap;align-items:center;gap:4px}.post-detail-locked-tag{display:inline-flex;align-items:center;gap:3px;margin-left:6px;color:hsl(var(--destructive));font-size:11px}.post-detail-edit-hint{font-size:12px;color:var(--color-text-3);align-self:center}.post-revision-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;background:#00000080;display:flex;align-items:center;justify-content:center;padding:16px}.post-revision-overlay--fullscreen{padding:0}.post-revision-panel{background:hsl(var(--background));border-radius:12px;width:min(1080px,100%);height:min(88vh,900px);display:flex;flex-direction:column;box-shadow:0 12px 48px #00000038;overflow:hidden}.post-revision-panel--fullscreen{width:100%;height:100%;max-height:none;border-radius:0}.post-revision-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px;border-bottom:1px solid var(--j13-border-light);flex-shrink:0}.post-revision-head-left{display:flex;align-items:center;gap:8px;min-width:0}.post-revision-head-left h3{font-size:15px;font-weight:600;margin:0}.post-revision-head-sub{font-size:12px;color:var(--color-text-3);padding-left:8px;border-left:1px solid var(--j13-border-light)}.post-revision-head-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.post-revision-view-tabs{display:flex;gap:2px;background:hsl(var(--muted));border-radius:8px;padding:3px}.post-revision-tab{display:inline-flex;align-items:center;gap:4px;padding:5px 10px;border:none;background:none;border-radius:6px;font-size:12px;color:var(--color-text-2);cursor:pointer;white-space:nowrap}.post-revision-tab:hover{color:var(--color-text-1)}.post-revision-tab.active{background:hsl(var(--background));color:var(--color-text-1);font-weight:500;box-shadow:0 1px 3px #00000014}.post-revision-icon-btn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:none;border-radius:8px;cursor:pointer;color:var(--color-text-3)}.post-revision-icon-btn:hover{background:hsl(var(--muted));color:var(--color-text-1)}.post-revision-loading,.post-revision-empty{flex:1;display:flex;align-items:center;justify-content:center;padding:48px 24px;color:var(--color-text-3);font-size:14px}.post-revision-body{display:flex;flex:1;min-height:0;overflow:hidden}.post-revision-sidebar{width:260px;flex-shrink:0;display:flex;flex-direction:column;border-right:1px solid var(--j13-border-light);min-height:0}.post-revision-sidebar-label{padding:10px 14px 6px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-3)}.post-revision-list{list-style:none;margin:0;padding:4px 8px;overflow-y:auto;flex:1;min-height:0}.post-revision-item{display:flex;flex-direction:column;gap:4px;width:100%;text-align:left;padding:10px 12px;border:none;background:none;border-radius:8px;cursor:pointer;font-size:13px;margin-bottom:2px}.post-revision-item:hover,.post-revision-item.active{background:hsl(var(--muted))}.post-revision-item-head{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.post-revision-item-num{font-size:11px;font-weight:600;color:var(--color-text-3)}.post-revision-item-title{font-weight:500;color:var(--color-text-1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.post-revision-item-meta{font-size:11px;color:var(--color-text-3)}.post-revision-badge{font-size:10px;padding:1px 6px;border-radius:4px;background:hsl(var(--primary) / .12);color:hsl(var(--primary));font-weight:500}.post-revision-badge--none{background:hsl(var(--muted));color:var(--color-text-3)}.post-revision-current{padding:12px 14px;border-top:1px solid var(--j13-border-light);background:hsl(var(--muted) / .4);flex-shrink:0}.post-revision-current-label{display:block;font-size:11px;color:var(--color-text-3);margin-bottom:4px}.post-revision-current-title{font-size:13px;font-weight:500;color:var(--color-text-1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.post-revision-main{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0}.post-revision-main-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 20px;border-bottom:1px solid var(--j13-border-light);flex-shrink:0}.post-revision-main-editor{font-size:14px;font-weight:600;color:var(--color-text-1);margin-right:8px}.post-revision-main-time{font-size:12px;color:var(--color-text-3)}.post-revision-scroll{flex:1;overflow-y:auto;overflow-x:hidden;min-height:0;padding:16px 20px 24px;-webkit-overflow-scrolling:touch}.revision-diff-view{display:flex;flex-direction:column;gap:20px}.revision-diff-section h4{font-size:12px;font-weight:600;color:var(--color-text-3);text-transform:uppercase;letter-spacing:.04em;margin:0 0 8px}.revision-diff-block{padding:12px 14px;background:hsl(var(--muted) / .35);border-radius:8px;font-size:14px;line-height:1.6;word-break:break-word}.revision-diff-inline del{background:#fbe9e9;color:#8f2424;text-decoration:line-through;border-radius:2px;padding:0 2px}.revision-diff-inline ins{background:#e2f8ea;color:#246b3c;text-decoration:none;border-radius:2px;padding:0 2px}.revision-diff-unchanged{color:var(--color-text-3);font-size:13px}.revision-diff-stats{display:flex;gap:8px;margin-bottom:8px}.revision-diff-stat{font-size:11px;padding:2px 8px;border-radius:4px;font-weight:500}.revision-diff-stat--add{background:#e2f8ea;color:#246b3c}.revision-diff-stat--del{background:#fbe9e9;color:#8f2424}.revision-diff-pre{margin:0;font-family:ui-monospace,Cascadia Code,Source Code Pro,Menlo,monospace;font-size:13px;line-height:1.55;border:1px solid var(--j13-border-light);border-radius:8px;overflow:hidden}.revision-diff-line{display:flex;padding:1px 0;white-space:pre-wrap;word-break:break-word}.revision-diff-line--add{background:#ebfaf0}.revision-diff-line--del{background:#fceeee}.revision-diff-line--same{background:hsl(var(--background))}.revision-diff-gutter{flex-shrink:0;width:24px;text-align:center;color:var(--color-text-3);-webkit-user-select:none;-moz-user-select:none;user-select:none;font-size:12px}.revision-diff-line--add .revision-diff-gutter{color:#395}.revision-diff-line--del .revision-diff-gutter{color:#b82e2e}.revision-diff-text{flex:1;padding-right:12px}.revision-diff-line--add .revision-diff-text{color:#1f5130}.revision-diff-line--del .revision-diff-text{color:#722;text-decoration:line-through}.revision-full-view h4{font-size:18px;font-weight:600;margin:0 0 8px;line-height:1.4}.revision-full-tags{font-size:13px;color:var(--color-text-3);margin:0 0 16px}@media (max-width: 768px){.post-revision-overlay:not(.post-revision-overlay--fullscreen){padding:0;align-items:stretch}.post-revision-panel:not(.post-revision-panel--fullscreen){width:100%;height:100%;border-radius:0}.post-revision-head{flex-wrap:wrap}.post-revision-head-actions{width:100%;justify-content:space-between}.post-revision-view-tabs{flex:1}.post-revision-tab-label{display:none}.post-revision-tab.active .post-revision-tab-label{display:inline}.post-revision-body{flex-direction:column}.post-revision-sidebar{width:100%;max-height:180px;border-right:none;border-bottom:1px solid var(--j13-border-light)}.post-revision-current{display:none}}.post-detail-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}.post-detail-actions{display:flex;flex-wrap:wrap;justify-content:center;gap:12px;margin-top:28px;padding-top:20px;border-top:1px solid var(--j13-border-light)}.post-detail-content{font-size:15px;line-height:1.75;word-break:break-word;color:var(--color-text-1)}.post-detail-content h1,.post-detail-content h2,.post-detail-content h3,.post-detail-content h4,.post-detail-content h5,.post-detail-content h6{font-weight:700;line-height:1.35;letter-spacing:-.02em;color:var(--color-text-1);margin:1.4em 0 .55em}.post-detail-content>:first-child,.post-detail-content h1:first-child,.post-detail-content h2:first-child,.post-detail-content h3:first-child,.post-detail-content h4:first-child,.post-detail-content h5:first-child,.post-detail-content h6:first-child{margin-top:0}.post-detail-content h1{font-size:1.85em}.post-detail-content h2{font-size:1.55em}.post-detail-content h3{font-size:1.3em}.post-detail-content h4{font-size:1.12em}.post-detail-content h5{font-size:1em}.post-detail-content h6{font-size:.92em;color:var(--color-text-2);font-weight:600}.post-detail-content ul,.post-detail-content ol{margin:0 0 12px;padding-left:1.6em}.post-detail-content ul{list-style-type:disc}.post-detail-content ol{list-style-type:decimal}.post-detail-content li{display:list-item;margin-bottom:4px}.post-detail-content li>ul,.post-detail-content li>ol{margin-top:4px;margin-bottom:0}.post-detail-content hr{margin:24px 0;border:none;border-top:1px solid var(--j13-border)}.post-detail-content members-only,.post-detail-content .post-members-only{display:block;margin:20px 0;border-radius:12px;overflow:hidden}.post-detail-content .post-members-only--visible{border:1px solid rgba(24,160,88,.35);background:linear-gradient(135deg,#18a0580f,#18a05805);box-shadow:inset 0 1px #fff9}.post-detail-content .post-members-only__badge{display:inline-flex;align-items:center;gap:6px;margin:12px 16px 0;padding:4px 10px;border-radius:20px;background:#18a0581f;color:var(--j13-green);font-size:12px;font-weight:600;letter-spacing:.02em}.post-detail-content .post-members-only__badge-icon{display:inline-flex;align-items:center;justify-content:center}.post-detail-content .post-members-only__body{padding:12px 18px 18px}.post-detail-content .post-members-only__body--empty{color:var(--color-text-4);font-style:italic}.post-detail-content .post-members-only--locked{position:relative;border:1px solid rgba(24,160,88,.22);background:var(--j13-bg-surface)}.post-detail-content .post-members-only__locked-wrap{position:relative;min-height:160px}.post-detail-content .post-members-only__badge--locked{position:relative;z-index:2;background:#18a0581a}.post-detail-content .post-members-only__preview{position:relative;z-index:0;padding:8px 20px 20px;filter:blur(5px);opacity:.45;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none}.post-detail-content .post-members-only__preview-line{height:11px;margin-bottom:12px;border-radius:6px;background:linear-gradient(90deg,var(--j13-bg-block-muted) 0%,var(--color-fill-3) 100%)}.post-detail-content .post-members-only__preview-line--medium{width:88%}.post-detail-content .post-members-only__preview-line--short{width:62%;margin-bottom:0}.post-detail-content .post-members-only__gate{position:absolute;top:0;right:0;bottom:0;left:0;z-index:3;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:24px 20px 20px;gap:6px;background:linear-gradient(180deg,#ffffff8c,#ffffffe0 38%,#ffffffeb);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}.post-detail-content .post-members-only__gate-icon{width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:var(--j13-bg-surface);color:var(--color-text-3);border:1px solid var(--j13-border);margin-bottom:4px;box-shadow:var(--j13-shadow-soft)}.post-detail-content .post-members-only__gate-title{margin:0;font-size:15px;font-weight:600;color:var(--color-text-1)}.post-detail-content .post-members-only__gate-desc{margin:0 0 8px;font-size:13px;color:var(--color-text-3);line-height:1.5;max-width:280px}.post-detail-content .post-members-only__gate-btn{padding:8px 20px;border:none;border-radius:8px;background:var(--j13-green);color:#fff;font-size:13px;font-weight:600;cursor:pointer;transition:background .15s,transform .1s}.post-detail-content .post-members-only__gate-btn:hover{background:var(--j13-green-hover);transform:translateY(-1px)}.post-detail-content .post-members-only__gate-alt{margin-top:4px;font-size:12px;color:var(--color-text-3)}.post-detail-content .post-members-only__gate-link{padding:0;border:none;background:none;color:var(--j13-green);font-size:12px;font-weight:600;cursor:pointer;text-decoration:underline;text-underline-offset:2px}.post-detail-content .post-members-only__gate-link:hover{color:var(--j13-green-hover)}.dark .post-detail-content .post-members-only--visible{border-color:#23c36b59;background:linear-gradient(135deg,#23c36b1a,#23c36b08);box-shadow:none}.dark .post-detail-content .post-members-only--locked{border-color:#23c36b40;background:var(--j13-bg-surface)}.dark .post-detail-content .post-members-only__gate{background:linear-gradient(180deg,#18181b80,#18181bd1 38%,#18181be6)}.dark .post-detail-content .post-members-only__preview-line{background:linear-gradient(90deg,var(--j13-bg-block-muted) 0%,rgba(255,255,255,.08) 100%)}.article-editor-tools-members{display:inline-flex;align-items:center;gap:6px;margin-left:4px}.article-editor-tools-sep{display:inline-block;width:1px;height:20px;background:var(--j13-border-light);flex-shrink:0}.article-editor-tools .article-tool-btn--members{color:var(--j13-green)}.article-editor-tools .article-tool-btn--members:hover,.article-editor-tools .article-tool-btn--members.active{background:var(--j13-green-bg);color:var(--j13-green-hover)}.post-members-only__exit-btn,.post-members-only__unwrap-btn{margin-left:4px;padding:2px 8px;border:none;border-radius:12px;background:#18a05829;color:var(--j13-green);font-size:11px;font-weight:500;cursor:pointer;display:inline-flex;align-items:center;gap:3px;transition:background .12s,color .12s}.post-members-only__unwrap-btn{background:transparent;color:var(--color-text-3)}.post-members-only__exit-btn:hover{background:#18a05847;color:var(--j13-green-hover)}.post-members-only__unwrap-btn:hover{background:var(--j13-bg-block-muted);color:var(--color-text-2)}.post-detail-content strong,.post-detail-content b{font-weight:700;color:var(--color-text-1)}.post-detail-content em,.post-detail-content i{font-style:italic}.post-detail-content img{max-width:100%;border-radius:6px}.post-detail-content p{margin:0 0 12px}.post-detail-content p:last-child{margin-bottom:0}.post-detail-content a{color:var(--j13-green)}.post-detail-content blockquote{margin:12px 0;padding:8px 14px;border-left:3px solid var(--j13-green);background:var(--j13-bg-block-muted);color:var(--color-text-3);border-radius:0 6px 6px 0}.post-detail-content pre,.post-detail-content code{font-family:ui-monospace,Cascadia Code,Consolas,monospace;font-size:13px}.post-detail-content pre{padding:12px;background:var(--j13-bg-block-muted);border-radius:6px;overflow-x:auto}.post-detail-content code{padding:2px 6px;background:var(--j13-bg-block-muted);border-radius:4px}.comment-section{display:flex;flex-direction:column;background:var(--j13-bg-surface);border:1px solid var(--j13-border-light);border-radius:12px;box-shadow:var(--j13-shadow-card);flex-shrink:0;overflow:hidden}.comment-section-bar{position:relative;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 20px 12px;font-size:15px;font-weight:600;flex-shrink:0;border-bottom:1px solid var(--j13-border-light)}.comment-section-bar:after{content:"";position:absolute;bottom:-1px;left:20px;width:36px;height:2px;background:var(--j13-green);border-radius:1px;transition:width .35s cubic-bezier(.4,0,.2,1)}.comment-section:hover .comment-section-bar:after{width:52px}.comment-section-title{color:var(--color-text-1)}.comment-section-count{font-size:13px;font-weight:400;color:var(--color-text-3)}.floor-jump-tools{display:flex;align-items:center;gap:4px}.comment-list-area{display:flex;flex-direction:column}.comment-empty{text-align:center;padding:48px 24px;color:var(--color-text-3)}.comment-empty-icon{font-size:32px;margin-bottom:8px;opacity:.6}.comment-empty p{margin:0;font-size:13px}.reply-bar{padding:12px 20px 16px;border-top:1px solid var(--j13-border-light);background:var(--j13-bg-block-muted);flex-shrink:0}.comment-box-wrap{padding:16px 20px;border-bottom:1px solid var(--j13-border-light);background:var(--j13-bg-surface);flex-shrink:0}.comment-box-wrap.inline{padding:12px 0 4px;border-bottom:none;background:transparent}.comment-box-wrap.inline .comment-box-avatar,.comment-box-wrap.inline .comment-box-avatar-img,.comment-box-wrap.inline .comment-box-avatar-placeholder{width:32px;height:32px;font-size:13px}.waline-comment-reply-btn.cancel{color:#e74c3c}.waline-comment-reply-btn.cancel:hover{color:#c0392b}.comment-box{display:flex;gap:12px;align-items:flex-start}.comment-box-avatar{flex-shrink:0}.comment-box-avatar-img,.comment-box-avatar-placeholder{width:40px;height:40px;border-radius:50%;-o-object-fit:cover;object-fit:cover}.comment-box-avatar-placeholder{display:flex;align-items:center;justify-content:center;background:var(--j13-green);color:#fff;font-size:16px;font-weight:600}.comment-box-avatar-placeholder.guest{background:var(--color-fill-3);color:var(--color-text-3)}.comment-box-main{flex:1;min-width:0}.comment-box-reply-hint{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--j13-green);margin-bottom:8px}.comment-box-reply-cancel{border:none;background:none;color:var(--color-text-3);cursor:pointer;font-size:12px;padding:0}.comment-box-reply-cancel:hover{color:var(--color-text-1)}.comment-box-input-wrap{position:relative;border:1px solid var(--j13-border-light);border-radius:10px;background:var(--j13-bg-block);transition:border-color .2s,background .2s}.comment-box-input-wrap:focus-within{border-color:rgb(var(--primary-6))}.comment-box-input-wrap.private-mode{background:var(--j13-bg-block-muted);border-color:var(--j13-border)}.comment-box-textarea{display:block;width:100%;min-height:72px;max-height:200px;padding:10px 48px 10px 12px;border:none;outline:none;resize:vertical;font-size:14px;line-height:1.6;font-family:inherit;color:var(--color-text-1);background:transparent;box-sizing:border-box}.comment-box-textarea::-moz-placeholder{color:var(--color-text-4)}.comment-box-textarea::placeholder{color:var(--color-text-4)}.comment-box-send{position:absolute;right:8px;bottom:8px;width:32px;height:32px;border:none;border-radius:50%;background:#27c;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;transition:background .15s,opacity .15s}.comment-box-send:hover:not(:disabled){background:#1a9bd8}.comment-box-send:disabled{opacity:.45;cursor:not-allowed}.comment-box-guest-fields{display:grid;grid-template-columns:repeat(3,1fr);gap:8px 10px;margin-top:8px}.comment-box-guest-field{display:flex;flex-direction:column;gap:4px;min-width:0}.comment-box-guest-label{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--color-text-3)}.comment-box-guest-required,.comment-box-guest-optional{font-style:normal;font-size:11px;line-height:1;padding:2px 6px;border-radius:4px}.comment-box-guest-required{color:rgb(var(--danger-6));background:color-mix(in srgb,rgb(var(--danger-6)) 12%,transparent)}.comment-box-guest-optional{color:var(--color-text-4);background:var(--color-fill-2)}.comment-box-guest-hint{grid-column:1 / -1;margin:0;font-size:12px;color:var(--color-text-4);line-height:1.5}.comment-box-guest-input{height:32px;padding:0 10px;border:1px solid var(--j13-border);border-radius:6px;font-size:13px;color:var(--color-text-1);background:var(--color-bg-1);outline:none;transition:border-color .2s}.comment-box-guest-input:focus{border-color:rgb(var(--primary-6))}.comment-box-guest-input::-moz-placeholder{color:var(--color-text-4)}.comment-box-guest-input::placeholder{color:var(--color-text-4)}.comment-box-toolbar{display:flex;align-items:center;gap:16px;margin-top:8px}.comment-box-owo{border:none;background:none;padding:2px 6px;font-size:13px;font-weight:600;color:var(--color-text-2);cursor:pointer;border-radius:4px;transition:background .15s,color .15s}.comment-box-owo:hover,.comment-box-owo.active{background:#27ccff1f;color:#27c}.comment-box-private{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--color-text-3);cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.emoji-picker{display:grid;grid-template-columns:repeat(12,1fr);gap:2px;margin-top:8px;padding:10px;border:1px solid #dcdfe6;border-radius:8px;background:var(--color-bg-1);max-height:200px;overflow-y:auto;box-shadow:0 2px 12px #00000014}.emoji-picker-item{border:none;background:none;font-size:20px;line-height:1;padding:4px;cursor:pointer;border-radius:4px;transition:background .1s}.emoji-picker-item:hover{background:var(--color-fill-2)}.waline-comment{display:flex;gap:12px;padding:16px 20px;border-bottom:1px solid var(--j13-border-light)}.waline-comment.nested{padding:12px 0 0;border-bottom:none}.waline-comment.highlight{animation:floor-highlight 2s ease-out}@keyframes floor-highlight{0%,30%{background:var(--j13-green-bg)}to{background:transparent}}.waline-replies{margin-top:8px}.waline-comment.nested .waline-comment-avatar{width:32px;height:32px;font-size:13px}.waline-comment-avatar{flex-shrink:0;width:40px;height:40px;border-radius:50%;overflow:hidden;background:var(--j13-green);color:#fff;font-size:16px;font-weight:600;display:flex;align-items:center;justify-content:center}.waline-comment-avatar img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.waline-comment-avatar.guest{background:var(--color-fill-3);color:var(--color-text-3)}.waline-comment-main{flex:1;min-width:0}.waline-comment-head{display:flex;align-items:center;gap:8px;margin-bottom:6px}.waline-comment-author{font-size:14px;font-weight:600;color:var(--color-text-1);text-decoration:none}a.waline-comment-author:hover{color:var(--j13-green)}.waline-comment-bubble{padding:10px 14px;background:var(--j13-bg-block-muted);border-radius:10px;font-size:14px;line-height:1.65;color:var(--color-text-1);word-break:break-word}.waline-reply-at{display:block;color:#27c;font-weight:600;margin-bottom:4px;line-height:1.5}.waline-comment-private-mask{padding:14px 16px;text-align:center;font-size:13px;color:#999;line-height:1.5;border-radius:8px;background:repeating-linear-gradient(-45deg,#f6f6f6,#f6f6f6 8px,#ececec 8px,#ececec 16px)}.waline-comment-bubble .floor-body{font-size:inherit;line-height:inherit;word-break:break-word}.floor-body{font-size:14px;line-height:1.65;word-break:break-word}.waline-comment-bubble .quote-block{margin:6px 0;background:var(--j13-bg-block)}.waline-comment-meta{display:flex;align-items:center;gap:16px;margin-top:8px;font-size:12px;color:var(--color-text-3)}.waline-comment-date{display:flex;align-items:center;gap:4px}.waline-comment-reply-btn{display:flex;align-items:center;gap:4px;border:none;background:none;padding:0;font-size:12px;color:var(--color-text-3);cursor:pointer;transition:color .15s}.waline-comment-reply-btn:hover{color:var(--j13-green)}@media (max-width: 768px){.comment-box-wrap{padding:12px 14px}.comment-box-guest-fields{grid-template-columns:1fr}.emoji-picker{grid-template-columns:repeat(8,1fr)}.waline-comment{padding:12px 14px}}.mention{color:var(--j13-green);font-weight:600}.quote-block{border-left:3px solid var(--j13-green);padding:8px 12px;margin:6px 0 8px;background:var(--j13-bg-block-muted);font-size:13px;color:var(--color-text-3);border-radius:0 8px 8px 0;line-height:1.5;white-space:pre-wrap;word-break:break-word}.quote-block.clickable{cursor:pointer;transition:background .15s,border-color .15s}.quote-block.clickable:hover{background:var(--j13-green-bg);border-left-color:var(--j13-green-hover)}@media (max-width: 768px){.post-detail-page{padding:12px 14px 20px;gap:12px}.post-detail-header{padding:12px 14px 16px}.post-detail-title{font-size:17px}.post-detail-actions{margin-top:20px;padding-top:16px;gap:10px}.comment-section-bar{padding:12px 14px 10px}.comment-section-bar:after{left:14px;width:32px}.comment-section:hover .comment-section-bar:after{width:46px}}.widget-card{background:transparent;border:none;border-radius:0;box-shadow:none;margin-bottom:0;overflow:hidden;border-bottom:1px solid var(--j13-border-light);flex-shrink:0}.widget-card-head{padding:12px 16px 8px;font-size:13px;font-weight:600;border-bottom:none;background:transparent;color:var(--color-text-2)}.widget-card-body{padding:0 16px 14px}.widget-card--about{flex:1;display:flex;flex-direction:column;border-bottom:none;min-height:72px}.widget-card--about .widget-card-body{flex:1;display:flex;align-items:center;justify-content:center;text-align:center;padding:20px 16px}.widget-about-text{margin:0;font-size:12px;color:var(--color-text-3);line-height:1.65}.widget-about-text strong{display:block;margin-bottom:4px;color:var(--j13-green);font-size:13px}.widget-item{padding:6px 0;font-size:13px;cursor:pointer;border-bottom:1px solid var(--j13-border-light);display:flex;align-items:center;gap:6px}.widget-item:last-child{border-bottom:none}.widget-item:hover{color:var(--j13-green)}.widget-online-list{display:flex;flex-wrap:wrap;gap:6px}.widget-online-avatar{width:28px;height:28px;border-radius:50%;background:var(--j13-green);color:#fff;font-size:12px;display:inline-flex;align-items:center;justify-content:center;overflow:hidden;flex-shrink:0}.widget-online-avatar img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.profile-header{display:flex;align-items:center;gap:16px;margin-bottom:24px}.profile-header-card{position:relative;display:flex;align-items:center;gap:20px;padding:24px;margin-bottom:16px;background:var(--j13-bg-block);border:1px solid var(--j13-border-light);border-radius:12px;box-shadow:var(--j13-shadow-soft);transition:border-color .2s,box-shadow .2s}.profile-header-card--dragover{border-color:color-mix(in srgb,var(--j13-green) 50%,var(--j13-border-light));box-shadow:0 0 0 3px color-mix(in srgb,var(--j13-green) 15%,transparent)}.profile-drop-overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;border-radius:12px;background:color-mix(in srgb,var(--j13-green) 12%,var(--j13-bg-block));color:var(--j13-green);font-size:14px;font-weight:500;pointer-events:none}.profile-avatar-btn{flex-shrink:0;padding:0;border:none;background:none;cursor:pointer;border-radius:50%;line-height:0}.profile-avatar-btn:disabled{cursor:not-allowed}.profile-avatar-lg{position:relative;width:88px;height:88px;border-radius:50%;background:var(--j13-green);color:#fff;font-size:32px;font-weight:600;display:flex;align-items:center;justify-content:center;overflow:hidden;transition:box-shadow .2s}.profile-avatar-lg--pending{box-shadow:0 0 0 3px color-mix(in srgb,var(--j13-green) 40%,transparent)}.profile-avatar-lg img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.profile-avatar-overlay{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:#00000073;color:#fff;opacity:0;transition:opacity .2s}.profile-avatar-btn:hover .profile-avatar-overlay,.profile-avatar-btn:focus-visible .profile-avatar-overlay{opacity:1}.profile-avatar-btn:disabled .profile-avatar-overlay{opacity:1}.profile-header-info{flex:1;min-width:0;display:flex;align-items:center;justify-content:space-between;gap:16px}.profile-header-main{min-width:0}.profile-display-name{margin:0 0 4px;font-size:20px;font-weight:600;line-height:1.3}.profile-username{font-size:13px;color:var(--color-text-3)}.profile-avatar-tip{margin:6px 0 0;font-size:12px;color:var(--color-text-3);line-height:1.4}.profile-avatar-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}.profile-avatar-hint{font-size:13px;color:var(--color-text-3);white-space:nowrap}.profile-form{display:flex;flex-direction:column;gap:16px}.profile-form-footer{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:4px}.profile-form-footer--end{justify-content:flex-end}.profile-form-hint{font-size:12px;color:var(--color-text-3);line-height:1.4}@media (max-width: 520px){.profile-header-card{flex-direction:column;text-align:center;padding:20px 16px}.profile-header-info{flex-direction:column;align-items:center}.profile-form-footer{flex-direction:column;align-items:stretch}.profile-form-hint{text-align:center}}.avatar-crop-dialog{max-width:420px;padding:20px}.avatar-crop-stage{position:relative;width:100%;height:280px;border-radius:8px;overflow:hidden;background:#111}.avatar-crop-loading{display:flex;align-items:center;justify-content:center;height:100%}.avatar-crop-zoom{display:flex;align-items:center;gap:12px;padding:4px 0}.avatar-crop-zoom-label{flex-shrink:0;font-size:13px;color:var(--color-text-3);width:32px}.avatar-crop-zoom input[type=range]{flex:1;height:4px;accent-color:var(--j13-green);cursor:pointer}.admin-entry-card{border-color:color-mix(in srgb,var(--j13-green) 25%,var(--j13-border));background:var(--j13-bg-block-accent)}.auth-page{height:100%;min-height:100dvh;overflow-y:auto;display:flex;align-items:center;justify-content:center;background:var(--j13-bg-page);padding:24px}.auth-box{width:100%;max-width:400px;background:var(--j13-bg-surface);border:1px solid var(--j13-border);border-radius:12px;box-shadow:var(--j13-shadow-card);padding:32px}.auth-box .logo-mark{width:48px;height:48px;border-radius:12px;background:var(--j13-green);color:#fff;font-size:22px;font-weight:700;display:flex;align-items:center;justify-content:center;margin:0 auto 16px}.auth-box h1{text-align:center;font-size:20px;margin:0 0 4px}.auth-box .subtitle{text-align:center;font-size:13px;color:var(--color-text-3);margin-bottom:24px}.app-body--compose,.content-workspace--compose{background:var(--j13-bg-workspace)}.main-content--compose{overflow-y:auto;overflow-x:hidden}.compose-page{flex:1;display:flex;flex-direction:column;min-height:min(100%,100vh - var(--j13-header-h));overflow:visible;background:radial-gradient(ellipse 80% 50% at 50% -10%,var(--j13-green-bg),transparent),var(--j13-bg-workspace)}.compose-page--empty{align-items:center;justify-content:center}.compose-empty-card{text-align:center;padding:48px 40px;background:var(--j13-bg-surface);border:1px solid var(--j13-border);border-radius:16px;box-shadow:var(--j13-shadow-card);max-width:400px}.compose-empty-icon{width:56px;height:56px;margin:0 auto 20px;border-radius:14px;background:var(--j13-green-bg);color:var(--j13-green);font-size:24px;display:flex;align-items:center;justify-content:center}.compose-empty-card h2{margin:0 0 8px;font-size:18px;font-weight:600}.compose-empty-card p{margin:0 0 24px;font-size:14px;color:var(--color-text-3);line-height:1.5}.compose-primary-btn,.compose-ghost-btn{padding:10px 24px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:background .15s,transform .1s}.compose-primary-btn{background:var(--j13-green);color:#fff}.compose-primary-btn:hover{background:var(--j13-green-hover)}.compose-ghost-btn{background:var(--j13-bg-block-muted);color:var(--color-text-2)}.compose-canvas{flex:1;display:flex;flex-direction:column;min-height:min(100%,100vh - var(--j13-header-h));max-width:1200px;width:100%;margin:0 auto;padding:0 32px 32px}.compose-header{display:flex;align-items:center;justify-content:space-between;padding:16px 0 12px;flex-shrink:0}.compose-back{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border:1px solid var(--j13-border);border-radius:8px;background:var(--j13-bg-surface);color:var(--color-text-2);font-size:13px;cursor:pointer;transition:border-color .15s,color .15s,box-shadow .15s;box-shadow:var(--j13-shadow-soft)}.compose-back:hover{border-color:var(--j13-green);color:var(--j13-green)}.compose-publish-btn{display:inline-flex;align-items:center;gap:8px;padding:10px 22px;border:none;border-radius:8px;background:linear-gradient(135deg,var(--j13-green),var(--j13-green-hover));color:#fff;font-size:14px;font-weight:600;cursor:pointer;box-shadow:0 2px 8px #18a0584d;transition:transform .1s,box-shadow .15s,opacity .15s}.compose-publish-btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 14px #18a05859}.compose-publish-btn:disabled{opacity:.65;cursor:not-allowed}.compose-meta{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-bottom:20px;flex-shrink:0;flex-wrap:wrap}.compose-board-pills{display:flex;flex-wrap:wrap;gap:8px}.compose-board-pill{padding:6px 14px;border:1px solid var(--j13-border);border-radius:20px;background:var(--j13-bg-surface);color:var(--color-text-2);font-size:13px;cursor:pointer;transition:all .15s}.compose-board-pill:hover{border-color:var(--j13-green);color:var(--j13-green)}.compose-board-pill.active{background:var(--j13-green);border-color:var(--j13-green);color:#fff;font-weight:500}.compose-tags-field{display:flex;align-items:center;gap:8px;padding:6px 14px;border:1px solid var(--j13-border);border-radius:20px;background:var(--j13-bg-surface);min-width:220px;transition:border-color .15s}.compose-tags-field:focus-within{border-color:var(--j13-green)}.compose-tags-icon{color:var(--color-text-4);font-size:14px;flex-shrink:0}.compose-tags-field input{flex:1;border:none;background:transparent;outline:none;font-size:13px;color:var(--color-text-1);min-width:0}.compose-tags-field input::-moz-placeholder{color:var(--color-text-4)}.compose-tags-field input::placeholder{color:var(--color-text-4)}.compose-writing{flex:1;display:flex;flex-direction:column;background:var(--j13-bg-surface);border:1px solid var(--j13-border);border-radius:16px;box-shadow:var(--j13-shadow-card);padding:28px 32px 0;overflow:visible}.compose-title{width:100%;padding:0;border:none;background:transparent;font-size:32px;font-weight:700;line-height:1.3;letter-spacing:-.02em;color:var(--color-text-1);outline:none}.compose-title::-moz-placeholder{color:var(--color-text-4)}.compose-title::placeholder{color:var(--color-text-4)}.compose-subtitle{margin-top:8px;font-size:13px;color:var(--color-text-3)}.compose-subtitle strong{color:var(--j13-green);font-weight:500}.article-editor{flex:1;display:flex;flex-direction:column;margin-top:24px;border-top:1px solid var(--j13-border-light)}.article-editor-bar{position:sticky;top:0;z-index:30;display:flex;align-items:center;gap:12px;margin:0 -32px;padding:10px 32px;flex-shrink:0;flex-wrap:wrap;background:var(--j13-bg-surface);border-bottom:1px solid var(--j13-border-light);box-shadow:0 4px 12px #0f172a0a}.ui-tooltip{position:relative;display:inline-flex}.ui-tooltip-bubble{position:absolute;z-index:50;pointer-events:none;opacity:0;visibility:hidden;width:-moz-max-content;width:max-content;background:var(--j13-bg-surface);border:1px solid var(--j13-border);border-radius:8px;box-shadow:var(--j13-shadow-card);transition:opacity .1s ease,transform .1s ease,visibility .1s}.ui-tooltip-bubble--compact{padding:5px 10px}.ui-tooltip-bubble--rich{min-width:148px;max-width:220px;padding:7px 12px}.ui-tooltip-bubble__title{display:block;font-size:12px;font-weight:500;line-height:1.4;color:var(--color-text-1)}.ui-tooltip-bubble--compact .ui-tooltip-bubble__title{white-space:nowrap}.ui-tooltip-bubble__hint{display:block;margin-top:3px;font-size:11px;line-height:1.45;color:var(--color-text-3)}.ui-tooltip-bubble--bottom{top:calc(100% + 8px)}.ui-tooltip-bubble--top{bottom:calc(100% + 8px)}.ui-tooltip-bubble--center.ui-tooltip-bubble--bottom{left:50%;transform:translate(-50%) translateY(-2px)}.ui-tooltip-bubble--center.ui-tooltip-bubble--top{left:50%;transform:translate(-50%) translateY(2px)}.ui-tooltip-bubble--start.ui-tooltip-bubble--bottom,.ui-tooltip-bubble--start.ui-tooltip-bubble--top{left:0;transform:translateY(-2px)}.ui-tooltip-bubble--end.ui-tooltip-bubble--bottom,.ui-tooltip-bubble--end.ui-tooltip-bubble--top{right:0;left:auto;transform:translateY(-2px)}.ui-tooltip:hover .ui-tooltip-bubble,.ui-tooltip:focus-within .ui-tooltip-bubble{opacity:1;visibility:visible}.ui-tooltip:hover .ui-tooltip-bubble--center.ui-tooltip-bubble--bottom,.ui-tooltip:focus-within .ui-tooltip-bubble--center.ui-tooltip-bubble--bottom{transform:translate(-50%) translateY(0)}.ui-tooltip:hover .ui-tooltip-bubble--center.ui-tooltip-bubble--top,.ui-tooltip:focus-within .ui-tooltip-bubble--center.ui-tooltip-bubble--top{transform:translate(-50%) translateY(0)}.ui-tooltip:hover .ui-tooltip-bubble--start.ui-tooltip-bubble--bottom,.ui-tooltip:hover .ui-tooltip-bubble--start.ui-tooltip-bubble--top,.ui-tooltip:hover .ui-tooltip-bubble--end.ui-tooltip-bubble--bottom,.ui-tooltip:hover .ui-tooltip-bubble--end.ui-tooltip-bubble--top,.ui-tooltip:focus-within .ui-tooltip-bubble--start.ui-tooltip-bubble--bottom,.ui-tooltip:focus-within .ui-tooltip-bubble--start.ui-tooltip-bubble--top,.ui-tooltip:focus-within .ui-tooltip-bubble--end.ui-tooltip-bubble--bottom,.ui-tooltip:focus-within .ui-tooltip-bubble--end.ui-tooltip-bubble--top{transform:translateY(0)}.article-editor-tools{display:flex;align-items:center;gap:2px;flex-wrap:wrap}.article-tool-btn{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:6px;background:transparent;color:var(--color-text-2);font-size:13px;cursor:pointer;transition:background .12s,color .12s}.article-tool-btn:hover{background:var(--j13-bg-block-muted);color:var(--j13-green)}.article-tool-btn.active{background:#18a0581f;color:var(--j13-green)}.article-tool-btn strong{font-size:12px;font-weight:700}.article-editor-body{flex:1;display:flex;flex-direction:column;min-height:280px}.article-editor-pane{display:flex;flex:1;min-height:280px;border:1px solid var(--j13-border);border-radius:10px;overflow:hidden;background:var(--j13-bg-block);box-shadow:inset 0 1px #ffffffa6}.article-editor-pane--source{min-height:320px}.article-editor-scroll ::-moz-selection,.article-editor-markdown-input::-moz-selection{background:color-mix(in srgb,var(--j13-green) 24%,#d6e8f0);color:inherit}.article-editor-scroll ::selection,.article-editor-markdown-input::selection{background:color-mix(in srgb,var(--j13-green) 24%,#d6e8f0);color:inherit}.article-prosemirror ::-moz-selection{background:color-mix(in srgb,var(--j13-green) 24%,#d6e8f0);color:inherit}.article-prosemirror ::selection{background:color-mix(in srgb,var(--j13-green) 24%,#d6e8f0);color:inherit}.article-prosemirror .ProseMirror-selectednode{outline:2px solid color-mix(in srgb,var(--j13-green) 45%,transparent);outline-offset:2px}.dark .article-editor-scroll ::-moz-selection,.dark .article-editor-markdown-input::-moz-selection,.dark .article-prosemirror ::-moz-selection{background:color-mix(in srgb,var(--j13-green) 35%,#2a3f50);color:inherit}.dark .article-editor-scroll ::selection,.dark .article-editor-markdown-input::selection,.dark .article-prosemirror ::selection{background:color-mix(in srgb,var(--j13-green) 35%,#2a3f50);color:inherit}.article-editor-scroll{flex:1;min-width:0;overflow:auto;background:var(--j13-bg-block)}.article-editor-content{flex:1;display:flex;flex-direction:column}.article-editor-content .tiptap,.article-prosemirror{flex:1;min-height:280px;padding:14px 20px 20px;outline:none}.article-prosemirror p.is-editor-empty:first-child:before{color:var(--color-text-4);content:attr(data-placeholder);float:left;height:0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.article-prosemirror p.is-editor-empty::-moz-selection,.article-prosemirror p.is-editor-empty *::-moz-selection{background:transparent}.article-prosemirror p.is-editor-empty::selection,.article-prosemirror p.is-editor-empty *::selection{background:transparent}.article-prosemirror.ProseMirror-focused p.is-editor-empty::-moz-selection{background:transparent}.article-prosemirror.ProseMirror-focused p.is-editor-empty::selection{background:transparent}.article-prosemirror a{color:var(--j13-green);text-decoration:underline;text-underline-offset:2px}.article-prosemirror img{max-width:100%;height:auto;border-radius:8px;margin:12px 0}.editor-members-only.post-members-only--visible{border:1px solid rgba(24,160,88,.45);background:linear-gradient(135deg,#18a05814,#18a05805);border-radius:12px;overflow:hidden;box-shadow:inset 0 1px #ffffff8c}.editor-members-only .post-members-only__badge{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin:0;padding:10px 14px;border-bottom:1px dashed rgba(24,160,88,.28);border-radius:0;background:#18a0581a;width:100%}.editor-members-only .post-members-only__body{padding:14px 18px 18px;min-height:96px;background:#ffffff73}.dark .editor-members-only .post-members-only__body{background:#0000001f}.post-members-only__shortcut-hint{margin-left:auto;font-size:11px;font-weight:400;color:var(--color-text-3)}.editor-members-only{margin:20px 0}.editor-members-only--selected{box-shadow:0 0 0 2px #18a05859}.article-editor-status{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0 16px;border-top:1px solid var(--j13-border-light);font-size:12px;color:var(--color-text-4);flex-shrink:0}.article-editor-status-meta{display:flex;align-items:center;flex-wrap:wrap;gap:6px;min-width:0}.article-editor-status-sep{color:var(--color-text-4);opacity:.6}.article-editor-status-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}.article-editor-view-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--j13-border-light);border-radius:8px;background:var(--j13-bg-block);color:var(--color-text-2);font-size:12px;font-weight:500;cursor:pointer;transition:background .12s,border-color .12s,color .12s;flex-shrink:0}.article-editor-view-btn:hover{border-color:var(--j13-green);color:var(--j13-green);background:#18a0580f}.article-editor-view-btn.active{border-color:#18a05873;color:var(--j13-green);background:#18a0581a}.article-editor--fullscreen{position:fixed;top:0;right:0;bottom:0;left:0;z-index:120;margin:0!important;padding:0 32px 24px;background:var(--j13-bg-surface);border-top:none}.article-editor--fullscreen .article-editor-bar{margin:0;padding:12px 0}.article-editor--fullscreen.article-editor--rich .article-editor-bar{width:100%;max-width:var(--j13-article-read-w);margin:0 auto}.article-editor--fullscreen .article-editor-body{min-height:0;flex:1}.article-editor--fullscreen.article-editor--rich .article-editor-body{overflow-y:auto;padding:20px 0 0;background:var(--j13-bg-workspace)}.article-editor--fullscreen.article-editor--rich .article-editor-pane{width:100%;max-width:var(--j13-article-read-w);margin:0 auto;min-height:calc(100vh - 176px)}.article-editor--fullscreen .article-editor-scroll,.article-editor--fullscreen .article-editor-content .tiptap,.article-editor--fullscreen .article-prosemirror{min-height:calc(100vh - 220px)}.article-editor--fullscreen .article-editor-markdown{min-height:calc(100vh - 176px)}.article-editor--fullscreen .article-editor-markdown-input,.article-editor--fullscreen .article-editor-markdown-preview,.article-editor--fullscreen .article-editor-pane--source{min-height:calc(100vh - 220px)}.article-editor-tools--markdown{display:flex;align-items:center;gap:8px}.article-editor-tools--markdown-hint{font-size:12px;color:var(--color-text-3)}.article-link-dialog__footer{gap:8px}.article-editor-markdown{flex:1;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px;min-height:320px}.article-editor-markdown-input{display:block;width:100%;min-height:100%;padding:14px 16px 20px;border:none;outline:none;resize:none;font-family:ui-monospace,Cascadia Code,Consolas,monospace;font-size:13px;line-height:1.65;color:var(--color-text-1);background:transparent}.article-editor-markdown-preview{display:flex;flex-direction:column;min-height:320px;background:var(--j13-bg-surface);border:1px solid var(--j13-border);border-radius:10px;overflow:hidden}.article-editor-markdown-preview-label{padding:8px 16px;border-bottom:1px solid var(--j13-border-light);font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--color-text-4);flex-shrink:0}.article-editor-markdown-preview-body{flex:1;padding:14px 16px;overflow-y:auto}@media (max-width: 768px){.compose-canvas{padding:0 16px}.compose-writing{padding:20px 16px 0;border-radius:12px}.article-editor--fullscreen{padding:0 16px 16px}.article-editor--fullscreen .article-editor-bar{margin:0;padding:10px 0}.article-editor-markdown{grid-template-columns:1fr;grid-template-rows:minmax(240px,1fr) minmax(240px,1fr)}.article-editor-pane--source{min-height:240px}.article-editor--fullscreen.article-editor--rich .article-editor-pane{max-width:none;margin:0}.article-editor-bar{margin:0 -16px;padding:10px 16px}.article-editor-status{flex-wrap:wrap;align-items:flex-start}.article-editor-status-actions{width:100%;justify-content:flex-end}.compose-title{font-size:24px}.compose-meta{flex-direction:column;align-items:stretch}.compose-tags-field{min-width:0}.compose-header{padding-top:12px}.compose-publish-btn span{display:none}}.page-loader{display:flex;flex:1;align-items:center;justify-content:center;gap:8px;min-height:240px;color:var(--j13-green);font-size:14px}.page-loader__dot{width:8px;height:8px;border-radius:50%;background:currentColor;animation:page-loader-pulse .9s ease-in-out infinite}@keyframes page-loader-pulse{0%,to{opacity:.35;transform:scale(.85)}50%{opacity:1;transform:scale(1)}}.admin-shell{min-height:100vh;background:hsl(var(--background))}.admin-topbar{display:flex;align-items:center;justify-content:space-between;height:56px;padding:0 20px;border-bottom:1px solid var(--j13-border);background:hsl(var(--card))}.admin-topbar-brand{display:flex;align-items:center;gap:10px}.admin-topbar-mark{width:32px;height:32px;border-radius:8px;background:var(--j13-green);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700}.admin-topbar-title{font-size:14px;font-weight:600;line-height:1.2}.admin-topbar-sub{font-size:12px;color:hsl(var(--muted-foreground))}.admin-topbar-actions{display:flex;align-items:center;gap:12px}.admin-topbar-user{font-size:13px;color:hsl(var(--muted-foreground))}.admin-link-btn{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--j13-green);background:none;border:none;cursor:pointer}.admin-body{display:flex;height:calc(100vh - 56px);overflow:hidden}.admin-sidebar{width:200px;flex-shrink:0;padding:16px 10px;border-right:1px solid var(--j13-border);background:hsl(var(--card));overflow-y:auto}.admin-nav-item{display:flex;align-items:center;gap:8px;width:100%;padding:9px 12px;margin-bottom:2px;border-radius:8px;font-size:13px;color:hsl(var(--muted-foreground));text-decoration:none;transition:background .15s,color .15s}.admin-nav-item:hover{background:var(--j13-green-bg);color:var(--j13-green)}.admin-nav-item.active{background:var(--j13-green-bg);color:var(--j13-green);font-weight:600}.admin-main{flex:1;min-width:0;min-height:0;padding:24px;overflow-y:auto}.admin-page-head{margin-bottom:20px}.admin-page-head h1{font-size:22px;font-weight:700;margin-bottom:4px}.admin-page-head p{font-size:13px;color:hsl(var(--muted-foreground))}.admin-stat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px;margin-bottom:20px}.admin-stat-card{padding:16px;border-radius:10px;border:1px solid var(--j13-border);background:hsl(var(--card))}.admin-stat-value{font-size:24px;font-weight:700;color:var(--j13-green)}.admin-stat-label{font-size:12px;color:hsl(var(--muted-foreground));margin-top:4px}.admin-card{border:1px solid var(--j13-border);border-radius:10px;background:hsl(var(--card));margin-bottom:16px}.admin-card-body{padding:16px 20px 20px}.admin-card-head{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--j13-border);font-weight:600;font-size:14px}.admin-card-desc{padding:12px 16px 0;font-size:13px;color:hsl(var(--muted-foreground));line-height:1.5}.admin-card .admin-card-desc+button{margin:12px 16px 16px}.admin-form-row{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:12px 16px 16px;font-size:13px}.admin-form-row label{color:hsl(var(--muted-foreground));white-space:nowrap}.admin-settings-page{max-width:880px;padding-bottom:24px}.admin-settings-tabs{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:20px;padding-bottom:0;border-bottom:1px solid var(--j13-border)}.admin-settings-tab{display:inline-flex;align-items:center;gap:6px;padding:10px 14px;margin-bottom:-1px;border:none;border-bottom:2px solid transparent;background:none;font-size:13px;font-weight:500;color:hsl(var(--muted-foreground));cursor:pointer;transition:color .15s,border-color .15s}.admin-settings-tab:hover{color:hsl(var(--foreground))}.admin-settings-tab.active{color:var(--j13-green);border-bottom-color:var(--j13-green)}.admin-settings-panel{display:flex;flex-direction:column;gap:0}.admin-settings-card{margin-bottom:0}.admin-settings-card-badge{font-size:12px;font-weight:500;color:hsl(var(--muted-foreground));padding:2px 8px;border-radius:999px;background:hsl(var(--muted) / .45)}.admin-settings-sections{display:flex;flex-direction:column;gap:20px}.admin-settings-section-head h3{font-size:13px;font-weight:600;margin-bottom:2px}.admin-settings-section-head p{font-size:12px;color:hsl(var(--muted-foreground));line-height:1.45;margin-bottom:10px}.admin-settings-table{border:1px solid var(--j13-border);border-radius:8px;overflow:hidden;background:hsl(var(--background))}.admin-settings-row{display:grid;grid-template-columns:140px 140px 1fr;align-items:center;gap:8px 16px;padding:10px 14px;border-bottom:1px solid var(--j13-border);font-size:13px}.admin-settings-row:last-child{border-bottom:none}.admin-settings-row-label{color:hsl(var(--foreground));font-weight:500}.admin-settings-row-input{display:flex;align-items:center;gap:8px}.admin-settings-input{width:88px;height:32px;padding-top:0;padding-bottom:0}.admin-settings-unit{font-size:12px;color:hsl(var(--muted-foreground));white-space:nowrap}.admin-settings-row-hint{font-size:12px;color:hsl(var(--muted-foreground))}.admin-settings-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;padding:14px 16px;border:1px solid var(--j13-border);border-radius:10px;background:hsl(var(--card))}.admin-settings-bar p{margin:0;font-size:12px;color:hsl(var(--muted-foreground));line-height:1.45;max-width:420px}.admin-settings-filter-body{display:flex;flex-direction:column;gap:12px}.admin-settings-filter-tip{margin:0;font-size:12px;color:hsl(var(--muted-foreground));line-height:1.5}.admin-settings-filter-tip code,.admin-settings-backup-name code{font-size:11px;background:hsl(var(--muted));padding:1px 5px;border-radius:4px}.admin-settings-filter-textarea{min-height:320px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;line-height:1.55;resize:vertical}.admin-settings-info{display:flex;flex-direction:column;gap:0}.admin-settings-info-row{display:grid;grid-template-columns:88px 1fr;gap:12px 16px;padding:10px 0;border-bottom:1px solid var(--j13-border);font-size:13px}.admin-settings-info-row:last-child{border-bottom:none;padding-bottom:0}.admin-settings-info-row:first-child{padding-top:0}.admin-settings-info-row dt{color:hsl(var(--muted-foreground))}.admin-settings-info-row dd{margin:0;word-break:break-all}.admin-settings-info-row dd code{font-size:12px;background:hsl(var(--muted));padding:2px 6px;border-radius:4px}.admin-settings-backup-body{display:flex;flex-direction:column;align-items:flex-start;gap:10px}.admin-settings-backup-body>p{margin:0;font-size:13px;color:hsl(var(--muted-foreground));line-height:1.5}.admin-settings-backup-name{font-size:12px!important}@media (max-width: 640px){.admin-settings-row{grid-template-columns:1fr;gap:6px;padding:12px 14px}.admin-settings-row-hint{padding-left:0}.admin-settings-bar{flex-direction:column;align-items:stretch}.admin-settings-bar p{max-width:none}.admin-settings-info-row{grid-template-columns:1fr;gap:4px}}.admin-table{width:100%;border-collapse:collapse;font-size:13px}.admin-table th,.admin-table td{padding:10px 14px;text-align:left;border-bottom:1px solid var(--j13-border)}.admin-table th{font-weight:600;color:hsl(var(--muted-foreground));background:hsl(var(--muted) / .3)}.admin-table tr:last-child td{border-bottom:none}.admin-empty{padding:32px;text-align:center;color:hsl(var(--muted-foreground));font-size:13px}.admin-text-link{background:none;border:none;padding:0;color:var(--j13-green);cursor:pointer;font-size:inherit}.admin-text-link:hover{text-decoration:underline}.admin-search-bar{display:flex;gap:8px;margin-bottom:16px;max-width:480px}.admin-pagination{display:flex;align-items:center;justify-content:center;gap:12px;padding:12px;border-top:1px solid var(--j13-border);font-size:13px}.admin-dl{padding:16px;display:grid;grid-template-columns:120px 1fr;gap:10px 16px;font-size:13px}.admin-dl dt{color:hsl(var(--muted-foreground))}.admin-dl dd code{font-size:12px;background:hsl(var(--muted));padding:2px 6px;border-radius:4px}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color: hsl(var(--background))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[state\=checked\]\:translate-x-4[data-state=checked]{--tw-translate-x: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=checked\]\:bg-\[var\(--j13-green\)\][data-state=checked]{background-color:var(--j13-green)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.dark\:bg-orange-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(67 20 7 / var(--tw-bg-opacity, 1))}.dark\:text-orange-300:is(.dark *){--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}@media (min-width: 640px){.sm\:mt-0{margin-top:0}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>svg\]\:size-4>svg{width:1rem;height:1rem}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0px}.\[\&_tr\]\:border-b tr{border-bottom-width:1px} diff --git a/embed_static/static/spa/assets/index-kfMSnNdB.js b/embed_static/static/spa/assets/index-kfMSnNdB.js deleted file mode 100644 index f3b505e..0000000 --- a/embed_static/static/spa/assets/index-kfMSnNdB.js +++ /dev/null @@ -1,2 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/HomePage-Bk9P_MHc.js","assets/react-vendor-1fwFMt02.js","assets/virtual-vendor-DDSEW9eW.js","assets/badge-C0Go598m.js","assets/PinnedIcon-wXBQDLix.js","assets/ui-vendor-Gb6mai95.js","assets/content-BrFHUpp8.js","assets/PostDetailPage-BXxbrPMM.js","assets/postContent-ClrHK1rL.js","assets/purify-vendor-Cx4rtWv4.js","assets/LoginPage-CCZinbxI.js","assets/form-PYX6hP9B.js","assets/input-BjHCK3cg.js","assets/RegisterPage-CVXuCuRY.js","assets/ComposePage-DOjc4_kJ.js","assets/dialog-DJohwkVv.js","assets/BoardsManagePage-CBisP7fL.js","assets/textarea-5HbBKxKc.js","assets/alert-dialog-_wPjKojj.js","assets/ProfilePage-SfO7sDgP.js","assets/FavoritesPage-C0oxHajd.js","assets/AdminDashboardPage-biZSiZPA.js","assets/AdminPostsPage-CPPJRgyw.js","assets/AdminCommentsPage-8EpDyC2e.js","assets/AdminUsersPage-qrFcGy2M.js","assets/AdminSettingsPage-BPulW3i2.js"])))=>i.map(i=>d[i]); -var Is=Object.defineProperty;var Os=(e,t,s)=>t in e?Is(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var ft=(e,t,s)=>Os(e,typeof t!="symbol"?t+"":t,s);import{r as b,j as r,e as qe,g as Pt,i as Rt,k as u,m as Ls,O as zt,N as Ds,B as Ms,n as Bs,p as G,q as ht,t as $s}from"./react-vendor-1fwFMt02.js";import{S as At,C as Fs,a as It,P as Vs,b as Ot,I as Lt,c as Dt,d as Mt,e as Us,R as Bt,f as Gs,L as $t,g as Ft,h as Ws,T as Hs,i as Ys,M as qs,F as Js,H as Ks,j as Xs,k as Vt,l as Qs,m as Zs,n as eo,o as to,p as Ut,A as so,q as oo,r as ro,s as ao,U as no,t as io,u as lo}from"./ui-vendor-Gb6mai95.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))o(i);new MutationObserver(i=>{for(const l of i)if(l.type==="childList")for(const n of l.addedNodes)n.tagName==="LINK"&&n.rel==="modulepreload"&&o(n)}).observe(document,{childList:!0,subtree:!0});function s(i){const l={};return i.integrity&&(l.integrity=i.integrity),i.referrerPolicy&&(l.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?l.credentials="include":i.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function o(i){if(i.ep)return;i.ep=!0;const l=s(i);fetch(i.href,l)}})();const Gt="j13-theme";function Wt(){return localStorage.getItem(Gt)==="dark"?"dark":"light"}function Ht(e){const t=document.documentElement;t.classList.toggle("dark",e==="dark"),t.style.colorScheme=e,localStorage.setItem(Gt,e)}const co="modulepreload",uo=function(e){return"/"+e},gt={},re=function(t,s,o){let i=Promise.resolve();if(s&&s.length>0){document.getElementsByTagName("link");const n=document.querySelector("meta[property=csp-nonce]"),d=(n==null?void 0:n.nonce)||(n==null?void 0:n.getAttribute("nonce"));i=Promise.allSettled(s.map(m=>{if(m=uo(m),m in gt)return;gt[m]=!0;const c=m.endsWith(".css"),x=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${m}"]${x}`))return;const a=document.createElement("link");if(a.rel=c?"stylesheet":co,c||(a.as="script"),a.crossOrigin="",a.href=m,d&&a.setAttribute("nonce",d),document.head.appendChild(a),c)return new Promise((E,T)=>{a.addEventListener("load",E),a.addEventListener("error",()=>T(new Error(`Unable to preload CSS for ${m}`)))})}))}function l(n){const d=new Event("vite:preloadError",{cancelable:!0});if(d.payload=n,window.dispatchEvent(d),!d.defaultPrevented)throw n}return i.then(n=>{for(const d of n||[])d.status==="rejected"&&l(d.reason);return t().catch(l)})},mo="";async function y(e,t={}){const s=await fetch(mo+e,{credentials:"same-origin",...t,headers:{...t.body instanceof FormData?{}:{"Content-Type":"application/json"},...t.headers}});let o;try{o=await s.json()}catch{throw new Error("服务器响应异常")}if(!s.ok)throw new Error(o.error||"请求失败");return o}const he={me:()=>y("/api/me"),stats:()=>y("/api/stats"),forumLimits:()=>y("/api/forum-limits"),boards:()=>y("/api/boards"),posts:e=>{const t=new URLSearchParams(e).toString();return y(`/api/posts?${t}`)},hotPosts:()=>y("/api/posts/hot"),post:(e,t)=>{const s=t!=null&&t.skipView?"?skip_view=1":"";return y(`/api/posts/${e}${s}`)},comments:(e,t)=>{const s=t!=null&&t.length?`?my_ids=${t.join(",")}`:"";return y(`/api/posts/${e}/comments${s}`)},notifications:()=>y("/api/notifications"),online:()=>y("/api/online"),presence:()=>y("/api/presence",{method:"POST"}),favorites:()=>y("/api/favorites"),createBoard:e=>y("/api/admin/boards",{method:"POST",body:JSON.stringify(e)}),updateBoard:(e,t)=>y(`/api/admin/boards/${e}`,{method:"PUT",body:JSON.stringify(t)}),deleteBoard:e=>y(`/api/admin/boards/${e}`,{method:"DELETE"}),adminDashboard:()=>y("/api/admin/dashboard"),adminSettings:()=>y("/api/admin/settings"),adminPosts:e=>{const t=new URLSearchParams;e.page&&t.set("page",String(e.page)),e.keyword&&t.set("keyword",e.keyword);const s=t.toString();return y(`/api/admin/posts${s?`?${s}`:""}`)},adminPinPost:(e,t)=>y(`/api/admin/posts/${e}/pin`,{method:"POST",body:JSON.stringify({pinned:t})}),adminLockPost:(e,t)=>y(`/api/admin/posts/${e}/lock`,{method:"POST",body:JSON.stringify({locked:t})}),adminUpdateForumSettings:e=>y("/api/admin/settings/forum",{method:"PUT",body:JSON.stringify(e)}),adminUpdateFilterWords:e=>y("/api/admin/settings/filter-words",{method:"PUT",body:JSON.stringify({content:e})}),postRevisions:e=>y(`/api/posts/${e}/revisions`),postRevision:(e,t)=>y(`/api/posts/${e}/revisions/${t}`),adminDeletePost:e=>y(`/api/admin/posts/${e}`,{method:"DELETE"}),adminComments:(e=1)=>y(`/api/admin/comments?page=${e}`),adminDeleteComment:e=>y(`/api/admin/comments/${e}`,{method:"DELETE"}),adminUsers:(e=1)=>y(`/api/admin/users?page=${e}`),adminBanUser:(e,t)=>y(`/api/admin/users/${e}/ban`,{method:"POST",body:JSON.stringify({banned:t})}),adminBackup:()=>y("/api/admin/backup",{method:"POST"}),updateNickname:e=>{const t=new FormData;return t.append("nickname",e),y("/api/profile/nickname",{method:"POST",body:t,headers:{}})},updatePassword:(e,t)=>{const s=new FormData;return s.append("old_password",e),s.append("new_password",t),y("/api/profile/password",{method:"POST",body:s,headers:{}})},uploadAvatar:e=>{const t=new FormData;return t.append("avatar",e),y("/api/profile/avatar",{method:"POST",body:t,headers:{}})},uploadPostImage:e=>{const t=new FormData;return t.append("image",e),y("/api/uploads/image",{method:"POST",body:t,headers:{}})},createPost:e=>{const t=new FormData;return t.append("board_id",e.board_id),t.append("title",e.title),t.append("content",e.content),t.append("tags",e.tags||""),y("/api/posts",{method:"POST",body:t,headers:{}})},updatePost:(e,t)=>{const s=new FormData;return s.append("title",t.title),s.append("content",t.content),s.append("tags",t.tags||""),y(`/api/posts/${e}`,{method:"PUT",body:s,headers:{}})},login:(e,t)=>{const s=new FormData;return s.append("username",e),s.append("password",t),y("/api/login",{method:"POST",body:s,headers:{}})},register:(e,t,s)=>{const o=new FormData;return o.append("username",e),o.append("password",t),o.append("nickname",s),y("/api/register",{method:"POST",body:o,headers:{}})},logout:()=>y("/api/logout",{method:"POST"}),like:e=>y(`/api/posts/${e}/like`,{method:"POST"}),favorite:e=>y(`/api/posts/${e}/favorite`,{method:"POST"}),addComment:(e,t)=>{const s=new FormData;return s.append("content",t.content),t.replyTo&&s.append("reply_to",String(t.replyTo)),t.guestNick&&s.append("guest_nick",t.guestNick),t.guestEmail&&s.append("guest_email",t.guestEmail),t.guestUrl&&s.append("guest_url",t.guestUrl),t.isPrivate&&s.append("is_private","1"),y(`/api/posts/${e}/comments`,{method:"POST",body:s,headers:{}})},ping:()=>y("/api/ping",{method:"POST"})},Yt=b.createContext({user:null,loading:!0,refresh:async()=>{},logout:async()=>{}});function po({children:e}){const[t,s]=b.useState(null),[o,i]=b.useState(!0),l=b.useCallback(async()=>{try{const d=await he.me();s(d.user??null)}catch{s(null)}finally{i(!1)}},[]);b.useEffect(()=>{l()},[l]);const n=async()=>{await he.logout(),s(null)};return r.jsx(Yt.Provider,{value:{user:t,loading:o,refresh:l,logout:n},children:e})}const Je=()=>b.useContext(Yt),qt=b.createContext({theme:"light",toggle:()=>{}});function fo({children:e}){const[t,s]=b.useState(Wt);b.useLayoutEffect(()=>{Ht(t)},[t]);const o=()=>s(i=>i==="light"?"dark":"light");return r.jsx(qt.Provider,{value:{theme:t,toggle:o},children:e})}const Jt=()=>b.useContext(qt);function ho(e){const[t,s]=b.useState(()=>window.matchMedia(e).matches);return b.useLayoutEffect(()=>{const o=window.matchMedia(e),i=()=>s(o.matches);return o.addEventListener("change",i),()=>o.removeEventListener("change",i)},[e]),t}function ye(){return r.jsxs("div",{className:"page-loader",role:"status","aria-live":"polite",children:[r.jsx("span",{className:"page-loader__dot"}),"加载中…"]})}function Kt(e){var t,s,o="";if(typeof e=="string"||typeof e=="number")o+=e;else if(typeof e=="object")if(Array.isArray(e)){var i=e.length;for(t=0;t{const s=new Array(e.length+t.length);for(let o=0;o({classGroupId:e,validator:t}),Qt=(e=new Map,t=null,s)=>({nextPart:e,validators:t,classGroupId:s}),We="-",bt=[],xo="arbitrary..",yo=e=>{const t=wo(e),{conflictingClassGroups:s,conflictingClassGroupModifiers:o}=e;return{getClassGroupId:n=>{if(n.startsWith("[")&&n.endsWith("]"))return vo(n);const d=n.split(We),m=d[0]===""&&d.length>1?1:0;return Zt(d,m,t)},getConflictingClassGroupIds:(n,d)=>{if(d){const m=o[n],c=s[n];return m?c?go(c,m):m:c||bt}return s[n]||bt}}},Zt=(e,t,s)=>{if(e.length-t===0)return s.classGroupId;const i=e[t],l=s.nextPart.get(i);if(l){const c=Zt(e,t+1,l);if(c)return c}const n=s.validators;if(n===null)return;const d=t===0?e.join(We):e.slice(t).join(We),m=n.length;for(let c=0;ce.slice(1,-1).indexOf(":")===-1?void 0:(()=>{const t=e.slice(1,-1),s=t.indexOf(":"),o=t.slice(0,s);return o?xo+o:void 0})(),wo=e=>{const{theme:t,classGroups:s}=e;return ko(s,t)},ko=(e,t)=>{const s=Qt();for(const o in e){const i=e[o];ot(i,s,o,t)}return s},ot=(e,t,s,o)=>{const i=e.length;for(let l=0;l{if(typeof e=="string"){So(e,t,s);return}if(typeof e=="function"){No(e,t,s,o);return}Eo(e,t,s,o)},So=(e,t,s)=>{const o=e===""?t:es(t,e);o.classGroupId=s},No=(e,t,s,o)=>{if(_o(e)){ot(e(o),t,s,o);return}t.validators===null&&(t.validators=[]),t.validators.push(bo(s,e))},Eo=(e,t,s,o)=>{const i=Object.entries(e),l=i.length;for(let n=0;n{let s=e;const o=t.split(We),i=o.length;for(let l=0;l"isThemeGetter"in e&&e.isThemeGetter===!0,To=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,s=Object.create(null),o=Object.create(null);const i=(l,n)=>{s[l]=n,t++,t>e&&(t=0,o=s,s=Object.create(null))};return{get(l){let n=s[l];if(n!==void 0)return n;if((n=o[l])!==void 0)return i(l,n),n},set(l,n){l in s?s[l]=n:i(l,n)}}},et="!",xt=":",Co=[],yt=(e,t,s,o,i)=>({modifiers:e,hasImportantModifier:t,baseClassName:s,maybePostfixModifierPosition:o,isExternal:i}),Po=e=>{const{prefix:t,experimentalParseClassName:s}=e;let o=i=>{const l=[];let n=0,d=0,m=0,c;const x=i.length;for(let L=0;Lm?c-m:void 0;return yt(l,T,E,R)};if(t){const i=t+xt,l=o;o=n=>n.startsWith(i)?l(n.slice(i.length)):yt(Co,!1,n,void 0,!0)}if(s){const i=o;o=l=>s({className:l,parseClassName:i})}return o},Ro=e=>{const t=new Map;return e.orderSensitiveModifiers.forEach((s,o)=>{t.set(s,1e6+o)}),s=>{const o=[];let i=[];for(let l=0;l0&&(i.sort(),o.push(...i),i=[]),o.push(n)):i.push(n)}return i.length>0&&(i.sort(),o.push(...i)),o}},zo=e=>({cache:To(e.cacheSize),parseClassName:Po(e),sortModifiers:Ro(e),postfixLookupClassGroupIds:Ao(e),...yo(e)}),Ao=e=>{const t=Object.create(null),s=e.postfixLookupClassGroups;if(s)for(let o=0;o{const{parseClassName:s,getClassGroupId:o,getConflictingClassGroupIds:i,sortModifiers:l,postfixLookupClassGroupIds:n}=t,d=[],m=e.trim().split(Io);let c="";for(let x=m.length-1;x>=0;x-=1){const a=m[x],{isExternal:E,modifiers:T,hasImportantModifier:R,baseClassName:L,maybePostfixModifierPosition:O}=s(a);if(E){c=a+(c.length>0?" "+c:c);continue}let N=!!O,B;if(N){const D=L.substring(0,O);B=o(D);const p=B&&n[B]?o(L):void 0;p&&p!==B&&(B=p,N=!1)}else B=o(L);if(!B){if(!N){c=a+(c.length>0?" "+c:c);continue}if(B=o(L),!B){c=a+(c.length>0?" "+c:c);continue}N=!1}const X=T.length===0?"":T.length===1?T[0]:l(T).join(":"),te=R?X+et:X,ae=te+B;if(d.indexOf(ae)>-1)continue;d.push(ae);const $=i(B,N);for(let D=0;D<$.length;++D){const p=$[D];d.push(te+p)}c=a+(c.length>0?" "+c:c)}return c},Lo=(...e)=>{let t=0,s,o,i="";for(;t{if(typeof e=="string")return e;let t,s="";for(let o=0;o{let s,o,i,l;const n=m=>{const c=t.reduce((x,a)=>a(x),e());return s=zo(c),o=s.cache.get,i=s.cache.set,l=d,d(m)},d=m=>{const c=o(m);if(c)return c;const x=Oo(m,s);return i(m,x),x};return l=n,(...m)=>l(Lo(...m))},Mo=[],V=e=>{const t=s=>s[e]||Mo;return t.isThemeGetter=!0,t},ss=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,os=/^\((?:(\w[\w-]*):)?(.+)\)$/i,Bo=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,$o=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Fo=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Vo=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Uo=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Go=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ke=e=>Bo.test(e),j=e=>!!e&&!Number.isNaN(Number(e)),pe=e=>!!e&&Number.isInteger(Number(e)),Qe=e=>e.endsWith("%")&&j(e.slice(0,-1)),xe=e=>$o.test(e),rs=()=>!0,Wo=e=>Fo.test(e)&&!Vo.test(e),rt=()=>!1,Ho=e=>Uo.test(e),Yo=e=>Go.test(e),qo=e=>!f(e)&&!g(e),Jo=e=>e.startsWith("@container")&&(e[10]==="/"&&e[11]!==void 0||e[11]==="s"&&e[16]!==void 0&&e.startsWith("-size/",10)||e[11]==="n"&&e[18]!==void 0&&e.startsWith("-normal/",10)),Ko=e=>je(e,is,rt),f=e=>ss.test(e),_e=e=>je(e,ls,Wo),vt=e=>je(e,rr,j),Xo=e=>je(e,ds,rs),Qo=e=>je(e,cs,rt),wt=e=>je(e,as,rt),Zo=e=>je(e,ns,Yo),Ve=e=>je(e,us,Ho),g=e=>os.test(e),Oe=e=>Te(e,ls),er=e=>Te(e,cs),kt=e=>Te(e,as),tr=e=>Te(e,is),sr=e=>Te(e,ns),Ue=e=>Te(e,us,!0),or=e=>Te(e,ds,!0),je=(e,t,s)=>{const o=ss.exec(e);return o?o[1]?t(o[1]):s(o[2]):!1},Te=(e,t,s=!1)=>{const o=os.exec(e);return o?o[1]?t(o[1]):s:!1},as=e=>e==="position"||e==="percentage",ns=e=>e==="image"||e==="url",is=e=>e==="length"||e==="size"||e==="bg-size",ls=e=>e==="length",rr=e=>e==="number",cs=e=>e==="family-name",ds=e=>e==="number"||e==="weight",us=e=>e==="shadow",ar=()=>{const e=V("color"),t=V("font"),s=V("text"),o=V("font-weight"),i=V("tracking"),l=V("leading"),n=V("breakpoint"),d=V("container"),m=V("spacing"),c=V("radius"),x=V("shadow"),a=V("inset-shadow"),E=V("text-shadow"),T=V("drop-shadow"),R=V("blur"),L=V("perspective"),O=V("aspect"),N=V("ease"),B=V("animate"),X=()=>["auto","avoid","all","avoid-page","page","left","right","column"],te=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],ae=()=>[...te(),g,f],$=()=>["auto","hidden","clip","visible","scroll"],D=()=>["auto","contain","none"],p=()=>[g,f,m],M=()=>[ke,"full","auto",...p()],ue=()=>[pe,"none","subgrid",g,f],J=()=>["auto",{span:["full",pe,g,f]},pe,g,f],K=()=>[pe,"auto",g,f],W=()=>["auto","min","max","fr",g,f],me=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],Q=()=>["start","end","center","stretch","center-safe","end-safe"],w=()=>["auto",...p()],C=()=>[ke,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...p()],v=()=>[ke,"screen","full","dvw","lvw","svw","min","max","fit",...p()],F=()=>[ke,"screen","full","lh","dvh","lvh","svh","min","max","fit",...p()],h=()=>[e,g,f],Y=()=>[...te(),kt,wt,{position:[g,f]}],Se=()=>["no-repeat",{repeat:["","x","y","space","round"]}],_=()=>["auto","cover","contain",tr,Ko,{size:[g,f]}],A=()=>[Qe,Oe,_e],S=()=>["","none","full",c,g,f],P=()=>["",j,Oe,_e],ie=()=>["solid","dashed","dotted","double"],z=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],I=()=>[j,Qe,kt,wt],Ne=()=>["","none",R,g,f],ge=()=>["none",j,g,f],le=()=>["none",j,g,f],Ae=()=>[j,g,f],ve=()=>[ke,"full",...p()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[xe],breakpoint:[xe],color:[rs],container:[xe],"drop-shadow":[xe],ease:["in","out","in-out"],font:[qo],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[xe],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[xe],shadow:[xe],spacing:["px",j],text:[xe],"text-shadow":[xe],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",ke,f,g,O]}],container:["container"],"container-type":[{"@container":["","normal","size",g,f]}],"container-named":[Jo],columns:[{columns:[j,f,g,d]}],"break-after":[{"break-after":X()}],"break-before":[{"break-before":X()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:ae()}],overflow:[{overflow:$()}],"overflow-x":[{"overflow-x":$()}],"overflow-y":[{"overflow-y":$()}],overscroll:[{overscroll:D()}],"overscroll-x":[{"overscroll-x":D()}],"overscroll-y":[{"overscroll-y":D()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:M()}],"inset-x":[{"inset-x":M()}],"inset-y":[{"inset-y":M()}],start:[{"inset-s":M(),start:M()}],end:[{"inset-e":M(),end:M()}],"inset-bs":[{"inset-bs":M()}],"inset-be":[{"inset-be":M()}],top:[{top:M()}],right:[{right:M()}],bottom:[{bottom:M()}],left:[{left:M()}],visibility:["visible","invisible","collapse"],z:[{z:[pe,"auto",g,f]}],basis:[{basis:[ke,"full","auto",d,...p()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[j,ke,"auto","initial","none",f]}],grow:[{grow:["",j,g,f]}],shrink:[{shrink:["",j,g,f]}],order:[{order:[pe,"first","last","none",g,f]}],"grid-cols":[{"grid-cols":ue()}],"col-start-end":[{col:J()}],"col-start":[{"col-start":K()}],"col-end":[{"col-end":K()}],"grid-rows":[{"grid-rows":ue()}],"row-start-end":[{row:J()}],"row-start":[{"row-start":K()}],"row-end":[{"row-end":K()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":W()}],"auto-rows":[{"auto-rows":W()}],gap:[{gap:p()}],"gap-x":[{"gap-x":p()}],"gap-y":[{"gap-y":p()}],"justify-content":[{justify:[...me(),"normal"]}],"justify-items":[{"justify-items":[...Q(),"normal"]}],"justify-self":[{"justify-self":["auto",...Q()]}],"align-content":[{content:["normal",...me()]}],"align-items":[{items:[...Q(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...Q(),{baseline:["","last"]}]}],"place-content":[{"place-content":me()}],"place-items":[{"place-items":[...Q(),"baseline"]}],"place-self":[{"place-self":["auto",...Q()]}],p:[{p:p()}],px:[{px:p()}],py:[{py:p()}],ps:[{ps:p()}],pe:[{pe:p()}],pbs:[{pbs:p()}],pbe:[{pbe:p()}],pt:[{pt:p()}],pr:[{pr:p()}],pb:[{pb:p()}],pl:[{pl:p()}],m:[{m:w()}],mx:[{mx:w()}],my:[{my:w()}],ms:[{ms:w()}],me:[{me:w()}],mbs:[{mbs:w()}],mbe:[{mbe:w()}],mt:[{mt:w()}],mr:[{mr:w()}],mb:[{mb:w()}],ml:[{ml:w()}],"space-x":[{"space-x":p()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":p()}],"space-y-reverse":["space-y-reverse"],size:[{size:C()}],"inline-size":[{inline:["auto",...v()]}],"min-inline-size":[{"min-inline":["auto",...v()]}],"max-inline-size":[{"max-inline":["none",...v()]}],"block-size":[{block:["auto",...F()]}],"min-block-size":[{"min-block":["auto",...F()]}],"max-block-size":[{"max-block":["none",...F()]}],w:[{w:[d,"screen",...C()]}],"min-w":[{"min-w":[d,"screen","none",...C()]}],"max-w":[{"max-w":[d,"screen","none","prose",{screen:[n]},...C()]}],h:[{h:["screen","lh",...C()]}],"min-h":[{"min-h":["screen","lh","none",...C()]}],"max-h":[{"max-h":["screen","lh",...C()]}],"font-size":[{text:["base",s,Oe,_e]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[o,or,Xo]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",Qe,f]}],"font-family":[{font:[er,Qo,t]}],"font-features":[{"font-features":[f]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[i,g,f]}],"line-clamp":[{"line-clamp":[j,"none",g,vt]}],leading:[{leading:[l,...p()]}],"list-image":[{"list-image":["none",g,f]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",g,f]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:h()}],"text-color":[{text:h()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...ie(),"wavy"]}],"text-decoration-thickness":[{decoration:[j,"from-font","auto",g,_e]}],"text-decoration-color":[{decoration:h()}],"underline-offset":[{"underline-offset":[j,"auto",g,f]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:p()}],"tab-size":[{tab:[pe,g,f]}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",g,f]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",g,f]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:Y()}],"bg-repeat":[{bg:Se()}],"bg-size":[{bg:_()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},pe,g,f],radial:["",g,f],conic:[pe,g,f]},sr,Zo]}],"bg-color":[{bg:h()}],"gradient-from-pos":[{from:A()}],"gradient-via-pos":[{via:A()}],"gradient-to-pos":[{to:A()}],"gradient-from":[{from:h()}],"gradient-via":[{via:h()}],"gradient-to":[{to:h()}],rounded:[{rounded:S()}],"rounded-s":[{"rounded-s":S()}],"rounded-e":[{"rounded-e":S()}],"rounded-t":[{"rounded-t":S()}],"rounded-r":[{"rounded-r":S()}],"rounded-b":[{"rounded-b":S()}],"rounded-l":[{"rounded-l":S()}],"rounded-ss":[{"rounded-ss":S()}],"rounded-se":[{"rounded-se":S()}],"rounded-ee":[{"rounded-ee":S()}],"rounded-es":[{"rounded-es":S()}],"rounded-tl":[{"rounded-tl":S()}],"rounded-tr":[{"rounded-tr":S()}],"rounded-br":[{"rounded-br":S()}],"rounded-bl":[{"rounded-bl":S()}],"border-w":[{border:P()}],"border-w-x":[{"border-x":P()}],"border-w-y":[{"border-y":P()}],"border-w-s":[{"border-s":P()}],"border-w-e":[{"border-e":P()}],"border-w-bs":[{"border-bs":P()}],"border-w-be":[{"border-be":P()}],"border-w-t":[{"border-t":P()}],"border-w-r":[{"border-r":P()}],"border-w-b":[{"border-b":P()}],"border-w-l":[{"border-l":P()}],"divide-x":[{"divide-x":P()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":P()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...ie(),"hidden","none"]}],"divide-style":[{divide:[...ie(),"hidden","none"]}],"border-color":[{border:h()}],"border-color-x":[{"border-x":h()}],"border-color-y":[{"border-y":h()}],"border-color-s":[{"border-s":h()}],"border-color-e":[{"border-e":h()}],"border-color-bs":[{"border-bs":h()}],"border-color-be":[{"border-be":h()}],"border-color-t":[{"border-t":h()}],"border-color-r":[{"border-r":h()}],"border-color-b":[{"border-b":h()}],"border-color-l":[{"border-l":h()}],"divide-color":[{divide:h()}],"outline-style":[{outline:[...ie(),"none","hidden"]}],"outline-offset":[{"outline-offset":[j,g,f]}],"outline-w":[{outline:["",j,Oe,_e]}],"outline-color":[{outline:h()}],shadow:[{shadow:["","none",x,Ue,Ve]}],"shadow-color":[{shadow:h()}],"inset-shadow":[{"inset-shadow":["none",a,Ue,Ve]}],"inset-shadow-color":[{"inset-shadow":h()}],"ring-w":[{ring:P()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:h()}],"ring-offset-w":[{"ring-offset":[j,_e]}],"ring-offset-color":[{"ring-offset":h()}],"inset-ring-w":[{"inset-ring":P()}],"inset-ring-color":[{"inset-ring":h()}],"text-shadow":[{"text-shadow":["none",E,Ue,Ve]}],"text-shadow-color":[{"text-shadow":h()}],opacity:[{opacity:[j,g,f]}],"mix-blend":[{"mix-blend":[...z(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":z()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[j]}],"mask-image-linear-from-pos":[{"mask-linear-from":I()}],"mask-image-linear-to-pos":[{"mask-linear-to":I()}],"mask-image-linear-from-color":[{"mask-linear-from":h()}],"mask-image-linear-to-color":[{"mask-linear-to":h()}],"mask-image-t-from-pos":[{"mask-t-from":I()}],"mask-image-t-to-pos":[{"mask-t-to":I()}],"mask-image-t-from-color":[{"mask-t-from":h()}],"mask-image-t-to-color":[{"mask-t-to":h()}],"mask-image-r-from-pos":[{"mask-r-from":I()}],"mask-image-r-to-pos":[{"mask-r-to":I()}],"mask-image-r-from-color":[{"mask-r-from":h()}],"mask-image-r-to-color":[{"mask-r-to":h()}],"mask-image-b-from-pos":[{"mask-b-from":I()}],"mask-image-b-to-pos":[{"mask-b-to":I()}],"mask-image-b-from-color":[{"mask-b-from":h()}],"mask-image-b-to-color":[{"mask-b-to":h()}],"mask-image-l-from-pos":[{"mask-l-from":I()}],"mask-image-l-to-pos":[{"mask-l-to":I()}],"mask-image-l-from-color":[{"mask-l-from":h()}],"mask-image-l-to-color":[{"mask-l-to":h()}],"mask-image-x-from-pos":[{"mask-x-from":I()}],"mask-image-x-to-pos":[{"mask-x-to":I()}],"mask-image-x-from-color":[{"mask-x-from":h()}],"mask-image-x-to-color":[{"mask-x-to":h()}],"mask-image-y-from-pos":[{"mask-y-from":I()}],"mask-image-y-to-pos":[{"mask-y-to":I()}],"mask-image-y-from-color":[{"mask-y-from":h()}],"mask-image-y-to-color":[{"mask-y-to":h()}],"mask-image-radial":[{"mask-radial":[g,f]}],"mask-image-radial-from-pos":[{"mask-radial-from":I()}],"mask-image-radial-to-pos":[{"mask-radial-to":I()}],"mask-image-radial-from-color":[{"mask-radial-from":h()}],"mask-image-radial-to-color":[{"mask-radial-to":h()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":te()}],"mask-image-conic-pos":[{"mask-conic":[j]}],"mask-image-conic-from-pos":[{"mask-conic-from":I()}],"mask-image-conic-to-pos":[{"mask-conic-to":I()}],"mask-image-conic-from-color":[{"mask-conic-from":h()}],"mask-image-conic-to-color":[{"mask-conic-to":h()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:Y()}],"mask-repeat":[{mask:Se()}],"mask-size":[{mask:_()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",g,f]}],filter:[{filter:["","none",g,f]}],blur:[{blur:Ne()}],brightness:[{brightness:[j,g,f]}],contrast:[{contrast:[j,g,f]}],"drop-shadow":[{"drop-shadow":["","none",T,Ue,Ve]}],"drop-shadow-color":[{"drop-shadow":h()}],grayscale:[{grayscale:["",j,g,f]}],"hue-rotate":[{"hue-rotate":[j,g,f]}],invert:[{invert:["",j,g,f]}],saturate:[{saturate:[j,g,f]}],sepia:[{sepia:["",j,g,f]}],"backdrop-filter":[{"backdrop-filter":["","none",g,f]}],"backdrop-blur":[{"backdrop-blur":Ne()}],"backdrop-brightness":[{"backdrop-brightness":[j,g,f]}],"backdrop-contrast":[{"backdrop-contrast":[j,g,f]}],"backdrop-grayscale":[{"backdrop-grayscale":["",j,g,f]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[j,g,f]}],"backdrop-invert":[{"backdrop-invert":["",j,g,f]}],"backdrop-opacity":[{"backdrop-opacity":[j,g,f]}],"backdrop-saturate":[{"backdrop-saturate":[j,g,f]}],"backdrop-sepia":[{"backdrop-sepia":["",j,g,f]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":p()}],"border-spacing-x":[{"border-spacing-x":p()}],"border-spacing-y":[{"border-spacing-y":p()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",g,f]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[j,"initial",g,f]}],ease:[{ease:["linear","initial",N,g,f]}],delay:[{delay:[j,g,f]}],animate:[{animate:["none",B,g,f]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[L,g,f]}],"perspective-origin":[{"perspective-origin":ae()}],rotate:[{rotate:ge()}],"rotate-x":[{"rotate-x":ge()}],"rotate-y":[{"rotate-y":ge()}],"rotate-z":[{"rotate-z":ge()}],scale:[{scale:le()}],"scale-x":[{"scale-x":le()}],"scale-y":[{"scale-y":le()}],"scale-z":[{"scale-z":le()}],"scale-3d":["scale-3d"],skew:[{skew:Ae()}],"skew-x":[{"skew-x":Ae()}],"skew-y":[{"skew-y":Ae()}],transform:[{transform:[g,f,"","none","gpu","cpu"]}],"transform-origin":[{origin:ae()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:ve()}],"translate-x":[{"translate-x":ve()}],"translate-y":[{"translate-y":ve()}],"translate-z":[{"translate-z":ve()}],"translate-none":["translate-none"],zoom:[{zoom:[pe,g,f]}],accent:[{accent:h()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:h()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",g,f]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scrollbar-thumb-color":[{"scrollbar-thumb":h()}],"scrollbar-track-color":[{"scrollbar-track":h()}],"scrollbar-gutter":[{"scrollbar-gutter":["auto","stable","both"]}],"scrollbar-w":[{scrollbar:["auto","thin","none"]}],"scroll-m":[{"scroll-m":p()}],"scroll-mx":[{"scroll-mx":p()}],"scroll-my":[{"scroll-my":p()}],"scroll-ms":[{"scroll-ms":p()}],"scroll-me":[{"scroll-me":p()}],"scroll-mbs":[{"scroll-mbs":p()}],"scroll-mbe":[{"scroll-mbe":p()}],"scroll-mt":[{"scroll-mt":p()}],"scroll-mr":[{"scroll-mr":p()}],"scroll-mb":[{"scroll-mb":p()}],"scroll-ml":[{"scroll-ml":p()}],"scroll-p":[{"scroll-p":p()}],"scroll-px":[{"scroll-px":p()}],"scroll-py":[{"scroll-py":p()}],"scroll-ps":[{"scroll-ps":p()}],"scroll-pe":[{"scroll-pe":p()}],"scroll-pbs":[{"scroll-pbs":p()}],"scroll-pbe":[{"scroll-pbe":p()}],"scroll-pt":[{"scroll-pt":p()}],"scroll-pr":[{"scroll-pr":p()}],"scroll-pb":[{"scroll-pb":p()}],"scroll-pl":[{"scroll-pl":p()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",g,f]}],fill:[{fill:["none",...h()]}],"stroke-w":[{stroke:[j,Oe,_e,vt]}],stroke:[{stroke:["none",...h()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{"container-named":["container-type"],overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","inset-bs","inset-be","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pbs","pbe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mbs","mbe","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-bs","border-w-be","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-bs","border-color-be","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mbs","scroll-mbe","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pbs","scroll-pbe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},postfixLookupClassGroups:["container-type"],orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},nr=Do(ar);function ee(...e){return nr(Xt(e))}const ir=Ws,lr=Hs,cr=b.forwardRef(({className:e,inset:t,children:s,...o},i)=>r.jsxs(At,{ref:i,className:ee("flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",t&&"pl-8",e),...o,children:[s,r.jsx(Fs,{className:"ml-auto"})]}));cr.displayName=At.displayName;const dr=b.forwardRef(({className:e,...t},s)=>r.jsx(It,{ref:s,className:ee("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...t}));dr.displayName=It.displayName;const ms=b.forwardRef(({className:e,sideOffset:t=4,...s},o)=>r.jsx(Vs,{children:r.jsx(Ot,{ref:o,sideOffset:t,className:ee("z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",e),...s})}));ms.displayName=Ot.displayName;const De=b.forwardRef(({className:e,inset:t,...s},o)=>r.jsx(Lt,{ref:o,className:ee("relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0",t&&"pl-8",e),...s}));De.displayName=Lt.displayName;const ur=b.forwardRef(({className:e,children:t,checked:s,...o},i)=>r.jsxs(Dt,{ref:i,className:ee("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),checked:s,...o,children:[r.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:r.jsx(Mt,{children:r.jsx(Us,{className:"h-4 w-4"})})}),t]}));ur.displayName=Dt.displayName;const mr=b.forwardRef(({className:e,children:t,...s},o)=>r.jsxs(Bt,{ref:o,className:ee("relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",e),...s,children:[r.jsx("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:r.jsx(Mt,{children:r.jsx(Gs,{className:"h-2 w-2 fill-current"})})}),t]}));mr.displayName=Bt.displayName;const pr=b.forwardRef(({className:e,inset:t,...s},o)=>r.jsx($t,{ref:o,className:ee("px-2 py-1.5 text-sm font-semibold",t&&"pl-8",e),...s}));pr.displayName=$t.displayName;const tt=b.forwardRef(({className:e,...t},s)=>r.jsx(Ft,{ref:s,className:ee("-mx-1 my-1 h-px bg-muted",e),...t}));tt.displayName=Ft.displayName;const ps="j13-cache-boards",fs="j13-cache-stats";function hs(e){try{const t=sessionStorage.getItem(e);return t?JSON.parse(t):null}catch{return null}}function gs(e,t){try{sessionStorage.setItem(e,JSON.stringify(t))}catch{}}function jt(){return hs(ps)??[]}function St(){return hs(fs)}function fr(e){gs(ps,e)}function hr(e){gs(fs,e)}const gr=[{key:"latest",label:"最新发帖",hint:"按发布时间",icon:Ys},{key:"reply",label:"最新回复",hint:"最近有人回复",icon:qs},{key:"hot",label:"热门讨论",hint:"按互动热度",icon:Js}];function bs(e){return e==="reply"||e==="hot"?e:"latest"}function He(e,t="latest"){const s=new URLSearchParams;e&&s.set("board",String(e)),t!=="latest"&&s.set("sort",t);const o=s.toString();return o?`/?${o}`:"/"}function Sa({value:e,onChange:t,postTotal:s}){return r.jsxs("div",{className:"feed-toolbar",children:[r.jsx("div",{className:"feed-sort-bar",role:"tablist","aria-label":"帖子排序",children:gr.map(({key:o,label:i,hint:l,icon:n})=>r.jsxs("button",{type:"button",role:"tab","aria-selected":e===o,title:`${i} · ${l}`,className:ee("feed-sort-tab",e===o&&"active"),onClick:()=>t(o),children:[r.jsx(n,{"aria-hidden":!0}),r.jsx("span",{className:"feed-sort-tab__label",children:i})]},o))}),s!=null&&r.jsxs("span",{className:"feed-toolbar__count",children:["共 ",s," 条"]})]})}const xs="j13-feed-cache:";function ys(e,t,s){return`${xs}${e}:${t}:${s}`}function Na(e,t,s){try{const o=sessionStorage.getItem(ys(e,t,s));return o?JSON.parse(o):null}catch{return null}}function Ea(e,t,s,o){try{sessionStorage.setItem(ys(e,t,s),JSON.stringify(o))}catch{}}function br(){try{for(let e=sessionStorage.length-1;e>=0;e--){const t=sessionStorage.key(e);t!=null&&t.startsWith(xs)&&sessionStorage.removeItem(t)}}catch{}}const xr="feed-reset";function Me(e,t){br(),window.dispatchEvent(new Event(xr)),e(t,{state:{refreshFeed:!0}})}const yr=["/post/","/profile"];function vs(e){return yr.some(t=>e.startsWith(t))}function vr(e,t){return vs(e)?null:e.startsWith("/favorites")?"favorites":e.startsWith("/admin")?"admin":t===0?"all":String(t)}function wr({boards:e,activeBoard:t,onSelectBoard:s}){const o=qe(),i=Pt(),[l]=Rt(),n=bs(l.get("sort")),{user:d}=Je(),m=(d==null?void 0:d.role)==="admin",c=vr(i.pathname,t),x=(a,E,T,R)=>r.jsxs("button",{type:"button",className:ee("sidebar-nav-item",c!=null&&c===a&&"active"),onClick:R,children:[T,r.jsx("span",{className:"flex-1 truncate",children:E})]},a);return r.jsxs("aside",{className:"sidebar",children:[r.jsx("div",{className:"sidebar-section",children:"浏览"}),r.jsxs("nav",{className:"sidebar-nav",children:[x("all","全部帖子",r.jsx(Ks,{}),()=>{s(0),Me(o,He(0,n))}),d&&x("favorites","我的收藏",r.jsx(Xs,{}),()=>o("/favorites"))]}),e.length>0&&r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"sidebar-section",style:{marginTop:8},children:"板块"}),r.jsx("nav",{className:"sidebar-nav",children:e.map(a=>r.jsx("button",{type:"button",className:ee("sidebar-nav-item",c!=null&&c===String(a.id)&&"active"),onClick:()=>{s(a.id),Me(o,He(a.id,n))},children:r.jsx("span",{className:"flex-1 truncate",children:a.name})},a.id))})]}),m&&r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"sidebar-section",style:{marginTop:8},children:"管理"}),r.jsx("nav",{className:"sidebar-nav",children:x("admin","管理后台",r.jsx(Vt,{}),()=>o("/admin/dashboard"))})]})]})}function kr({hot:e,notifications:t,online:s,onPostClick:o}){const i=(e==null?void 0:e.slice(0,8))??[],l=(t==null?void 0:t.slice(0,6))??[],n=(s==null?void 0:s.users)??[];return r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"widget-card",children:[r.jsx("div",{className:"widget-card-head",children:"🔥 热门帖子"}),r.jsx("div",{className:"widget-card-body",children:i.length===0?r.jsx("div",{style:{fontSize:13,color:"var(--color-text-3)",padding:"8px 0"},children:"暂无数据"}):i.map((d,m)=>r.jsxs("div",{className:"widget-item",onClick:()=>o(d.id),children:[r.jsx("span",{style:{color:m<3?"#e74c3c":"var(--color-text-3)",fontWeight:600,minWidth:18},children:m+1}),r.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:d.title})]},d.id))})]}),r.jsxs("div",{className:"widget-card",children:[r.jsx("div",{className:"widget-card-head",children:"📢 最新动态"}),r.jsx("div",{className:"widget-card-body",children:l.length===0?r.jsx("div",{style:{fontSize:13,color:"var(--color-text-3)",padding:"8px 0"},children:"暂无动态"}):l.map(d=>r.jsxs("div",{className:"widget-item",onClick:()=>o(d.id),children:[r.jsx("span",{style:{flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:d.title}),r.jsx("span",{style:{fontSize:11,color:"var(--color-text-4)",flexShrink:0},children:d.created_at})]},d.id))})]}),r.jsxs("div",{className:"widget-card",children:[r.jsxs("div",{className:"widget-card-head",children:["👀 当前浏览 ",(s==null?void 0:s.count)??"—"," 人"]}),r.jsxs("div",{className:"widget-card-body",children:[r.jsxs("div",{style:{fontSize:12,color:"var(--color-text-3)",marginBottom:8},children:["会员 ",(s==null?void 0:s.members)??0," · 游客 ",(s==null?void 0:s.guests)??0]}),r.jsxs("div",{className:"widget-online-list",children:[n.map(d=>{var m;return r.jsx("span",{className:"widget-online-avatar",title:d.nickname,children:d.avatar?r.jsx("img",{src:d.avatar,alt:""}):((m=d.nickname)==null?void 0:m[0])||"?"},d.id)}),n.length===0&&r.jsx("span",{style:{fontSize:13,color:"var(--color-text-3)"},children:"暂无会员在线"})]})]})]}),r.jsx("div",{className:"widget-card widget-card--about",children:r.jsx("div",{className:"widget-card-body",children:r.jsxs("p",{className:"widget-about-text",children:[r.jsx("strong",{children:"姜十三论坛"}),"拾三一隅,自在交流。轻量社区,专为小圈子打造。"]})})})]})}const ws={post_title_max:128,post_tags_max:256,post_content_max:5e4,comment_max:5e3,search_keyword_min:1,search_keyword_max:50,password_min_len:6,avatar_max_mb:2};let ze=null,Le=null;function jr(){return ze?Promise.resolve(ze):Le||(Le=he.forumLimits().then(e=>(ze=e,e)).catch(()=>ws).finally(()=>{Le=null}),Le)}function Sr(){const[e,t]=b.useState(ze??ws),[s,o]=b.useState(!ze);return b.useEffect(()=>{jr().then(t).finally(()=>o(!1))},[]),{limits:e,loading:s}}function _a(){ze=null}function Nr(e){if(typeof document>"u")return;let t=document.head||document.getElementsByTagName("head")[0],s=document.createElement("style");s.type="text/css",t.appendChild(s),s.styleSheet?s.styleSheet.cssText=e:s.appendChild(document.createTextNode(e))}const Er=e=>{switch(e){case"success":return Cr;case"info":return Rr;case"warning":return Pr;case"error":return zr;default:return null}},_r=Array(12).fill(0),Tr=({visible:e,className:t})=>u.createElement("div",{className:["sonner-loading-wrapper",t].filter(Boolean).join(" "),"data-visible":e},u.createElement("div",{className:"sonner-spinner"},_r.map((s,o)=>u.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${o}`})))),Cr=u.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},u.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),Pr=u.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},u.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),Rr=u.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},u.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),zr=u.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},u.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),Ar=u.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},u.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),u.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),Ir=()=>{const[e,t]=u.useState(document.hidden);return u.useEffect(()=>{const s=()=>{t(document.hidden)};return document.addEventListener("visibilitychange",s),()=>window.removeEventListener("visibilitychange",s)},[]),e};let st=1;class Or{constructor(){this.subscribe=t=>(this.subscribers.push(t),()=>{const s=this.subscribers.indexOf(t);this.subscribers.splice(s,1)}),this.publish=t=>{this.subscribers.forEach(s=>s(t))},this.addToast=t=>{this.publish(t),this.toasts=[...this.toasts,t]},this.create=t=>{var s;const{message:o,...i}=t,l=typeof(t==null?void 0:t.id)=="number"||((s=t.id)==null?void 0:s.length)>0?t.id:st++,n=this.toasts.find(m=>m.id===l),d=t.dismissible===void 0?!0:t.dismissible;return this.dismissedToasts.has(l)&&this.dismissedToasts.delete(l),n?this.toasts=this.toasts.map(m=>m.id===l?(this.publish({...m,...t,id:l,title:o}),{...m,...t,id:l,dismissible:d,title:o}):m):this.addToast({title:o,...i,dismissible:d,id:l}),l},this.dismiss=t=>(t?(this.dismissedToasts.add(t),requestAnimationFrame(()=>this.subscribers.forEach(s=>s({id:t,dismiss:!0})))):this.toasts.forEach(s=>{this.subscribers.forEach(o=>o({id:s.id,dismiss:!0}))}),t),this.message=(t,s)=>this.create({...s,message:t}),this.error=(t,s)=>this.create({...s,message:t,type:"error"}),this.success=(t,s)=>this.create({...s,type:"success",message:t}),this.info=(t,s)=>this.create({...s,type:"info",message:t}),this.warning=(t,s)=>this.create({...s,type:"warning",message:t}),this.loading=(t,s)=>this.create({...s,type:"loading",message:t}),this.promise=(t,s)=>{if(!s)return;let o;s.loading!==void 0&&(o=this.create({...s,promise:t,type:"loading",message:s.loading,description:typeof s.description!="function"?s.description:void 0}));const i=Promise.resolve(t instanceof Function?t():t);let l=o!==void 0,n;const d=i.then(async c=>{if(n=["resolve",c],u.isValidElement(c))l=!1,this.create({id:o,type:"default",message:c});else if(Dr(c)&&!c.ok){l=!1;const a=typeof s.error=="function"?await s.error(`HTTP error! status: ${c.status}`):s.error,E=typeof s.description=="function"?await s.description(`HTTP error! status: ${c.status}`):s.description,R=typeof a=="object"&&!u.isValidElement(a)?a:{message:a};this.create({id:o,type:"error",description:E,...R})}else if(c instanceof Error){l=!1;const a=typeof s.error=="function"?await s.error(c):s.error,E=typeof s.description=="function"?await s.description(c):s.description,R=typeof a=="object"&&!u.isValidElement(a)?a:{message:a};this.create({id:o,type:"error",description:E,...R})}else if(s.success!==void 0){l=!1;const a=typeof s.success=="function"?await s.success(c):s.success,E=typeof s.description=="function"?await s.description(c):s.description,R=typeof a=="object"&&!u.isValidElement(a)?a:{message:a};this.create({id:o,type:"success",description:E,...R})}}).catch(async c=>{if(n=["reject",c],s.error!==void 0){l=!1;const x=typeof s.error=="function"?await s.error(c):s.error,a=typeof s.description=="function"?await s.description(c):s.description,T=typeof x=="object"&&!u.isValidElement(x)?x:{message:x};this.create({id:o,type:"error",description:a,...T})}}).finally(()=>{l&&(this.dismiss(o),o=void 0),s.finally==null||s.finally.call(s)}),m=()=>new Promise((c,x)=>d.then(()=>n[0]==="reject"?x(n[1]):c(n[1])).catch(x));return typeof o!="string"&&typeof o!="number"?{unwrap:m}:Object.assign(o,{unwrap:m})},this.custom=(t,s)=>{const o=(s==null?void 0:s.id)||st++;return this.create({jsx:t(o),id:o,...s}),o},this.getActiveToasts=()=>this.toasts.filter(t=>!this.dismissedToasts.has(t.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}}const Z=new Or,Lr=(e,t)=>{const s=(t==null?void 0:t.id)||st++;return Z.addToast({title:e,...t,id:s}),s},Dr=e=>e&&typeof e=="object"&&"ok"in e&&typeof e.ok=="boolean"&&"status"in e&&typeof e.status=="number",Mr=Lr,Br=()=>Z.toasts,$r=()=>Z.getActiveToasts(),Ze=Object.assign(Mr,{success:Z.success,info:Z.info,warning:Z.warning,error:Z.error,custom:Z.custom,message:Z.message,promise:Z.promise,dismiss:Z.dismiss,loading:Z.loading},{getHistory:Br,getToasts:$r});Nr("[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}");function Ge(e){return e.label!==void 0}const Fr=3,Vr="24px",Ur="16px",Nt=4e3,Gr=356,Wr=14,Hr=45,Yr=200;function fe(...e){return e.filter(Boolean).join(" ")}function qr(e){const[t,s]=e.split("-"),o=[];return t&&o.push(t),s&&o.push(s),o}const Jr=e=>{var t,s,o,i,l,n,d,m,c;const{invert:x,toast:a,unstyled:E,interacting:T,setHeights:R,visibleToasts:L,heights:O,index:N,toasts:B,expanded:X,removeToast:te,defaultRichColors:ae,closeButton:$,style:D,cancelButtonStyle:p,actionButtonStyle:M,className:ue="",descriptionClassName:J="",duration:K,position:W,gap:me,expandByDefault:Q,classNames:w,icons:C,closeButtonAriaLabel:v="Close toast"}=e,[F,h]=u.useState(null),[Y,Se]=u.useState(null),[_,A]=u.useState(!1),[S,P]=u.useState(!1),[ie,z]=u.useState(!1),[I,Ne]=u.useState(!1),[ge,le]=u.useState(!1),[Ae,ve]=u.useState(0),[js,at]=u.useState(0),Ie=u.useRef(a.duration||K||Nt),nt=u.useRef(null),be=u.useRef(null),Ss=N===0,Ns=N+1<=L,se=a.type,Ce=a.dismissible!==!1,Es=a.className||"",_s=a.descriptionClassName||"",Be=u.useMemo(()=>O.findIndex(k=>k.toastId===a.id)||0,[O,a.id]),Ts=u.useMemo(()=>{var k;return(k=a.closeButton)!=null?k:$},[a.closeButton,$]),it=u.useMemo(()=>a.duration||K||Nt,[a.duration,K]),Ke=u.useRef(0),Pe=u.useRef(0),lt=u.useRef(0),Re=u.useRef(null),[Cs,Ps]=W.split("-"),ct=u.useMemo(()=>O.reduce((k,U,q)=>q>=Be?k:k+U.height,0),[O,Be]),dt=Ir(),Rs=a.invert||x,Xe=se==="loading";Pe.current=u.useMemo(()=>Be*me+ct,[Be,ct]),u.useEffect(()=>{Ie.current=it},[it]),u.useEffect(()=>{A(!0)},[]),u.useEffect(()=>{const k=be.current;if(k){const U=k.getBoundingClientRect().height;return at(U),R(q=>[{toastId:a.id,height:U,position:a.position},...q]),()=>R(q=>q.filter(oe=>oe.toastId!==a.id))}},[R,a.id]),u.useLayoutEffect(()=>{if(!_)return;const k=be.current,U=k.style.height;k.style.height="auto";const q=k.getBoundingClientRect().height;k.style.height=U,at(q),R(oe=>oe.find(H=>H.toastId===a.id)?oe.map(H=>H.toastId===a.id?{...H,height:q}:H):[{toastId:a.id,height:q,position:a.position},...oe])},[_,a.title,a.description,R,a.id,a.jsx,a.action,a.cancel]);const we=u.useCallback(()=>{P(!0),ve(Pe.current),R(k=>k.filter(U=>U.toastId!==a.id)),setTimeout(()=>{te(a)},Yr)},[a,te,R,Pe]);u.useEffect(()=>{if(a.promise&&se==="loading"||a.duration===1/0||a.type==="loading")return;let k;return X||T||dt?(()=>{if(lt.current{Ie.current!==1/0&&(Ke.current=new Date().getTime(),k=setTimeout(()=>{a.onAutoClose==null||a.onAutoClose.call(a,a),we()},Ie.current))})(),()=>clearTimeout(k)},[X,T,a,se,dt,we]),u.useEffect(()=>{a.delete&&(we(),a.onDismiss==null||a.onDismiss.call(a,a))},[we,a.delete]);function zs(){var k;if(C!=null&&C.loading){var U;return u.createElement("div",{className:fe(w==null?void 0:w.loader,a==null||(U=a.classNames)==null?void 0:U.loader,"sonner-loader"),"data-visible":se==="loading"},C.loading)}return u.createElement(Tr,{className:fe(w==null?void 0:w.loader,a==null||(k=a.classNames)==null?void 0:k.loader),visible:se==="loading"})}const As=a.icon||(C==null?void 0:C[se])||Er(se);var ut,mt;return u.createElement("li",{tabIndex:0,ref:be,className:fe(ue,Es,w==null?void 0:w.toast,a==null||(t=a.classNames)==null?void 0:t.toast,w==null?void 0:w.default,w==null?void 0:w[se],a==null||(s=a.classNames)==null?void 0:s[se]),"data-sonner-toast":"","data-rich-colors":(ut=a.richColors)!=null?ut:ae,"data-styled":!(a.jsx||a.unstyled||E),"data-mounted":_,"data-promise":!!a.promise,"data-swiped":ge,"data-removed":S,"data-visible":Ns,"data-y-position":Cs,"data-x-position":Ps,"data-index":N,"data-front":Ss,"data-swiping":ie,"data-dismissible":Ce,"data-type":se,"data-invert":Rs,"data-swipe-out":I,"data-swipe-direction":Y,"data-expanded":!!(X||Q&&_),"data-testid":a.testId,style:{"--index":N,"--toasts-before":N,"--z-index":B.length-N,"--offset":`${S?Ae:Pe.current}px`,"--initial-height":Q?"auto":`${js}px`,...D,...a.style},onDragEnd:()=>{z(!1),h(null),Re.current=null},onPointerDown:k=>{k.button!==2&&(Xe||!Ce||(nt.current=new Date,ve(Pe.current),k.target.setPointerCapture(k.pointerId),k.target.tagName!=="BUTTON"&&(z(!0),Re.current={x:k.clientX,y:k.clientY})))},onPointerUp:()=>{var k,U,q;if(I||!Ce)return;Re.current=null;const oe=Number(((k=be.current)==null?void 0:k.style.getPropertyValue("--swipe-amount-x").replace("px",""))||0),$e=Number(((U=be.current)==null?void 0:U.style.getPropertyValue("--swipe-amount-y").replace("px",""))||0),H=new Date().getTime()-((q=nt.current)==null?void 0:q.getTime()),ne=F==="x"?oe:$e,Fe=Math.abs(ne)/H;if(Math.abs(ne)>=Hr||Fe>.11){ve(Pe.current),a.onDismiss==null||a.onDismiss.call(a,a),Se(F==="x"?oe>0?"right":"left":$e>0?"down":"up"),we(),Ne(!0);return}else{var ce,de;(ce=be.current)==null||ce.style.setProperty("--swipe-amount-x","0px"),(de=be.current)==null||de.style.setProperty("--swipe-amount-y","0px")}le(!1),z(!1),h(null)},onPointerMove:k=>{var U,q,oe;if(!Re.current||!Ce||((U=window.getSelection())==null?void 0:U.toString().length)>0)return;const H=k.clientY-Re.current.y,ne=k.clientX-Re.current.x;var Fe;const ce=(Fe=e.swipeDirections)!=null?Fe:qr(W);!F&&(Math.abs(ne)>1||Math.abs(H)>1)&&h(Math.abs(ne)>Math.abs(H)?"x":"y");let de={x:0,y:0};const pt=Ee=>1/(1.5+Math.abs(Ee)/20);if(F==="y"){if(ce.includes("top")||ce.includes("bottom"))if(ce.includes("top")&&H<0||ce.includes("bottom")&&H>0)de.y=H;else{const Ee=H*pt(H);de.y=Math.abs(Ee)0)de.x=ne;else{const Ee=ne*pt(ne);de.x=Math.abs(Ee)0||Math.abs(de.y)>0)&&le(!0),(q=be.current)==null||q.style.setProperty("--swipe-amount-x",`${de.x}px`),(oe=be.current)==null||oe.style.setProperty("--swipe-amount-y",`${de.y}px`)}},Ts&&!a.jsx&&se!=="loading"?u.createElement("button",{"aria-label":v,"data-disabled":Xe,"data-close-button":!0,onClick:Xe||!Ce?()=>{}:()=>{we(),a.onDismiss==null||a.onDismiss.call(a,a)},className:fe(w==null?void 0:w.closeButton,a==null||(o=a.classNames)==null?void 0:o.closeButton)},(mt=C==null?void 0:C.close)!=null?mt:Ar):null,(se||a.icon||a.promise)&&a.icon!==null&&((C==null?void 0:C[se])!==null||a.icon)?u.createElement("div",{"data-icon":"",className:fe(w==null?void 0:w.icon,a==null||(i=a.classNames)==null?void 0:i.icon)},a.promise||a.type==="loading"&&!a.icon?a.icon||zs():null,a.type!=="loading"?As:null):null,u.createElement("div",{"data-content":"",className:fe(w==null?void 0:w.content,a==null||(l=a.classNames)==null?void 0:l.content)},u.createElement("div",{"data-title":"",className:fe(w==null?void 0:w.title,a==null||(n=a.classNames)==null?void 0:n.title)},a.jsx?a.jsx:typeof a.title=="function"?a.title():a.title),a.description?u.createElement("div",{"data-description":"",className:fe(J,_s,w==null?void 0:w.description,a==null||(d=a.classNames)==null?void 0:d.description)},typeof a.description=="function"?a.description():a.description):null),u.isValidElement(a.cancel)?a.cancel:a.cancel&&Ge(a.cancel)?u.createElement("button",{"data-button":!0,"data-cancel":!0,style:a.cancelButtonStyle||p,onClick:k=>{Ge(a.cancel)&&Ce&&(a.cancel.onClick==null||a.cancel.onClick.call(a.cancel,k),we())},className:fe(w==null?void 0:w.cancelButton,a==null||(m=a.classNames)==null?void 0:m.cancelButton)},a.cancel.label):null,u.isValidElement(a.action)?a.action:a.action&&Ge(a.action)?u.createElement("button",{"data-button":!0,"data-action":!0,style:a.actionButtonStyle||M,onClick:k=>{Ge(a.action)&&(a.action.onClick==null||a.action.onClick.call(a.action,k),!k.defaultPrevented&&we())},className:fe(w==null?void 0:w.actionButton,a==null||(c=a.classNames)==null?void 0:c.actionButton)},a.action.label):null)};function Et(){if(typeof window>"u"||typeof document>"u")return"ltr";const e=document.documentElement.getAttribute("dir");return e==="auto"||!e?window.getComputedStyle(document.documentElement).direction:e}function Kr(e,t){const s={};return[e,t].forEach((o,i)=>{const l=i===1,n=l?"--mobile-offset":"--offset",d=l?Ur:Vr;function m(c){["top","right","bottom","left"].forEach(x=>{s[`${n}-${x}`]=typeof c=="number"?`${c}px`:c})}typeof o=="number"||typeof o=="string"?m(o):typeof o=="object"?["top","right","bottom","left"].forEach(c=>{o[c]===void 0?s[`${n}-${c}`]=d:s[`${n}-${c}`]=typeof o[c]=="number"?`${o[c]}px`:o[c]}):m(d)}),s}const Xr=u.forwardRef(function(t,s){const{id:o,invert:i,position:l="bottom-right",hotkey:n=["altKey","KeyT"],expand:d,closeButton:m,className:c,offset:x,mobileOffset:a,theme:E="light",richColors:T,duration:R,style:L,visibleToasts:O=Fr,toastOptions:N,dir:B=Et(),gap:X=Wr,icons:te,containerAriaLabel:ae="Notifications"}=t,[$,D]=u.useState([]),p=u.useMemo(()=>o?$.filter(_=>_.toasterId===o):$.filter(_=>!_.toasterId),[$,o]),M=u.useMemo(()=>Array.from(new Set([l].concat(p.filter(_=>_.position).map(_=>_.position)))),[p,l]),[ue,J]=u.useState([]),[K,W]=u.useState(!1),[me,Q]=u.useState(!1),[w,C]=u.useState(E!=="system"?E:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),v=u.useRef(null),F=n.join("+").replace(/Key/g,"").replace(/Digit/g,""),h=u.useRef(null),Y=u.useRef(!1),Se=u.useCallback(_=>{D(A=>{var S;return(S=A.find(P=>P.id===_.id))!=null&&S.delete||Z.dismiss(_.id),A.filter(({id:P})=>P!==_.id)})},[]);return u.useEffect(()=>Z.subscribe(_=>{if(_.dismiss){requestAnimationFrame(()=>{D(A=>A.map(S=>S.id===_.id?{...S,delete:!0}:S))});return}setTimeout(()=>{Ls.flushSync(()=>{D(A=>{const S=A.findIndex(P=>P.id===_.id);return S!==-1?[...A.slice(0,S),{...A[S],..._},...A.slice(S+1)]:[_,...A]})})})}),[$]),u.useEffect(()=>{if(E!=="system"){C(E);return}if(E==="system"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?C("dark"):C("light")),typeof window>"u")return;const _=window.matchMedia("(prefers-color-scheme: dark)");try{_.addEventListener("change",({matches:A})=>{C(A?"dark":"light")})}catch{_.addListener(({matches:S})=>{try{C(S?"dark":"light")}catch(P){console.error(P)}})}},[E]),u.useEffect(()=>{$.length<=1&&W(!1)},[$]),u.useEffect(()=>{const _=A=>{var S;if(n.every(z=>A[z]||A.code===z)){var ie;W(!0),(ie=v.current)==null||ie.focus()}A.code==="Escape"&&(document.activeElement===v.current||(S=v.current)!=null&&S.contains(document.activeElement))&&W(!1)};return document.addEventListener("keydown",_),()=>document.removeEventListener("keydown",_)},[n]),u.useEffect(()=>{if(v.current)return()=>{h.current&&(h.current.focus({preventScroll:!0}),h.current=null,Y.current=!1)}},[v.current]),u.createElement("section",{ref:s,"aria-label":`${ae} ${F}`,tabIndex:-1,"aria-live":"polite","aria-relevant":"additions text","aria-atomic":"false",suppressHydrationWarning:!0},M.map((_,A)=>{var S;const[P,ie]=_.split("-");return p.length?u.createElement("ol",{key:_,dir:B==="auto"?Et():B,tabIndex:-1,ref:v,className:c,"data-sonner-toaster":!0,"data-sonner-theme":w,"data-y-position":P,"data-x-position":ie,style:{"--front-toast-height":`${((S=ue[0])==null?void 0:S.height)||0}px`,"--width":`${Gr}px`,"--gap":`${X}px`,...L,...Kr(x,a)},onBlur:z=>{Y.current&&!z.currentTarget.contains(z.relatedTarget)&&(Y.current=!1,h.current&&(h.current.focus({preventScroll:!0}),h.current=null))},onFocus:z=>{z.target instanceof HTMLElement&&z.target.dataset.dismissible==="false"||Y.current||(Y.current=!0,h.current=z.relatedTarget)},onMouseEnter:()=>W(!0),onMouseMove:()=>W(!0),onMouseLeave:()=>{me||W(!1)},onDragEnd:()=>W(!1),onPointerDown:z=>{z.target instanceof HTMLElement&&z.target.dataset.dismissible==="false"||Q(!0)},onPointerUp:()=>Q(!1)},p.filter(z=>!z.position&&A===0||z.position===_).map((z,I)=>{var Ne,ge;return u.createElement(Jr,{key:z.id,icons:te,index:I,toast:z,defaultRichColors:T,duration:(Ne=N==null?void 0:N.duration)!=null?Ne:R,className:N==null?void 0:N.className,descriptionClassName:N==null?void 0:N.descriptionClassName,invert:i,visibleToasts:O,closeButton:(ge=N==null?void 0:N.closeButton)!=null?ge:m,interacting:me,position:_,style:N==null?void 0:N.style,unstyled:N==null?void 0:N.unstyled,classNames:N==null?void 0:N.classNames,cancelButtonStyle:N==null?void 0:N.cancelButtonStyle,actionButtonStyle:N==null?void 0:N.actionButtonStyle,closeButtonAriaLabel:N==null?void 0:N.closeButtonAriaLabel,removeToast:Se,toasts:p.filter(le=>le.position==z.position),heights:ue.filter(le=>le.position==z.position),setHeights:J,expandByDefault:d,gap:X,expanded:K,swipeDirections:t.swipeDirections})})):null}))}),Ye={success:e=>Ze.success(e),error:e=>Ze.error(e),warning:e=>Ze.warning(e)};function Qr(){var C;const{user:e,loading:t,logout:s}=Je(),{theme:o,toggle:i}=Jt(),l=ho("(max-width: 768px)"),n=qe(),d=Pt(),[m]=Rt(),c=d.pathname.startsWith("/compose")||/\/post\/\d+\/edit$/.test(d.pathname),[x,a]=b.useState(()=>jt()),[E,T]=b.useState(()=>St()),[R,L]=b.useState(()=>jt().length>0||!!St()),[O,N]=b.useState([]),[B,X]=b.useState([]),[te,ae]=b.useState(null),[$,D]=b.useState(Number(m.get("board"))||0),[p,M]=b.useState(m.get("keyword")||""),ue=bs(m.get("sort")),{limits:J}=Sr();b.useEffect(()=>{D(Number(m.get("board"))||0)},[m]),b.useEffect(()=>{M(m.get("keyword")||"")},[m]);const K=b.useCallback(()=>{Promise.all([he.boards().then(v=>{const F=v.boards??[];return a(F),fr(F),F}).catch(()=>[]),he.stats().then(v=>(T(v),hr(v),v)).catch(()=>null)]).finally(()=>L(!0))},[]),W=b.useCallback(()=>{he.online().then(v=>{ae({count:v.count??0,members:v.members??0,guests:v.guests??0,users:Array.isArray(v.users)?v.users:[]})}).catch(()=>{})},[]);b.useEffect(()=>{K(),he.hotPosts().then(Y=>N(Array.isArray(Y.posts)?Y.posts:[])).catch(()=>{}),he.notifications().then(Y=>X(Array.isArray(Y.notifications)?Y.notifications:[])).catch(()=>{}),W(),he.presence().catch(()=>{});const v=setInterval(W,3e4),F=setInterval(()=>he.presence().catch(()=>{}),6e4),h=()=>K();return window.addEventListener("boards-refresh",h),()=>{clearInterval(v),clearInterval(F),window.removeEventListener("boards-refresh",h)}},[K,W]);const me=()=>{const v=p.trim();if(!v){n("/");return}const F=[...v].length;if(J.search_keyword_min>0&&F0&&F>J.search_keyword_max){Ye.warning(`搜索关键词最多 ${J.search_keyword_max} 个字`);return}n(`/?keyword=${encodeURIComponent(v)}`)},Q=((C=e==null?void 0:e.nickname)==null?void 0:C.charAt(0))||"?",w=vs(d.pathname)?-1:$;return r.jsx("div",{className:"app-shell",children:r.jsxs("div",{className:"app-frame",children:[r.jsx("header",{className:"app-header",children:r.jsxs("div",{className:"header-inner",children:[r.jsxs("button",{type:"button",className:"header-brand",onClick:()=>Me(n,"/"),children:[r.jsx("span",{className:"header-logo-mark",children:"姜"}),!l&&r.jsx("span",{className:"header-logo-text",children:"姜十三论坛"})]}),!c&&r.jsxs("div",{className:"header-search-wrap",children:[r.jsx(Qs,{className:"header-search-icon",size:16}),r.jsx("input",{className:"header-search-input",type:"search",placeholder:"搜索帖子...",value:p,onChange:v=>M(v.target.value),maxLength:J.search_keyword_max>0?J.search_keyword_max:void 0,onKeyDown:v=>v.key==="Enter"&&me()}),p&&r.jsx("button",{type:"button",className:"header-search-clear",onClick:()=>{M(""),n("/")},"aria-label":"清除搜索",children:"×"})]}),r.jsxs("div",{className:"header-actions",children:[!c&&r.jsxs("button",{type:"button",className:"header-compose-btn",onClick:()=>n(e?"/compose":"/login"),children:[r.jsx(Zs,{size:16}),!l&&r.jsx("span",{children:"发帖"})]}),r.jsxs("div",{className:"header-action-group",children:[r.jsx("button",{type:"button",className:"header-icon-btn",onClick:i,title:o==="light"?"切换暗色模式":"切换亮色模式",children:o==="light"?r.jsx(eo,{size:18}):r.jsx(to,{size:18})}),t?r.jsx("span",{className:"header-auth-slot header-auth-slot--loading","aria-hidden":!0}):e?r.jsxs(ir,{children:[r.jsx(lr,{asChild:!0,children:r.jsx("button",{type:"button",className:"header-user-btn",title:e.nickname,children:e.avatar?r.jsx("img",{src:e.avatar,alt:"",className:"header-user-avatar"}):r.jsx("span",{className:"header-user-initial",children:Q})})}),r.jsxs(ms,{align:"end",className:"w-40",children:[r.jsx(De,{onClick:()=>n("/profile"),children:"个人中心"}),r.jsx(De,{onClick:()=>n("/favorites"),children:"我的收藏"}),e.role==="admin"&&r.jsxs(r.Fragment,{children:[r.jsx(tt,{}),r.jsx(De,{onClick:()=>n("/admin/dashboard"),children:"管理后台"})]}),r.jsx(tt,{}),r.jsx(De,{onClick:()=>s().then(()=>n("/login")),children:"退出登录"})]})]}):r.jsx("button",{type:"button",className:"header-login-btn",onClick:()=>n("/login"),children:"登录"})]})]})]})}),r.jsxs("div",{className:`app-body${c?" app-body--compose":""}`,children:[!c&&r.jsx(wr,{boards:x,activeBoard:$,onSelectBoard:D}),r.jsxs("div",{className:`content-workspace${c?" content-workspace--compose":""}`,children:[r.jsxs("main",{className:`main-content${c?" main-content--compose":""}`,children:[l&&!c&&r.jsxs("div",{className:"mobile-board-bar",children:[r.jsx("span",{className:`board-chip ${w===0?"active":""}`,onClick:()=>{D(0),Me(n,He(0,ue))},children:"全部"}),x.map(v=>r.jsx("span",{className:`board-chip ${w===v.id?"active":""}`,onClick:()=>{D(v.id),Me(n,He(v.id,ue))},children:v.name},v.id))]}),r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(zt,{context:{boardId:$,keyword:m.get("keyword")||"",setBoardId:D,boards:x,stats:E,layoutReady:R,refreshBoards:K,isMobile:l}})})]}),!c&&r.jsx("aside",{className:"aside-panel",children:r.jsx(kr,{hot:O,notifications:B,online:te,onPostClick:v=>n(`/post/${v}`)})})]})]})]})})}const Zr={sm:"h-4 w-4",md:"h-5 w-5",lg:"h-8 w-8"};function ea({className:e,size:t="md"}){return r.jsx(Ut,{className:ee("animate-spin text-[var(--j13-green)]",Zr[t],e),"aria-label":"加载中"})}const ta=[{to:"/admin/dashboard",label:"仪表盘",icon:Vt},{to:"/admin/boards",label:"板块管理",icon:oo},{to:"/admin/posts",label:"帖子管理",icon:ro},{to:"/admin/comments",label:"评论管理",icon:ao},{to:"/admin/users",label:"用户管理",icon:no},{to:"/admin/settings",label:"系统设置",icon:io}];function sa(){const{user:e,loading:t}=Je(),s=qe();return b.useEffect(()=>{if(!t){if(!e){s("/login");return}e.role!=="admin"&&(Ye.warning("需要管理员权限"),s("/"))}},[e,t,s]),t?r.jsx("div",{className:"flex justify-center py-24",children:r.jsx(ea,{size:"lg"})}):!e||e.role!=="admin"?null:r.jsxs("div",{className:"admin-shell",children:[r.jsxs("header",{className:"admin-topbar",children:[r.jsxs("div",{className:"admin-topbar-brand",children:[r.jsx("div",{className:"admin-topbar-mark",children:"姜"}),r.jsxs("div",{children:[r.jsx("div",{className:"admin-topbar-title",children:"姜十三论坛"}),r.jsx("div",{className:"admin-topbar-sub",children:"管理后台"})]})]}),r.jsxs("div",{className:"admin-topbar-actions",children:[r.jsxs("button",{type:"button",className:"admin-link-btn",onClick:()=>s("/"),children:[r.jsx(so,{size:16}),"返回论坛"]}),r.jsx("span",{className:"admin-topbar-user",children:e.nickname})]})]}),r.jsxs("div",{className:"admin-body",children:[r.jsx("aside",{className:"admin-sidebar",children:ta.map(({to:o,label:i,icon:l})=>r.jsxs(Ds,{to:o,className:({isActive:n})=>ee("admin-nav-item",n&&"active"),children:[r.jsx(l,{size:16}),i]},o))}),r.jsx("main",{className:"admin-main",children:r.jsx(zt,{})})]})]})}function Ta(){const{user:e,loading:t}=Je(),s=qe();return b.useEffect(()=>{t||(e?e.role!=="admin"&&(Ye.warning("需要管理员权限"),s("/")):s("/login"))},[e,t,s]),{user:e,loading:t,ready:!t&&!!e&&e.role==="admin"}}const _t=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,Tt=Xt,oa=(e,t)=>s=>{var o;if((t==null?void 0:t.variants)==null)return Tt(e,s==null?void 0:s.class,s==null?void 0:s.className);const{variants:i,defaultVariants:l}=t,n=Object.keys(i).map(c=>{const x=s==null?void 0:s[c],a=l==null?void 0:l[c];if(x===null)return null;const E=_t(x)||_t(a);return i[c][E]}),d=s&&Object.entries(s).reduce((c,x)=>{let[a,E]=x;return E===void 0||(c[a]=E),c},{}),m=t==null||(o=t.compoundVariants)===null||o===void 0?void 0:o.reduce((c,x)=>{let{class:a,className:E,...T}=x;return Object.entries(T).every(R=>{let[L,O]=R;return Array.isArray(O)?O.includes({...l,...d}[L]):{...l,...d}[L]===O})?[...c,a,E]:c},[]);return Tt(e,n,m,s==null?void 0:s.class,s==null?void 0:s.className)},ra=oa("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),ks=b.forwardRef(({className:e,variant:t,size:s,asChild:o=!1,loading:i,children:l,disabled:n,...d},m)=>{const c=o?lo:"button";return r.jsxs(c,{className:ee(ra({variant:t,size:s,className:e})),ref:m,disabled:n||i,...d,children:[i?r.jsx(Ut,{className:"animate-spin"}):null,l]})});ks.displayName="Button";class aa extends b.Component{constructor(){super(...arguments);ft(this,"state",{error:null})}static getDerivedStateFromError(s){return{error:s}}componentDidCatch(s,o){console.error("[Jiang13Forum]",s,o.componentStack)}render(){return this.state.error?r.jsxs("div",{style:{padding:24,textAlign:"center"},children:[r.jsx("h3",{children:"页面渲染出错"}),r.jsx("p",{style:{color:"var(--color-text-3)",fontSize:13},children:this.state.error.message}),r.jsx(ks,{size:"sm",onClick:()=>{this.setState({error:null}),window.location.reload()},children:"刷新页面"})]}):this.props.children}}function na(){const{theme:e}=Jt();return r.jsx(Xr,{theme:e,position:"top-center",richColors:!0,closeButton:!0,toastOptions:{classNames:{toast:"font-sans"}}})}const ia=b.lazy(()=>re(()=>import("./HomePage-Bk9P_MHc.js"),__vite__mapDeps([0,1,2,3,4,5,6]))),la=b.lazy(()=>re(()=>import("./PostDetailPage-BXxbrPMM.js"),__vite__mapDeps([7,1,4,5,3,6,8,9]))),ca=b.lazy(()=>re(()=>import("./LoginPage-CCZinbxI.js"),__vite__mapDeps([10,1,11,5,12]))),da=b.lazy(()=>re(()=>import("./RegisterPage-CVXuCuRY.js"),__vite__mapDeps([13,1,11,5,12]))),Ct=b.lazy(()=>re(()=>import("./ComposePage-DOjc4_kJ.js"),__vite__mapDeps([14,1,8,9,5,15,12]))),ua=b.lazy(()=>re(()=>import("./BoardsManagePage-CBisP7fL.js"),__vite__mapDeps([16,1,11,5,12,17,3,15,18]))),ma=b.lazy(()=>re(()=>import("./ProfilePage-SfO7sDgP.js"),__vite__mapDeps([19,1,11,5,12,3,15]))),pa=b.lazy(()=>re(()=>import("./FavoritesPage-C0oxHajd.js"),__vite__mapDeps([20,1,6,5]))),fa=b.lazy(()=>re(()=>import("./AdminDashboardPage-biZSiZPA.js"),__vite__mapDeps([21,1,3,5]))),ha=b.lazy(()=>re(()=>import("./AdminPostsPage-CPPJRgyw.js"),__vite__mapDeps([22,1,12,3,18,5,6]))),ga=b.lazy(()=>re(()=>import("./AdminCommentsPage-8EpDyC2e.js"),__vite__mapDeps([23,1,3,18,5]))),ba=b.lazy(()=>re(()=>import("./AdminUsersPage-qrFcGy2M.js"),__vite__mapDeps([24,1,3,5]))),xa=b.lazy(()=>re(()=>import("./AdminSettingsPage-BPulW3i2.js"),__vite__mapDeps([25,1,12,17,5])));function ya(){return r.jsx(fo,{children:r.jsx(po,{children:r.jsxs(aa,{children:[r.jsx(Ms,{children:r.jsxs(Bs,{children:[r.jsx(G,{path:"/login",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(ca,{})})}),r.jsx(G,{path:"/register",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(da,{})})}),r.jsx(G,{path:"/boards",element:r.jsx(ht,{to:"/admin/boards",replace:!0})}),r.jsxs(G,{path:"/admin",element:r.jsx(sa,{}),children:[r.jsx(G,{index:!0,element:r.jsx(ht,{to:"/admin/dashboard",replace:!0})}),r.jsx(G,{path:"dashboard",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(fa,{})})}),r.jsx(G,{path:"boards",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(ua,{})})}),r.jsx(G,{path:"posts",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(ha,{})})}),r.jsx(G,{path:"comments",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(ga,{})})}),r.jsx(G,{path:"users",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(ba,{})})}),r.jsx(G,{path:"settings",element:r.jsx(b.Suspense,{fallback:r.jsx(ye,{}),children:r.jsx(xa,{})})})]}),r.jsxs(G,{element:r.jsx(Qr,{}),children:[r.jsx(G,{path:"/",element:r.jsx(ia,{})}),r.jsx(G,{path:"/post/:id",element:r.jsx(la,{})}),r.jsx(G,{path:"/post/:id/edit",element:r.jsx(Ct,{})}),r.jsx(G,{path:"/compose",element:r.jsx(Ct,{})}),r.jsx(G,{path:"/profile",element:r.jsx(ma,{})}),r.jsx(G,{path:"/favorites",element:r.jsx(pa,{})})]})]})}),r.jsx(na,{})]})})})}Ht(Wt());$s.createRoot(document.getElementById("root")).render(r.jsx(u.StrictMode,{children:r.jsx(ya,{})}));export{ks as B,xr as F,ea as S,he as a,Sa as b,br as c,Me as d,He as e,ee as f,Na as g,Sr as h,Ta as i,oa as j,ra as k,_a as l,Ye as n,bs as p,Ea as s,Je as u}; diff --git a/embed_static/static/spa/assets/input-BjHCK3cg.js b/embed_static/static/spa/assets/input-Dsk6No-h.js similarity index 88% rename from embed_static/static/spa/assets/input-BjHCK3cg.js rename to embed_static/static/spa/assets/input-Dsk6No-h.js index 4ae82b2..83cbbb6 100644 --- a/embed_static/static/spa/assets/input-BjHCK3cg.js +++ b/embed_static/static/spa/assets/input-Dsk6No-h.js @@ -1 +1 @@ -import{r as t,j as i}from"./react-vendor-1fwFMt02.js";import{f as n}from"./index-kfMSnNdB.js";const a=t.forwardRef(({className:e,type:o,...r},s)=>i.jsx("input",{type:o,className:n("flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",e),ref:s,...r}));a.displayName="Input";export{a as I}; +import{r as t,j as i}from"./react-vendor-1fwFMt02.js";import{f as n}from"./index-BCHo3nLu.js";const a=t.forwardRef(({className:e,type:o,...r},s)=>i.jsx("input",{type:o,className:n("flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",e),ref:s,...r}));a.displayName="Input";export{a as I}; diff --git a/embed_static/static/spa/assets/textarea-5HbBKxKc.js b/embed_static/static/spa/assets/textarea-BPVvpwYr.js similarity index 86% rename from embed_static/static/spa/assets/textarea-5HbBKxKc.js rename to embed_static/static/spa/assets/textarea-BPVvpwYr.js index 852149a..6d596b2 100644 --- a/embed_static/static/spa/assets/textarea-5HbBKxKc.js +++ b/embed_static/static/spa/assets/textarea-BPVvpwYr.js @@ -1 +1 @@ -import{r as s,j as a}from"./react-vendor-1fwFMt02.js";import{f as t}from"./index-kfMSnNdB.js";const i=s.forwardRef(({className:e,...r},o)=>a.jsx("textarea",{className:t("flex min-h-[60px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",e),ref:o,...r}));i.displayName="Textarea";export{i as T}; +import{r as s,j as a}from"./react-vendor-1fwFMt02.js";import{f as t}from"./index-BCHo3nLu.js";const i=s.forwardRef(({className:e,...r},o)=>a.jsx("textarea",{className:t("flex min-h-[60px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",e),ref:o,...r}));i.displayName="Textarea";export{i as T}; diff --git a/embed_static/static/spa/index.html b/embed_static/static/spa/index.html index 49d4fd9..263adba 100644 --- a/embed_static/static/spa/index.html +++ b/embed_static/static/spa/index.html @@ -27,10 +27,10 @@ document.documentElement.style.colorScheme = theme; })(); - + - +
diff --git a/frontend/src/api/types.ts b/frontend/src/api/types.ts index 27158ac..b55fb44 100644 --- a/frontend/src/api/types.ts +++ b/frontend/src/api/types.ts @@ -105,6 +105,8 @@ export interface ForumLimits { search_keyword_max: number; page_size_default: number; page_size_max: number; + feed_max_pages: number; + feed_max_items: number; password_min_len: number; avatar_max_mb: number; } @@ -116,6 +118,9 @@ export interface ForumLimitsPublic { comment_max: number; search_keyword_min: number; search_keyword_max: number; + page_size_default: number; + feed_max_pages: number; + feed_max_items: number; password_min_len: number; avatar_max_mb: number; } diff --git a/frontend/src/components/VirtualPostList.tsx b/frontend/src/components/VirtualPostList.tsx index 46cf618..66169e0 100644 --- a/frontend/src/components/VirtualPostList.tsx +++ b/frontend/src/components/VirtualPostList.tsx @@ -1,6 +1,7 @@ import { useRef, useEffect, useLayoutEffect } from 'react'; import { useVirtualizer } from '@tanstack/react-virtual'; import { Spinner } from '@/components/ui/spinner'; +import { Button } from '@/components/ui/button'; import PostListItem from './PostListItem'; import type { PostItem } from '../api/types'; import type { FeedSort } from './FeedSortBar'; @@ -10,6 +11,9 @@ interface Props { sort?: FeedSort; loading: boolean; hasMore: boolean; + /** 是否允许滚动触底自动加载(达到上限后为 false) */ + canAutoLoad: boolean; + postTotal: number; onLoadMore: () => void; onSelect: (id: number) => void; /** 返回列表时恢复的滚动位置 */ @@ -25,6 +29,8 @@ export default function VirtualPostList({ sort = 'latest', loading, hasMore, + canAutoLoad, + postTotal, onLoadMore, onSelect, restoreScrollTop, @@ -42,6 +48,9 @@ export default function VirtualPostList({ overscan: 8, }); + const showHistoryPrompt = hasMore && !canAutoLoad && !loading; + const showEnd = !hasMore && posts.length > 0 && !loading; + useLayoutEffect(() => { if (resetScrollKey <= 0) return; const el = parentRef.current; @@ -69,13 +78,13 @@ export default function VirtualPostList({ if (!el) return; const onScroll = () => { onScrollTopChange?.(el.scrollTop); - if (el.scrollTop + el.clientHeight >= el.scrollHeight - 120 && hasMore && !loading) { + if (el.scrollTop + el.clientHeight >= el.scrollHeight - 120 && canAutoLoad && hasMore && !loading) { onLoadMore(); } }; el.addEventListener('scroll', onScroll); return () => el.removeEventListener('scroll', onScroll); - }, [hasMore, loading, onLoadMore, onScrollTopChange]); + }, [canAutoLoad, hasMore, loading, onLoadMore, onScrollTopChange]); return (
@@ -99,12 +108,22 @@ export default function VirtualPostList({ })}
{loading && ( -
+
)} - {!loading && !hasMore && posts.length > 0 && ( -
— 已加载全部 —
+ {showHistoryPrompt && ( +
+

+ 已显示 {posts.length} / {postTotal} 条 +

+ +
+ )} + {showEnd && ( +
— 已加载全部 —
)}
); diff --git a/frontend/src/hooks/useForumLimits.ts b/frontend/src/hooks/useForumLimits.ts index f0e8b64..7b149c1 100644 --- a/frontend/src/hooks/useForumLimits.ts +++ b/frontend/src/hooks/useForumLimits.ts @@ -9,6 +9,9 @@ const DEFAULT_LIMITS: ForumLimitsPublic = { comment_max: 5000, search_keyword_min: 1, search_keyword_max: 50, + page_size_default: 30, + feed_max_pages: 10, + feed_max_items: 300, password_min_len: 6, avatar_max_mb: 2, }; diff --git a/frontend/src/pages/HomePage.tsx b/frontend/src/pages/HomePage.tsx index bf653df..fae01de 100644 --- a/frontend/src/pages/HomePage.tsx +++ b/frontend/src/pages/HomePage.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useCallback, useRef } from 'react'; +import { useState, useEffect, useCallback, useRef, useMemo } from 'react'; import { useNavigate, useOutletContext, useSearchParams, useLocation } from 'react-router-dom'; import { notify } from '@/lib/notify'; import { api } from '../api/client'; @@ -7,6 +7,7 @@ import type { LayoutCtx } from '../layouts/MainLayout'; import VirtualPostList from '../components/VirtualPostList'; import FeedHeader from '../components/FeedHeader'; import FeedSortBar, { parseFeedSort, buildHomeUrl, type FeedSort } from '../components/FeedSortBar'; +import { useForumLimits } from '../hooks/useForumLimits'; import { getFeedCache, setFeedCache, @@ -21,6 +22,11 @@ export default function HomePage() { const location = useLocation(); const [params] = useSearchParams(); const ctx = useOutletContext(); + const { limits } = useForumLimits(); + const pageSize = limits.page_size_default; + const feedMaxPages = limits.feed_max_pages; + const feedMaxItems = limits.feed_max_items; + const boardId = Number(params.get('board')) || ctx?.boardId || 0; const keyword = params.get('keyword') || ''; const sort = parseFeedSort(params.get('sort')); @@ -38,6 +44,11 @@ export default function HomePage() { /** 主动刷新时不把旧列表/滚动位置写回 cache */ const skipCacheSaveRef = useRef(false); + const canAutoLoad = useMemo( + () => hasMore && page < feedMaxPages && posts.length < feedMaxItems, + [hasMore, page, feedMaxPages, posts.length, feedMaxItems], + ); + const resetFeedView = useCallback(() => { setRestoreScrollTop(null); scrollTopRef.current = 0; @@ -56,7 +67,7 @@ export default function HomePage() { try { const data = await api.posts({ page: p, - size: 30, + size: pageSize, board_id: boardId || '', keyword, sort: sort === 'latest' ? '' : sort, @@ -72,36 +83,32 @@ export default function HomePage() { } finally { setLoading(false); } - }, [boardId, keyword, sort]); + }, [boardId, keyword, sort, pageSize]); - /** 有缓存时静默拉取已加载页,更新置顶等状态同时保留滚动位置 */ - const revalidate = useCallback(async (maxPage: number) => { + /** 有缓存时静默刷新第 1 页,合并置顶等变化同时保留已加载的历史 */ + const revalidate = useCallback(async () => { try { - const all: PostItem[] = []; - let total = 0; - let hasMore = true; - for (let p = 1; p <= maxPage; p++) { - const data = await api.posts({ - page: p, - size: 30, - board_id: boardId || '', - keyword, - sort: sort === 'latest' ? '' : sort, - }); - const batch = Array.isArray(data.posts) ? data.posts : []; - all.push(...batch); - total = data.total ?? 0; - hasMore = !!data.has_more; - if (!data.has_more) break; - } - setPosts(all); - setPostTotal(total); - setHasMore(hasMore); - setPage(maxPage); + const data = await api.posts({ + page: 1, + size: pageSize, + board_id: boardId || '', + keyword, + sort: sort === 'latest' ? '' : sort, + }); + const fresh = Array.isArray(data.posts) ? data.posts : []; + const freshIds = new Set(fresh.map(p => p.id)); + setPosts(prev => [...fresh, ...prev.filter(p => !freshIds.has(p.id))]); + setPostTotal(data.total ?? 0); + setHasMore(!!data.has_more); } catch { // 静默失败,保留缓存数据 } - }, [boardId, keyword, sort]); + }, [boardId, keyword, sort, pageSize]); + + const loadNextPage = useCallback(() => { + if (loading || !hasMore) return; + load(page + 1); + }, [loading, hasMore, page, load]); useEffect(() => { const forceRefresh = (location.state as FeedNavState | null)?.refreshFeed; @@ -119,7 +126,7 @@ export default function HomePage() { setRestoreScrollTop(cached.scrollTop); scrollTopRef.current = cached.scrollTop; setLoading(false); - revalidate(cached.page); + revalidate(); return; } setRestoreScrollTop(null); @@ -193,7 +200,9 @@ export default function HomePage() { sort={sort} loading={loading} hasMore={hasMore} - onLoadMore={() => !loading && hasMore && load(page + 1)} + canAutoLoad={canAutoLoad} + postTotal={postTotal} + onLoadMore={loadNextPage} onSelect={(id) => nav(`/post/${id}`)} restoreScrollTop={restoreScrollTop} resetScrollKey={listResetKey} diff --git a/frontend/src/pages/admin/AdminSettingsPage.tsx b/frontend/src/pages/admin/AdminSettingsPage.tsx index 475234a..120e940 100644 --- a/frontend/src/pages/admin/AdminSettingsPage.tsx +++ b/frontend/src/pages/admin/AdminSettingsPage.tsx @@ -68,6 +68,8 @@ const SETTING_SECTIONS: SettingSection[] = [ { key: 'search_keyword_max', label: '关键词最长', unit: '字', min: 1 }, { key: 'page_size_default', label: '默认每页', unit: '条', min: 1 }, { key: 'page_size_max', label: '最大每页', unit: '条', min: 1 }, + { key: 'feed_max_pages', label: '首页自动加载页数', unit: '页', hint: '超出后需手动加载', min: 1 }, + { key: 'feed_max_items', label: '首页自动加载条数', unit: '条', hint: '与页数取先到上限', min: 1 }, ], }, { diff --git a/frontend/src/styles/global.css b/frontend/src/styles/global.css index 4b27cc1..0d8ae65 100644 --- a/frontend/src/styles/global.css +++ b/frontend/src/styles/global.css @@ -553,6 +553,31 @@ a:hover { text-decoration: underline; } .post-list-scroll::-webkit-scrollbar { display: none; } + +.feed-list-footer { + display: flex; + justify-content: center; + align-items: center; + padding: 16px 12px; +} + +.feed-list-footer--end { + font-size: 12px; + color: var(--color-text-3); + padding: 10px 12px; +} + +.feed-list-footer--history { + flex-direction: column; + gap: 10px; +} + +.feed-list-footer__hint { + margin: 0; + font-size: 12px; + color: var(--color-text-3); +} + .page-inner { padding: 20px 24px; max-width: 720px; } .page-inner-wide { padding: 20px 24px; } .page-title { font-size: 20px; font-weight: 600; margin: 0 0 4px; } diff --git a/service/settings.go b/service/settings.go index cd4ece3..ace6608 100644 --- a/service/settings.go +++ b/service/settings.go @@ -29,6 +29,9 @@ const ( SettingPageSizeDefault = "page_size_default" SettingPageSizeMax = "page_size_max" + SettingFeedMaxPages = "feed_max_pages" + SettingFeedMaxItems = "feed_max_items" + SettingPasswordMinLen = "password_min_len" SettingAvatarMaxMB = "avatar_max_mb" ) @@ -55,6 +58,9 @@ type ForumLimits struct { PageSizeDefault int `json:"page_size_default"` PageSizeMax int `json:"page_size_max"` + FeedMaxPages int `json:"feed_max_pages"` + FeedMaxItems int `json:"feed_max_items"` + PasswordMinLen int `json:"password_min_len"` AvatarMaxMB int `json:"avatar_max_mb"` } @@ -67,6 +73,9 @@ type ForumLimitsPublic struct { CommentMax int `json:"comment_max"` SearchKeywordMin int `json:"search_keyword_min"` SearchKeywordMax int `json:"search_keyword_max"` + PageSizeDefault int `json:"page_size_default"` + FeedMaxPages int `json:"feed_max_pages"` + FeedMaxItems int `json:"feed_max_items"` PasswordMinLen int `json:"password_min_len"` AvatarMaxMB int `json:"avatar_max_mb"` } @@ -99,6 +108,9 @@ var forumSettingDefs = []settingDef{ {SettingPageSizeDefault, "30", 1, 200}, {SettingPageSizeMax, "50", 1, 200}, + {SettingFeedMaxPages, "10", 1, 100}, + {SettingFeedMaxItems, "300", 1, 5000}, + {SettingPasswordMinLen, "6", 4, 128}, {SettingAvatarMaxMB, "2", 1, 20}, } @@ -176,6 +188,9 @@ func (s *ForumSettingsService) Limits() ForumLimits { PageSizeDefault: s.PageSizeDefault(), PageSizeMax: s.PageSizeMax(), + FeedMaxPages: s.FeedMaxPages(), + FeedMaxItems: s.FeedMaxItems(), + PasswordMinLen: s.PasswordMinLen(), AvatarMaxMB: s.AvatarMaxMB(), } @@ -190,6 +205,9 @@ func (s *ForumSettingsService) PublicLimits() ForumLimitsPublic { CommentMax: limits.CommentMax, SearchKeywordMin: limits.SearchKeywordMin, SearchKeywordMax: limits.SearchKeywordMax, + PageSizeDefault: limits.PageSizeDefault, + FeedMaxPages: limits.FeedMaxPages, + FeedMaxItems: limits.FeedMaxItems, PasswordMinLen: limits.PasswordMinLen, AvatarMaxMB: limits.AvatarMaxMB, } @@ -211,6 +229,8 @@ func (s *ForumSettingsService) UpdateLimits(in ForumLimits) error { SettingSearchKeywordMax: in.SearchKeywordMax, SettingPageSizeDefault: in.PageSizeDefault, SettingPageSizeMax: in.PageSizeMax, + SettingFeedMaxPages: in.FeedMaxPages, + SettingFeedMaxItems: in.FeedMaxItems, SettingPasswordMinLen: in.PasswordMinLen, SettingAvatarMaxMB: in.AvatarMaxMB, } @@ -262,6 +282,9 @@ func (s *ForumSettingsService) SearchKeywordMax() int { return s.getInt(SettingS func (s *ForumSettingsService) PageSizeDefault() int { return s.getInt(SettingPageSizeDefault, 30) } func (s *ForumSettingsService) PageSizeMax() int { return s.getInt(SettingPageSizeMax, 50) } +func (s *ForumSettingsService) FeedMaxPages() int { return s.getInt(SettingFeedMaxPages, 10) } +func (s *ForumSettingsService) FeedMaxItems() int { return s.getInt(SettingFeedMaxItems, 300) } + func (s *ForumSettingsService) PasswordMinLen() int { return s.getInt(SettingPasswordMinLen, 6) } func (s *ForumSettingsService) AvatarMaxMB() int { return s.getInt(SettingAvatarMaxMB, 2) }